模拟时钟电路的程序

合集下载

fpga中的模拟时钟和数字时钟

fpga中的模拟时钟和数字时钟

fpga中的模拟时钟和数字时钟
在FPGA(现场可编程门阵列)中,模拟时钟和数字时钟是两
种不同的时钟信号。

1. 模拟时钟:
模拟时钟是连续变化的信号,它可以表示连续时间的变化。

在FPGA中,模拟时钟通常用于模拟信号处理(Analog Signal Processing)和模拟电路仿真。

模拟时钟通常以模拟时钟频率
定义,如100MHz或1GHz。

2. 数字时钟:
数字时钟是离散的信号,它用于同步数字电路操作。

在FPGA 中,数字时钟用于同步逻辑电路的操作和数据传输。

数字时钟通常以数字时钟频率定义,如50MHz或100MHz。

在FPGA设计中,模拟和数字时钟起到了不同的作用。

模拟
时钟主要用于处理和模拟连续信号,例如模拟滤波、混频等操作。

数字时钟用于同步FPGA中的数字逻辑电路,确保逻辑
电路按照预期的时序进行操作,并提供数据的正确传输和处理。

通常情况下,FPGA设计中会引入一个或多个数字时钟信号,
以确保系统的正确运行,并使用时钟分频器等技术来将数字时钟信号转换为模拟时钟信号供模拟电路使用。

总之,模拟时钟和数字时钟是FPGA设计中的两种不同的时
钟信号,用于处理连续信号和同步数字电路操作。

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

基于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键再次进入时钟运行状态。

[数电课程设计数字电子时钟的实现] 电子时钟课程设计

[数电课程设计数字电子时钟的实现] 电子时钟课程设计

[数电课程设计数字电子时钟的实现] 电子时钟课程设计课程设计报告设计题目:数字电子时钟的设计与实现班级:学号:姓名:指导教师:设计时间:摘要钟表的数字化给人们生产生活带来了极大的方便,大大的扩展了原先钟表的报时。

诸如,定时报警、按时自动打铃、时间程序自动控制等,这些,都是以钟表数字化为基础的。

功能数字钟是一种用数字电路实现时、分、秒、计时的装置,与机械时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。

从原理上讲,数字钟是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。

因此,此次设计与制作数字钟就是为了了解数字钟的原理,从而学会制作数字钟,而且通过数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及使用方法。

通过此次课程设计可以进一步学习与各种组合逻辑电路与时序电路的原理与使用方法。

通过仿真过程也进一步学会了Multisim7的使用方法与注意事项。

本次所要设计的数字电子表可以满足使用者的一些特殊要求,输出方式灵活,如可以随意设置时、分、秒的输出,定点报时。

由于集成电路技术的发展,,使数字电子钟具有体积小、耗电省、计时准确、性能稳定、维护方便等优点。

关键词:数字钟,组合逻辑电路,时序电路,集成电路目录摘要 (1)第1章概述············································3第2章课程设计任务及要求·······························42.1设计任务············································42.2设计要求············································4第3章系统设计··········································63.1方案论证············································63.2系统设计············································63.2.1结构框图及说明·································63.2.2系统原理图及工作原理···························73.3单元电路设计········································83.3.1单元电路工作原理·······························83.3.2元件参数选择···································14第4章软件仿真·········································154.1仿真电路图··········································154.2仿真过程············································164.3仿真结果············································16第5章安装调试··········································175.1安装调试过程········································175.2故障分析············································17第6章结论···············································18第7章使用仪器设备清单··································19参考文献·················································19收获、体会和建议·········································20第1章概述数字集成电路的出现和飞速发展,以及石英晶体振荡器的广泛应用,使得数字钟的精度稳定度远远超过了老式的机械表,用数字电路实现对“时”、“分”、“秒”数字显示的数字钟在数字显示方面,目前已有集成的计数、译码电路,它可以直接驱动数码显示器件,也可以直接采用才COMS--LED光电组合器件,构成模块式石英晶体数字钟。

时钟电路工作原理

时钟电路工作原理

时钟电路工作原理
时钟电路是一种用于产生和控制电子设备中时间的电路。

它通常由一个或多个振荡器和一组计数器、分频器以及其他辅助电路组成。

其工作原理可以分为以下几个步骤。

1. 振荡器产生稳定的时钟信号。

振荡器是时钟电路的核心部件,它负责产生稳定的振荡输出。

常见的振荡器类型包括晶体振荡器、RC振荡器和LC振荡器。

这些振荡器根据其设计原理,
通过在电路中形成周期性的振荡信号来产生频率稳定的时钟信号。

2. 计数器将时钟信号转换为数字表示。

计数器是时钟电路中的重要组成部分,它接收来自振荡器的时钟信号,并将其转换为相应的数字表示。

计数器通常是二进制计数器,根据时钟信号的上升沿或下降沿触发,逐次递增或递减数字。

