单片机数字钟电路图

合集下载

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。

常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。

时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。

10秒位到5后,即59秒,分钟加1,10秒位回0。

依次类推,时钟最大的显示值为23小时59分59秒。

这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。

开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。

6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。

以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH;clr P3.7 ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 闪动调时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ;MOV TL1, #0B0H ;装定时器T1定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"MOV 72H,76H ;02H位为0时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 加1子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1: MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;............. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟调整程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM: cLR ET0 ;关定时器T0中断CLR TR0 ;关闭定时器T0LCALL DL1S ;调用1秒延时程序JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1SET4: JB P3.7,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态MOV R0,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加1子程序MOV A,R3 ;取调整单元数据CLR C ;清进位标志CJNE A,#60H,HHH ;调整单元数据与60比较HHH: JC SET4 ;调整单元数据小于60转SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。

电子时钟基于某AT89c51单片机设计电路图及程序

电子时钟基于某AT89c51单片机设计电路图及程序

电子时钟基于AT89c51单片机的设计电子时钟原理图开机显示仿真图: 当按下仿真键时电子时钟开机页面显示第一行显示JD12102Class--16,第二行显示动态TINE:12:00:04。

电子时钟调时间仿真图:当按下K1为1次时,光标直接跳到电子时钟的秒,可以按下K2进行调节。

当按下K1为2次时,光标直接跳到电子时钟的分,可以按下K2进行调节。

当按下K1为3次时,光标直接跳到电子时钟的时,可以按下K2进行调节。

当按下K1为4次时,光标直接跳完,电子时钟可以进行正常计时。

电子时钟闹钟调节仿真:当按下K3为1次时,直接跳到闹钟显示界面00:00:00,按下K2可以对闹钟的秒进行调节。

当按下K3为2次时,可以调到分,按下K2可以对闹钟的分进行调节。

当按下K3为3次时,可以调到时,按下K2可以对闹钟的时进行调节。

当按下K3为4次时,直接跳到计时界面,对闹钟进行到计时,时间到可以发出滴滴声。

#include<reg51.h>#define uchar unsigned char //预定义一下#define uint unsigned intuchar table[]="JD12102Class--21"; //显示内容sbit lcden=P3^4; //寄存器EN片选引脚sbit lcdrs=P3^5; //寄存器RS选择引脚sbit beep=P3^6; //接蜂鸣器extern void key1();extern void key2();extern void key3();uchar num,hour=12,minite,second,ahour,aminite,asecond,a,F_k1,F_k2,F_k3; //定义变量void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;P0=com; //送出指令,写指令时序delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){lcdrs=1;P0=date; //送出数据,写指令程序delay(5);lcden=1;delay(5);lcden=0;}void write_add(uchar add,uchar date){uchar aa,bb;aa=date/10;bb=date%10;write_com(0x80+add);write_data(0x30+aa);write_data(0x30+bb);}void init() //初始化{lcden=0;write_com(0x38); //设置16*2显示,5*7点阵write_com(0x0c); //开显示,不显示光标write_com(0x06); //地址加1,写入数据是光标右移1位write_com(0x01); //清屏write_com(0x80); //起点为第一行第一个字符开始}void display(uchar h,uchar m,uchar s) //显示设计程序{{write_com(0x80+0x16);}{write_com(0xC0+0x00);write_data('T');write_data('I');write_data('M');write_data('E');write_data(':');write_data(0x30+(h/10));write_data(0x30+(h%10));write_data(':');write_data(0x30+(m/10));write_data(0x30+(m%10));write_data(':');write_data(0x30+(s/10));write_data(0x30+(s%10));write_data(' ');write_data(' ');write_data(' ');} }void main(){init();TMOD=0X01; //设置T0定时方式1TH0=(65535-50000)/256; //设置初值TL0=(65535-50000)%256;EA=1; //开总中断TR0=1; //启动T0ET0=1;for(num=0;num<16;num++) //依次读出数据{write_data(table[num]);}while(1){key1();key2();key3();if(ahour==hour&&aminite==minite&&second<10) //时间到闹钟响{beep=~beep;}if(F_k1==0&F_k3==0) //K1和K3按下次数为零就直接显示时分秒display(hour,minite,second);}}void timer0() interrupt 1 //T0中断函数{TH0=(65535-50000)/256; //装载计数器初值TL0=(65535-50000)%256;a++;if(a==20){ //进位设置60秒进1分,60分进1时,24时进0时a=0;second++;if(second==60){second=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}}#include <reg51.h> //调时间程序#define uchar unsigned char#define uint unsigned intsbit k1=P1^0; //定义3个变量sbit k2=P1^1;sbit k3=P1^2;extern uchar F_k1,F_k3,second,minite,hour,ahour,aminite,asecond; //预定义变量extern void write_com(uchar com);extern void write_add(uchar add,uchar date);extern void display(uchar h,uchar m,uchar s);void delay_key(int i){while(i--);}void key1(){if(k1==0) //按下K1零次时,直接计时与开机显示{delay_key(100);if(k1==0){TR0=0;while(!k1);F_k1++;if(F_k1==4){F_k1=0;write_com(0x0c);TR0=1;}}}if(F_k1==1|F_k3==1){write_com(0xC0+0x0c);write_com(0x0f);}if(F_k1==2|F_k3==2)write_com(0xC0+0x09);if(F_k1==3|F_k3==3)write_com(0xC0+0x06);}void key2(){if(k2==0){delay_key(100);{while(!k2);if(F_k1==1) //按下K1一次时设置闹钟的秒{second++;if(second==60)second=0;write_add(0x4b,second);}if(F_k1==2) //按下K3两次时设置闹钟的分{minite++;if(minite==60)minite=0;write_add(0x48,minite);}if(F_k1==3) // 按下K1三次时设置闹钟的时{hour++;if(hour==24)hour=0;write_add(0x45,hour);}if(F_k3==1) //按下K3一次时设置闹钟的秒{asecond++;if(asecond==60)asecond=0;write_add(0x4b,asecond);}if(F_k3==2) //按下K3两次时设置闹钟的分{aminite++;if(aminite==60)aminite=0;write_add(0x48,aminite);}if(F_k3==3) //按下K3三次时设置闹钟的时{ahour++;if(ahour==24)ahour=0;write_add(0x45,ahour);}}}}void key3(){if(k3==0){delay_key(100);if(k3==0){while(!k3);F_k3++;if(F_k3==4) //K3等于四次时直接跳入闹钟显示{F_k3=0;write_com(0x0c);}if(F_k3==1)display(ahour,aminite,asecond);}}}。

