带详细注释的单片机闹钟程序

来源:本站
导读:目前正在解读《带详细注释的单片机闹钟程序》的相关信息,《带详细注释的单片机闹钟程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《带详细注释的单片机闹钟程序》的详细说明。
简介:本文和大家分享一个带详细注释的单片机闹钟程序,感兴趣的朋友可以看一下。

#include<reg52.h> //头文件#include<intrins.h>#define uchar unsigned char//宏定义#define uint  unsigned intsbit key1=P1^0;   //位声明sbit key2=P1^1;sbit key3=P1^2;sbit fmq=P3^3;//闹钟uchar code table[]={0xc0,0xf9,0xa4,//数码管显示的数值0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x40,0x79,0x24,//带小数点的数值0x30,0x19,0x12,0x02,0x78,0x00,0x10};void jia();   //函数声明void jian();uchar table_1[6]; //定义数组,数组内含有6个数值uchar table_2[6];uchar shi=23,fen=59,miao=50; //显示初始值uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;//定义全局变量uchar flag,flag1,cnt,count;//定义全局变量void delay(uchar i)  //延时函数,用于动态扫描数码管{     uchar x,y;     for(x=i;x>0;x--)          for(y=110;y>0;y--);}void init()   //初始化函数{     TMOD=0X01; //工作方式1     TH0=(65536-50000)/256; //定时时间为:50ms     TL0=(65536-50000)%256;     ET0=1;     //打开定时器     EA=1;    //开总中断     TR0=1;    //启动定时器}void display()  //显示子函数,用于显示时间数值{     uchar i,j;     table_1[0]=miao%10;  //分离秒的各位与十位     table_1[1]=miao/10;     table_1[2]=fen%10+11;  //分离分的各位与十位     table_1[3]=fen/10;     table_1[4]=shi%10+11; //分离时的各位与十位     table_1[5]=shi/10;     j=0x7f;    //从秒到时的扫描(位选)     for(i=0;i<6;i++)     {      P2=j;      P0=table[table_1[i]];//显示数值      delay(10);      j=_cror_(j,1);//循环右移     }}void display_1() //显示子函数,用于显示定时时间{     uchar i,j;     table_2[0]=miao2%10;  //以下含义同上     table_2[1]=miao2/10;     table_2[2]=fen2%10+11;     table_2[3]=fen2/10;     table_2[4]=shi2%10+11;     table_2[5]=shi2/10;     j=0x7f;     for(i=0;i<6;i++)     {          P2=j;          P0=table[table_2[i]];          delay(10);          j=_cror_(j,1);     }}void shijian() //时间子函数{     if(flag>=20)  //判断是否到一秒     {          flag=0;  //到了,则标志位清零          miao++;  //秒加1          if(miao>=60) //判断秒是否到60s          {               miao=0;//到了,则清零               fen++; //分加1               if(fen>=59) //以下含义同上               {                    fen=0;                    shi++;                    if(shi>23)                         shi=0;               }          }     }}void key_scan() //键盘扫描子函数{     uchar i;   //定义局部变量     if(key1==0)     {          while(!key1)  //防止掉显          {               if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)               {                    display();               }               if(cnt==5||cnt==6||cnt==7)               {                    display_1();               }          }          cnt++; //记下按键key1按下的次数          if(cnt==1) //第一次按下,停止计数          TR0=0;          if(cnt==2)   //第二次按下          {               miao1=miao; //保存秒的数值               miao=99;//显示99,表示可以调节秒的数值了               for(i=0;i<100;i++)                display(); //显示99               miao=miao1; //恢复前一刻秒的数值          }          if(cnt==3) //以下含义同上          {               fen1=fen;               fen=99;               for(i=0;i<100;i++)                    display();               fen=fen1;          }          if(cnt==4)          {               shi1=shi;               shi=99;               for(i=0;i<100;i++)                    display();               shi=shi1;          }          if(cnt==5)          {               miao1=miao2;               miao2=88;               for(i=0;i<100;i++)                    display_1();               miao2=miao1;          }          if(cnt==6)          {               fen1=fen2;               fen2=88;               for(i=0;i<100;i++)                    display_1();               fen2=fen1;          }          if(cnt==7)          {               shi1=shi2;               shi2=88;               for(i=0;i<100;i++)                    display_1();               shi2=shi1;          }          if(cnt==8) //第八次按下          {               TR0=1;  //开始计数               cnt=0; //按下次数清零          }     }     if(key2==0)   //判断key2是否按下     {          while(!key2)  //防止掉显          {               if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)               {                    display();               }               if(cnt==5||cnt==6||cnt==7)               {                    display_1();               }          }          jia();//调用加1的子函数     }     if(key3==0)  //判断key3是否按下     {          while(!key3)  //防止掉显          {               if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)               {                    display();               }               if(cnt==5||cnt==6||cnt==7)               {                    display_1();               }          }          jian(); //调用减1子函数     }}void jia()   //加1子函数{     if(cnt==2) //判断key1按下的次数是否为2     {          miao++; //是,则秒加1          if(miao>59) //判断秒是否大于59,是,则秒清零               miao=0;     }     if(cnt==3) //以下含义同上     {          fen++;          if(fen>59)               fen=0;     }     if(cnt==4)     {          shi++;          if(shi>23)               shi=0;     }     if(cnt==5)     {          miao2++;          if(miao2>59)               miao2=0;     }     if(cnt==6)     {          fen2++;          if(fen2>59)               fen2=0;     }     if(cnt==7)     {          shi2++;          if(shi2>23)               shi2=0;     }}void jian()    //减1子函数{     if(cnt==2) //判断key1按下的次数是否为2,是则秒减1     {          miao--;          if(miao==255)  //判断秒是否减到255,是,则秒清零               miao=59;     }     if(cnt==3)     {          fen--;          if(fen==255)               fen=59;     }     if(cnt==4)     {          shi--;          if(shi==255)               shi=23;     }     if(cnt==5)     {          miao2--;          if(miao2==255)               miao2=59;     }     if(cnt==6)     {          fen2--;          if(fen2==255)               fen2=59;     }     if(cnt==7)     {          shi2--;          if(shi2==255)               shi2=23;     }}void clock() //闹铃子函数{     if(miao2==miao) //显判断秒的数值是否相等          if(fen2==fen)  //是,在判断分是否相等               if(shi2==shi) //是,再判断时是否相等               {                    flag1=0; //是,则标志位,flag1清零                    while(!(flag1==100))  //判断flag1是否到100                    {                         fmq=0;  //没有,则,继续驱动蜂鸣器响,时间约为:5s                         shijian(); //调用时间子函数                         display(); //调用显示子函数                      }                    fmq=1;//关闭蜂鸣器               }}void main(){     init();//调用初始化子函数     while(1)     {          key_scan(); //调用键盘扫描子函数          shijian(); //时间子函数          clock(); //闹钟子函数          //显示子函数          if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)          {               display();          }          if(cnt==5||cnt==6||cnt==7)          {               display_1();          }     }}void time0() interrupt 1 //定时器0{     TH0=(65536-50000)/256; //初值50ms     TL0=(65536-50000)%256;     flag++;   //标志位     flag1++;}

提醒:《带详细注释的单片机闹钟程序》最后刷新时间 2024-03-14 00:58:17,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《带详细注释的单片机闹钟程序》该内容的真实性请自行鉴别。