电子钟四位数码管电路原理图
基于51单片机的4位数码管电子钟

原理图附:源程序/***************************************************************************标题:定时器中断 24小时时钟程序效果:数码管显示24小时制时钟(具有调时功能)说明:使用12M晶振,key1=P3^7; key2=P3^6; key3=P3^5; key4=P3^4;数码管位选P1.0~P1.3 ,段选P0,共阳数码管******************************************************************************/ #include<reg52.h>#define uchar unsigned char;#define uint unsigned int;uchar position;uchar tt;uchar second;uchar minute;uchar hour;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9sbit smg_q = P1^0; //数码管千位引脚sbit smg_b = P1^1;sbit smg_s = P1^2;sbit smg_g = P1^3;sbit key1=P3^7; //按键定义sbit key2=P3^6;sbit key3=P3^5;sbit key4=P3^4;void keyscan(); //函数声明void display(unsigned char hour,unsigned char minute);void delay(unsigned int timer);void init();/***********************************************************主函数***********************************************************/ void main(){init();while(1){if(tt==20){tt=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24)hour=0;}}}keyscan();display(hour,minute);delay(1);}}/***********************************************************调时***********************************************************/ void keyscan(){if(key1==0) //小时加1{TR0=0;hour++;if(hour==24)hour=0;delay(200) ;TR0=1;}if(key2==0) // 小时减{TR0=0;hour--;if(hour<0)hour=23;delay(200) ;TR0=1;}if(key3==0) // 分钟加{TR0=0;minute++;if(minute==60)minute=0;delay(200) ;TR0=1;}if(key4==0) // 分钟减{TR0=0;minute--;if(minute<0)minute=59;delay(200) ;TR0=1;}}/***********************************************************初始化***********************************************************/ void init(){tt=0;position=0;second=0;minute=0;hour=0;smg_q=1;smg_b=1;smg_s=1;smg_g=1;key1=1;key2=1;TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}/***********************************************************定时器TO中断***********************************************************/ void t0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;}/***********************************************************显示***********************************************************/void display(unsigned char hour,unsigned char minute){P0=0XFF;switch(position){case 0:smg_g=1;smg_q=0;P0=table[hour/10];break;case 1:smg_q=1;smg_b=0;P0=table[hour%10];if(tt>=10)P0&=0x7f; //小数点以半秒的时间闪烁break;case 2:smg_b=1;smg_s=0;P0=table[minute/10];break;case 3:smg_s=1;smg_g=0;P0=table[minute%10];break;}position++;if(position>3)position=0;}/***********************************************************延时***********************************************************/ void delay(unsigned int time){unsigned int x,y;for(x=time;x>0;x--)for(y=110;y>0;y--);}。
电子钟四位数码管电路原理图