单片机制作数字钟(含万年历、秒表功能)

单片机制作数字钟(含万年历、秒表功能)

数字钟、万年历制作(基于单片机)电路原理图:程序://********************20131206****数字钟程序#pragma SMALL#include <reg51.h>#include <absacc.h>#include <intrins.h>//********************************************************* *********编译预处理void display(unsigned char *p); //显示函数,P为显示数据首地址unsigned char keytest(); //按键检测函数unsigned char search(); //按键识别函数void alarm(); //闹钟判断启动函数void ftion0(); //始终修改函数void ftion1(); //闹钟修改函数void ftion3(); //日期修改函数void cum(); //加1修改函数void minus(); //减1修改函数void jinzhi(); //进制修改函数void riqi(); //日期void stopwatch(); //秒表函数//********************************************************* *******函数声明sbit P2_7=P2^7;//********************************************************* *******端口定义unsigned char clockbuf[3]={0,0,0};unsigned char bellbuf[3]={0,0,0};unsigned char date[3]={1,1,1}; //日期存放数组unsigned char stop[3]={0,0,0};unsigned char msec1,msec2;unsigned char timdata,rtimdata,dtimdata;unsigned char count;unsigned char *dis_p;unsigned char or; //12进制控制标志unsigned char ri; //日期显示控制标志位unsigned char mb; //秒表控制标志位bit arm,rtim,rhour,rmin,hour,min,sec,day,mon,year; //定义位变量//********************************************************* *****全局变量定义void main(){unsigned char a;or=0; //12进制修改标志清零ri=0;mb=0;P2_7=0;arm=0;msec1=0;msec2=0;timdata=0;rtimdata=0;count=0;TMOD=0x12;TL0=0x06;TH0=0x06;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;dis_p=clockbuf;while(1){a=keytest();if(a==0x78) //判断是否有键按下{display(dis_p);if(arm==1) alarm();}else{display(dis_p);a=keytest();if(a!=0x78){a=search();switch(a){case 0x00:ftion0();break;case 0x01:ftion1();break;case 0x02:cum();break;case 0x06:jinzhi();break;case 0x03:riqi();break;case 0x04:ftion3();break;case 0x05:minus();break;case 0x07:stopwatch();break;case 0x09:TR1=1;break;case 0x0a:TR1=0;break;case 0x0b:stop[0]=0;stop[1]=0;stop[2]=0;break;default:break;}}}}}//********************************************主函数【完】void display(unsigned char *p){unsigned char buffer[]={0,0,0,0,0,0};unsigned char k,i,j,m,temp;unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};buffer[0]=p[0]/10;buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;if((sec==0)&&(min==0)&&(hour==0)&&(rmin==0)&&(rhour==0)&&( day==0)&&(mon==0)&&(year==0)) //没有修改标志,正常显示{for(k=0;k<3;k++){temp=0x01;for(i=0;i<6;i++){P0=0x00; //段选端口j=buffer[i];P0=led[j];P1=~temp; //位选端口temp<<=1;for(m=0;m<200;m++);}}}else //若有修改标志,则按以下标志分别显示{if(sec==1||day==1){P1=0x1f;i=buffer[5];P0=led[i];for(m=0;m<200;m++);P1=0x2f;j=buffer[4];P0=led[j];for(m=0;m<200;m++);}if(min==1||rmin==1||mon==1){P1=0x3b;i=buffer[2];P0=led[i];for(m=0;m<200;m++);P1=0x37;j=buffer[3];P0=led[j];for(m=0;m<200;m++);}if(hour==1||rhour==1||year==1) {P1=0x3e;i=buffer[0];P0=led[i];for(m=0;m<200;m++);P1=0x3d;j=buffer[1];P0=led[j];for(m=0;m<200;m++);}}}//**********************************LED显示函数【完】unsigned char keytest(){unsigned char c;P2=0x78; //检测是否有键按下c=P2;c=c&0x78;return(c);}//******************************************键盘检测函数【完】unsigned char search(){unsigned char a,b,c,d,e;c=0x3f;a=0; //行号while(1){P2=c;d=P2;d=d&0x07;if(d==0x03){b=0;break;} //列号else if(d==0x05){b=1;break;}else if(d==0x06){b=2;break;}a++;c>>=1;if(a==5){a=0;c=0x3f;}}e=a*3+b;do{display(dis_p);}while((d=keytest())!=0x78);return(e);}//***********************************************查键值函数【完】void alarm(){if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P2_7=1;rtim=1;if(count==10){count=0;P2_7=0;arm=0;rtim=0;}}}//****************************************闹钟判断启动函数【完】void ftion0(){TR0=0;rhour=0;rmin=0;dis_p=clockbuf;rtimdata=0;timdata++;switch(timdata){case 0x01:sec=1;break;case 0x02:sec=0;min=1;break;case 0x03:min=0;hour=1;break;case 0x04:timdata=0;hour=0;TR0=1;break;default:break;}}//*********************************************时钟设置函数【完】void ftion1(){if(TR0==0) TR0=1;sec=0;min=0;hour=0;dis_p=bellbuf;timdata=0;rtimdata++;switch(rtimdata){case 0x01:rmin=1;break;case 0x02:rmin=0;rhour=1;break;case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;default:break;}}//*********************************************闹钟设置函数【完】void ftion3(){if(TR0==0) TR0=1;day=0;mon=0;year=0;dis_p=date;timdata=0;rtimdata=0;dtimdata++;switch(dtimdata){case 0x01:day=1;break;case 0x02:day=0;mon=1;break;case 0x03:mon=0;year=1;break;case 0x04:dtimdata=0;year=0;dis_p=clockbuf;break;default:break;}}//*************************************************日期修改函数【完】void minus(){if(sec==1){if(0==clockbuf[2]) clockbuf[2]=59;else clockbuf[2]--;}else if(min==1){if(0==clockbuf[1]) clockbuf[1]=59;else clockbuf[1]--;}else if(hour==1){if(or==0) //判断进制{if(0==clockbuf[0]) clockbuf[0]=23;else clockbuf[0]--;}if(or==1){if(1==clockbuf[0]) clockbuf[0]=12;else clockbuf[0]--;}}else if(rmin==1){if(bellbuf[1]==0) bellbuf[1]=59;else bellbuf[1]--;}else if(rhour==1){if(or==0){if(bellbuf[0]==0) bellbuf[0]=23;else bellbuf[0]--;}if(or==1){if(bellbuf[0]==1) bellbuf[0]=12;else bellbuf[0]--;}}else if(day==1){if(date[2]==1) date[2]=31;else date[2]--;}else if(mon==1){if(date[1]==1) date[1]=12;else date[1]--;}else if(year==1){if(date[0]==1) date[0]=99;else date[0]--;}}//*************************************减1修改功能函数【完】void cum(){if(sec==1){if(59==clockbuf[2]) clockbuf[2]=0;else clockbuf[2]++;}else if(min==1){if(59==clockbuf[1]) clockbuf[1]=0;else clockbuf[1]++;}else if(hour==1){if(or==0) //判断进制{if(23==clockbuf[0]) clockbuf[0]=0;else clockbuf[0]++;}if(or==1){if(12==clockbuf[0]) clockbuf[0]=1;else clockbuf[0]++;}}else if(rmin==1){if(bellbuf[1]==59) bellbuf[1]=0;else bellbuf[1]++;}else if(rhour==1){if(or==0){if(bellbuf[0]==23) bellbuf[0]=0;else bellbuf[0]++;}if(or==1){if(bellbuf[0]==12) bellbuf[0]=1;else bellbuf[0]++;}}else if(day==1){if(date[2]==31) date[2]=1;else date[2]++;}else if(mon==1){if(date[1]==12) date[1]=1;else date[1]++;}else if(year==1){if(date[0]==99) date[0]=0;else date[0]++;}}//*************************************加1修改功能函数【完】void jinzhi(){if(or==0) or=1;else or=0;}//***********************************进制修改控制函数【完】void riqi(){if(ri==0){dis_p=date;}if(ri==1){dis_p=clockbuf;}ri++;if(ri==2) ri=0;}//********************************日期控显示函数【完】void stopwatch(){if(mb==0){dis_p=stop;mb=1;}else{mb=0;dis_p=clockbuf;}}//************秒表**********秒表**********秒表函数【完】void clock() interrupt 1{EA=0;if(msec1!=0x14) msec1++; //6MHz晶振定时10mselse{msec1=0;if(msec2!=100) msec2++; //定时1selse{if(rtim==1) count++; //闹钟启动标志计时10smsec2=0;if(clockbuf[2]!=59) clockbuf[2]++;else{clockbuf[2]=0;if(clockbuf[1]!=59) clockbuf[1]++;else{clockbuf[1]=0;if(or==0){if(clockbuf[0]!=23) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}if(or==1){if(clockbuf[0]!=12) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}}}}}EA=1;}//*******************************定时器0中断函数【完】void miaobiao() interrupt 3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(stop[2]!=99) stop[2]++;else{stop[2]=0;if(stop[1]!=59) stop[1]++;else{stop[1]=0;if(stop[0]!=59) stop[0]++;else stop[0]=0;}}}//***********************************定时器1中断函数【完】。

