基于单片机的WIFI、语音、储存、时钟、闹钟、定位系统

所有仿真详情导航:

PROTEUS专栏说明-CSDN博客

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采用DS1302时钟模块,通过LCD1602显示实时时间,也可以储存时间在AT2DC02中,下次开机读取闹钟时间
然后通过串口传输实时时间给电脑端,这个表示WIFI
到达闹钟后,蜂鸣器报警,LED闪烁一秒
语音通过串口设置闹钟,发送格式为@22-20-20#
采用按键表示定位模块,一个表示定位正确,一个表示定位错误,用两个LED灯表示状态。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、主程序编程

cpp 复制代码
#include"reg51.h"
#include"ds1302.h"
#include "lcd1602.h"
#include<intrins.h>
#include<stdio.h>
#include"i2c.h"

#define uchar unsigned char	//数据类型换名字
#define uint unsigned int
/**************接口定义***************/
sbit button=P3^2;//按钮
sbit beep=P2^3;//蜂鸣器
sbit led=P1^0;//LED
sbit key1 = P1^1;
sbit key2 = P1^2;
sbit led1 = P1^3;
sbit led2 = P1^4;
/**************变量定义*****************/
uchar shi_time=0x17,fen_time=0x56,miao_time=0X30;//闹钟
uchar alarm[]={"ALARM12-40-30OFF"};//闹钟缓存
uchar clock[]={"CLOCK12-40-30   "};//时钟缓存
uchar ON_OFF=0;//ON.OFF标志
uint tim=0;	  //计时
uint tim1 = 0;
uchar start=0;//闹钟开启

uchar recive=0;//接收标志
uchar start_shou=0;//接收开始
uchar buff[]={"12-40-30"};

void delay(uint i)//延时
{
	while(i--);
}


void UART_init()//串口初始化
{
	SCON=0X50;			//设置为工作方式1
	TMOD = 0x21;  	//T1工作模式2  8位自动重装	T0模式1
	TH1 = 0xfd;
	TL1 = 0xfd; 	//比特率9600
	TH0=0x3c;//定时50ms
	TL0=0xb0;
	ET0=1;//T0中断开启
	TR0=1;
	TR1 = 1;		//启动T1定时器
	REN = 1;		//串口允许接收
	EA  = 1;		//开总中断
	ES  = 1;		//串口中断打开
	TI=1;
}
//===================================================================
void main()//主函数
{	
	init_1602();
	delay(10000);
	write_string(1,0,clock);//显示
	write_string(2,0,alarm);

	Ds1302ReadTime();
	TIME[0]&=0x7f;
	Ds1302Init();

	shi_time=At24c02Read(0);//初始化闹钟
	//if((shi_time>0x23)||((shi_time>>4)>9)||((shi_time&0x0f)>9))
	//	shi_time=0x06;
	fen_time=At24c02Read(1);//初始化闹钟
	//if(fen_time>0x59||((fen_time>>4)>9)||((fen_time&0x0f)>9))
	//	fen_time=0x30;
	miao_time=At24c02Read(2);//初始化闹钟
	//if(miao_time>0x59||((miao_time>>4)>9)||((miao_time&0x0f)>9))
	//	miao_time=0x30;
	At24c02Write(0,shi_time);//保存到24C02
	delay(10000);
	At24c02Write(1,fen_time);
	delay(10000);
	At24c02Write(2,miao_time);
	delay(10000);
	alarm[5]=(shi_time>>4)+0x30;
	alarm[6]=(shi_time & 0x0f)+0x30;
	alarm[8]=(fen_time>>4)+0x30;
	alarm[9]=(fen_time & 0x0f)+0x30;
	alarm[11]=(miao_time>>4)+0x30;
	alarm[12]=(miao_time & 0x0f)+0x30;
	write_string(2,0,alarm);//显示闹钟
	UART_init(); //串口初始化
	while(1)//主循环
	{
		if(!key1)
		{
			led1 = 0;
			led2 = 1;
			while(!key1);
		}
		
			if(!key2)
		{
			led1 = 1;
			led2 = 0;
			while(!key1);
		}
		
	 if(!button)//检测按钮
	 {
//	 delay(100);//延时消抖
	 	  if(!button)
		  {
		  	if(start)	  //清除报警
			  	start=0;
			else		 //闹钟开关
			   ON_OFF=!ON_OFF;
			if(!ON_OFF)		   //调整闹钟显示
			{
				alarm[14]='F';
				alarm[15]='F';
				write_string(2,0,alarm);
			}
			else
			{
				alarm[14]='N';
				alarm[15]=' ';
				write_string(2,0,alarm);
			}
		  }
		  while(!button);//等待按钮松开
	 }
	}
//**************************
	
}
//===================================================================
void UART() interrupt 4	//串口中断
{
	uchar num=0,i;
	if(RI)
	{	
	
		num=SBUF;//保存数据
		RI=0;

		if(start_shou)
		{
			TR0=0;
			buff[recive]=num;//保存数据
			recive++;
			if(recive==8)//接收数据处理
				{	
					recive=0;
					
					shi_time=(buff[0]-0x30)<<4;					
					shi_time+=(buff[1]-0x30);
					fen_time=(buff[3]-0x30)<<4;
					fen_time+=(buff[4]-0x30);
					miao_time=(buff[6]-0x30)<<4;
					miao_time+=(buff[7]-0x30);
					for(i=0;i<8;i++)	  //保存到数组
					{
						alarm[i+5]=buff[i];
					}
					write_string(2,0,alarm);//显示闹钟
					At24c02Write(0,shi_time);//保存到24C02
					delay(10000);
					At24c02Write(1,fen_time);
					delay(10000);
					At24c02Write(2,miao_time);
					delay(10000);
					TR0=1;
				}			
		}
		if(num=='@') //开始
			{
				start_shou=1;
				recive=0;
			}
		if(num=='#') //结束
			{
				start_shou=0;
				recive=0;
			}
			TR0=1;
	}
}