程序:#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchart,s=0,m=11,h=0,qian=0,bai=0,shi=0,ge=0,s0=0,m0=0,h0=0,qian0=0,bai0=0,shi0=0,ge0=0,n1=0; sbit key1=P1^0; //功能sbit key2=P1^1; //加一sbit key3=P1^2; //减一sbit key4=P1^3; //查看秒数bit mm=0;sbit beep=P2^3;uint a;void delay_1ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay(uint i){uint j;for(;i>0;i--)for(j>19;j>0;j--);}/*void clock(){for(a=0;a<=50;a++){beep=1;delay_1ms(200);beep=0;delay_1ms(200);}}*/void timer () interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t++;if(t==20){s++;t=0;if(s==60){m++;s=0;if(m==60){h++;m=0;if(h==24)h=0;}}}}void display(uchar h,uchar m,uchar s) {qian=h/10;bai=h%10;shi=m/10;ge=m%10;P0=num[qian];P2=0xef;delay_1ms(2);P0=0xff;P0=num[bai];P2=0xdf;delay_1ms(2);P0=0xff;P0=num[shi];P2=0xbf;delay_1ms(2);P0=0xff;P0=num[ge];P2=0x7f;delay_1ms(2);P0=0xff;}void display0(uchar h0,uchar m0,uchar s0) {qian0=h0/10;bai0=h0%10;shi0=m0/10;ge0=m0%10;P0=num[qian0];P2=0xef;delay_1ms(2);P0=0xff;P0=num[bai0];P2=0xdf;delay_1ms(2);P0=0xff;P0=num[shi0];P2=0xbf;delay_1ms(2);P0=0xff;P0=num[ge0];P2=0x7f;delay_1ms(2);P0=0xff;}void keyscan()//按键扫描{if(key4==0)mm=!mm;while(!key4)display(m,s,0);if(key1==0){mm=0;delay(20);//消抖if(key1==0) //功能选择{TR0=0;n1++;while(!key1)display(h,m,s);if(n1==7){TR0=1;n1=0;}}}if(n1!=0){if(n1==1){if(key2==0) //调时{ //加delay(20);if(key2==0){h++;if(h==24)h=0;}while(!key2)display(h,m,s);}else if(key3==0) //减{delay(20);if(key3==0){if(h==0)h--;}while(!key3)display(h,m,s);}}if(n1==2){if(key2==0) //调分{delay(20);if(key2==0){m++;if(m==60)m=0;}while(!key2)display(h,m,s);}else if(key3==0){delay(20);if(key3==0){if(m==0)m=60;m--;}while(!key3)display(h,m,s);}}if(n1==3){if(key2==0) //调秒{delay(20);if(key2==0){s++;if(s==60)}while(!key2)display(m,s,0);}else if(key3==0){delay(20);if(key3==0){if(s==0)s=60;s--;}while(!key3)display(m,s,0);}}if(n1==4){if(key2==0) //调闹钟时{ //加delay(20);if(key2==0){h0++;if(h0==24)h0=0;}while(!key2)display0(h0,m0,s0);}else if(key3==0) //减{delay(20);if(key3==0){if(h0==0)h0=24;h0--;}while(!key3)display0(h0,m0,s0);}display0(h0,m0,s0);}if(n1==5){if(key2==0) //调闹钟分{delay(20);if(key2==0){m0++;if(m0==60)m0=0;}while(!key2)display0(h0,m0,s0);}else if(key3==0){delay(20);if(key3==0){if(m0==0)m0=60;m0--;}while(!key3)display0(h0,m0,s0);}display0(h0,m0,s0);}if(n1==6){if(key2==0) //调闹钟秒{delay(20);if(key2==0){s0++;if(s0==60)s0=0;}while(!key2)display0(m0,s0,0);}else if(key3==0){delay(20);if(key3==0){if(s0==0)s0=60;s0--;}while(!key3)display0(m0,s0,0);}display0(m0,s0,0);}}}void main(){TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1; //打开总中断ET0=1;//打开定时器中断TR0=1;//启动定时器0while(1){keyscan();if(n1==7 || mm)display(m,s,0);elsedisplay(h,m,s);if((h==h0)&&(m==m0)&&(s==s0)){TR0=1;//clock();for(a=0;a<=145;a++){beep=1;delay_1ms(200);beep=0;delay_1ms(200);display(m,s,0);}display(h,m,s);}}}。
四位数码管工作原理

四位数码管工作原理
四位数码管是一种常见的显示装置,用于显示数字和一些字母。
它由四个七段数码管组成,每个数码管有七个段和一个小数点,通过控制这些段的亮灭来显示不同的数字或字母。
工作原理如下:
1. 位选:四位数码管的显示是通过位选的方式进行的。
在每个时间段,只有一个数码管被选中,其余的数码管处于关闭状态。
通过快速轮流选择每个数码管,形成了连续的显示效果。
2. 共阳极和共阴极:四位数码管有两种类型:共阳极(共正极)和共阴极(共负极)。
在共阳极数码管中,共阳极连接到电源正极,而在共阴极数码管中,共阴极连接到电源负极。
不同类型的数码管需要采用相应的电路驱动方法。
3. 控制信号:为了控制每个数码管的亮灭,需要提供适当的控制信号。
通常,使用微控制器或专用的驱动芯片来产生这些信号。
通过设置控制信号的高低电平和时序,可以实现数码管的显示和刷新。
4. 位选扫描:在每个时间段,控制信号选择一个数码管进行显示,并通过控制对应的段点亮灭来显示相应的数字或字母。
通过快速地轮流切换位选信号,每个数码管都能够被依次选中并显示需要的内容。
通过合理的控制位选信号和段选信号,可以实现多个数码管的同时显示,以显示更复杂的数字、字母和符号。
需要注意的是,具体的四位数码管的工作原理可能会有所不同,取决于使用的具体型号和电路设计。
因此,在实际应用中,应根据具体的电路和芯片规格来了解和使用相应的工作原理。
1/ 1。
四位时钟设计方案

