您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 8位数码管显示电子时钟c51单片机程序
8位数码管显示电子时钟c51单片机程序时间:2012-09-1013:52:26来源:作者:/*8位数码管显示时间格式05—50—00标示05点50分00秒S1用于小时加1操作S2用于小时减1操作S3用于分钟加1操作S4用于分钟减1操作*/#includereg52.hsbitKEY1=P3^0;//定义端口参数sbitKEY2=P3^1;sbitKEY3=P3^2;sbitKEY4=P3^3;sbitLED=P1^2;//定义指示灯参数codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管0—9unsignedcharStrTab[8];//定义缓冲区unsignedcharminute=19,hour=23,second;//定义并初始化为12:30:00voiddelay(unsignedintcnt){while(--cnt);}/******************************************************************//*显示处理函数*//******************************************************************/voidDisplaypro(void){StrTab[0]=tab[hour/10];//显示小时StrTab[1]=tab[hour%10];StrTab[2]=0x40;//显示-StrTab[3]=tab[minute/10];//显示分钟StrTab[4]=tab[minute%10];StrTab[5]=0x40;//显示-StrTab[6]=tab[second/10];//显示秒StrTab[7]=tab[second%10];}main(){TMOD|=0x01;//定时器010msinMcrystal用于计时TH0=0xd8;//初值TL0=0xf0;ET0=1;TR0=1;TMOD|=0x10;//定时器1用于动态扫描TH1=0xF8;//初值TL1=0xf0;ET1=1;TR1=1;EA=1;Displaypro();//调用显示处理函数while(1){if(!KEY1)//按键1去抖以及动作{delay(10000);if(!KEY1){hour++;if(hour==24)hour=0;//正常时间小时加1Displaypro();}}if(!KEY2)//按键2去抖以及动作{delay(10000);if(!KEY2){hour--;if(hour==255)hour=23;//正常时间小时减1Displaypro();}}if(!KEY3)//按键去抖以及动作{delay(10000);if(!KEY3){minute++;if(minute==60)minute=0;//分加1Displaypro();}}if(!KEY4)//按键去抖以及动作{delay(10000);if(!KEY4){minute--;if(minute==255)minute=59;//分减1Displaypro();}}}}/******************************************************************//*定时器1中断*//******************************************************************/voidtime1_isr(void)interrupt3using0//定时器1用来动态扫描{staticunsignedcharnum;TH1=0xF8;//重入初值TL1=0xf0;switch(num){case0:P2=0;P0=StrTab[num];break;//分别调用缓冲区的值进行扫描case1:P2=1;P0=StrTab[num];break;case2:P2=2;P0=StrTab[num];break;case3:P2=3;P0=StrTab[num];break;case4:P2=4;P0=StrTab[num];break;case5:P2=5;P0=StrTab[num];break;case6:P2=6;P0=StrTab[num];break;case7:P2=7;P0=StrTab[num];break;default:break;}num++;//扫描8次,使用8个数码管if(num==8)num=0;}/******************************************************************//*定时器0中断*//******************************************************************/voidtim(void)interrupt1using1{staticunsignedcharcount;//定义内部局部变量TH0=0xd8;//重新赋值TL0=0xf0;count++;switch(count){case0:case20:case40:case60:case80:Displaypro();break;//隔一定时间调用显示处理case50:P1=~P1;break;//半秒LED闪烁default:break;}if(count==100){count=0;second++;//秒加1if(second==60){second=0;minute++;//分加1if(minute==60){minute=0;hour++;//时加1if(hour==24)hour=0;}}}}基于单片机的LCD1602控制总线模式时间:2012-09-1013:50:39来源:作者:第一行显示Welcome;第二行显示=Happyday;若要显示其他字符,请直接往数组LCMLineOne[16]和LCMLineTwo[16]填充相应的代码。直接上图,仿真图如下:源程序如下,可以对比时序方式,理解总线的操作方法。#includereg51.h//#includeabsacc.h#defineucharunsignedchar#defineuintunsignedint#definebusy0x80ucharxdataLCMWriteCOM_at_0x80ff;//写指令寄存器ucharxdataLCMReadCOM_at_0xa0ff;//读指令寄存器ucharxdataLCMWriteData_at_0xc0ff;//写数据寄存器ucharxdataLCMReadData_at_0xe0ff;//读数据寄存器uchardataLCMLineOne[16]=Welcome;//第一行显示的数据uchardataLCMLineTwo[16]=Happyday;//第二行显示的数据voidDelayms(ucharms){uchari,j;for(i=0;ims;i++)for(j=0;j57;j++);}//写指令寄存器voidLCMWriteC(ucharCOMData){ucharLCMStatus;do{LCMStatus=(LCMReadCOM&busy);}while(LCMStatus!=0);LCMWriteCOM=COMData;}//读指令寄存器ucharLCMReadC(){ucharLCMStatus;do{LCMStatus=(LCMReadCOM&busy);}while(LCMStatus!=0);LCMStatus=LCMReadCOM;return(LCMStatus);}//读数据寄存器ucharLCMReadD(ucharaddr){ucharLCMStatus;do{LCMStatus=(LCMReadCOM&busy);}while(LCMStatus!=0);LCMWriteC(0x80+addr);LCMStatus=LCMReadData;return(LCMStatus);}//写数据寄存器带地址voidLCMWriteDAdd(ucharaddr,ucharLCMData){ucharLCMStatus;do{LCMStatus=(LCMReadCOM&busy);}while(LCMStatus!=0);LCMWriteC(0x80+addr);LCMWriteData=LCMData;}//写数据寄存器无地址voidLCMWriteD(ucharLCMData){ucharLCMStatus;do{LCMStatus=(LCMReadCOM&busy);}while(LCMStatus!=0);LCMWriteData=LCMData;}//初始化voidLCMInit(void){Delayms(15);LCMWriteCOM=0x38;Delayms(5);LCMWriteCOM=0x38;Delayms(5);LCMWriteCOM=0x38;Delayms(5);LCMWriteC(0x38);LCMWriteC(0x08);LCMWriteC(0x01);LCMWriteC(0x06);LCMWriteC(0x0c);}main(){uchari;LCMInit();while(1){LCMWriteC(0x80);//第一行开始地址for(i=0;i16;i++)LCMWriteD(LCMLineOne[i]);LCMWriteC(0x80+0x40);//第二行开始地址for(i=0;i16;i++)LCMWriteD(LCMLineTwo[i]);}}
本文标题:8位数码管显示电子时钟c51单片机程序
链接地址:https://www.777doc.com/doc-5064275 .html