单片机时钟原理图及程序

单片机时钟原理图及程序

功能说明:1.开机时,显示12:00:00的时间计时2.P0.0控制“秒”的调整,每按一次加1秒3.P0.1控制“分”的调整,每按一次加1分4.P0.2控制“时”的调整,每按一次加1个小时一.相关知识:多位数(DIGIT)的驱动方式1.如采用直接驱动发驱动4个7段显示器,共要32条的I/O线;而采用解码器驱动也要16条I/O线.形成了I/O端口的浪费.2.扫描显示法所需的I/O数为8+n条(n个显示器),可节省硬件电路。

3.扫描法要注意两点:(1)点亮时要让LED得到最大的顺向电流,通常一个LED要10mA.在做四位数的扫描时,每一个LED的平均电流值只有1/4的最高电流,因此扫描时要得到适当的亮度最好有30mA以上的瞬间电流,即将LED的限流电阻降低到20~100欧.(2) 在切至下一个显示器时,应把上一个先关闭一段时间(50us),再将下一个显示器扫描信号送出,以避免上一个显示器数据显示到下一个显示,即避免鬼影.4. 扫描频率必须高于视觉暂留频率16MHZ以上(即62毫秒)ORG 00HJMP STARTORG 0BH ;T0中断起始地址JMP T1MO ;跳到中断子程序START: MOV SP,#70H ;设置堆栈指针在70HMOV 28H,#00 ;;设置寄存器初值00HMOV 2AH,#12H ;时寄存器初值为12HMOV 2BH,#00 ;分寄存器初值为00HMOV 2CH,#00 ;秒寄存器初值为00HMOV TMOD,#00000001B ;设T0为方式1(16位定时器/计数器)MOV TH0,#HIGH(65536-4000) ;计时中断为4000usMOV TL0,#LOW(65536-4000)MOV IE,#10000010B ;T0中断使能,CPU中断允许,允许定时/计数器申请中断MOV R4,#250 ;中断250次SETB TR0 ;启动定时器0LOOP: JB P0.0,N2 ;P0.0(秒)按了?不是到N1CALL DELAY ;消除抖动MOV A,2CH ;将秒寄存器的值装入AADD A,#01 ;将A的值加1DA A ;做十进制调整MOV 2CH,A ;将A的值装入秒寄存器CJNE A,#60H,N1 ;是否等于60秒?不到N1MOV 2CH,#00 ;是则清除秒寄存器的值为00N1: JNB P0.0,$ ;P0.0放开了吗,P0.0=0等待CALL DELAY ;消除抖动N2: JB P0.1,N4 ; P0.1(分)按了?不是到N4(没按P0.1=1)CALL DELAY ;消除抖动MOV A,2BH ;将分寄存器的值装入AADD A,#01DA AMOV 2BH,A ;将分寄存器的值装入ACJNE A,#60H,N3 ;是否等于60分?不到N3MOV 2BH,#00 ;是则清除分寄存器的值00N3: JNB P0.1,$ ;P0.1(分)放开了?CALL DELAY ;消除抖动N4: JB P0.2,LOOP ; P0.2(时)按了?不是LOOPCALL DELAY ;消除抖动MOV A,2AH ;将时寄存器的值AADD A,#01 ;A的值加1DA AMOV 2AH,A ;A的值到时寄存器CJNE A,#24H,N5 ;是否等于24时?不到N5MOV 2AH,#00 ;是则清除时寄存器的值00N5: JNB P0.2,$ ; P0.2(时)放开了?CALL DELAY ;消除抖动JMP LOOPT1MO: MOV TH0,#HIGH(65536-4000) ;重设计时4000usMOV TL0,#LOW(65536-4000)PUSH ACC ;将A的值压入堆栈PUSH PSW ;将PSW的值压入堆栈DJNZ R4,X2 ;计时1秒(R4减1不等于0转)MOV R4,#250CALL CLOCK ;调用计时子程序CALL DISP ;调用显示子程序X2: CALL SCAN ;调用扫描子程序POP PSW ;将PSW的值从堆栈取出POP ACCRETISCAN: MOV R0,#28H ;(28H)为扫描指针INC @R0 ;扫描指针加1CJNE @R0,#6,X3 ;扫描完6个显示器?否到X3MOV @R0,#0 ;是扫描指针为0X3: MOV A,@R0 ;扫描指针AADD A,#20H ;A加常数20H(显示寄存器地址)=各时间显示区地址MOV R1,A ;扫描指针到R1MOV A,@R0 ;将A高低4位互换(P1高4位SWAP A ;为扫描值,低4位为显示数据值ORL A,@R1 ;扫描值加显示值MOV P1,A ;输出到P1RETCLOCK: MOV A,2CH ;(2CH)为秒寄存器ADD A,#1 ;加1秒DA A ;做十进制调整MOV 2CH,A ;存入秒寄存器CJNE A,#60H,X4 ;是否超过60秒,否到X4MOV 2CH,#00 ;是则清0MOV A,2BHADD A,#1DA AMOV 2BH,ACJNE A,#60H,X4MOV 2BH,#00MOV A,2AHADD A,#1DA AMOV 2AH,ACJNE A,#24H,X4MOV 2AH,#00X4: RETDISP: MOV R1,#20H ;R1=20HMOV A,2CH ;将秒寄存器到AMOV B,#10H ;B=10HDIV AB ;A/B商存入A,余数存入BMOV @R1,B ;B到(20H)INC R1 ;R1=21HMOV @R1,A ;A到(21H)INC R1 ;R1=22HMOV A,2BH ;分寄存器AMOV B,#10H ;B=10HDIV ABMOV @R1,B ;B的内容到(22H)INC R1 ;R1=23HMOV @R1,A ;A到(23H)INC R1 R1=24HMOV A,2AH ;时寄存器的内容AMOV B,#10HDIV ABMOV @R1,B ;B的内容到(24H)INC R1 ;R1=25HMOV @R1,A ;A的内容到(25H)RETDELAY: MOV R6,#60 ;延时5豪秒D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETEND。