目录一.前言二.设计任务1.设计题目:4位数字时钟设计2.技术指标及设计要求3.给定条件及器件三.设计方案与实现1.硬件设计2.相关器件介绍3.数码管介绍4.数码管的驱动方式5.电路设计电路原理图如下,采用AT89C2051单片机制作,使用3~6V直流电源。
S1为复位按键,S2调时,S3调分;注意:1安装前检查元件,2元件安装极性和引脚方向。
此外J1 和J2是两根“飞线”,请先用电阻剪角焊接,然后焊接数码管。
四、总结五、附录元件清单六、参考文献一、前言当前,电子技术已经广泛应用于社会生活中,电子技术俨然成为了我们日常生活的必备技术,无论计算机、电视机、洗衣机还是手机、MP3播放器都不能缺少电子技术的支持。
电子技术综合课程设计是集电路分析、模拟电子技术、数字电子技术以及电路实验、模拟电子技术实验、数字电子技术实验等课程之后的一门理论与实践相结合的综合设计性课程。
作为电子信息领域的一员,无疑电子技术对我们的专业课学习至关重要,通过对《数字电子技术基础》、《模拟电子技术基础》等课程的学习,经过不懈的探讨努力,最终完成设计任务制作。
本次课程设计我们将设计一个四位数字时钟。
本系统采用以A T89C2051为主控芯片,实现电子时钟的设计并考虑节约系统的硬件,而且达到时钟功能为24小时的设计方式,显示时、分;具有快速校准时、分的功能,实现时间的调整,然后输出四位的显示器显示出来。
二、设计任务1、题目:4位数字时钟的设计2、技术指标及设计要求(1)显示小时、分钟时间(2)实现秒的量化显示(3)具有调整时间功能(4)手动复位显示功能3、综合条件及器件(1)单片机及相关外围器件(2)直流稳压电源4V(3)万用电路板(4)4联共阳数码管4、器件介绍1)数码管介绍数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
数字钟计时电路的电类实验原理图和电路图

页眉内容
实验1 多功能计时电路的设计——数字钟
1.实验原理及框图
图1.1三位计时器示意图
计时电路示意图如图1.1所示,计时电路完成计时功能,并且将计时结果传送至显示电路,进而实现显示功能。
原理框图如图1.2所示,主要由计时电路,秒信号发生电路,清零电路和译码显示电路组成。
计时电路在秒信号的作用下,产生0:00~9:59的循环计时,清零电路控制计时电路的清零端,实现时钟的清零,最终将计时电路的输出送至译码显示电路,实现时钟的显示。
图1.2数字钟的原理框图
精心整理。
四位电子钟电路和汇编源程序