计数器的位数决定了其能够表示的最大数字。

3. 分频器将时钟信号进行分频。

分频器用于将高频的时钟信号分频为低频的时钟信号。

这是因为某些电子设备可能需要不同的时钟频率来执行不同的任务。

分频器可以通过设置不同的分频比将时钟频率降低到所需的范围。

4. 辅助电路进行时钟信号处理。

时钟电路中还可以包含一些辅助电路,用于对时钟信号进行进一步处理。

例如,锁相环(PLL)可以用于对时钟信号进行相位或频率调整,以满足特
定的要求。

另外,时钟电路中通常还会包含使能电路、复位电路和延时电路等,以控制和调整时钟信号的行为。

通过以上的步骤,时钟电路可以产生稳定的时钟信号并将其用于电子设备中。

时钟信号的稳定性和准确性对于许多电子设备的正常工作至关重要,因此时钟电路被广泛应用于各种设备中,如计算机、手机、电视和微控制器等。

毕业设计(论文)-基于单片机多功能电子时钟的设计与仿真(含程序仿真)[管理资料]

毕业设计(论文)-基于单片机多功能电子时钟的设计与仿真(含程序仿真)[管理资料]

程序仿真等全套设计,联系153893706第1章绪论二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。

第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。

商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计为软件,硬件相结合的一组设计。

在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。

基本的要了解一些主要器件的基本功能和作用。

除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。

AT89C52是由ATMEL公司推出的一种小型单片机。

95年出现在中国市场。

其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

本文介绍了基于AT89C52单片机设计的电子万年历。

选题背景及研究的目的与意义设计的目的电子钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来了极大的方便。

基于Proteus的数字电子钟的设计与仿真

基于Proteus的数字电子钟的设计与仿真

基于Proteus的数字电子钟的设计与仿真一、设计目的与要求 (1)二、设计内容与方案制定 (1)三、芯片简介 (1)1、AT89C52 (1)2、AT24C02 (2)四、设计步骤 (3)1、硬件电路设计 (3)1.1.硬件电路组成框图 (3)1.2.各单元电路及工作原理 (3)1.3.绘制原理图 (5)1.4.元件清单列表 (6)2、程序设计 (7)2.1程序流程 (7)2.2主程序 (9)2.2.源程序 (10)五、调试与仿真 (22)六、心得体会 (23)七、参考文献 (23)一、设计目的与要求设计目的:通过课程设计,培养学生运用已学知识解决实际问题的能力、查阅资料的能力、自学能力和独立分析问题、解决问题的能力和能通过独立思考。

设计要求:设计一个时、分可调的数字电子钟、断电后将数据保存,开启后时间将从断电后时间继续行走。

二、设计内容与方案制定具有校时功能,按键控制电路其中时键、分键六个键分别控制时、分时间的调整。

按下小时数实现对小时数加减,按下分钟数实现对分钟数进行加减,并设置有复位键,启始键。

以AT89C51单片机进行实现秒、分、时上的正常显示和进位,其中显示功能由单片机控制共阴极数码管来实现,数码管进行动态显示。

通过AT24C02分别写入时、分、秒数据在断电后实现保存,在下次通电后将数据读出保持为断电前数据。

三、芯片简介1、AT89C52AT89C52是一个低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系2、AT24C02AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传件为接收器。

数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。

主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,由于A0、A1和A2可以组成000~111八种情况,即通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上,通过进行不同的配置进行选择器件。

简单的数字时钟(verilog设计)

简单的数字时钟(verilog设计)
Verilog作为一种硬件描述语言,可用于设计和实现数字系统,包括数字时钟。 通过Verilog设计数字时钟,可以加深对数字系统和Verilog语言的理解,并提高 设计能力。
设计目标与要求
设计一个简单的数字 时钟,能够显示时、 分、秒。
时钟应具有可靠性、 稳定性和可扩展性。
要求使用Verilog语 言实现,并能够在 FPGA或ASIC上实现。
设计思路及流程
• 设计思路:采用模块化设计方法,将数字时钟划分为不同的模 块,如计数器模块、显示模块等。每个模块负责实现特定的功 能,并通过接口与其他模块进行通信。
设计思路及流程
设计流程 1. 确定设计需求和目标。 2. 制定设计方案和计划。
设计思路及流程
3. 编写Verilog代码,实现各个模块的功能。 5. 根据测试结果进行调试和优化。
未来改进方向探讨
提高计时精度
通过改进算法或采用更高 性能的硬件平台,提高数
字时钟的计时精度。
降低资源占用
优化代码结构,减少不 必要的资源占用,提高 时钟系统的运行效率。
增加实用功能
拓展应用领域
考虑增加闹钟、定时器 等实用功能,使数字时 钟更加符合用户需求。
探索将数字时钟应用于 更多领域,如智能家居、
数据类型与运算符
Verilog中的数据类型包括
整型、实型、时间型、数组、结构体等。
Verilog中的运算符包括
算术运算符、关系运算符、逻辑运算符、位运算符等。
顺序语句与并行语句
Verilog中的顺序语句包括
赋值语句、条件语句、循环语句等,用于描述电路的时序行为。
Verilog中的并行语句包括
模块实例化、连续赋值语句、门级电路描述等,用于描述电路的并行行为。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//单片机实验模板文件。