电子时钟基于AT89c51单片机设计电路图及程序

电子时钟基于AT89c51单片机设计电路图及程序

电子时钟基于AT89c51单片机的设计电子时钟原理图开机显示仿真图: 当按下仿真键时电子时钟开机页面显示第一行显示JD12102Class--16,第二行显示动态TINE:12:00:04。

电子时钟调时间仿真图:当按下K1为1次时,光标直接跳到电子时钟的秒,可以按下K2进行调节。

当按下K1为2次时,光标直接跳到电子时钟的分,可以按下K2进行调节。

当按下K1为3次时,光标直接跳到电子时钟的时,可以按下K2进行调节。

当按下K1为4次时,光标直接跳完,电子时钟可以进行正常计时。

电子时钟闹钟调节仿真:当按下K3为1次时,直接跳到闹钟显示界面00:00:00,按下K2可以对闹钟的秒进行调节。

当按下K3为2次时,可以调到分,按下K2可以对闹钟的分进行调节。

当按下K3为3次时,可以调到时,按下K2可以对闹钟的时进行调节。

当按下K3为4次时,直接跳到计时界面,对闹钟进行到计时,时间到可以发出滴滴声。

#include<reg51.h>#define uchar unsigned char //预定义一下#define uint unsigned intuchar table[]="JD12102Class--21"; //显示内容sbit lcden=P3^4; //寄存器EN片选引脚sbit lcdrs=P3^5; //寄存器RS选择引脚sbit beep=P3^6; //接蜂鸣器extern void key1();extern void key2();extern void key3();uchar num,hour=12,minite,second,ahour,aminite,asecond,a,F_k1,F_k2,F_k3; //定义变量void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;P0=com; //送出指令,写指令时序delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){lcdrs=1;P0=date; //送出数据,写指令程序delay(5);lcden=1;delay(5);lcden=0;}void write_add(uchar add,uchar date){uchar aa,bb;aa=date/10;bb=date%10;write_com(0x80+add);write_data(0x30+aa);write_data(0x30+bb);}void init() //初始化{lcden=0;write_com(0x38); //设置16*2显示,5*7点阵write_com(0x0c); //开显示,不显示光标write_com(0x06); //地址加1,写入数据是光标右移1位write_com(0x01); //清屏write_com(0x80); //起点为第一行第一个字符开始}void display(uchar h,uchar m,uchar s) //显示设计程序{{write_com(0x80+0x16);}{write_com(0xC0+0x00);write_data('T');write_data('I');write_data('M');write_data('E');write_data(':');write_data(0x30+(h/10));write_data(0x30+(h%10));write_data(':');write_data(0x30+(m/10));write_data(0x30+(m%10));write_data(':');write_data(0x30+(s/10));write_data(0x30+(s%10));write_data(' ');write_data(' ');write_data(' ');} }void main(){init();TMOD=0X01; //设置T0定时方式1 TH0=(65535-50000)/256; //设置初值TL0=(65535-50000)%256;EA=1; //开总中断TR0=1; //启动T0ET0=1;for(num=0;num<16;num++) //依次读出数据{write_data(table[num]);}while(1){key1();key2();key3();if(ahour==hour&&aminite==minite&&second<10) //时间到闹钟响{beep=~beep;}if(F_k1==0&F_k3==0) //K1和K3按下次数为零就直接显示时分秒display(hour,minite,second);}}void timer0() interrupt 1 //T0中断函数{TH0=(65535-50000)/256; //装载计数器初值TL0=(65535-50000)%256;a++;if(a==20){ //进位设置60秒进1分,60分进1时,24时进0时a=0;second++;if(second==60){second=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}}#include <reg51.h> //调时间程序#define uchar unsigned char#define uint unsigned intsbit k1=P1^0; //定义3个变量sbit k2=P1^1;sbit k3=P1^2;extern uchar F_k1,F_k3,second,minite,hour,ahour,aminite,asecond; //预定义变量extern void write_com(uchar com);extern void write_add(uchar add,uchar date);extern void display(uchar h,uchar m,uchar s);void delay_key(int i){while(i--);}void key1(){if(k1==0) //按下K1零次时,直接计时与开机显示{delay_key(100);if(k1==0){TR0=0;while(!k1);F_k1++;if(F_k1==4){F_k1=0;write_com(0x0c);TR0=1;}}}if(F_k1==1|F_k3==1){write_com(0xC0+0x0c);write_com(0x0f);}if(F_k1==2|F_k3==2)write_com(0xC0+0x09);if(F_k1==3|F_k3==3)write_com(0xC0+0x06);}void key2(){if(k2==0){delay_key(100);while(!k2);if(F_k1==1) //按下K1一次时设置闹钟的秒{second++;if(second==60)second=0;write_add(0x4b,second);}if(F_k1==2) //按下K3两次时设置闹钟的分{minite++;if(minite==60)minite=0;write_add(0x48,minite);}if(F_k1==3) // 按下K1三次时设置闹钟的时{hour++;if(hour==24)hour=0;write_add(0x45,hour);}if(F_k3==1) //按下K3一次时设置闹钟的秒{asecond++;if(asecond==60)asecond=0;write_add(0x4b,asecond);}if(F_k3==2) //按下K3两次时设置闹钟的分{aminite++;if(aminite==60)aminite=0;write_add(0x48,aminite);}if(F_k3==3) //按下K3三次时设置闹钟的时{ahour++;if(ahour==24)ahour=0;write_add(0x45,ahour);}}}void key3(){if(k3==0){delay_key(100);if(k3==0){while(!k3);F_k3++;if(F_k3==4) //K3等于四次时直接跳入闹钟显示{F_k3=0;write_com(0x0c);}if(F_k3==1)display(ahour,aminite,asecond);}}}。