RS T1P3.0(R XD)2P3.1(TXD)3XTAL24XTAL15P3.2(INT0)6P3.3(INT1)7P3.4(T0)8P3.5(T1)9GND 10P3.711P1.012P1.113P1.214P1.315P1.416P1.517P1.618P1.719VC C 20IC1AT89C 2051JTC130P C230PR110KVC CAN 2AN 1R2R3R4R5R6R7R8R9A 1B 2C 3D 4E 5F 6G 7DP8P19P210P311P4128.8.8.8.LEDDPY_7_SEGAVC CR10 4.7K R13 4.7KR11 4.7K R12 4.7K Q18550Q28550Q38550Q4855012JXZ CON2C5104C4470UF VC CC310UFA FB GC DPDE A B C D EFG DP 四位电子钟设计与制作电路原理图:此作品为四位电子钟,主要由单片机编程实现其功能,所以分有两部分一个硬件,一个是软件,硬件方面的电路图如上图,单片机采用ATMEL 公司生产的芯片AT89C2051里面有2K 字节的可反复擦写的Flash 程序存储器和128字节的随机存取数据存储器。
显示部分为0.56共阳极四位数码管,在电路中P1口输出段码数据送入四位数码管,P3口做扫描控制,控制数码管的显示。
Q1、Q2、Q3为8550三极管,信号经过放大送入P1、P2、P3、P4也就是数码管显示部分,AN1调整小时,AN2为调整分钟它们都接10脚然后接地.10脚接地,20脚接正电源,它们由3-6V 电源供电,可以用两节1.5V 的电池供电,也可以接USB 接口5V 供电.软件方面,程序里先定义两个中断定时器T0和T1,一个作为秒记数用,另一个作为调整时闪烁用,编程时先将P1和P3口数据清零,然后P1和P3作为动态扫描显示,由于人的眼睛有延迟性,当扫描频率非常高时人就感觉数码管一直亮着,而同时计数器在遵循时间的变化方式执行着分到了60分钟加1,时间为24小时制,就是到了24小时后自动为00:00. 元件清单:名称 型号 数量 单片机 AT89C2051 1 数码管 0.56四位共阳极 1三极管8550 4电阻4.7K 4 10K 1 220 8电容30PF 2 10uf 1 104 1石英晶体振荡器12M 1 电子钟源程序(汇编):MIAO BIT P2.0 ;秒点位HOU_S BIT P3.0 ;时十位HOU_G BIT P3.1 ;时个位MIN_S BIT P3.2 ;分十位MIN_G BIT P3.3 ;分个位H_KEY BIT P3.4 ;时调整键M_KEY BIT P3.5 ;分调整键SHAN BIT 0 ;秒点闪烁LEDBUS EQU P1 ;显示数据总线SECOND EQU 30H ;秒寄存器MINUTE EQU 31H ;分寄存器HOUR EQU 32H ;时寄存器TIM_1 EQU 33H ;定时器0中断次数TIM_2 EQU 34H ;定时器0中断次数;********************************ORG 0000H ;程序开始LJMP INITORG 000BH ;定时器0中断入口地址LJMP TIMER0ORG 0030H ;程序从30H开始;********************************; 单片机初始化INIT:MOV SECOND, #0 ;秒置0MOV MINUTE, #0 ;分置0MOV HOUR, #0 ;开机后显示0点MOV TIM_1, #10 ;中断10次为0.5秒MOV TIM_2, #2 ;0.5*2=1秒MOV SP, #60H ;堆栈指针指向60HMOV TMOD, #01H ;定时器0为模式1(16位)MOV TH0, #03CHMOV TL0, #0B0H ;50毫秒初值(晶振12M)SETB ET0 ;定时器0中断允许SETB TR0 ;启动定时器0SETB EA ;开总中断;********************************; 主程序MAIN:JNB H_KEY, HT ;时调整键按下转到HTJNB M_KEY, MT ;分调整键按下转到MTACALL DISP ;调用显示子程序AJMP MAIN ;转LOOP继续检测按键状态;********************************; 时间调整;----- 分调整 -----------------MT: ACALL DISP ;调用显示子程序JNB M_KEY, MT ;判断按键是否松开INC MINUTE ;分加一MOV A, MINUTECJNE A,#60, MAIN ;判断分是否加到60MOV MINUTE, #0 ;分到60变为0MOV SECOND, #0 ;秒置0AJMP MAIN;----- 时调整 -----------------HT: ACALL DISP ;调用显示子程序JNB H_KEY, HT ;判断按键是否松开INC HOUR ;时加1MOV A, HOURCJNE A,#24, MAINMOV HOUR, #0 ;判断时是否到24,时到24变0 AJMP MAIN;********************************; 显示子程序DISP:MOV DPTR, #LEDTAB ;数码管段码表首地址送DPTR MOV A, MINUTE ;分放入ACCMOV B, #10 ;B放入10DIV AB ;A/B,商在A余数在BMOVC A, @A+DPTR ;查表取分十位段码MOV LEDBUS, A ;段码送LEDBUS口显示MOV C, SHANMOV MIAO, C ;秒点闪烁CLR MIN_S ;打开分十位显示ACALL D1MS ;延时1毫秒SETB MIN_S ;关闭分十位显示MOV A, BMOVC A, @A+DPTR ;查表取分个位段码MOV LEDBUS, AMOV C, SHANMOV MIAO, C ;秒点闪烁CLR MIN_G ;打开分个位显示ACALL D1MS ;延时1毫秒SETB MIN_G ;关闭分十位显示MOV A, HOURMOV B, #10DIV AB ;拆分小时的十位和个位JZ DISP0 ;十位为0不显示十位MOVC A, @A+DPTRMOV LEDBUS, ACLR HOU_S ;打开时十位显示DISP0:ACALL D1MSSETB HOU_S ;关闭时十位显示MOV A, BMOVC A, @A+DPTRMOV LEDBUS, ACLR HOU_G ;打开时个位显示ACALL D1MSSETB HOU_G ;关闭时个位显示RET;********************************; 定时器0中断服务程序TIMER0:MOV A, #0B1H ;定时器0中断服务子程序ADD A, TL0 ;同步修正(参考本人的<如何是自制的单片机电子钟走时精准>)MOV TL0, AMOV TH0, #03CH ;重装定时器0初值PUSH ACC ;入栈保护ACC和PSWPUSH PSWDJNZ TIM_1, RETI_1MOV TIM_1, #10 ;中断10次为0.5秒CPL SHAN ;取反闪烁位DJNZ TIM_2, RETI_1MOV TIM_2, #2 ;1秒时间到INC SECOND ;秒加1MOV A, SECONDCJNE A,#60, RETI_1MOV SECOND, #0 ;秒到60变0INC MINUTE ;分加1MOV A, MINUTECJNE A,#60, RETI_1MOV MINUTE, #0 ;分到60变0INC HOUR ;时加1MOV A, HOURCJNE A,#24, RETI_1MOV HOUR, #0 ;时到24变0RETI_1: POP PSW ;出栈POP ACCRETI;********************************; 延时子程序D1MS: MOV R7, #2 ;延时1毫秒子程序D_1: MOV R6, #250 ;延时时间估算250*2*2=1000微秒=1毫秒DJNZ R6, $DJNZ R7, D_1RET;********************************; 数码管段码表LEDTAB:DB 14H,0D7H,4CH,45H,87H; 0 1 2 3 4DB 25H,024H,57H,04H,05H; 5 6 7 8 9END。
第一讲 电子钟的组成及工作原理

