您好,欢迎访问三七文档
****************************************************************程序名称:51单片机数码管电子钟+定时闹钟晶振:12.00*实验对象:51hei单片机学习开发板*单片机:AT89S52或STC89C52闹钟时间:7:10分(程序自定义)*使用定时器方式,数码管显示24小时“00-00-00”(增加中断进入对时功能P1为按键,P2为段选,P0为位选,****************************************************************//***使用定时器方式,数码管显示24小时“00-00-00”(增加进入对时功能)P1为按键,P2为段选,P0为位选,{闹钟暂时不可调待完善})***/#includereg52.h#defineucharunsignedchar/*宏定义*/#defineuintunsignedint/*宏定义*/ucharhour,hour_h,hour_l;/*定义小时,小时的高位,小时的低位*/ucharmin,min_h,min_l;/*分*/ucharsec,sec_h,sec_l;/*秒*/ucharint_num;/*定时溢出作用标号*/sbitkey_secadd=P1^1;/*定义了p1.1为秒增1键,用在调时中断里*/sbitkey_minadd=P1^2;/*定义了p1.2为分增1键,用在调时中断里*/sbitkey_houradd=P1^3;/*定义了p1.3为时增1键,用在调时中断里*/sbitkey_intime=P1^0;//按P1.0进入调时sbitkey_quit=P1^5;//P1.5退出调时sbitbell=P1^5;//小喇叭voiddelay(uchartime);/*延时子函数声明*/voiddisplay();/*显示子函数声明*/voidinter_init();/*定时器初始化子函数声明*/voidtime24();/****专用数码管显示表***/ucharcodeduma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};/*0x40显示“一”符号*/ucharcodewema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};/*小时hour分min秒sec*///---------------------延时子函数--------------------------------voiddelay(uchartime)/*延时子函数*/{uchartime_1;for(;time0;time--)for(time_1=100;time_10;time_1--);}//---------------------初始化T0函数--------------------------voidtime0(void)interrupt1/*定时器T0服务子程序*/{TH0=(65535-50000)/256;TL0=(65535-50000)%256;int_num++;}//---------------------定时器函数--------------------------voidinter_init()/*定时器初始化子函数*/{EA=1;/*开总中断*/EX0=1;/*开外部中断0*/ET0=1;/*打开定时器T0*/TMOD=0x01;/*工作方式1*/TCON=0x00;/*触发方式*/IP=0x01;/*中断优先级别,T0优先*/TH0=(65535-50000)/256;/*置初值,大约50ms一个中断*/TL0=(65535-50000)%256;TR0=1;/*置位TR0,启动定时器0*/}//---------------------24小时时间自加--------------------------voidtime24()/*时间递增*/{if(int_num==20)/*值满20,大约就是一秒的时间。*/{/*其值设为2,则定时时间快10倍,可做毫秒计时*/int_num=0;sec++;/*秒值加1*/if(sec==60)/*如果秒值满60,就归0*/{sec=0;min++;/*分值加1*/if(min==60){min=0;hour++;/*分值归0,时值加1*/if(hour==24){hour=0;/*时值满24归0*/}}}}}//-----------按键调整子函数-------------------------------------voidkey(void)//按键调整子函数{if(key_intime==0){EA=0;//关中断sec=0;//秒归零while(100)//正确{display();if(key_quit==0){EA=1;break;}if(key_secadd==0){delay(1);if(key_secadd==0){sec++;while(!key_secadd);if(sec==60){sec=0;}}}if(key_minadd==0){delay(80);if(key_minadd==0){min++;while(!key_minadd);if(min==60){min=0;}}}if(key_houradd==0){delay(80);if(key_houradd==0){hour++;while(!key_houradd);if(hour==24){hour=0;}}}}}}//---------------------数码管显示子函数-------------------------------------voiddisplay()/*数码管显示子函数*/{sec_h=sec/10;/*求出秒高位需要显示的字符*/sec_l=sec%10;/*求出秒低位需要显示的字符*/min_h=min/10;min_l=min%10;hour_h=hour/10;hour_l=hour%10;P2=duma[sec_h];/*显示秒高位*/P0=wema[6];delay(10);P2=duma[sec_l];/*显示秒低位*/P0=wema[7];delay(10);P2=duma[10];/*“一”符号的显示*/P0=wema[5];delay(10);P2=duma[min_h];/*分*/P0=wema[3];delay(10);P2=duma[min_l];P0=wema[4];delay(10);P2=duma[10];/*“一”符号的显示*/P0=wema[2];delay(10);P2=duma[hour_h];/*时*/P0=wema[0];delay(10);P2=duma[hour_l];P0=wema[1];delay(10);}//---------------------主函数--------------------------------/*voidalarm_clock()//闹钟子函数-变频发声{uinti,j,y,m;if(hour==00)//时到了00点?{if(min=01){m=0;}//分大于或等于01就把m清零,若不成立向下执行if(min==00)//到了00分?{if(m15){do{//循环-变频m++;display();for(i=0;i2000;i++){bell=~bell;for(j=0;j24;j++);}//取反/for(y=0;y2000;y++){bell=~bell;for(j=0;j25;j++);}//取反/for(i=0;i2000;i++){bell=~bell;for(j=0;j26;j++);}//取反/for(i=0;i2000;i++){bell=~bell;for(j=0;j27;j++);}//取反/}while(m15);//闹15次结束}}}}*///---------------------主函数--------------------------------voidmain(){inter_init();/*定时器初始化*/hour=23;/*自定义一个初值,方便快速观察翻转状态(可修改)*/min=59;sec=50;while(1){key();time24();/*分开时间,分别显示字符*///alarm_clock();//闹钟函数display();/*调用显示函数来显示*/}}
本文标题:51时钟模块程序
链接地址:https://www.777doc.com/doc-2927931 .html