51单片机电子时钟程序

合集下载

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不显示)状态。

简单的51单片机电子时钟

简单的51单片机电子时钟

仿真图:C程序;#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit k1=P3^5;sbit k2=P3^6;sbit k3=P3^7;uchar code duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//显示数组uchar hc[8]; //缓存数组uchar jishu,jishu1=0,k,set,shan,a,b,c,time; //变量定义char shi,fen,miao; //时分秒定义(必须为char不然按键会显乱码)//====延时子程序=====//void delay(uint t){uchar i;while(t--)for(i=110;i>0;i--);}//====按键子程序===//void key(){//====调节选择===//if(k1==0){delay(5);while(k1==0);if(++set==4) set=0;}//====时分秒,加调整=====// if(k2==0){delay(5);while(k2==0);if(set==1){if(++miao==60) miao=0;}if(set==2){if(++fen==60) fen=0;}if(set==3){if(++shi==24) shi=0;}}//====时分秒,减调整=====//if(k3==0){delay(5);while(k3==0);if(set==1){if(--miao<0) miao=59;}if(set==2){if(--fen<0) fen=59;}if(set==3){if(--shi<0) shi=23;}}//====调整闪烁====//if(set==1) a=0xff*shan; else{a=0;} if(set==2) b=0xff*shan; else{b=0;} if(set==3) c=0xff*shan; else{c=0;} }//=====中断初始化===//void init(){TMOD=0x01;TH0=(65535-5000)/256;TL0=(65535-5000)%256;EA=1;ET0=1;TR0=1;}//=====选择中断方式1=====//void tint(void) interrupt 1{TH0=(65535-5000)/256;TL0=(65535-5000)%256;//===10秒无操作跳出时间调整====//if(set!=0){if((k1==0)||(k2==0)||(k3==0)) time=0;if(time>=10) {set=0;time=0 ; }}//====时分秒即时==//jishu++;if(jishu==40){jishu=0;shan=!shan; //控制闪烁变量if(++k==4){ k=0;time++;if(++miao==60){miao=0;if(++fen==60){fen=0;if(++shi==24)shi=0;}}}}//=====显示位分离,存入缓存数组====//hc[0]= c|shi/10;hc[1]= c|shi%10;hc[2]=10;hc[3]=b|fen/10;hc[4]=b|fen%10;hc[5]=10;hc[6]=a|miao/10;hc[7]=a|miao%10;jishu1++;if(jishu1==8)jishu1=0;P2=(P2+1)%8; //138位扫描P0=duan[hc[jishu1]]; //显示段扫描}void main(){init(); //中断初始化P2=0x00; //138初始位校正(去掉显示会后移一位)while(1){key(); //按键程序}}。

基于C51单片机的数字时钟课程设计(C语言,带闹钟).

基于C51单片机的数字时钟课程设计(C语言,带闹钟).

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

基于51单片机电子时钟程序

基于51单片机电子时钟程序

// 本程序实现功能:显示小时和分钟,并以最后一位的小数点闪烁一次表示一秒。

按下INT0键后显示日期。

