51单片机电子钟(串口) 电子时钟设计 1、配置定时器,能够计算时、分、秒(实现电子时钟功能) 2、配置单片机按键,实现按键修改时间的功能,能够修改时、分、秒 3、通过数码管把时间显示出来。 4、当时间计算到23时59分59秒,再加1时间变为0时0分0秒,蜂鸣器报警 5、配置按键,蜂鸣器报警后按下该按键关闭报警。 拓展:
1、串口把时间发送到上位机。 2、通过串口发送指令进行修改时间。 #include “reg51.h” #define uchar unsigned char #define uint unsigned int sbit k1=P1^0;//按钮 sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; sbit smg1 =P2^0;//数码管 sbit smg2 =P2^1; sbit smg3 =P2^2; sbit smg4 =P2^3; sbit smg5 =P2^4; sbit smg6 =P2^5; sbit beep=P3^3; //数码管编码 uchar code smgduan0[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//显示0~9,无小数点 uchar code smgduan1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//显示0~9,有小数点 uchar mode=0;//设置切换 uchar flag=0; uchar time=0,miao=50,fen=59,shi=23; //延时 void delay(uint i) { uint j; for(j=0;j<i;j++); } //主函数 void main() { SCON=0X50; //设置为工作方式1 TMOD=0X21; //设置计数器工作方式2 TH1=0XFD; TL1=0XFD; TR1=1; //打开计数器 TH0=(65536-50000)/256;//50ms TL0=(65536-50000)%256; ET0=1;//打开定时器0中断允许 ES=1; EA=1;//打开总中断 TR0=1;//打开定时器 while(1) { if(!k1)//停止蜂鸣器 { beep=1; } if(!k2)//设置 { if(mode!=1) { mode=1; flag=0; } else { if(flag<1) flag++; else { flag=0; mode=0; } } while(!k2); } if(mode==1)//设置时间 { if(!k3)//加 { switch(flag) { case 0: if(shi<23) shi++; break; case 1: if(fen<59) fen++; break; case 2: if(miao<59) miao++; } while(!k3); } if(!k4)//减 { switch(flag) { case 0: if(shi>0) shi–; break; case 1: if(fen>0) fen–; break; case 2: if(miao>0) miao–; } while(!k4); } } //显示 if(mode==0) //时间显示 { P0=smgduan0[shi/10];smg1=1;delay(100);smg1=0; P0=smgduan1[shi%10];smg2=1;delay(100);smg2=0; P0=smgduan0[fen/10];smg3=1;delay(100);smg3=0; P0=smgduan1[fen%10];smg4=1;delay(100);smg4=0; } P0=smgduan0[miao/10];smg5=1;delay(100);smg5=0; P0=smgduan0[miao%10];smg6=1;delay(100);smg6=0; if(mode==1)//设置时间 { if(flag==0)//小时闪烁 { if(time<11) { P0=smgduan0[shi/10];smg1=1;delay(100);smg1=0; P0=smgduan1[shi%10];smg2=1;delay(100);smg2=0; } else { P0=0xff;smg1=1;delay(100);smg1=0; P0=0xff;smg2=1;delay(100);smg2=0; } } else { P0=smgduan0[shi/10];smg1=1;delay(100);smg1=0; P0=smgduan1[shi%10];smg2=1;delay(100);smg2=0; } if(flag==1)//分钟闪烁 { if(time<11) { P0=smgduan0[fen/10];smg3=1;delay(100);smg3=0; P0=smgduan1[fen%10];smg4=1;delay(100);smg4=0; } else { P0=0xff;smg3=1;delay(100);smg3=0; P0=0xff;smg4=1;delay(100);smg4=0; } } else { P0=smgduan0[fen/10];smg3=1;delay(100);smg3=0; P0=smgduan1[fen%10];smg4=1;delay(100);smg4=0; } } //闹钟判断 if((shi==0)&&(fen==0)&&(miao==0)) beep=0; } } //定时器0中断 void Timer0() interrupt 1 { if(mode==0)//计时 { if(time<20) time++; else { time=0; if(miao<59) miao++; else { miao=0; if(fen<59) fen++; else { fen=0; if(shi<23) shi++; else shi=0; } } //串口发送 SBUF=shi/10+0x30;while(!TI);TI=0; SBUF=shi%10+0x30;while(!TI);TI=0; SBUF=’:’;while(!TI);TI=0; SBUF=fen/10+0x30;while(!TI);TI=0; SBUF=fen%10+0x30;while(!TI);TI=0; SBUF=’:’;while(!TI);TI=0; SBUF=miao/10+0x30;while(!TI);TI=0; SBUF=miao%10+0x30;while(!TI);TI=0; SBUF=0x0d;while(!TI);TI=0; } } if(mode>0)//闪烁定时 { if(time<20) time++; else time=0; } TH0=(65536-50000)/256;//50ms TL0=(65536-50000)%256; } //串口中断 void Usart() interrupt 4 { uchar i; i=SBUF;//出去接收到的数据 RI = 0;//清除接收中断标志位 if(i==’Q’)//停止蜂鸣器 { beep=1; } if(i==’W’)//设置 { if(mode!=1) { mode=1; flag=0; } else { if(flag<1) flag++; else { flag=0; mode=0; } } } if(mode==1)//设置时间 { if(i==’E’)//加 { switch(flag) { case 0: if(shi<23) shi++; break; case 1: if(fen<59) fen++; break; case 2: if(miao<59) miao++; } } if(i==’R’)//减 { switch(flag) { case 0: if(shi>0) shi–; break; case 1: if(fen>0) fen–; break; case 2: if(miao>0) miao–; } } } }
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/86136.html