基于单片机的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的分享

相关推荐
典则23 分钟前
STM32FreeRtos入门(四)——任务状态和调度
stm32·单片机·嵌入式硬件
充哥单片机设计29 分钟前
【STM32项目开源】基于STM32的智能天然气火灾监控
stm32·单片机·嵌入式硬件
充哥单片机设计32 分钟前
【STM32项目开源】基于STM32的智能仓库火灾检测系统
stm32·单片机·嵌入式硬件
A9better3 小时前
嵌入式开发学习日志38——stm32之看门狗
stm32·嵌入式硬件·学习
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机智能路灯控制系统
c语言·stm32·单片机·嵌入式硬件·51单片机
A9better13 小时前
嵌入式开发学习日志36——stm32之USART串口通信前述
stm32·单片机·嵌入式硬件·学习
思诺学长13 小时前
BMS(电池管理系统)的主要功能和架构简述
单片机·嵌入式硬件
czhaii14 小时前
全局不关总中断的 RTOS / CosyOS-II for STCAI MCU
单片机
qq_4017004114 小时前
STM32低功耗Tickless模式
stm32·单片机
点灯小铭16 小时前
基于单片机的自动存包柜设计
数据库·单片机·mongodb·毕业设计·课程设计