并在所设定的时间蜂铃器响5次以此为闹钟;// 第二:按下INT1键后,可对时间,日期,闹钟进行设置,再次按下INT1推出设置//// 显示说明:前两位显示小时和月份,后两位显示分钟和日期//#include <reg52.h>/*==========================================宏定义uchar和uint===========================================*/#define uchar unsigned char#define uint unsigned intsbit alarm=P1^4;/*==============================================变量的定义==============================================*/int year=2010;/*初始年份为2010年*/uchar alarm_hour=0,alarm_min=0; /*初始闹钟时间为00:00*/uchar qian=0,bai=0,shi=0,ge=0,key_flag=0,Key=0,num=0,Flag=0; /*定义输出函数变量和按键号*/uchar x,dis_flag=0; /*显示变换标志位*/uchar Key_control=0; /*按键被按下的标志位*/uchar mounth=7,day=25; /*初始日期设为7月25号*/uchar hour=0,t=0,min=0,sec=0,ring=0;/*初始时间为00:00:00*//*=============================================子函数的定义=============================================*/void Init(); /*此函数用于初始化所有需要使用的中断*/void delay(uint z); /*用于数码管显示*/uchar Key_num(void); /*此函数为确定按下的按键输出编号*/void Led_display();void display(uchar cc, uchar dd); /*显示时间的函数,中间的点表示:*/void display_nian(uchar cc, uchar dd); /*显示年份的显示函数,即没有中间的点*/void display_date(uchar cc, uchar dd); /*显示日期的函数,即四个小数点全亮*/void display_alarm(uchar cc, uchar dd); /*显示闹钟的函数,第二个和第四个点*/void Leap_Nonleap(int aa); /*判断是闰年还是平年,并将二月的最大天数赋给Mounth_array[1]*/void Judge_Setting(uchar Key_set); /*所得出的按键号进行对应的设置*//*==========================================所使用数组的定义============================================*/uchar Mounth_array[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /*每个月的最大天数数组*/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,/*数码管显示编码*/};uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*百位及其小数点的段码*//*==============================================主函数部分==============================================*/void main(){Init();while(1){Leap_Nonleap(year); /*进入大循环后首先对年份进行判断*/while(Key_control)/*当P3.3被按下后Key_control=1进入函数进行设置,直到第二次Key_control=0推出循环*/{Flag=Key_num(); /*将按键函数里面是否有按键被按下的标志位赋给Flag*/if(Flag) /*当有按键被按下时,进入设置函数*/{Judge_Setting(num); /*将num值传入函数,并进行设置*/}Led_display(); /*保证在设置的循环时有显示*/}Led_display();/*循环式动态显示*/}}/*===========================================系统初始化函数=============================================*/void Init() /*初始化系统,启动计时器0,1,外部中断0,1*/{TMOD=0x01; /*将计时器0定位工作方式1,将计时器1定为工作方式2*/TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=1;// ET1=1;// TR1=1;IE0=1;EX0=1; /*使用外部中断0和1,分别作为显示变换,设置的前戏*/IT0=1;/*为下降沿突发*/IE1=1;EX1=1;IT1=1;/*为下降沿突发*/EA=1;}void Display_flag() interrupt 0 /*使用外部中断0,进行显示时间和日期的转换P3.2口切换显示*/{dis_flag++;if(dis_flag==4) /*当dis_flag=0时,输出时间,当dis_flag=1时,输出日期,当dis_flag=2时,输出闹钟*/dis_flag=0; /*当dis_flag=3时,输出年份。

51单片机课程设计电子时钟

51单片机课程设计电子时钟

51单片机课程设计电子时钟课程设计:单片机课程设计课程名称:单片机电子时钟题目名称:电信学院学院:程工专业子电:姓名曾代科:学号 3201:国加杨指导教师2010月11年 7日一、课程设计名称:51单片机电子时钟二、设计方案:1、通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。

2、采用时钟芯片,它的功能强大,功能部件集成在芯片内部,具有自动产生时钟等相关功能,硬件成本相对较高;软件编程简单,通常用在对时钟精度要求较高的场合。

三、设计内容:这里采用应用广泛的AT89C52作为时钟控制芯片,利用单片机内部的定时/计数器T0 实现软时钟的目的。

首先将T0设定工作于定时方式,对机器周期计数形成基准时间(50ms),然后用另一个定时/计数器T1对基准时间计数形成秒,妙计60次形成分,分计60形成小时,小时计到12。

最后通过数码管把它们的内容在相应的位置显示出来,达到时、分、秒计时的功能。

此外还要实现对时间的调整功能,89C52的、、外接三个独立按键,当按下按键时,系统进入调时间的状态或启动时间显示的功能;当按下按键时,对显示的数码管进行加一的功能;当按下按键时,对显示的数码管进行减一的功能,达到调整时间的目的。

四、系统软件程序设计1.主程序先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,当有按键按下时,则转入相应的功能程序。

2、数码管显示模块本实验有8个数码管,从右到左为妙、横线、分、横线、时。

在本系统中数码管显示采用软件译码动态显示。

在存储器中首先建立一张显示信息的字段码表,显示时,先中取出显示的信息,然后通过查表程序在从显示缓冲区字段表中查出所显示的信息的断码,从P0端口输出,同时在P2端口进行数码管显示。

3、定时器/计数器T0中断服务程序T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。

基于C51单片机的数字时钟课程设计(C语言带闹钟)

基于C51单片机的数字时钟课程设计(C语言带闹钟)

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。

键盘采用动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

51单片机电子时钟C语言程序

