#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++;}
导读:目前正在解读《带详细注释的单片机闹钟程序》的相关信息,《带详细注释的单片机闹钟程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《带详细注释的单片机闹钟程序》的详细说明。
简介:本文和大家分享一个带详细注释的单片机闹钟程序,感兴趣的朋友可以看一下。
提醒:《带详细注释的单片机闹钟程序》最后刷新时间 2024-03-14 00:58:17,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《带详细注释的单片机闹钟程序》该内容的真实性请自行鉴别。