51单片机简易时钟(DS1302,LCD1602,独立按键) 1、使用1602显示屏第一行显示当前时间:小时、分钟、秒(24时制),第二行显示闹钟时间。 2、通过按键修改时间,小时、分钟、秒 3、闹钟与当前时间一直时,声光提示一段时间。 4、通过按键修改闹钟时间,小时、分钟 5、系统在切断其他的外部电源后,板载的备用电源使DS1302仍能继续工作,并在重新上电以后显示正确的时间
#include <reg51.h> #include <intrins.h> #include “lcd1602.h” #include “ds1302.h” #define uchar unsigned char #define uint unsigned int sbit K1=P3^2;//功能0 sbit K2=P3^3;//功能1 sbit K3=P3^4;//时+ sbit K4=P3^5;//时- sbit K5=P3^6;//分+ sbit K6=P3^7;//分- sbit beep=P2^6;//蜂鸣器 sbit led=P1^7; uchar mode=0;//模式。0时间,1闹钟 uchar start=0; uint time0=0; uchar xian0[]={0,0,’:’,0,0,’:’,0,0,’ ‘,’\0′};//显存 uchar xian1[]={0,0,’:’,0,0,’\0′};//显存 uchar shi=0,fen=0;//闹钟 uchar shunxu=0xfe; void delay(uint i)//延时 { uchar k; while(i–) for(k=0;k<110;k++); } uchar key_scan()//按键检测 { if(!K1) { delay(10);//延时防抖 if(!K1) { while(!K1);//等待按钮松开 return 1; } } if(!K2) { delay(10);//延时防抖 if(!K2) { while(!K2);//等待按钮松开 return 2; } } if(!K3) { delay(10);//延时防抖 if(!K3) { while(!K3);//等待按钮松开 return 3; } } if(!K4) { delay(10);//延时防抖 if(!K4) { while(!K4);//等待按钮松开 return 4; } } if(!K5) { delay(10);//延时防抖 if(!K5) { while(!K5);//等待按钮松开 return 5; } } if(!K6) { delay(10);//延时防抖 if(!K6) { while(!K6);//等待按钮松开 return 6; } } return 0; } //主函数 void main() { uchar i,j; init_1602(); Ds1302ReadTime(); TIME[0]&=0X7F; Ds1302Init(); TMOD=0X01;//定时器0,工作方式1。 TH0=0XFC; //定时1ms TL0=0X18; ET0=1;//打开定时器0中断允许 TR0=1; EA=1;//打开总中断 write_string(2,0,”CLOCK:”); xian1[0]=shi/10+0x30; xian1[1]=shi%10+0x30; xian1[3]=fen/10+0x30; xian1[4]=fen%10+0x30; write_string(2,7,xian1); while(1) { if(mode==0)//模式指示灯 led=0; else led=1; if(((10*(TIME[2]>>4)+(TIME[2]&0x0f))==shi)&&(10*(TIME[1]>>4)+(TIME[1]&0x0f)==fen)) //判断响铃 start=1; else start=0; i=key_scan(); switch(i) { //时钟校准 case 1: mode=0;break;//时钟模式 case 2: mode=1;break;//闹钟模式 case 3: if(mode==0)//时钟设置 { j=10*(TIME[2]>>4)+(TIME[2]&0x0f); //时+ if(j<23) { j++; TIME[2]=((j/10)<<4)+j%10; xian0[0]=(TIME[2]>>4)+0x30; //显示时间 xian0[1]=(TIME[2]&0x0f)+0x30; Ds1302Init(); write_string(1,3,xian0); } } else //闹钟设置 { if(shi<23) { shi++; xian1[0]=shi/10+0x30; xian1[1]=shi%10+0x30; write_string(2,7,xian1); } } break; case 4: //时钟设置 if(mode==0) { j=10*(TIME[2]>>4)+(TIME[2]&0x0f); //时- if(j>0) { j–; TIME[2]=((j/10)<<4)+j%10; xian0[0]=(TIME[2]>>4)+0x30; //显示时间 xian0[1]=(TIME[2]&0x0f)+0x30; Ds1302Init(); write_string(1,3,xian0); } } else //闹钟设置 { if(shi>0) { shi–; xian1[0]=shi/10+0x30; xian1[1]=shi%10+0x30; write_string(2,7,xian1); } } break; case 5: if(mode==0)//时钟设置 { j=10*(TIME[1]>>4)+(TIME[1]&0x0f); //分+ if(j<59) { j++; TIME[1]=((j/10)<<4)+j%10; xian0[3]=(TIME[1]>>4)+0x30; xian0[4]=(TIME[1]&0x0f)+0x30; Ds1302Init(); write_string(1,3,xian0); } } else //闹钟设置 { if(fen<59) { fen++; xian1[3]=fen/10+0x30; xian1[4]=fen%10+0x30; write_string(2,7,xian1); } } break; case 6: if(mode==0) { j=10*(TIME[1]>>4)+(TIME[1]&0x0f); //分- if(j>0) { j–; TIME[1]=((j/10)<<4)+j%10; xian0[3]=(TIME[1]>>4)+0x30; xian0[4]=(TIME[1]&0x0f)+0x30; Ds1302Init(); write_string(1,3,xian0); } } else { if(fen>0) { fen–; xian1[3]=fen/10+0x30; xian1[4]=fen%10+0x30; write_string(2,7,xian1); } } } } } void timer0() interrupt 1 { TH0=0XFC; //定时1ms TL0=0X18; if(start) //启动蜂鸣器 beep=!beep; else { P1=0xff; shunxu=0xfe; beep=1; } if(time0<500)//每隔0.5s读一次时间 time0++; else { time0=0; TR0=0;EA=0; if(start)//点亮流水灯 { P1=shunxu; shunxu=_crol_(shunxu,1); } Ds1302ReadTime(); xian0[0]=(TIME[2]>>4)+0x30; //显示时间 xian0[1]=(TIME[2]&0x0f)+0x30; xian0[3]=(TIME[1]>>4)+0x30; xian0[4]=(TIME[1]&0x0f)+0x30; xian0[6]=(TIME[0]>>4)+0x30; xian0[7]=(TIME[0]&0x0f)+0x30; write_string(1,3,xian0); TR0=1;EA=1; } }
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/87117.html