51单片机电子时钟C语言程序
IT0=0;//电平触发(低电平有效)
EX0=1;
ET0=1;
TR0=1;
yueqh(),riqh();//初始化日月切换
}
void ritiao()//日期的调节函数
{ if(P36==0)//日期加一调节键
{
p36xd();
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{numyue=1;}
yueqh();
}
if(P37==0)
{
p37xd();
numyue-=1;
if(numyue==0)
{numyue=12;}
yueqh();
}
}
void int0() interrupt 0
{
p32xd();
if(numsec==-1)
{
numsec=59;
}
secqh();
}
}
};
p32xd();
while(P32!=0)//第二次按下p32时,进行分调时
{
for(m=0;m<40;m++)
{
P2=0x00;
P0=table[hou1];
P2=0X20;
delayms(1);
P2=0x00;
P0=table[hou2]&0x7f;
P2=0X10;
delayms(1);
P2=0x00;
P0=table[sec1];

51单片机电子时钟设计

51单片机电子时钟设计

二、时钟的基本原理分析
利用单片机的定时器来完成定时功能。定时器0每隔0.01秒中断一次,并将其计为一个计数。一秒钟的中断计数初始值设为100,每次中断计数初始值减1。当它减少到0时,意味着它是1s,第二个变量增加1。同理判断是1min还是1h。
为了在LED数码管上显示时间,可以采用静态显示法和动态显示法。由于静态显示方法需要更多的硬件,如解码器和数据锁存器,动态显示方法可以用来实现LED显示。通过依次扫描每个数码管,相应的数码管被点亮,相应的字码被送到数码管显示数字。由于数码管的扫描周期短,加上人眼的余辉效应,数码管看起来总是很亮,从而实现各种显示。
AJMP MAIN
S_PD:
MOV A,R3;
JNZ MAINR4和R3的存储参数减少到0,并且计时长度已经达到。
JNB P0.6,升银2;当闹钟响铃功能开启时,进入闹钟程序。
AJMP TISHI如果闹铃没有再响,计时到了就跳转到提示程序。
转移到主程序
史策:
呼叫铃
转移到主程序
声引1号:;呼叫铃子程序
四个时钟的实现
A.电路设计
1.总设计
本设计主要利用单片机来设计电子钟。硬件部分主要分为以下几个电路模块:显示电路用8个普通阴极数码管分别显示周(年)、时、分(月)、秒(日),并通过动态扫描显示,避免了解码器的使用,节省了I/o口,使电路更加简单。采用AT89S51系列单片机,应用简单,适用于电子钟设计。
来电铃声
转移到主程序
声音2:
SETB F0;报警再响铃标志位的设置
LCALL RING门铃
CLR F0标志位复位
转移到主程序
NLTZZ:
AJMP NLTZ1进入警报调整程序
DSTZ:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg51.h>#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;sbit LED_alarm=P3^5; //闹钟指示灯sbit led_naozhongonoff=P3^4;//闹铃响(LED亮)sbit P0_1=P0^1;sbit P0_2=P0^2;sbit P0_3=P0^3;sbit P3_0=P3^0;sbit P3_1=P3^1;unsigned char code Disp_Tab[] = {0x3f, 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char coun=0,coun1=0,sec=0,min=0,hour=0;unsigned char timer_hour=0,timer_min=0,timer_sec=0;unsigned char flag=0,flag1=0,flag2=0;unsigned char temp=0,num=0,dingshi_num=0;unsigned char alarm_hour=0,alarm_min=0,alarm_sec=0;void init_t0();void init_t1();void set_time();void dingshi_end();void alarm_adjust();void dingshi_start();unsigned char key_scan();void delay_ms(unsigned char i);void disp_led(unsigned char hour,unsigned char min,unsigned char sec );void init_t0(){TMOD|=0x01;TH0=0x3c;TL0=0xb0;}void init_t1(){TMOD|=0x10;TH1=0x3c;TL1=0xb0;}void delay_ms(unsigned char i){unsigned int j;for(i;i>0;i--)for(j=200;j>0;j--);}void delay_disp(){unsigned char i,j, LedOut[6],hour1,min1,sec1;if(flag1==0&&flag2==0){hour1=hour;min1=min;sec1=sec;}if(flag2){hour1=timer_hour;min1=timer_min;sec1=timer_sec;}if(flag1==1){hour1=alarm_hour;min1=alarm_min;sec1=alarm_sec;}LedOut[0]=Disp_Tab[hour1/10];LedOut[1]=Disp_Tab[hour1%10]|0x80; //0x7f小数点LedOut[2]=Disp_Tab[min1/10];LedOut[3]=Disp_Tab[min1%10]|0x80;LedOut[4]=Disp_Tab[sec1/10];LedOut[5]=Disp_Tab[sec1%10];for(j=4;j>0;j--){for( i=0; i<6; i++){switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;}P1 = LedOut[i];delay_ms(2);}}}unsigned char key_scan(){unsigned char j,k;j=0x10;for(k=0;k<4;k++){P0=~j;if(P0_1==0) {delay_disp();if(P0_1==0) return k; break;}if(P0_2==0) {delay_disp();if(P0_2==0) return k+4;break;}if(P0_3==0) {delay_disp();if(P0_3==0) return k+8;break;}j=j<<1;}if(P0_1&&P0_2&&P0_3)return 66;}void disp_led(unsigned char hour,unsigned char min,unsigned char sec ) {unsigned char i, LedOut[6];LedOut[0]=Disp_Tab[hour/10];LedOut[1]=Disp_Tab[hour%10]|0x80; //0x7f小数点LedOut[2]=Disp_Tab[min/10];LedOut[3]=Disp_Tab[min%10]|0x80;LedOut[4]=Disp_Tab[sec/10];LedOut[5]=Disp_Tab[sec%10];for( i=0; i<6; i++){switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;}P1 = LedOut[i];delay_ms(2);}}void intt_t1() interrupt 3{TH1=0x3c;TL1=0xb0;coun++;if(coun>=20){coun=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour==24)hour=0;}}}}void intt_t0() interrupt 1{TH0=0x3c;TL0=0xb0;coun1++;if(coun1>=20){coun1=0;timer_sec++;if(timer_sec==60){timer_sec=0;timer_min++;if(timer_min==60){timer_min=0;timer_hour++;if(timer_hour==24) timer_hour=0;} }}}void intt_ex1(void) interrupt 2 using 2 //设置闹钟时间{EX1=0;flag1++;if(flag1==2)flag1=0;EX1=1;}void intt_ex0(void) interrupt 0 using 1 //时间设置{EX0=0;flag=1;EX0=1;}void dingshi_start() //定时{init_t0();// timer_hour=0;timer_min=0;timer_sec=0;TR0=1;ET0=1;// flag2=1;}void dingshi_end(){TR0=0;ET0=0;}void alarm_adjust(){if(key_scan()!=66){temp=key_scan();if(num==0&&temp<3){alarm_hour=temp*10;num++;temp=66;}if(num==1&&temp<10){alarm_hour=temp+alarm_hour;num++;temp=66;}if(num==2&&temp<6){alarm_min=temp*10;num++;temp=66;}if(num==3&&temp<10){alarm_min=temp+alarm_min;num++;temp=66;}if(num==4&&temp<6){alarm_sec=temp*10;num++;temp=66;}if(num==5&&temp<10){alarm_sec=temp+alarm_sec;num++;temp=66;}if(temp==11){flag1=0;num=0;}}}void set_time(){ET1=0;//hour=min=sec=0;if(key_scan()!=66){temp=key_scan();if(num==0&&temp<3){hour=temp*10+hour%10;num++;temp=66;}if(num==1&&temp<10){hour=temp+hour-hour%10;num++;temp=66;}if(num==2&&temp<6){min=temp*10+min%10;num++;temp=66;}if(num==3&&temp<10){min=temp+min-min%10;num++;temp=66;}if(num==4&&temp<6){sec=temp*10+sec%10;num++;temp=66;}if(num==5&&temp<10){sec=temp+sec-sec%10;num++;temp=66;}//num=num+1;if(temp==11){flag=0;num=0;ET1=1;}}}main(){unsigned char naozhongonoff_num=0;P0=P0&0x0f;init_t1();ET1=1;EA=1;EX0=1;EX1=1;IT0=1;IT1=1;IP=0x0a;P3=P3&0xff;while(1){if(flag1==0&&flag2==0)disp_led(hour,min,sec);if(flag2)disp_led(timer_hour,timer_min,timer_sec);if(flag1==1) //闹钟调整{disp_led(alarm_hour,alarm_min,alarm_sec);alarm_adjust();}if(flag==1) //时间设置set_time();if(P3_1==0){//闹钟开关delay_disp();delay_disp();if(P3_1==0){naozhongonoff_num++;if(naozhongonoff_num==2){naozhongonoff_num=0;led_naozhongonoff=1;}}}if(naozhongonoff_num==1){led_naozhongonoff=0;if(hour==alarm_hour&&min==alarm_min&&sec==alarm_sec){LED_alarm=0;timer_sec=0;dingshi_start();while(1){disp_led(alarm_hour,alarm_min,alarm_sec);if(timer_sec==5){LED_alarm=1;dingshi_end();timer_sec=0;break;}}}else LED_alarm=1;}if(P3_0==0) //定时按键I/O{delay_disp();delay_disp();//delay_disp();if(P3_0==0){dingshi_num++;flag2=1;}if(dingshi_num==1) //定时开始{dingshi_start();timer_hour=0;timer_min=0;timer_sec=0;}if(dingshi_num==2) // 定时结束dingshi_end();if(dingshi_num==3) //退出{flag2=0;dingshi_num=0;} //}}}以下是仿真图片以上完全是原创代码,水平有限,难免有些不足之处!。

相关文档
最新文档