多功能大尺寸LED 时钟显示屏的设计与制作LED 数码管时钟显示屏的组成及工作原理一、时钟显示屏的组成数码管时钟显示屏的组成电路如图所示:由电源电路,单片机最小系统,时钟电路,键盘电路,数码管驱动显示电路,温湿度检测电路,红外接收电路,光亮度检测电路,语音报时电路、电器控制电路,通讯电路等组成。
图3-1 多功能时钟显示屏的组成框图二、时钟显示屏的工作原理时钟显示屏以单片机为核心完成对时钟芯片DS1302管理和数码管的驱动显示控制。
数码管采用静态显示方式,由多片串入并出芯片74HC595(功能等同74HC164)级联的方式进行驱动。
通过温湿度传感器实现温湿度的检测,红外接收电路完成无线调表和多种定时等时钟功能的设置,用按键也可实现时钟调整等以及各种时钟功能的设定。
光亮传感器可以监测环境明暗,实时调整数码管的显示亮度。
语音报时电路实现语音报时,电器控制电路可实现家用电器的定时控制或者上课打铃的控制等,通讯电路可进行有线、无线通讯、控制等。
单片机最小系统数码管红外接收电路键盘电路温湿度传感器光亮检测电路驱动电路语音报时电路通讯电路电器控制电路扩展接口时钟电路功能与特点一、功能:1、年、月、日、时、分、秒、星期;2、温度、湿度检测与显示;3、农历日期的显示;4、手动按键调表;5、红外遥控器调表;6、预留光亮度检测及显示亮度的自动调整;7、预留继电器控制(10A,可实现定时打铃、家电定时控制等);8、预留语音报时和音乐报时功能;9、预留RS232和485串行通讯接口,实现与微机通讯或者远程通讯;10、预留蜂鸣器提示音功能;11、预留无线通讯接口,可实现无线通讯;12、预留I/O接口,方便今后功能扩展。
13、电源保护电路,防止电源反接烧坏路线板元件;二、特点:1、大尺寸,由1.5~2.3寸数码管显示;2、农历、星期能尾随日期变化自动调整;3、采用时钟芯片和备用电池,走时准确,断电不影响计时;4、静态显示工作模式,延长时钟显示屏使用寿命;5、采用新型单片机功能更强、速度更快;6、硬件设计功能丰富;7、可实现数码管显示亮度随环境明暗自动调节,人性化设计,使用舒适;8、可实现多种显示模式,以实现节能目的;9、软件开辟可实现多种扩展功能;10、插接件接口设计,便于组装、维护。
四位数码管工作原理 stm32