void timer0() interrupt 1//T0中断
{ 
	uchar i=0,j=0;
		if(start)//响铃
			beep=0;
		else
			beep=1;//关闭蜂鸣器
	//***************************
	if(tim<10)//0.5s
		tim++;
	else
		{
		tim=0;
		if(start)	 //闪灯
			led=!led;
		else
			led=1;	 //关灯
		Ds1302ReadTime();//读取时间
		clock[5]=(TIME[2]>>4)+0x30;//转换成ascall
		clock[6]=(TIME[2]&0x0f)+0x30;
		clock[8]=(TIME[1]>>4)+0x30;//转换成ascall
		clock[9]=(TIME[1]&0x0f)+0x30;
		clock[11]=(TIME[0]>>4)+0x30;//转换成ascall
		clock[12]=(TIME[0]&0x0f)+0x30;
		write_string(1,0,clock);//显示	
		//*************************
	i=0;
	if(miao_time==TIME[0])//闹钟检测
	{
		i++;
	}
if(ON_OFF==1)
{				
	if(shi_time==TIME[2])
	{
		i++;
	}
	if(fen_time==TIME[1])
	{
		i++;
	}
	if(i==3)
	{	 
		start=1;//开启闹铃
		i=0;
	}
	if(fen_time+1==TIME[1])
	{
		i++;
	}
	if(i==3)
	{	 
		start=0;//关闭闹铃
		i=0;
	}
}
		}
		if(tim1<20)
		{
			tim1++;
		}
		else
		{
			tim1 = 0;
			printf("%s \r\n",clock);	
		}
	TH0=0x3c;//定时50ms
	TL0=0xb0;
}

四、实现现象

具体动态效果看B站演示视频:

基于单片机的WIFI、语音、储存、时钟、闹钟、定位系统_哔哩哔哩_bilibili

全部资料(源程序、仿真文件、安装包、原理图、演示视频):

链接: https://pan.baidu.com/s/1bmfVoItSzq9Hi06uQmVkXQ?pwd=8wq1 提取码: 8wq1

--来自百度网盘超级会员v4的分享

相关推荐
欢乐熊嵌入式编程2 小时前
智能手表固件升级 OTA 策略文档初稿
嵌入式硬件·学习·智能手表
欢乐熊嵌入式编程2 小时前
智能手表 MCU 任务调度图
单片机·嵌入式硬件·智能手表
【云轩】2 小时前
电机密集型工厂环境下的无线通信技术选型与优化策略
经验分享·嵌入式硬件
sword devil9002 小时前
将arduino开发的Marlin部署到stm32(3D打印机驱动)
stm32·单片机·嵌入式硬件
GodKK老神灭3 小时前
STM32 变量存储
stm32·单片机·嵌入式硬件
木宁kk3 小时前
51单片机引脚功能概述
单片机·嵌入式硬件
JANYI20183 小时前
嵌入式MCU和Linux开发哪个好?
linux·单片机·嵌入式硬件
sword devil9005 小时前
Arduino快速入门
stm32·单片机·嵌入式硬件
GodKK老神灭5 小时前
STM32实现循环队列
stm32·单片机·嵌入式硬件
不脱发的程序猿7 小时前
从MCU到SoC的开发思维转变
单片机·嵌入式硬件