基于单片机控制的电子时钟设计(完整版图纸直接可用)

基于单片机控制的电子时钟设计(完整版图纸直接可用)

中图分类号:基于单片机控制的电子时钟设计专业名称:应用电子技术学生姓名:王明宗导师姓名:王春霞职称:讲师焦作大学机电工程学院2012年 12 月中图分类号:密级:UDC:单位代码:基于单片机控制的电子时钟设计Based on single-chip microcomputer control the design of the electronic clock焦作大学机电工程学院摘要现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。

对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。

数码管显示的时间简单明了而且读数快、时间准确显示到秒。

所以数字电子钟的精度、稳定度远远超过老式机械钟。

而机械式的依赖于晶体震荡器,可能会导致误差。

在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,并在数码管上显示相应的时间。

关键词:单片机 AT89S51 电子时钟ABSTRACTModern life people pay more and more attention to up the concept of time, can say time and money off the equal sign. For those who grasp of time is very strict and accurate person or thing, it is not accurate time will bring very big trouble, so to digital tube for display clock than pointer clock showed a lot of advantages. Digital tube display time simple and fast reading, time accurate display to seconds. So the digital clock accuracy, stability is far more than the old mechanical clock. And mechanical dependent on the crystal oscillators, may lead to error. In this design, we adopt LED digital tube display, points, SEC to 24 hours time way, according to the principle of dynamic display of digital tube to show that AT89S51 chip as the core, with the necessary circuit, design a simple electronic clock, it consists of 4.5 V dc power supply, through the digital tube can accurately display the time, adjusting time, and in the digital tube display the corresponding time.Key word:SCM AT89S51 electronic clock目录第一章引言 (1)1.1数字电子钟的背景 (1)1.2数字电子钟的意义 (1)1.3数字电子钟的应用 (1)第二章设计方案 (3)2.1数字时钟方案 (3)2.2数码管显示方案 (3)第三章系统设计 (4)3.1总体设计 (4)3.2单片机外围控制电路 (4)3.2.1单片机的选择 (4)3.2.2控制电路 (6)3.2.3电源部分 (7)3.2.4复位电路 (8)3.2.5程序下载接口 (8)3.2.6位选部分 (9)3.2.7数码管的连接电路 (9)第四章软件设计 (11)4.1程序流程图 (11)4.2源程序 (13)第五章使用调试 (20)第六章设计总结 (21)参考文献 (22)附录 (23)致谢 (24)第一章引言1.1数字电子钟的背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

2051单片机6位数字钟

2051单片机6位数字钟

2051单片机6位数字钟51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机教程者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。

常见的电子钟程序由显示部分,计算部分,时钟调整部分构成,这样程序就有了一定的长度和难度。

这里我们为了便于大家理解和掌握单片机,我们把时钟调整部分去除,从而够成了这个简单的电子钟程序。

时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。

10秒位到5后,即59秒,分钟加1,10秒位回0。

依次类推,时钟最大的显示值为23小时59分59秒。

这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。

开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。

电路原理图:为了节省硬件资源,电路部分采用6位共阳极动态扫描数码管,数码管的段位并联接在51单片机的p0口,控制位分别由6个2N5401的PNP三极管作驱动接在单片机的p2.1, p2.2,p2.3,p2.4,p2.5,p2.6口。

从标号star开始把这些位全部清除为0,从而保证了开始时显示时间为0时0分0秒。

然后是程序的计算部分:inc a_bit(秒位),这里用到了一个inc指令,意思是加1,程序运行到这里自动加1。

然后把加1后的数据送acc:mov a,a_bit (秒位),这时出现了一个问题,如果不断往上加数字不会加爆?所以有了下面的一句话cjne a,#10,stlop; 如果秒位到10那么转到10秒处理程序。

cjne 是比较的意思,比较如果a等于10 就转移到10秒处理程序,实际上也就限定了在这里a的值最大只能为9,同时mov a_bit,#00h,这时a_bit(秒位)被强行清空为0,又开始下一轮的计数。

51单片机的24c02电子时钟程序和电路图

