所有仿真详情导航:
PROTEUS专栏说明-CSDN博客
目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
基于51单片机,采用DS1302时钟模块,通过LCD1602显示实时时间,也可以储存时间在AT2DC02中,下次开机读取闹钟时间
然后通过串口传输实时时间给电脑端,这个表示WIFI
到达闹钟后,蜂鸣器报警,LED闪烁一秒
语音通过串口设置闹钟,发送格式为@22-20-20#
采用按键表示定位模块,一个表示定位正确,一个表示定位错误,用两个LED灯表示状态。
二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
三、主程序编程
#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的分享