选用芯片:AT89S52 功能:能校时和校分,具有整点报时功能(四低一高)。 我在设计的时候,想设计出那种四低一高的整点报时,刚开始想的时候确实费了点脑子,在网上搜也没相关的代码参考。不过好在最后用定时器的50ms设计出符合自己的要求的整点报时。 由于自己能力不足,本设计功能简陋,并没有日历和闹钟功能。 博主刚接触单片机,才疏学浅,可能会出现设计不足和错误,欢迎大家评论区交流。^ _ ^
/*********************************************************** 此函数功能为:用定时器的中断方式实现数字钟功能,能校时和校分, 具有整点报时功能。 作者:Crazy Wind 日期:2020.10.2 version:1.0.0 2020.10.2 1.1.0 2020.10.5 (取消了中断校分校时,改用独立按键) 1.1.1 2020.10.5 (增加了整点报时功能,四低一高) ***********************************************************/ #include "reg52.h" #include "intrins.h" typedef unsigned char u8; typedef unsigned int u16; u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //段码:0~F u8 code smgwei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码 u16 i,j,q,r; sbit k1=P1^4; //校分按键 sbit k2=P1^5; //校时按键 sbit beep=P3^6; //蜂鸣器 u8 s=0; u8 m=0; u8 h=0; u16 k=0; u8 shuxian[8]; //装填秒分时数字段码的数组 void delayms(u16 ms) //毫秒延时 { for(i=0;i<ms;i++) { for(j=115;j>0;j--); } } void dsq() //定时器和中断 { TMOD=0x01; //定时器T0的模式1 TH0=0x4C; //定时器T0的高8位赋初值 (11.0592MHz) TL0=0x00; //定时器T0的低8位赋初值 TR0=1; //启动定时器T0 EA=1; //开放总中断 ET0=1; //允许使用定时器中断0 } void ms() interrupt 1 //50毫秒 进入此中断 { k++; TH0=0x4C; //重新赋初值 TL0=0x00; } void smh() { if(k==20) //1秒 { k=0; s++; if(s>59) //秒进位 { s=0; m++; if(m>59) //分进位 { m=0; h++; if(h>23) { h=0; } } } } } void smg() //取段码函数 { shuxian[0]=smgduan[s%10]; //秒个位 shuxian[1]=smgduan[s/10]; //秒十位 shuxian[2]=0xbf; shuxian[3]=smgduan[m%10]; //分个位 shuxian[4]=smgduan[m/10]; //分十位 shuxian[5]=0xbf; shuxian[6]=smgduan[h%10]; //时个位 shuxian[7]=smgduan[h/10]; //时十位 } void display() //秒分时显示函数 { P2=0x7f; for(q=0;q<8;q++) //利用循环位移,同时赋段码和位码 { P0=shuxian[q]; delayms(1); P0=0xff; //消影 P2=_cror_(P2,1); } } void jiaofen() //校分 { if(k1==0) { delayms(10); //消抖 if(k1==0) { m++; if(m>59) { m=0; h++; if(h>23) { h=0; } } while(!k1) //不松手走时 { smh(); smg(); display(); } } } } void jiaoshi() //校时 { if(k2==0) { delayms(10); //消抖 if(k2==0) { h++; if(h>23) { h=0; } while(!k2) //不松手走时 { smh(); smg(); display(); } } } } void speaker1() //蜂鸣器发声 高音 { beep=0; //500Hz delayms(1); beep=1; delayms(1); } void speaker2() //蜂鸣器发声 低音 { beep=0; //250HZ delayms(2); beep=1; delayms(2); } void baoshi() //整点报时 { if(k==0&&m==59&&s>55) //四低音(59分56——59秒时,每秒响一下低音)(k==0的时间为50ms) { for(r=0;r<10;r++) { speaker2(); } } if(k==0&&m==0&&s==0) //一高音(整点时响高音) { for(r=0;r<20;r++) { speaker1(); } } } void main() //主函数 { dsq(); while(1) { smh(); smg(); display(); jiaofen(); jiaoshi(); baoshi(); } }