新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于单片机定时器中断的时钟程序

基于单片机定时器中断的时钟程序

作者:时间:2012-10-17来源:网络收藏

大家只要自行更改端口就可以使用,走时还是比较准确的

#includereg51.h>#define uchar unsigned char#define uint  unsigned intsbit RING1=P3^7;                           //P3^7接蜂鸣                                       sbit OPEN=P3^1;                            //闹钟开时LED亮                    uchar idata buffer[8]={0,0,0,0,0,0,10,11};//定义两段缓冲区,buffer用于过程中时间BCD码暂存并初始化uchar code LED[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40,0X40}; //LED段译存储于程序存储区uchar miao=0;fen=58;shi=10; //定义全局变量用于miao,fen,shi用于存储过程时间uchar _20ms;//定义全局变量_20ms用于计数中断个数,50个为1秒uchar hour2,minutes2,second2;//闹铃设置时间存储区uchar hour1,minutes1,second1;//修改时间时暂存区bit hour,minutes,second;//修改相应时的位标志 bit add,dec;//加减位标志bit openring,cancelring;//闹铃开、关、取消标志                                            bit setring,settime;//闹铃设置、时间设置标志                                    bit ok;//确定变量void delay_1ms(uchar x)//延时1ms{uchar j;while(x--){for(j=0;j123;j++){;}}}void  inital(void)//定时器初始化函数{  RING1=1;      //这里RING等于0时蜂鸣器响;TMOD=0x01;   //定时器0工作于方式1,采用12M晶振,定时20msTH0=(65536-20000)/256;TL0=(65536-20000)%256; TR0=1;    //TR0=1  启动定时器EA=1;     //开总中断ET0=1;  //开}void timer0 (void) interrupt 1 using 1   //定时0中断函数{  TH0=(65536-20000)/256;TL0=(65536-20000)%256; _20ms++;if(50==_20ms)   //判断是否到了一秒{  miao++;        //到了一秒,秒++_20ms=0; if(miao==60)   //六十秒到了吗{ fen++;        //到了份++miao=0;if(fen==60)     //六十分到了吗{ shi++;      //到了时++fen=0;if(shi==24)   //24小时到了吗{ shi=0;    //时清零fen=0;miao=0;}}}}if(openring==1)    //闹钟开了吗{ if((shi==hour2)(fen==minutes2)(miao==second2)) //定时时间到  闹铃响RING1=0;if(cancelring==1)  //闹钟关{RING1=1;cancelring=0;}}  }void timebcd (uchar m,uchar f,uchar s)         //时间变动函数,当计时到达1秒时进行时间变动             { buffer[0]=m%10;              //shi、fen、miao转换成BCD码,主要为了数码管的显示buffer[1]=m/10;buffer[2]=f%10;buffer[3]=f/10;buffer[4]=s%10;buffer[5]=s/10;}void keyscan(void)       //键扫描并确定键值函数,该部分是时钟各种功能实现的核心{ uchar scode,recode,value;    //定义行列变量P2=0XF0;   //  注意键盘与P2的接法,4*4键盘if ((P2  0XF0)!=0XF0){ delay_1ms(10);if ((P20XF0)!=0XF0){scode=0xfe;while((scode  0x10)!=0){  P2=scode;if ((P20XF0)!=0XF0){recode=(P2  0XF0)|0X0f;value=((~scode)+(~recode));switch(value){ case 0x11: hour=1;minutes=0;second=0;break;//时,按到的键是修改时的功能键,hour是修改时的标志位case 0x21: hour=0;minutes=1;second=0;break;//分,按到的键是修改分的功能键,minutes是修改分的标志位;case 0x41: hour=0;minutes=0;second=1;break;//秒     与上面类似;case 0x81: add=1;dec=0;break;// 加   case 0x12: dec=1;add=0;break;//减case 0x22: setring=1;settime=0;second1=second2;minutes1=minutes2;hour1= hour2;break;//闹钟设置,case 0x42: settime=1;setring=0;second1=miao;minutes1=fen;hour1=shi;break;//时间设置case 0x82: setring=0;settime=0;break;//返回case 0x14: ok=1;break;//确定case 0x24: openring=1;OPEN=0;break;//开闹钟case 0x44: openring=0;OPEN=1;break;//关闹钟case 0x84:cancelring=1;break;//  取消响铃            default: break;}}else   scode=(scode1)|0x01;}}     } } 注意:这里将键盘的值进行了编码,12个键盘进行了编码 ,特别注意 闹钟设置和时间设置的实现方法 ,他们共用了函数 resettime,没什么难的。      void resettime (viod)  {if(hour==1){if (add==1){hour1++;add=0;}if( hour1==24)hour1=0;if (dec==1){hour1--;dec=0;}if (hour1==-1)hour1=23;}if(minutes==1){if (add==1){minutes1++;add=0;}if (minutes1==60)minutes1=0;if(dec==1){ minutes1--;dec=0;}if (minutes1==-1)minutes1=59;}if(second==1){ if (add==1){second1++;add=0;}if(second1==60)second1=0;if (dec==1){second1--;dec=0;}if(second1==-1)second1=59;}}display (void)                    //显示函数子程序{  uchar j,n;for(n=0,j=0XFE;n8;j=((j1)|0X01),n++){P1=j;  //P1接数码管位选P0=LED[buffer[n]];  //P0接数码管段选delay_1ms(5);}}void main (void){ inital();                              // 调用定时器初始化for(;;)                           {                        timebcd(miao,fen,shi);  keyscan(); //调用键扫描,确定功能if(settime==1)                    //当按下的键是时间设置时{ resettime();timebcd ( second1, minutes1,hour1);if(ok==1)      //当确定被按下时,表明重设时间要覆盖原来的时间,所以将miao,fen,shi重置,_20ms清零{ shi=hour1;fen=minutes1;miao=second1;_20ms=0;}} if(setring==1){   resettime();timebcd( second1, minutes1,hour1);if(ok==1){  hour2=hour1;minutes2=minutes1;second2=second1;}}display(); //调用显示函数}}

蜂鸣器相关文章:蜂鸣器原理


评论


相关推荐

技术专区

关闭