四位数码管工作原理 stm32STM32是一款高性能的微控制器,广泛应用于各种嵌入式系统中。
在嵌入式系统中,常常需要使用数码管来显示数字或字符信息。
本文将介绍数码管的工作原理,并结合STM32微控制器,探讨如何使用STM32驱动数码管。
数码管是一种能够显示数字或字符的电子显示器件。
它由多个发光二极管(LED)组成,每个LED可以独立控制发光与否。
根据LED 的排列方式和控制方式的不同,常见的数码管有共阳数码管和共阴数码管。
共阳数码管是指在数码管的每个LED的阳极都连接在一起,并与正极相连,而每个LED的阴极则分别独立连接到控制芯片的输出引脚。
当控制芯片将某个输出引脚的电平拉低时,对应的LED就会点亮。
通过控制不同的输出引脚,可以实现对数码管上各个LED的控制,从而显示不同的数字或字符。
共阴数码管与共阳数码管的原理基本相同,只是阳极和阴极的连接方式相反。
在共阴数码管中,每个LED的阴极都连接在一起,并与负极相连,而每个LED的阳极则分别独立连接到控制芯片的输出引脚。
当控制芯片将某个输出引脚的电平拉高时,对应的LED就会点亮。
在使用STM32驱动数码管时,需要通过控制STM32的输出引脚来控制数码管的LED。
以共阳数码管为例,假设数码管的每个LED分别连接到STM32的P0、P1、P2等输出引脚上。
当需要显示数字0时,将P0、P1、P2等输出引脚的电平拉低,对应的LED就会点亮;当需要显示数字1时,将P1、P2等输出引脚的电平拉低,P0引脚的电平拉高,对应的LED就会点亮,以此类推。
通过依次控制不同的输出引脚,可以实现对数码管的控制,从而显示不同的数字或字符。
为了方便控制数码管,我们可以编写相应的驱动程序。
首先,需要初始化STM32的输出引脚,并设置为输出模式。
然后,根据需要显示的数字或字符,通过控制相应的输出引脚的电平,点亮对应的LED。
为了实现动态显示,可以使用定时器中断来周期性地更新数码管的显示内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar
t,s=0,m=11,h=0,qian=0,bai=0,shi=0,ge=0,s0=0,m0=0,h0=0,qian0=0,bai0=0,shi0=0,ge0=0,n1=0; sbit key1=P1^0; //功能
sbit key2=P1^1; //加一
sbit key3=P1^2; //减一
sbit key4=P1^3; //查看秒数
bit mm=0;
sbit beep=P2^3;
uint a;
void delay_1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uint i)
{
uint j;
for(;i>0;i--)
for(j>19;j>0;j--);
}
/*void clock()
{
for(a=0;a<=50;a++)
{
beep=1;
delay_1ms(200);
beep=0;
delay_1ms(200);
}
}*/
void timer () interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
s++;t=0;
if(s==60)
{
m++;s=0;
if(m==60)
{
h++;m=0;
if(h==24)
h=0;
}
}
}
}
void display(uchar h,uchar m,uchar s) {
qian=h/10;
bai=h%10;
shi=m/10;
ge=m%10;
P0=num[qian];
P2=0xef;
delay_1ms(2);
P0=0xff;
P0=num[bai];
P2=0xdf;
delay_1ms(2);
P0=0xff;
P0=num[shi];
P2=0xbf;
delay_1ms(2);
P0=0xff;
P0=num[ge];
P2=0x7f;
delay_1ms(2);
P0=0xff;
}
void display0(uchar h0,uchar m0,uchar s0) {
qian0=h0/10;
bai0=h0%10;
shi0=m0/10;
ge0=m0%10;
P0=num[qian0];
P2=0xef;
delay_1ms(2);
P0=0xff;
P0=num[bai0];
P2=0xdf;
delay_1ms(2);
P0=0xff;
P0=num[shi0];
P2=0xbf;
delay_1ms(2);
P0=0xff;
P0=num[ge0];
P2=0x7f;
delay_1ms(2);
P0=0xff;
}
void keyscan()//按键扫描
{
if(key4==0)
mm=!mm;
while(!key4)
display(m,s,0);
if(key1==0)
{
mm=0;
delay(20);//消抖
if(key1==0) //功能选择
{
TR0=0;
n1++;
while(!key1)
display(h,m,s);
if(n1==7)
{
TR0=1;
n1=0;
}
}
}
if(n1!=0)
{
if(n1==1)
{
if(key2==0) //调时
{ //加
delay(20);
if(key2==0)
{
h++;
if(h==24)
h=0;
}
while(!key2)
display(h,m,s);
}
else if(key3==0) //减
{
delay(20);
if(key3==0)
{
if(h==0)
h--;
}
while(!key3)
display(h,m,s);
}
}
if(n1==2)
{
if(key2==0) //调分
{
delay(20);
if(key2==0)
{
m++;
if(m==60)
m=0;
}
while(!key2)
display(h,m,s);
}
else if(key3==0)
{
delay(20);
if(key3==0)
{
if(m==0)
m=60;
m--;
}
while(!key3)
display(h,m,s);
}
}
if(n1==3)
{
if(key2==0) //调秒
{
delay(20);
if(key2==0)
{
s++;
if(s==60)
}
while(!key2)
display(m,s,0);
}
else if(key3==0)
{
delay(20);
if(key3==0)
{
if(s==0)
s=60;
s--;
}
while(!key3)
display(m,s,0);
}
}
if(n1==4)
{
if(key2==0) //调闹钟时
{ //加
delay(20);
if(key2==0)
{
h0++;
if(h0==24)
h0=0;
}
while(!key2)
display0(h0,m0,s0);
}
else if(key3==0) //减
{
delay(20);
if(key3==0)
{
if(h0==0)
h0=24;
h0--;
}
while(!key3)
display0(h0,m0,s0);
}
display0(h0,m0,s0);
}
if(n1==5)
{
if(key2==0) //调闹钟分
{
delay(20);
if(key2==0)
{
m0++;
if(m0==60)
m0=0;
}
while(!key2)
display0(h0,m0,s0);
}
else if(key3==0)
{
delay(20);
if(key3==0)
{
if(m0==0)
m0=60;
m0--;
}
while(!key3)
display0(h0,m0,s0);
}
display0(h0,m0,s0);
}
if(n1==6)
{
if(key2==0) //调闹钟秒
{
delay(20);
if(key2==0)
{
s0++;
if(s0==60)
s0=0;
}
while(!key2)
display0(m0,s0,0);
}
else if(key3==0)
{
delay(20);
if(key3==0)
{
if(s0==0)
s0=60;
s0--;
}
while(!key3)
display0(m0,s0,0);
}
display0(m0,s0,0);
}
}
}
void main()
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //打开总中断
ET0=1;//打开定时器中断
TR0=1;//启动定时器0
while(1)
{
keyscan();
if(n1==7 || mm)
display(m,s,0);
else
display(h,m,s);
if((h==h0)&&(m==m0)&&(s==s0))
{
TR0=1;
//clock();
for(a=0;a<=145;a++)
{
beep=1;
delay_1ms(200);
beep=0;
delay_1ms(200);
display(m,s,0);
}
display(h,m,s);
}
}
}。