51单片机的24c02电子时钟程序和电路图
{
fen++;
if(fen==60)fen=0;
write_sfm(shi,fen,miao);
write_cmd(0xc0+7);
write_add(2,fen);
}
if(s1num==3)
{
shi++;
if(shi==60)shi=0;
write_sfm(shi,fen,miao);
write_cmd(0xc0+4);
}
void keyscan()
{
if(s1==0)//如果功能按键1按下
{
delayms(5);//去抖动
if(s1==0)
{
while(!s1);//等待松手
s1num++;//主要还是记下次数
di();//蜂鸣器响
if(s1num==1)//按一下秒钟
{
TR0=0;
write_cmd(0xc0+10);//指针显示闪烁
sbit lcdrs=P2^4;//液晶的控制角
sbit lcdrw=P2^5;
sbit lcden=P2^6;
sbit s1=P3^0;//三个调时钟的按键
sbit s2=P3^1;
sbit s3=P3^2;
sbit beep=P2^3;//蜂鸣器
uchar count,s1num;
char miao,shi,fen;
delayms(1);
}
void write_sfm(uchar s,uchar f,uchar m)//数据在液晶显示
{
uchar ss,sg,fs,fg,ms,mg;
ss=s/10;sg=s%10;

数字钟 单片机 显示时间按

数字钟 单片机 显示时间按

小小电子闹钟生活学习良伴———一款电路极简的单片机电子钟设计详解电路特点这里介绍的电子钟,电路可称得上极简,它仅使用单片的20引脚单片机完成电子钟的全部功能,而笔者见到的其它设计方案均采用二片以上的多片IC实现。

电路见图1。

一片20引脚的单片机AT89C2051为电子钟主体,其显示数据从P1口分时输出,P3.0~3.3则输出对应的位选通信号。

由于LED数码管点亮时耗电较大,故使用了四只PNP型晶体管VT1~VT4进行放大。

本来笔者还有一种更简的设计方案(见图2),可省去VT1~VT4及R1~R4八个元件,但这种设计由于单片机输出口的灌入电流有限(约20mA),数码管亮度较暗而不向读者介绍,除非你采用了高亮度的发光数码管。

P3.4、P3.5、3.7外接了三个轻触式按键,这里我们分别命名为:模式设定键set(P3.4)、时调整键hour(P3.5)、分调整键min(P3.7)。

C1、R13组成上电复位电路。

VT5及蜂鸣器Bz为闹时讯响电路。

三端稳压器7805输出的5V电压供整个系统工作。

此电子钟可与任何9~20V/100mA的交直流电源适配器配合工作,适应性强。

电子钟功能1.走时:通过模式设定键set选择为走时,U1、U2显示小时,U3、U4显示分。

U2的小数点为秒点,每秒闪烁一次。

2.走时调整:通过模式设定键set选择为走时调整,按下hour键对U1、U2的走时“时”显示进行调整(每0.2秒递加1)。

按下min键对U3、U4的走时“分”显示进行调整(每0.2秒递加1)。

3.闹时调整:通过模式设定键set选择为闹时调整,按下hour键对U1、U2的闹时“时”显示进行调整(每0.2秒递加1)。

按下min键对U3、U4的闹时“分”显示进行调整(每0.2秒递加1)。

4.闹时启/停设定:通过模式设定键set选择为闹时启/停设定,按下min键U3的小数点点亮,闹时功能启动;按下hour键U3的小数点熄灭,闹时功能关停。

基于单片机控制的电子钟的电路及制作

基于单片机控制的电子钟的电路及制作

LED显示电脑电子钟电路原理图本例介绍一种用LED制作的电脑电子钟(电脑万年历)。

其制作完成装潢后的照片如下图:上图中,年、月、日及时间选用的是1.2寸共阳数码管,星期选用的是2.3寸数码管,温度选用的是0.5寸数码管,也可根据个人的爱好选用不同规格的数码管。

原理图如下图所示:基于单片机控制的电子钟的电路及制作基于单片机控制的电子钟的电路及制作以“基于单片机控制的电子钟”(以下简称电子钟)为一周教学的重点内容。

其中单片机教学内容占一周劳技课时的1/2,在实践中我以理论知识为基础,分析和解决作品中的故障为着重点,使学生在学习、制作与调试过程中,掌握单片机系统的应用;以调试作品为抓手,对作品出现的故障进行分析,在分析故障的过程中,运用一定的策略,使学生更快、更准确的找到故障原因,并进行排除。

通过探究与分析、尝试与体验、交流与感悟,提高学生发现问题与解决实际问题的能力,并培养学生团队意识与严谨、细致、耐心的工作态度,强化质量意识和效率意识。

了解和解决硬件方面的问题,能为今后编程打下扎实的基础。

以下为本人的教学过程和教学心得。

1、载体的选用。

根据课程标准,设计实践效果与趣味性相结合的载体——“基于单片机控制的电子钟”(以下简称电子钟)(图一)。

电子钟是单片机教学中非常经典的一个应用案例。

因为电子钟,它符合了单片机系统应用的五部分要求(图二),同时还有输出效果显而易见,调试过程方便等优点,在学生制作与编程过程中容易查找到作品故障的原因,所以结合本中心的特点选用了电子钟。

在选用电子钟的控制芯片-单片机时,选用了易于学生操作的芯片和编程软件,同时又能充分体现单片机的作用。

2、电路图分解后教学。

将单片机系统应用的五部分电路图分解后进行解读。

我从学生的感受出发,考虑我的教学行为,从帮助学生学习的角度思考,我该怎么教。

考虑到电路图的复杂性,学生在读图和理解方面有难度,所以根据单片机系统应用的五部分将电路图分解后进行讲解(图三)。

基于单片机的数码管电子时钟PPT

基于单片机的数码管电子时钟PPT

图3-2
3.3.2复位电路设计 MCS—51复位电路有两种:一种是加电自动复位电路, 一种是开关复位电路。本实验采用的是开关复位电路。
图3-3
如图3-3所示,复位电路主要由型号为10UF/16V的电 解电容,型号为104的瓷片电容,10K的电阻以及按键S构 成,S接芯片的相应引脚RST,当开关按下时引脚RST为高 电平1,断开时引脚为低电平0。
第4章 原理图及PCB图
4.1原理图:
4.2 PCB图:
第5章 程序流程图
ห้องสมุดไป่ตู้
3.3.3位选模块电路设计
图3-4
图3-4为位选电路,三极管的集电极接数码管的公共端,当P2口对应的 引脚输出高电平时三极管导通,对应的数码管显示数据。这样,在同一时刻, 6位LED中只有选通的那1位显示出字符,而其他5位则是熄灭的。同样,在下 一时刻,只让下一位的位选线处于选通状态,而其他个位的位选线处于关闭 状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示 出相应的字符,而其他各位则是熄灭的。如此循环下去,就可以使各位显示 出将要显示的字符。虽然这些字符是在不同时刻出现的,而在同一时刻,只 有一位显示,其他各位熄灭,但由于LED的余辉和人眼的视觉暂留作用,只 要每位显示间隔足够短,则可以造成多位同时亮的假象,达到同时显示的效 果。
3.3.4显示模块部分 显示电路分为共阳极七段数码管显示和发光二极管显示,其中, 为了能够自动识别显示电路是接发光二极管还是数据管及接数据管 的多少,该电路采用读取数码管I/O引脚的方法确定,从而达到智 能识别的目的。 该模块由共阳极LED数码管组成,用来显示电子钟信号的具体 路数的,6个引脚分别与单片机6个输出口连接,根据单片机引脚与 数码管的连接关系,可以列出显示不同数字的段选码,从而准确显 示出时间。如图3-5所示。

数字钟时钟电路图

数字钟时钟电路图

目录前言: (4)1.设计目的 (6)2.设计功能要求 (6)3.电路设计1111111111 (6)3.1设计方案 (6)3.2单元电路的设计 (7)3.2.1 主体电路部分 (7)3.2.1.1 振荡电路 (8)3.2.1.2 计数电路 (12)3.2.1.3 校时电路 (17)3.2.1.4 译码与显示电路 (19)3.2.2扩展功功能电路的设计 (21)3.2.2.1定时控制电路 (21)3.2.2.2 仿广播电台正点报时电路 (23)3.2.2.3 自动报整点时数电路 (24)3.2.2.4 触摸报整点时数电路 (26)4.调试 (27)4.1主体电路部分 (27)4.2 扩展电路部分 (29)5.总结 (31)致 (32)参考文献 (33)附录 (34)1.设计目的设计一种多功能数字钟,该数字钟具有基本功能和扩展功能两部分。

其中,基本功能部分的有准确计时,以数字形式显示时、分、秒的时间和校时功能。

扩展功能部分则具有:定时控制、仿广播电台正点报时、自动报整点时数和触摸报正点的功能。

数字钟的电路也是由主体电路和扩展电路两部分构成,在电路中,基本功能部分由主体电路实现,而扩展功能部电路实现。

这两部分都有一个共同特点就是它们都要用到振荡电路提供的1Hz脉冲信号。

在计时出现误差时电路还可以进行校时和校分,为了使电路简单所设计的电路不具备校秒的功能。

并且要用数码管显示时、分、秒,各位均为两位显示,扩展部分要有相应的响应电路。

分则由扩展2.设计功能要求基本功能:(1)时的计时要求为“12翻1”,分和秒的计时要求为60进制(2)准确计时,以数字形式显示时,分,秒的时间(3)校正时间扩展功能:(1)定时控制;(2)仿广播电台报时功能;(3)自动报整点时数;(4)触摸报整点时数;3.电路设计3.1设计方案根据设计要求首先建立了一个多功能数字钟电路系统的组成框图,框图如图1所示。

主体电路扩展电路图1由图1可知,电路的工作原理是:多功能数字钟电路由主体电路和扩展电路两大部分组成。

2051单片机6位数字钟

2051单片机6位数字钟

2051单片机6位数字钟51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机教程者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。

常见的电子钟程序由显示部分,计算部分,时钟调整部分构成,这样程序就有了一定的长度和难度。

这里我们为了便于大家理解和掌握单片机,我们把时钟调整部分去除,从而够成了这个简单的电子钟程序。

时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。

10秒位到5后,即59秒,分钟加1,10秒位回0。

依次类推,时钟最大的显示值为23小时59分59秒。

这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。

开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。

电路原理图:为了节省硬件资源,电路部分采用6位共阳极动态扫描数码管,数码管的段位并联接在51单片机的p0口,控制位分别由6个2N5401的PNP三极管作驱动接在单片机的p2.1, p2.2,p2.3,p2.4,p2.5,p2.6口。

从标号star开始把这些位全部清除为0,从而保证了开始时显示时间为0时0分0秒。

然后是程序的计算部分:inc a_bit(秒位),这里用到了一个inc指令,意思是加1,程序运行到这里自动加1。

然后把加1后的数据送acc:mov a,a_bit (秒位),这时出现了一个问题,如果不断往上加数字不会加爆?所以有了下面的一句话cjne a,#10,stlop; 如果秒位到10那么转到10秒处理程序。

cjne 是比较的意思,比较如果a等于10 就转移到10秒处理程序,实际上也就限定了在这里a的值最大只能为9,同时mov a_bit,#00h,这时a_bit(秒位)被强行清空为0,又开始下一轮的计数。

AT89C51单片机时钟电路

AT89C51单片机时钟电路

AT89C51单片机时钟电路工程设计AT89C51单片机时钟电路工程设计目录任务书摘要前言说明书第一章电路原理分析1-1 显示原理1-2 数码管结构及代码显示1-3 键盘及读数原理1-4 连击功能的实现第二章程序设计思想和相关指令介绍2-1 数据与代码转换2-2 计时功能的实现与中断服务程序2-3 时间控制功能与比较指令2-4 时钟误差的分析附录A 电路图附录B 存储单元地址表附录C 输入输出口功能分配表附录D 定时中断程序流程图附录F 调时功能流程图附录G 程序清单摘要单片计算机即单片微型计算机。

(Single-Chip Microcomputer ),是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。

他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。

而51 单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

前言本文通过用对一个能实现定时,时钟,日历显示功能的时间系统的设计学习,详细介绍了51 单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理、从而达到学习,了解单片机相关指令在各方面的应用。

系统由AT89C51、LED 数码管、按键、二极管等部分构成,能实现时钟日历的功能:能进行时、分、秒的显示。

也具有日历计算、显示和时钟,日历的校准、定时时间的设定,实现三路开关定时输出等功能。

文章后附有电路图,程序清单,各数据存储单元的所在地址,输入输出口对应表。

以供读者参考。

因作者本人也是个初学者,水平有限,难免有疏落不足之处,敬请老师和同学能给与批评正。

说明书系统由AT89C51、LED 数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。

系统的功能选择由SB0、SB1、SB2、SB3、SB4 完成。

其中SB0为时间校对,定时器调整功能键,按SB 0 进入调整状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字钟设计一、设计目的1. 熟悉集成电路的引脚安排。

2. 掌握各芯片的逻辑功能及使用方法。

3. 了解面包板结构及其接线方法。

4. 了解数字钟的组成及工作原理。

5. 熟悉数字钟的设计与制作。

二、设计要求1.设计指标时间以24小时为一个周期;显示时、分、秒;有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。

2.设计要求画出电路原理图(或仿真电路图);元器件及参数选择;电路仿真与调试;PCB文件生成与打印输出。

3.制作要求自行装配和调试,并能发现问题和解决问题。

4.编写设计报告写出设计与制作的全过程,附上有关资料和图纸,有心得体会。

三、设计原理及其框图1.数字钟的构成数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。

由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。

通常使用石英晶体振荡器电路构成数字钟。

图3-1所示为数字钟的一般构成框图。

图3-1 数字钟的组成框图⑴晶体振荡器电路晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。

不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。

⑵分频器电路分频器电路将32768Hz的高频方波信号经32768()次分频后得到1Hz的方波信号供秒计数器进行计数。

分频器实际上也就是计数器。

⑶时间计数器电路时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。

⑷译码驱动电路译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。

⑸数码管数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管。

2.数字钟的工作原理1)晶体振荡器电路晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。

图3-2所示电路通过CMOS非门构成的输出为方波的数字式晶体振荡电路,这个电路中,CMOS非门U1与晶体、电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波。

输出反馈电阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器。

电容C1、C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能。

由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。

晶体XTAL的频率选为32768HZ。

该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。

从有关手册中,可查得C1、C2均为30pF。

当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施。

由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为10MΩ。

较高的反馈电阻有利于提高振荡频率的稳定性。

非门电路可选74HC00。

图3-2 COMS晶体振荡器2)分频器电路通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。

通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。

例如,将32768Hz的振荡信号分频为1HZ的分频倍数为32768(215),即实现该分频功能的计数器相当于15极2进制计数器。

常用的2进制计数器有74HC393等。

本实验中采用CD4060来构成分频电路。

CD4060在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便。

CD4060计数为14级2进制计数器,可以将32768HZ的信号分频为2HZ,其内部框图如图3-3所示,从图中可以看出,CD4060的时钟输入端两个串接的非门,因此可以直接实现振荡和分频的功能。

图3-3 CD4046内部框图3)时间计数单元时间计数单元有时计数、分计数和秒计数等几个部分。

时计数单元一般为12进制计数器计数器,其输出为两位8421BCD码形式;分计数和秒计数单元为60进制计数器,其输出也为8421BCD码。

一般采用10进制计数器74HC390来实现时间计数单元的计数功能。

为减少器件使用数量,可选74HC390,其内部逻辑框图如图2.3所示。

该器件为双2—5-10异步计数器,并且每一计数器均提供一个异步清零端(高电平有效)。

图3-4 74HC390(1/2)内部逻辑框图秒个位计数单元为10进制计数器,无需进制转换,只需将QA与CPB(下降沿有效)相连即可。

CPA(下降没效)与1HZ秒输入信号相连,Q3可作为向上的进位信号与十位计数单元的CPA相连。

秒十位计数单元为6进制计数器,需要进制转换。

将10进制计数器转换为6进制计数器的电路连接方法如图3-5所示,其中Q2可作为向上的进位信号与分个位的计数单元的CPA相连。

图3-5 10进制——6进制计数器转换电路分个位和分十位计数单元电路结构分别与秒个位和秒十位计数单元完全相同,只不过分个位计数单元的Q3作为向上的进位信号应与分十位计数单元的CPA相连,分十位计数单元的Q2作为向上的进位信号应与时个位计数单元的CPA相连。

时个位计数单元电路结构仍与秒或个位计数单元相同,但是要求,整个时计数单元应为12进制计数器,不是10的整数倍,因此需将个位和十位计数单元合并为一个整体才能进行12进制转换。

利用1片74HC390实现12进制计数功能的电路如图3-6所示。

另外,图3-6所示电路中,尚余-2进制计数单元,正好可作为分频器2HZ输出信号转化为1HZ信号之用。

图3-6 12进制计数器电路4)译码驱动及显示单元计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用CD4511作为显示译码电路,选用LED数码管作为显示单元电路。