具有三个基本功能:
// 1、数码管、发光二极管扫描显示
// 2、键盘扫描,返回0---15
// 3、T0中断,产生基本延时2.5ms,并且调用显示函数
// 根据以上功能,该文件为进一步编写实验程序、实际应用程序,提供了基础
#include <reg52.h>
#define delay5ms(x) {delay_xms=x*2; while(delay_xms<255);} //用于延时的宏,x的1个数值对应延时5ms。

x<=127。

void display(void);
unsigned char code
ledcode[]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
//共阴极7段数码管显示段码
//unsigned char xdata dis_seg _at_ 0xfeff; //输出数码管段显示码地址
//unsigned char xdata dis_bit _at_ 0xfdff; //输出数码管位控制码地址unsigned char min,sec,hour;
unsigned char bdata dis_buf[7]; //dis_buf[0]为最高位数据(显示在左边),dis_buf[5]为最低位数据;dis_buf[6]为8个发光二极管的数据。

unsigned char data delay_xms; //用于延时
sfr IPH = 0xb7; //定义中断优先级(高2级)寄存器
//******************************************************************
void int_t0(void) interrupt 1 //T0中断函数,fosc按11.0592M计算,定时时间为2.5ms {
TH0=0xf7;
delay_xms--;
display(); //调用显示函数
}
//******************************************************************
void display(void) //数码管显示函数。

左边是最高位,从左边开始扫描,函数每执行1次仅扫描1位,每2.5ms扫描一位
{
static unsigned char data i=0, scan=0xfe;
P0=0;
if(i<6)
P0=ledcode[dis_buf[i]];
else
P0=dis_buf[i];
P2=scan;
scan=scan*2+1;
i++;
if(i>6)
scan=0xfe, i=0;
}
//******************************************************************
unsigned char key(void) //有键按下返回0---15,无键按下返回0xff {
unsigned char data i, j, dd, scan, kk=0xff;
P1=0xf0; //查询是否有键按下
dd=P1;
if(dd==0xf0)
return kk;
delay5ms(3); //延时15ms去抖动
P1=0xf0;
dd=P1;
if(dd==0xf0)
return kk;
scan=0xfe; //行扫描码
for(i=0;i<4;i++) //循环做行扫描
{ P1=scan; //使某一行为低扫描
dd=P1; //读P1口的值
dd/=16; //取P1口值的高4位
if(dd!=0xf) //dd!=0xf表明该行有键按下
{ for(j=0;j<4;j++)
{ if(dd%2==0) //dd%2==0表明查询的第j列有键按下{ kk=i*4+j; //计算被按下键的键值
break;
}
dd=dd/2;
}
break;
}
scan=scan*2+1;
}
while(1) //等待按键释放
{ P1=0xf0;
dd=P1;
if(dd==0xf0)
break; //无键按下跳出循环}
delay5ms(3); //延时15ms去抖动
return kk;
}
//******************************************************************
void timer1() interrupt 3
{
static unsigned char count=0;
TL1=0x12;
TH1=0x2c;
count++; //正常计时
if(count>19) // 定时1S 到,以下为时钟的正常走钟逻辑
{
count=0;
sec++;
if(sec>= 60)
{ sec=0;
min++;
if(min>59)
{ min=0; hour++;
if(hour>23)
hour=0;
dis_buf[0]=hour/10; //可以随便修改
dis_buf[1]=hour%10;
}
dis_buf[2]=min/10;
dis_buf[3]= min%10;
}
dis_buf[4]=sec/10;
dis_buf[5]=sec%10;
}
}
void main() //主函数
{
unsigned char i;
TMOD=0x11; //根据情况可以修改
TL0=0; //T0定时2.5ms的初值. 不要修改TH0=0xf7; //T0定时2.5ms的初值. 不要修改TL1=0X12;
TH1=0x2c;
IE=0x82; //根据情况可以修改
IPH=0x02; //T2的优先级,为2级. 不要修改TR0=1;
TR1=1;
ET1=1;
while(1)
{ i=key();
switch (i)
{
case 0:if(hour<23)
hour++;
else hour=0;
dis_buf[0]=hour/10; //可以随便修改
dis_buf[1]=hour%10;
break ;
case 1:if(min<59)
min++;
else min=0;
dis_buf[2]= min/10;
dis_buf[3]= min%10;
break;
case 2:if(sec<59)
sec++;
else sec=0;
dis_buf[4]=sec/10;
dis_buf[5]=sec%10;
break;
default:break;
} } }。

相关文档
最新文档