5)校时电源电路当重新接通电源或走时出现误差时都需要对时间进行校正。

通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可。

根据要求,数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中。

图3-7所示即为带有基本RS触发器的校时电路,图3-7 带有消抖动电路的校正电路6)整点报时电路一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒。

其作用方式是发出连续的或有节奏的音频声波,较复杂的也可以是实时语音提示。

根据要求,电路应在整点前10秒钟内开始整点报时,即当时间在59分50秒到59分59秒期间时,报时电路报时控制信号。

报时电路选74HC30,选蜂鸣器为电声器件。

四、元器件1.实验中所需的器材5V电源。

面包板1块。

示波器。

万用表。

镊子1把。

剪刀1把。

网络线2米/人。

共阴八段数码管6个。

CD4511集成块6块。

CD4060集成块1块。

74HC390集成块3块。

74HC51集成块1块。

74HC00集成块5块。

74HC30集成块1块。

10MΩ电阻5个。

500Ω电阻14个。

30p电容2个。

32.768k时钟晶体1个。

蜂鸣器。

2.芯片内部结构图及引脚图图4-1 7400 四2输入与非门图4-2 CD4511BCD七段译码/驱动器图4-3 CD4060BD 图4-4 74HC390D图4-5 74HC51D 图4-6 74HC303.面包板内部结构图面包板右边一列上五组竖的相通,下五组竖的相通,面包板的左边上下分四组,每组中X、Y列(0-15相通,16-40相通,41-55相通,ABCDE相通,FGHIJ相通,E和F之间不相通。

五、个功能块电路图1.一个CD4511和一个LED数码管连接成一个CD4511驱动电路,数码管可从0---9显示,以次来检查数码管的好坏,见附图5-1。

图5-1 4511驱动电路2.利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00连接成一个十进制计数器,电路在晶振的作用下数码管从0—9显示,见附图5-2。

图5-2 74390十进制计数器3.利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00和一个晶振连接成一个六进制计数器,数码管从0—6显示,见附图5-3。

图5-3 74390六进制计数器4.利用一个六进制电路和一个十进制连接成一个六十进制电路,电路可从0—59显示,见附图5-4。

图5-4 六十进制电路5.利用两个六十进制的电路合成一个双六十进制电路,两个六十进制之间有进位,见附图5-5。

图5-5 双六十进制电路6.利用CD4060、电阻及晶振连接成一个分频——晶振电路,见附图5-6。

图5-6 分频—晶振电路7.利用74HC51D和74HC00及电阻连接成一个校时电路,见附图5-7。

图5-7 校时电路8.利用74HC30和蜂鸣器连接成整点报时电路。

见附图5-8。

图5-8 整点报时电路9.利用两个六十进制和一个十二进制连接成一个时、分、秒都会进位的电路总图,见附图5-9。

21。

相关文档
最新文档