AT89C2051单片机LED数码管时钟汇编程序

合集下载

AT89C2051单片机电子时钟设计

AT89C2051单片机电子时钟设计

AT89C2051单片机电子时钟设计【摘要】近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动电子产品日新月益的更新。

本课题选用AT89C2051单片机来设计数字电子钟,采用汇编语言进行编程,通过购买的简单材料即可制作出一个漂亮的电子钟。

鉴于篇幅限制本文仅讲述硬件的选择、工作原理和简单的例程。

【关键词】AT89C2051单片机;电子钟;数码管1.系统主要功能电路具有设置时间分钟模式,设置时间小时模式,设置闹钟分钟模式,设置闹钟小时模式,走时等五个模式。

不同的模式采用数码管闪烁来区分:正常走时显示,D2、D3两位数码管的小数点闪烁;在设置时间分钟模式和设置小时模式时,相应的数码管不带小数点以0.5s的速度闪烁;在设置时问分钟模式和设置闹钟小时模式时,相应的数码管带小数点以0.5s的速度闪烁。

2.显示原理显示部分主要器件为4位共阳数码管,驱动采用PNP型三极管驱动,使用动态扫描方式显示,占用P1.0~P1.6端口。

调整R2可以改变数码管亮度。

,每位LED的显示时间10—25ms之间均可,扫描频率不能太高,否则每位LED显示的时间过短,亮度太低,不易于观看,以肉眼不感觉到LED闪烁为宜。

3.按键设置按键S1、S2采用复用的方式与显示部分的P3.3、P3.4口复用。

其工作方式为,在相应端口输出高电平时读取按键的状态。

由单片机消除抖动并执行相应的程序。

S2键为设置按键,每按一下,实现功能切换。

S1键为加1键,仅在设置模式时,S1键有效,此键具有连击功能。

当按键时问超过1s后能实现自动连加。

4.硬件组成IC1采用AT89C2051作为主控芯片,并配合所有的必须的电路,具有上电复位的功能。

其功能一是对接收到的按键进行判断识别,并进行相应的处理;二是定期通过复用P3.5和P3.7口读取DS1302中的时间,并把小时和分钟送显示;IC2为实时时钟芯片DS1302采用串行数据传输,可为掉电保护电源提供可编程的充电功能,也可以关闭充电功能,芯片采用32768Hz晶振。

基于AT89C2051单片机的电子钟

基于AT89C2051单片机的电子钟

新颖的60秒旋转电子钟一、任务设计一款基于AT89C2051单片机的电子钟。

二、设计要求1、基本要求⑴用4只LED数码管输出显示时和分。

⑵可通过按键设置闹钟功能,且停闹无须手工操作。

⑶可通过按键设置分校时。

⑷月计时误差小于45秒。

⑸写出详细的设计报告。

⑹给出全部电路和源程序。

2、发挥部分⑴用60只LED发光管旋转显示,模拟“秒针”的行走。

⑵模拟“秒针”行走的“嘀哒”声。

⑶增加室温检测和显示功能(可与时间交替显示)。

⑷增加停(掉)电保护功能。

⑸提高计时精度,使年计时误差小于30秒。

⑹增加日自动校准功能,使得该电子钟“永无误差”。

⑺增加红黄绿三色变色装饰。

⑻可通过按键设置一天两闹(比如早晨、中午各一次)。

新颖的60秒旋转电子钟目前市场上提供的无论是机械钟还是石英钟在晚上无照明的情况下都是不可见的。

要知道当前的时间,必须先开灯,故较为不便。

现在市场上也出现了一些电子钟,它以六只LED数码管来显示时分秒,与传统的以指针显示秒的方式不同,违背了人们传统的习惯与理念,而且这类电子钟一般是采用大型显示器件,适用于银行、车站等公共场所,且外观设计欠美观,很少进入百姓家庭。

此外,无论是机械钟、石英钟还是电子钟,都存在着共同的问题:时间误差。

针对以上存在的问题,我们设计了一款采用LED显示器件显示的电子时钟,有效克服了时钟存在的误差问题,并能在夜间不必其它照明就能看到时间,且以60只发光管实现秒显示,接近于传统的秒针来显示秒的形式,用户容易接受,而且美观大方。

另加七只装饰用的LED灯,使整个时钟显的相当美观新颖,故还可作为室内装饰用。

1 系统主要功能电子钟的外观如图1所示。

周边60只发光管顺时旋转来显示秒,中间四只LED数码管用于显示时间,中下方的七只LED灯顺时旋转,供装饰用。

其主要功能有:整点报时;四只LED数码管显示当前时分;每隔一秒钟周边的60只LED发光管旋转一格,装饰用的LED每隔一秒旋转一次。

当发生停电事件时,由后备电池供电,系统进入低功耗状态,所有显示部件停止显示,这样即延长了电池的寿命,同时又保证了CPU继续计数,不至于因停电而时钟停止运行。

基于AT89C2051串口的LED数码管显示电路

基于AT89C2051串口的LED数码管显示电路

基于AT89C2051串口的LED数码管显示电路AT89C2051 单片机内有一个串行I/O 端口,通过引脚RXD[P3.0]和TXD[P3.1]可与外部电路进行全双工的串行异步通信,发送数据时由TXD 端送出,接收时数据由RXD 端输入。

串口有四种工作方式,通过编程设置,可以使其工作在任一方式以满足不同的场合。

其中,方式0 是8 位移位寄存器输入/输出方式,多用与外接移位寄存器以扩展I/O 端口。

串口的工作方式可以参看相关的书籍,此处不做详细介绍。

方式0 的输出是8 位串行数据,通过移位寄存器可将8 位串行数据变成8 位并行数据输出,也可以将外部的8 位并行数据变成8 位串行数据输入。

因此外接一个移位寄存器就可扩展一个8 位的并行输入/输出接口,如果想多扩展几个并口就需要在外部级连几个移位寄存器。

但是这种扩展也不是无限的,因为串口的数据是一位一位串行输入/输出的。

如果外接的移位寄存器比较多的话那么是必影响数据输入/输出的速度。

串口外接的移位寄存器有两种,一种是“串行输入/并行输出移位寄存器”(如:741 一S164),另一种是“并行输入/串行输出”移位寄存器(如:74LS165)。

通过寄存器的名称就可以看出“串行输入/并行输出移位寄存器”是用于串口扩展并行输出接口,“并行输入/串行输出”是用于串口扩展并行输入接口。

图1(a)是串行输入/并行输出移位寄存器74LS164 的管脚排列图。

其功能表见表1 所示。

74LS164 有两个串行数据A、B 输入端,使用时一般把它们连在一起;丽为清零输入端,低电平有效,当该端加入低电平时,寄存器输出Q0~Q7 全为低电平。

在正常情况下,清零输入端接高电平,当CP 信号上升沿到来时,数据从A、B 端输入并右移一位;Q0~Q7 为并行数据输出端,同时Q7 端也是串行数据输出端,对于串行输入的数据,最先输入的从Q7 输出,最后进入的从Q0 输出。

CP 为移位脉冲。

图1(b)是另一种常用的“并行(串行)输入/串行。

89C2051数字钟程序

89C2051数字钟程序
LCALL ADD1 ;调加1子程序
MOV A,R3 ;
CLR C ;
CJNE A,#24H,HOUU ;计时单元数据与24比较
HOUU: JC SET6 ;小于24转SET6循环
LCALL CLR0 ;大于或等于24时清0操作
AJMP SET6 ;跳转到SET6循环
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键释放
MOV R0,#79H ;指向小时计时单元(78H-79H)
ACALL ADD1 ;小时计时单元加1小时
MOV A,R3 ;时数据放入A
CLR C ;清进位标志
CJNE A,#24H,HOUR ;
HOUR: JC OUTT0 ;小于24小时中断退出
ACALL CLR0 ;大于或等于24小时小时计时单元清0
HHH: JC SET4 ;调整单元数据小于60转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时清0
CLR C ;清进位标志
AJMP SET4 ;跳转到SET4循环
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
SETB TR0 ;开启T0定时器(开时钟)
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

基于AT89C51单片机电子时钟的设计 汇编语言

基于AT89C51单片机电子时钟的设计  汇编语言

基于AT89C51单片机电子时钟的设计摘要单片机是集CPU、RAM、ROM、定时、计数和多种接口于一体的微控制器。

近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入而51单片机是各单片机中最为典型和最有代表性的一种。

由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,本文介绍单片机AT89C51结合74LS373设计时钟定时控制器实现的方案。

74LS373为三态输出的八组缓冲器。

本系统将单片机AT89C51内部时钟读出并通过七段数码管(LED)显示出来,通过按键设定的时间来改变系统的闹钟时间,单片机依据设定的时间来响铃,从而实现了系统的智能化。

关键词:AT89C51电子时钟74LS373AbstractMCUisaCPU、RAM、ROM、timing、countingandmultipleinterfacesinonemicrocontroller.Inrecentyears,withthefieldofcomputerpenetrationinthecommunityandthedevelopmentoflarge-scaleintegratedcircuits,single-chipapplicationsissteadilymovingtowarddepthand51single-chipisthemosttypicalandmostrepresentativeone.Becauseofitsstrongfunctions,smallsize,lowpowerconsumption,cheap,reliableandeasytouseandsoon,itisparticularlysuitedtocontrolsystemsand,morewidelyusedinautomaticcontrol,intelligentinstruments,meters,dataacquisition,militaryproducts,aswellashouseholdappliancesandotherfields,Thisarticledescribesthedesignofsingle-chipmicrocomputerAT89C51combination74LS373clocktimingoftheprogramcontroller.74LS373tri-stateoutputfortheeightsetsofbuffers.AT89C51single-chipmicrocomputerofthesystemwillreadouttheinternalclockandthroughtheLEDdisplay,throughthebuttontosetthealarmclocktochangethesystemtime,single-chipbasedonthetimetosetalarmclockprocessing,thusrealizingtheintelligentsystem.Keywords:AT89C51MCU;Electronicclock;74LS373目录摘要……Abstract……目录……第一章单片机概述……00121.1单片机的定义……21.2单片机的特点……21.3单片机的应用领域……3第二章MCS-51单片机简介……52.1MCS-51单片机结构及引脚说明……52.2中央处理器(CPU)的结构……72.3AT89C51单片机的存储器……9第三章LED数码管及74LS373简介……133.1数码管的分类……133.2数码管的驱动方式……133.3数码管应用……143.4数码管使用的电流与电压……143.574LS373简介……14第四章电子钟功能介绍……154.1系统功能介绍……154.2软件设计流程……154.3电子钟程序清单……17第五章电子钟软件实现仿真……185.1单片机模拟调试软件Keil……185.2Proteus软件简介……215.3电子时钟仿真……225.4整机仿真及调试……24附录……25第1页第一章单片机概述单片机是指一个集成在一块芯片上的完整计算机系统。

AT89C2051数字电子钟的设计

AT89C2051数字电子钟的设计

AT89C2051数字电子钟的设计一、设计任务与要求1.通过单片机技术使 LED 数码管输出显示时间。

2. 可通过按键设置闹钟功能,且停闹无须手工操作。

3. 提高计时精度,使计时误差最小。

4. 通过键盘 2 个键,从左到右依次标名为 SET,DOWN,UP,ENTER, 用来修改和设置系统时钟。

二、方案设计与论证其主要设计思想是:整个系统用单片机为中央控制器,由单片机执行采集时钟芯片的时间信号并通过显示模块来输出信号及相关的控制功能。

时钟芯片产生时钟信号,利用单片机的 I/O 口传给单片机;并通过 I/O 口实现 LCD 的显示。

系统设有 4 个按键可以对时间星期年月日进行调整,还可以设置闹钟。

本电路以一片AT89C2051 单片机为主体,其显示数据从P3.0-P3.7 口输出,P1 口输出对应的六位位选信号。

电子钟程序设计时使用了 T0 作为计时,T1 为调整时显示用。

只要对程序稍加更改,可以很容易的实现 8 路定时功能。

电子钟只用一个轻触式按键来完成所有的设置。

为了使闹钟音量足够大,采用了 PNP 型三极管 8550 来驱动蜂鸣器,驱动电阻用 1K 的,蜂鸣器为 5V 小型蜂鸣器。

若用 NPN 来驱动蜂鸣器音量要小一点。

LED 数码管位驱动用8850,电子钟采用自制的 3A 开关电源供电。

AT89C205 是一个低电压,高性能 CMOS 8 位单片机,片内含 2k bytes 的可反复擦写的只读 Flash 程序存储器和 128 bytes 的随机存取数据存储器(RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,片内置通用 8 位中央处理器和 Flash 存储单元,功能强大。

但它只有 20 个引脚,15 个双向输入/输出(I/O)端口,其中 P1 是一个完整的 8 位双向 I/O 口,两个外中断口,两个 16 位可编程定时计数器,两个全双向串行通信口,一个模拟比较放大器。

单片机AT89C2051制作的LED流水灯电路

单片机AT89C2051制作的LED流水灯电路

单片机AT89C2051制作的LED流水灯电路
一、电路图
按照下图购买元器件及面包板,在面包实验板上参考右图搭成电路。

将已经固化好最简程序的AT89C2051单片机芯片插到实验板中缝左右。

LC3911BH型LED数码管高约13mm,宽10mm,引线排列在两侧,正好能骑插在面包实验板中缝左右。

然后用细硬线按照图2将数码管与单片机Pl口连接好,并接入电阻、电容、晶振、按钮开关等。

下图中LED数码管公共阳极接了1只限流电阻。

显示0—9共10个阿拉伯数字,显示1时段数最少为2个。

设每段电流最大为5mA,则2段总电流I=2×5mA =10 mA,公共限流电阻R=(UCC-ULED)/I=(5V-2V)/10 mA =300Ω
显示8时段数最多为7个,每段电流最小为10/7=1.43mA,显得较暗。

由于LED电流大时正向压降亦大些,故显示数字在0~9之间变化时,亮度变化不是预期那样厉害。

因此,下图电路数码管每段电流在1.5~5mA之间。

公共限流电阻方案适合于业余制作。

下图中AT89C2051晶振频率为6MHz。

没有两个33p电容,由于面包板的分布电容,单片机仍然能起振并工作。

0.1μ电容功能是防高频干扰。

1μ电容、10k电阻与lk电阻组成最常用的复位电路。

AT89系列51单片机要求直流电源电压3—6V。

目前有下列电源可供选用:
●手机锂电池3.6-4.1V
●万能手机充电器4.3-5V
●新稳压电源
二、固定字符显示的程序编制
普通数字电子电路都有特定功能,如与、或、非逻辑功能。

计算机包括单片机本身没有特。

基于at89c51的电子时钟设计

基于at89c51的电子时钟设计

课程设计2:设计一个数字时钟。

要求如下:1.利用51开发板上LED数码管,LED灯,按键等设备,设计一个电子时钟。

2.电子钟使用4位数码管显示小时(24小时制)和分钟,秒可以使用LED灯或其他形式表现。

3.具有设置时钟功能,设置时间时,时间停止计时。

需要设置的位置数码管处于闪烁状态,如你想设置小时的数值时,显示小时的数码管需要处于闪烁状态,而显示分钟的数码管不可以处于闪烁状态,应处于正常显示状态。

4.按键可以选择独立键盘或矩阵键盘。

5.其他扩展功能(选做,能力强的可以做):如闹钟,时制切换等。

一.key.c#include "reg52.h"#include "key.h"extern unsigned char min_flag ;//标志位,控制分数码管闪烁extern unsigned char hour_flag ;//标志位,控制时数码管闪烁extern unsigned char shi ;extern unsigned char fen ;unsigned char key_flag = 0;//标志位,有按键被按下unsigned char key_con = 0;//控制位,控制按键(K1)被按下/*独立按键P12连接到51单片机P1端口k1对应的端口为P1.3k2对应的端口为P1.2k3对应的端口为P1.1k4对应的端口为P1.0*/code unsigned char arr[]={0xf7,0xfb,0xfd,0xfe};unsigned char read_key(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(!(key & 1)){return i+1;}key>>=1; //key = key >> 1 ;}return 0;}void key_scan2(void){unsigned char temp;//键盘扫描temp = key4_scan();if(temp){if(!key_flag){if(temp==4)//K1被按下{key_con++;if(key_con==1) //第一次按下调整小时的数值{hour_flag=1;min_flag =0;}else if(key_con==2) //第二次按下调整分的数值{hour_flag=0;min_flag =1;}else //第三次按下取消调整{hour_flag=0;min_flag =0;key_con = 0;}}if(temp == 3) //增加数值{if(hour_flag){shi++;if(shi>23){shi = 0;}}else if(min_flag){fen++;if(fen>59){fen = 0;}}}if(temp == 2) //减少数值{if(hour_flag){shi--;if(shi>250){shi = 23;}}else if(min_flag){fen--;if(fen>250) //非负数,减的时候不会小于0{fen=59;}}}}key_flag = 1;}else{key_flag = 0;}}/*扫描独立键盘,输入参数:无返回值:有键按下时:返回对应的数字没有按键:返回0*/unsigned char key4_scan(void){unsigned char temp;P1 = 0xf;if(P1 != 0xf)//有按键被按下{temp = P1 & 0xf;//1110return read_key(temp);}return 0;}unsigned char sub_key_scan(unsigned char key) {unsigned char temp;P1 = key; //判断第一行temp = P1 >> 4;if(temp != 0xf){return read_key(temp);}return 0;}/*矩阵键盘硬件连接:P13连接到51单片机P1端口P1.0对应P13的1脚P1.1对应P13的2脚P1.2对应P13的3脚……P1.7对应P13的8脚输入参数:无返回值:有键按下时:返回对应的数字没有按键:返回0*/unsigned char key16_scan(void){unsigned char temp;unsigned char i=0;P1 = 0xf0;if(P1 != 0xf0)//有按键被按下{for(i=0;i<4;i++)//用函数扫描4行{temp = sub_key_scan(arr[i]);if(temp){return temp+(i*4);}}}return 0;}二.Key.h#ifndef KEY_H#define KEY_Hunsigned char key4_scan(void); unsigned char key16_scan(void);void key_scan2(void);#endif三.Led_reg.c#include "reg52.h"/*P2连接位码,P2.0连接Q4B,P2.1连接Q3B,P2.2连接Q2B,P2.3连接Q1B P0端口连接段码,P0.0连接A,。

at89c51led闪烁实验汇编语言

at89c51led闪烁实验汇编语言

at89c51led闪烁实验汇编语言1. 简介at89c51是一种经典的单片机芯片,被广泛应用于各种嵌入式系统中。

其中,led闪烁实验是单片机入门的必备实验之一,通过这个实验可以初步了解单片机的基本工作原理和汇编语言的编程方法。

2. 实验原理在at89c51单片机中,led是一种常用的输出设备,可以通过控制引脚的高低电平来实现闪烁效果。

通过学习汇编语言的编程方法,我们可以编写程序控制led引脚的状态,从而实现led的闪烁操作。

3. 实验步骤第一步:搭建硬件实验评台,将at89c51单片机与led灯连接。

第二步:编写汇编语言程序,通过设置端口的高低电平来实现led的闪烁效果。

第三步:将编写好的程序下载到at89c51单片机中,进行调试和验证。

4. 实验代码下面是一个简单的at89c51led闪烁实验的汇编语言程序:```assemblyorg 0h ; 程序从位置区域0开始执行mov P1, #0FFh ; 设置P1端口为输出loop:mov P1, #00h ; 将P1端口输出低电平acall delay ; 调用延时程序mov P1, #0FFh ; 将P1端口输出高电平acall delay ; 调用延时程序sjmp loop ; 无条件跳转至loop标号处delay:mov R1, #0Ah ; 设置延时计数值delay1:mov R2, #0FFh ; 设置内部计数值delay2:djnz R2, delay2 ; 内部计数减1djnz R1, delay1 ; 延时计数减1ret ; 返回end ; 程序结束```在这个程序中,我们首先设置P1端口为输出,并在一个循环中不断地将P1端口输出高低电平,通过调用延时程序来实现led的闪烁效果。

5. 实验总结通过这个实验,我们初步了解了at89c51单片机的基本工作原理和汇编语言的编程方法。

在以后的学习中,我们可以通过不断地深入实践和学习,掌握更多单片机和汇编语言的知识,从而实现更加复杂的功能和应用。

单片机AT89C2051中文资料

单片机AT89C2051中文资料

单片机AT89C2051中文资料(1)2007-04-05 09:52AT89C205189C2051是由ATMEL 公司推出的一种小型单片机。

95年出现在中国市场。

其 主要特点为采用Flash 存贮器技术,降低了制造成本,其软件、硬件与 MCS-51 完全兼容,可以很快被中国广大用户接受,其程序的电可擦写特性,使得开发 与试验比较容易。

1引脚89C2051共有20条引脚,详见图1.从图中可见,2051继承了 8031最重要引脚:rill ®tS06H1W>iP1 口共8脚,准双向端口。

P3.0〜P3.6共7脚,准双向端口,并且保留了全部的 P3的第二功能,如P3.0、 P3..1的串行通讯功能,P3.2、P3..3的中断输入功能,P3.4、P3.5的定时器输入功 能。

在引脚的驱动能力上面,89C2051具有很强的下拉能力,P1,P3 口的下拉能力均 可达到20mA.相比之下,89C51/87C51的端口下拉能力每脚最大为 15mA 。

但是 限定9脚电流之和小于71mA.这样,引脚的平均电流只 9mA 。

89C2051驱动能 力的增强,使得它可以直接驱动 LED 数码管。

为了增加对模拟量的输入功能,2051在内部构造了一个模拟信号比较器,其输 入端连到P1.0和P1.1 口,比较结果存入 P3.6对应寄存器,(P3.6在2051外部 无引脚),原理见图2。

对于一些不大复杂的控制电路我们就可以增加少量元件来实现,例如,对温度 的控制,过压的控制等。

图3为测量示意图。

其中,R 用于测量门限的调节,IN 端接输入模拟信号。

2电源89C2051有很宽的工作电源电压,可为2.7〜6V,当工作在3V 时,电流相当于6V 工作时的1/4。

89C2051工作于12Hz 时,动态电流为 5.5mA ,空闲态为1mA, 掉电态仅为20nA 。

这样小的功耗很适合于电池供电的小型控制系统。

3存储器89C2051片内含有2k 字节的Flash 程序存储器,128字节的片内RAM,与80C31 内部完全类似。

采用at89c2051制作的智能时钟31.doc

采用at89c2051制作的智能时钟31.doc

采用AT89C2051制作的智能时钟一、智能电子钟的功能1、全日历计时。

2、12/24小时转换。

3、8路定时输出(可关/开控制)4、误差:15S+1uS5、大、小月,润年,周,自动追踪二、调校上电后,电子钟显示“1:00”。

1、8路定时时间查询按下K1键依此显示8路定时时间。

星期位显示:“H”表示:打开当前定时输出;“L” 表示:关闭当前定时输出。

此时按K2键可进行“H”、“L”的切换。

所有输出,均由蜂鸣器输出!2、显示状态的控制按下K2键可进入以下工作状态:1)12小时/ 日月交替显示。

2)12小时固定显示。

3)24小时/ 日月交替显示。

4)24小时固定显示。

3、校时按下K2键3S后,进入校时菜单。

按下K1键依次进入校时状态:分、时、天、月、年、微调系数。

此时按K2键,完成+1。

当显示“d”时,表示要调整微调系数(0-99),其值越小,时钟走时越慢。

当使用的6MHz的晶振偏差大时,应仔细调整微调系数!当显示“out”时,按K2键,即可退出!退出后,按任意键即可启动时钟。

4、设置定时时间按下K1键3S后,进入设置菜单。

按下K1键依次进入8路定时调整状态:时、分。

此时按K2键,完成+1。

当显示“out”时,按K2键,即可退出!三、原理图和PCB图下一页AT89C2051的智能时钟单片机源程序以下为AT89C2051的智能时钟的内部程序;2001.5.24;***************;all_clk1 _program 2000-10-12;***************fl_250ms bit 00hfl_500ms bit fl_250ms+1set_clk_f bit fl_500ms+1set_al4_f bit set_clk_f+1am_f bit set_al4_f+1fl_3s bit am_f+1al1_f bit fl_3s+1al2_f bit fl_3s+2al4_f bit fl_3s+4set_over bit al4_f+1ha_f bit set_over+1ha_over bit ha_f+1fl_ms_f bit ha_over+1fl_s_f bit fl_ms_f+1key_over bit fl_s_f+1;************************************************** key_data equ 08htimers equ key_data+1t_30ms equ timers+1t_20ms equ t_30ms+1t_1s equ t_20ms+1k1_data equ t_1s+1k2_data equ k1_data+1stat_work equ k2_data+1stat_led equ stat_work+1t_1ms equ stat_led+1t_20m equ t_1ms+1beep equ t_20mal1 equ beep+1al2 equ beep+2al3 equ beep+3al4 equ beep+4al5 equ beep+5al6 equ beep+6al7 equ beep+7al8 equ beep+8ret_timer equ al8+1;************************************************** sec equ 23hmin equ sec+1hhour equ min+1hday equ hour+1hmon equ day+1hyear equ mon+1hw_adj equ year+1hweek equ w_adj+1h;***************************************al1_h equ week+1hal1_m equ al1_h+1hal2_h equ al1_m+1hal2_m equ al2_h+1hal3_m equ al3_h+1hal4_h equ al3_m+1hal4_m equ al4_h+1hal5_h equ al4_m+1hal5_m equ al5_h+1hal6_h equ al5_m+1hal6_m equ al6_h+1hal7_h equ al6_m+1hal7_m equ al7_h+1hal8_h equ al7_m+1hal8_m equ al8_h+1hbeep_t equ al8_m+1frist equ beep_t+1;**************************************led1 equ frist+1led2 equ led1+1led3 equ led2+1led4 equ led3+1led5 equ led4+1sp_data equ led5+1;**************************************led_1 bit p3.5led_2 bit p3.4led_3 bit p3.3led_4 bit p3.2led_5 bit p3.1beep_f BIT P3.7key_f bit p3.0;******************************************************** t_h_100ms equ 05dh ;100 ms for 6MHzt_l_100ms equ 07fh ;c6 for 100mstimer_no equ 8d ;3c90+30d=3cb0hw_adj_dat equ 50dkey_da equ 00000110b;********************************************************* blk_led equ 20ddot_led equ 21df_led equ 22dn_led equ 23du_led equ 24dt_led equ 25db_led equ 26dd_led equ 27doRG 0000H; ;sJMP startORG 0003H; ;reti;ORG 000BH ;;ajmp t0reti ;ORG 0013Hreti ;ORG 001BH ;aJMP T1 ;ORG 0023H ;RETI; AJMP RS_485 ;;************************************** start:call clr_ramMOV SP,#sp_data ;call int_t0call timer_intcall timer_20msSTAR_BI:call clockcall week_autocall al_outCALL KEY_bordcall key_delcall set_clk_alcall key_jmpcall rebackcall led_jmpsjmp star_bi;******************************************* reback:mov a,stat_workjz reback_endjb al1_f ,ka1mov ret_timer,secsetb al1_fsjmp reback_endka1:mov a,ret_timeradd a,#05dmov b,#60ddiv abmov a,seccjne a,b,reback_endclr al1_fmov stat_work,#00d reback_end:retkey_jmp:mov a,key_datajz key_jmp_endmov ret_timer,seccjne a,#01d,kk1mov a,stat_workinc a ;k1_keycjne a,#9d,kka1mov a,#00dkka1:mov stat_work ,asjmp key_jmp_endkk1:mov a,stat_work ;k2_key jnz kk2mov a,stat_ledinc acjne a,#05d,kka2mov a,#00dkka2:mov stat_led,asjmp key_jmp_endkk2:acall all1cpl amov @r0,akey_jmp_end:retall1:mov r0,#al1mov a,stat_workdec aadd a,r0mov r0,amov a,@r0retled_jmp:;**********************************;mov stat_work,#01d;mov stat_tw,#01dmov a,stat_workjnz led_al1mov a,stat_ledacall led_t_dmov led1,weeksjmp led_jmp_endled_al1:acall all1mov led1,#f_ledjnz le_t2mov led1,#n_ledle_t2:jb fl_250ms ,le_t4mov led1,#blk_ledle_t4:acall al_ledled_jmp_end:acall ledret;*************************************time_24:mov a,houracall bcd_8mov led2,ajnz tim4mov led2,#blk_ledtim4:mov led3,bjb fl_500ms,tim1mov a,badd a,#10dmov led3,atim1:acall led_mintime_12_end:ret;***********************************led_min:mov a,minacall bcd_8jb fl_500ms ,tim2add a,#10dtim2:mov led4,amov led5,bret;*************************************date_led:mov a,monacall bcd_8mov led2,ajnz da1mov led2,#blk_ledda1:mov a,badd a,#10dmov led3,amov a,dayacall bcd_8mov led4,ajnz da2mov led4,#blk_ledda2:mov led5,bdate_led_end:ret;*************; D_8=>BCD;*************BCD_8:MOV B,#10DDIV ABRET;**************************************** LED:mov p1,#0mov dptr,#led_asc;***************************led1 mov a,led1movc a,@a+dptrmov p1,aclr led_1acall timer_1msacall timer_1ms;acall timer_1ms;acall timer_1ms;acall timer_1mssetb led_1;*************************led2 led_led2:mov a,led2movc a,@a+dptrmov p1,aclr led_2acall timer_1mssetb led_2;*************************led3 led_led3:mov a,led3movc a,@a+dptrmov p1,aclr led_3acall timer_1mssetb led_3;*************************led4 led_led4:mov a,led4movc a,@a+dptrmov p1,aclr led_4acall timer_1mssetb led_4;*************************led5 led_led5:mov a,led5movc a,@a+dptrmov p1,aclr led_5acall timer_1mssetb led_5;*************************led_end:mov p1,#0ret;************************************ ; bafhcdegled_asc:db 11101110B;0db 10001000B;1db 11000111B;2db 11001101B;3db 10101001B;4db 01101101B;5db 01101111B;6db 11001000B;7db 11101111B;8db 11101101B;9db 11111110B;0. =>10ddb 10011000B;1.db 11010111B;2.db 11011101B;3.db 10111001B;4.db 01111101B;5.db 01111111B;6.db 11011000B;7.db 11111111B;8.db 11111101B;9.DB 00000000B;BLACK=>20dDB 00010000B;dot=>21dDB 00100110b;l=>22ddB 10101011B;h=>23dDB 10101110B;u=>24dDB 00100111B;t=>25ddB 00101111B;b=>26ddB 10001111B;d=>27d; bafhcdeg;********************************** ;delay;******************************** timer_1ms:mov t_1ms,#030hr2_1:djnz t_1ms , r2_1rettimer_20ms:mov t_20m,#050dr2_2:call clockcall leddjnz t_20m , r2_2call week_autocall al_outret;############################################# ;if mon<=2 and year=4Z(0,1,2,3...);gs1=>week=mod([5/4]*year+mon_asc(mon)+day-1)/7 ;else; gs2=>week=mod([5/4]*year+mon_asc(mon)+day)/7 week_auto:mov a,YEARmov b,#05mul abmov r4,bmov r5,amov r7,#04call mul_2MOV DPTR,#MON_ASCMOV A,MONdec aMOVC A,@A+DPTRADD A,r3;*********************MOV B,DAYADD A,Bmov r3,a;r3=gs2;*******jb mon<=2 ******MOV A,MONCJNE A,#02D,WEEK_1SJMP WEEK_2WEEK_1:JC WEEK_2week_3:mov b,#07div abmov a,bsjmp week_4WEEK_2:;*****jb year=4N ******mov a,yearmov b,#04div abmov a,bjnz week_3mov a,r3dec amov b,#07div abmov a,bweek_4:MOV WEEK,ajnz week_endmov week,#07hweek_end:RETMON_ASC:DB 6d, 2d, 2d, 5d, 0d, 3d, 5d, 1d, 4d, 6d, 2d, 4d ;2002.5.5 ;r4r5/r7=r3mul_2:D457: CLR CMOV A,R4SUBB A,R7JC DV50SETB OVRETDV50: MOV R6,#8 ;;求平均值(R4R5/R7-→R3)DV51: MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV F0,CCLR CSUBB A,R7ANL C,/F0MOV R4,ADV52: CPL CMOV A,R3RLC AMOV R3,ADJNZ R6,DV51MOV A,R4 ;;四舍五入ADD A,#0;R4JC DV53SUBB A,R7JC DV54DV53: INC R3DV54: CLR OVRET;************************************************************* clr_ram:MOV R7,#78h ;MOV R0,#0bH ;CLR A ;CR: INC R0 ;MOV @R0,A ;djnz r7,cr ;CLR RAMret;************** INT_CTRLint_t0:setb et1MOV TMOD,#00010001b ;mov w_adj,#w_adj_datsetb eajmp adj_w;**********************************************al_led:mov r0,#al1_hmov a,stat_workdec arl aadd a,r0mov r0,amov a,@r0acall bcd_8mov led2,ajnz al_1mov led2,#blk_ledmov a,badd a,#10dmov led3,ainc r0mov a,@r0acall bcd_8add a,#10dmov led4,amov led5,bal_led_end:ret;******************************** set_clk_al:jnb set_clk_f,see1call set_clockclr set_clk_fsjmp see2see1:jnb set_al4_f,see2call set_al4clr set_al4_fsee2:ret;********************************* proc led_t_dled_t_d:mov dptr,#led_ord_3mov b,#02hmul abjmp @a+dptrled_ord_3: ajmp led_k0_2ajmp led_k1_2ajmp led_k2_2ajmp led_k3_2ajmp led_k4_2led_k0_2: ; timer_12 and date to led acall time_12jnb fl_3s ,lk1acall date_ledlk1:ajmp led_jmp_5_endled_k1_2: ; timer_12 to ledacall time_12ajmp led_jmp_5_endled_k2_2: ;timer_24and date to ledacall time_24jnb fl_3s ,lk2acall date_ledlk2:ajmp led_jmp_5_endled_k3_2: ;timer_24to ledacall time_24ajmp led_jmp_5_endled_k4_2: ;sec to ledmov led1,#blk_ledmov led2,#blk_ledmov led3,#dot_ledmov a,secacall bcd_8add a,#10dmov led4,amov led5,bled_jmp_5_end:retend;**************************************** proc set_al4set_al4:mov k1_data,#01dmov k2_data,#01dclr set_overacall led_alacall key_bordcall sf_keymov key_data,#0mov frist,#0set_al41:call clockcall week_autoacall led_alacall key_bordcall key_delacall key_aljnb set_over,set_al41clr amov k1_data,amov k2_data,amov key_data,amov frist,aretend;************************************** proc key_alkey_al:mov a,key_datajz key_al_endcjne a,#01d,k2_alinc k1_data ;(1-9)mov a,k1_datacjne a,#19d,key_al_endmov k1_data,#01dsjmp key_al_endk2_al:mov a,k1_datacjne a,#018d,ke2setb set_oversjmp key_al_endke2:mov r0,#al1_hdec aadd a,r0mov r0,ainc @r0acall jj_bitmov b,#24djnz ke3mov b,#60dke3:mov a,@r0div abmov a,bmov @r0,akey_al_end:retendjj_bit:mov a,k1_datamov b,#02ddiv abmov a,b ;(a=1,0)ret;********************************* led_out1:mov led2,#00hmov led3,#u_ledmov led4,#t_ledmov led5,#blk_ledmov led1,#blk_ledret;******************************** led_al:mov a,k1_datacjne a,#017d,lo1acall beep_timersjmp led_al_endlo1:cjne a,#18d,ld1acall led_out1sjmp led_al_endld1:inc amov b,#02ddiv ab;**********mov led1,a;**********dec arl amov r0,#al1_hadd a,r0mov r0,amov a,@r0acall bcd_8mov led2,ajnz ld2mov led2,#blk_ledld2:mov a,badd a,#10dmov led3,a;************************************ inc r0mov a,@r0acall bcd_8add a,#10dmov led4,amov led5,b;***************************flash bitjb fl_250ms,led_al_endacall jj_bitjnz led_al_emov led4,#blk_ledmov led5,#blk_ledsjmp led_al_endled_al_e:mov led2,#blk_ledmov led3,#blk_ledled_al_end:acall ledret;*************************************** proc set_clockset_clock:mov k1_data,#01dmov k2_data,#01dclr set_overcall led_clcall key_bordcall sf_keymov key_data,#0mov frist,#0set_al41:call clockacall week_autocall al_outacall led_clacall key_bordcall key_delacall key_cljnb set_over,set_al41;acall key_bordmov k1_data,amov k2_data,amov key_data,amov frist,aretend;************************************** proc key_clkey_cl:mov a,key_datajz key_al_endcjne a,#01d,k2_alinc k1_data ;(1-8)mov a,k1_datacjne a,#9d,key_al_endmov k1_data,#01dsjmp key_al_endk2_al:mov a,k1_datacjne a,#08d,ke2setb set_oversjmp key_al_endke2:dec amov dptr,#asc_hmovc a,@a+dptrmov b,a;********************************mov r0,#secmov a,k1_datadec aadd a,r0mov r0,ainc @r0mov a,@r0div abmov a,bmov @r0,akey_al_end:retenddb 60d,60d,24d,32d,13d,100d,100dproc led_clled_cl:mov dptr,#led_ord_3mov a,k1_datadec amov b,#02hmul abjmp @a+dptrled_ord_3: ajmp led_k0_2ajmp led_k1_2ajmp led_k2_2ajmp led_k3_2ajmp led_k4_2ajmp led_k5_2ajmp led_k6_2ajmp led_k7_2led_k0_2: ; led secmov led2,#blk_ledmov led3,#dot_ledmov a,secacall bcd_8add a,#10dmov led4,amov led5,bjb fl_250ms ,lk1mov led4,#blk_ledmov led5,#blk_ledlk1:ajmp led_jmp_5_endled_k1_2: ; led min,houracall led_hourjb fl_250ms ,lk2mov led4,#blk_ledmov led5,#blk_ledlk2:ajmp led_jmp_5_endled_k2_2: ;led min,houracall led_hourjb fl_250ms ,lk3mov led2,#blk_ledmov led3,#blk_ledlk3:ajmp led_jmp_5_endled_k3_2: ;led day,mon acall led_monjb fl_250ms ,lk4mov led4,#blk_ledmov led5,#blk_ledlk4:ajmp led_jmp_5_endled_k4_2: ; led day,mon acall led_monjb fl_250ms ,lk5mov led2,#blk_ledmov led3,#blk_ledlk5:ajmp led_jmp_5_endled_k5_2: ; led year mov led2,#2dmov led3,#0dmov a,yearacall bcd_8mov led4,amov led5,bjb fl_250ms ,lk6mov led4,#blk_ledmov led5,#blk_ledlk6:ajmp led_jmp_5_endled_k6_2: ;led w_adj mov led2,#d_ledmov led3,#blk_ledmov a,w_adjacall bcd_8mov led4,amov led5,bjb fl_250ms ,lk7mov led4,#blk_ledmov led5,#blk_ledlk7:ajmp led_jmp_5_endled_k7_2: ;led outacall led_out1led_jmp_5_end:mov led1,weekacall ledretendled_hour:mov a,houracall bcd_8mov led2,ajnz lj1mov led2,#blk_ledlj1:mov a,badd a,#10dmov led3,a;********************* mov a,minacall bcd_8add a,#10dmov led4,amov led5,bretled_mon:mov a,monjnz lj5inc monmov a,monlj5:acall bcd_8mov led2,ajnz lj2mov led2,#blk_ledlj2:mov led3,b;********************* mov a,dayjnz lj4inc daymov a,daylj4:acall bcd_8mov led4,ajnz lj3mov led4,#blk_ledmov led5,bret;********************************************al_out:jb ha_over,al_out_endmov r7,#8dmov r1,#al8_mal_ch_1:mov r0,#minmov r6,#02d ;min houral_l:mov a,@r0mov b,@r1cjne a,b ,al_chinc r0dec r1djnz r6 ,al_l;************************************************** mov a,r7dec amov r0,#al1add a,r0mov r0,amov a,@r0mov c,acc.0cpl canl c,fl_250mscpl cmov beep_f,cacall beep_outal_ch:clr cmov a,r1subb a,r6mov r1,adjnz r7,al_ch_1al_out_end:retbeep_out:jb ha_f,ba1mov beep,secsetb ha_fmov a,beepadd a,beep_tmov b,#60ddiv abmov a,seccjne a,b,beep_out_endsetb beep_fsetb ha_overclr ha_fbeep_out_end:rettimer_int:MOV T_1S,#TIMER_nomov beep_t,#15dmov year ,#01dmov mon , #011dmov day , #06dmov hour ,#13dmov min , #00dmov sec , #00dmov r7,#16mov dptr ,#al_ascmov r0,#al1_hal_read:clr amovc a,@a+dptrmov @r0,ainc r0inc dptrdjnz r7,al_readret;************************************ beep_timer:mov led1,#blk_ledmov led2,#b_ledmov led3,#blk_ledmov a,beep_tacall bcd_8mov led4,amov led5,bjb fl_250ms,ft1mov led4,#blk_ledmov led5,#blk_ledft1:rettime_12:mov dptr,#asc_12mov a,hourrl amovc a,@a+dptrmov led2,ajnz iu2mov led2,#blk_lediu2:inc dptrmov a,hourrl amovc a,@a+dptrjb fl_500ms ,iu1add a,#10diu1:mov led3,a;*************************************** min to ledacall led_mintime_24_end:retasc_12:db 11d,2d,21d,1d,21d,2d,21d,3d,21d,4d,21d,5d,21d,6d,21d,7ddb 21d,8d,21d,9d,11d,0d,11d,1ddb 1d,2d,0d,1d,0d,2d,0d,3d,0d,4d,0d,5d,0d,6d,0d,7d,0d,8d,0d,9d db 1d,0,1d,1dclock:;********************************mov a,seccjne a,#60d,clock_end;!!!!!!!!!!!!!!!!!!!!!!mov sec,#00hinc min;**********clr ha_over ;2001.5.6mov a,mincjne a,#60d,clock_endmov min,#00hmov a,hourcjne a,#24d,clock_endmov hour,#00hmov a,monxrl a,#02djnz mm_1mov dptr,#year_dmov a, yearmovc a,@a+dptrsjmp mm_2mm_1:mov a,mondec amov dptr,#mou_12movc a,@a+dptrmm_2:mov b,ainc binc day ;***************day+1 mov a,daycjne a ,b ,clck_endsjmp clck1clck_end:jc clock_endclck1:mov day,#01hinc monmov a,moncjne a,#13d ,clock_endmov mon,#01dinc yearmov a,yearcjne a,#100d ,clock_endmov year,#00dclock_end:call fl_outretmou_12:db 31d, 28d, 31d, 30d, 31d,30d db 31d, 31d, 30d,31d, 30d,31ddb 29d, 28d, 28d, 28d, 29d, 28d , 28d, 28d, 29d, 28d db 28d, 28d, 29d, 28d, 28d, 28d , 29d, 28d, 28d, 28d db 29d, 28d, 28d, 28d, 29d, 28d , 28d, 28d, 29d, 28d db 28d, 28d, 29d, 28d, 28d, 28d , 29d, 28d, 28d, 28d db 'li jie 2000.5.15';***************************************t1:push apush pswpush bclr fl_ms_fdjnz t_1s ,t1_endclr fl_s_finc seccall adj_w;********************************t1_end:pop bpop pswpop aretiadj_w:clr tr1mov a,#T_L_100msadd a, w_adj ;*******have 5 ordermov tl1 ,amov a,#T_H_100msaddc a, #00hmov th1,amov t_1s,#timer_nosetb tr1retfl_out:jb fl_ms_f ,fl_out_endsetb fl_ms_fmov a,t_1smov b,#02ddiv abmov a,bjnz to_d1cpl fl_250msmov a,t_1smov b,#04ddiv abmov a,bjnz to_d2cpl fl_500msto_d2:fl_out_end:call sec_outretsec_out:jb fl_s_f ,sec_out_endsetb fl_s_fmov a,secmov b,#07djnb fl_3s,za1mov b,#02dza1:div abmov a,bjnz sec_out_endcpl fl_3ssec_out_end:ret;********************************** key_del:mov a,key_datajnz kl_12mov a,fristjnz kl_13retkl_13:mov key_data,fristmov frist,#0clr key_overjmp sf_beepkl_12:jnb key_over,kl11mov a,t_30msadd a,#03mov b,#60ddiv abcjne a,b,key_del_endclr key_overjmp set_keykl11:mov t_30ms,secsetb key_overkey_del_end:call sf_acjne a,#key_da,sfg_12clr key_overjmp sf_beepsfg_12:mov frist,key_datamov key_data,#0ret;**************************************** key_bord:acall re_kmov a,key_datajz key_bord1_end;acall psf_key0key_bord1_end:setb key_fretset_key:mov a,key_datacjne a,#01h,set_cc1setb set_al4_fsjmp sf23set_cc1:cjne a,#02h,sf23setb set_clk_fsf23:ret;************************************sf_key:call clockcall week_autocall al_outsetb key_fcall ledcall sf_acjne a,#key_da,sf_keycall sf_beepretsf_beep:clr beep_fcall timer_20mssetb beep_fret;******************************** re_k:mov key_data,#00hmov p1,#00hmov a,p3orl a,#01111111bmov p3,aclr key_fmov a,p3setb key_fmov p1,#0ffhanl a ,#00000110bcjne a,#00000110b,you_keyre_k_end:retyou_key:call timer_20ms;call ledmov p1,#00hmov a,p3orl a,#01111111bmov p3,aclr key_fmov a,p3setb key_fmov p1,#0ffhanl a ,#key_dacjne a,#key_da,you_key1ret;sjmp re_k_endyou_key1:jb acc.1,key_kbmov key_data,#02hkey_kb:jb acc.2,sf_key0mov key_data,#01hsf_key0:retsf_a:mov p1,#00hmov a,p3orl a,#01111111bmov p3,aclr key_fmov a,p3setb key_fanl a ,#key_daretal_asc:db 06d,40d, 06d,50d, 07d,00d, 07d,10d;am 4_al db 07d,15d, 013d,40d, 13d,45d, 14d,15d;pm 4_al。

AT89C2051单片机程序

AT89C2051单片机程序
{
count_time++; //时钟计时程序
if(count_time>=4020){
count_time=0;
second++;
if(second>=60){
second=0;
minute++;
if(minute>=60){
minute=0;
hour++;
if(hour>=24)hour=0;
P3_5=1;
P1|=0xff;
switch (program){
case 0: P1&=senen_seg[hour%10]; //时钟时的个位
break;
case 1: if(count_time>=2000) P1&=senen_seg[hour%10]; //校正时的个位
break;
x=3; //确认功能键2识别,返回3
key2_enter=0;
}
P3_0=1;
P1|=0xff;
switch (program){
case 0: P1&=senen_seg[hour/10]; //时钟时的个位
break;
case 1: if(count_time>=2000) P1&=senen_seg[hour/10]; //校正时的个位
if(count>=127) x=1; //确认功能键1为长按,返回1
else x=2; //确认功能键1为短按,返回2
key1_enter=0;
count=0;
}

89C2051单片机数码管时钟的设计

89C2051单片机数码管时钟的设计

毕业设计(论文)课题数码管时钟类别 毕业设计说明 毕业设计论文系科电子工程系专业 应用电子技术 应用电子技术/应用英语电气自动化技术 电气自动化技术/市场营销计算机应用技术 计算机应用技术/广告设计与策划班级电气061D 姓名完成日期指导教师基于89C2051单片机数码管时钟的设计摘要本设计论文介绍了选用AT89C2051单片机来控制数码管时钟的硬件结构与软件设计,给出了汇编源程序。

此数码管时钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。

它的计时周期为24小时,时、分调整可通过触摸按键来实现。

电路由LED 数码管、时钟电路、复位电路等部分组成。

用晶体振荡器产生时间标准信号,这里采用石英晶体振荡器。

根据60秒为1分、60分为1小时、24小时为1天的计数周期,分别组成两个60进制(秒、分)、一个12进制(时)的计数器。

构成秒、分、时的计数,实现计时的功能。

显示器件选用LED七段共阳极数码管,在9012输出的驱动下,显示出清晰、直观的数字符号。

针对数字钟会产生走时误差的现象,在电路中就设计有校准时间功能的电路。

关键词:LED数码管;AT89C2051;时钟电路;复位电路Design of Nixie Tube Clock Based on AT89C2051AbstractThe paper mainly presents the hardware and software design of the digital clock using AT89C2051.The source program using assemble language is given. This digital clock is a time-device , which can display “hour”,” minute”,“second”. Its time period is 24 hours and the full scale of the display is 23 hours, 59miutes,59 seconds and it has the function of time adjustment . The circuit const ants of the clock pula’s generator, the clock counter, decoding drive circuit, digital display circuit and the time adjustment circuit. It generates time standard signal using crystal oscillator, here is the quartz crystal oscillator. Because 60 seconds is 1 minute, 60 minute is 1 hour and 24 hours is 1 day. We uses two counters of 60 parts and counter of 60 parts and a counter of 24 parts separately to constitute the count of percentage of second , second, minute , and hour .So it can realize time function . Display comport selects six-segment numerical tube LED. Driven by decoding output circuit, it can display showing clear and intuitive figures. Due to walking error of digital clock, we design time calibration circuit in the system.Key word: Nixie Tube Clock; AT89C2051; Clock display circuit; Reset circuit目录摘要 (I)Abstract (II)引言 (1)1 数字钟的功能实现与设计方案 (2)1.1数字钟的设计要求及功能 (2)1.2 方案的确定 (2)2 数字硬件系统设计 (3)2.1数字钟的硬件电路的设计 (3)2.1.1 系统时钟电路的设计 (3)2.1.2 系统复位电路的设计 (3)2.1.3 按键与按钮电路设计 (4)2.1.4数字钟的显示电路设计 (4)2.2 数码管的结构 (5)2.2.1 数码管的内部结构 (5)2.2.2 数码管的外部结构 (5)3系统主要程序的设计 (6)3.1 主程序 (6)3.2 显示子程序 (7)3.3 定时器T0中断服务程序 (7)3.4定时器T1中断服务程序 (8)3.5调时功能程序 (9)4 硬件电路的焊接 (9)4.1 电烙铁使用 (9)4.2 对焊接点的基本要求 (9)4.3 焊接过程 (9)4.4 在调试中遇到的问题 (10)5软件电路的调试 (10)5.1软件电路调试 (10)5.2 系统程序调试 (13)总结 (15)参考文献...................................................................... - 1 - 致谢.......................................................................... - 2 - 附录1 ........................................................................ - 3 - 附录2 (作品成品照片)........................................................ - 4 - 附录3(软件程序清单)......................................................... - 5 -引言20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

自己做一个AT89C2051数码管1.8寸电子钟

自己做一个AT89C2051数码管1.8寸电子钟

自己做一个AT89C2051数码管1.8寸电子钟
家里的指针式电子钟坏了,本想上网买一个新的电子钟万年历,可是看了一圈没有一个看中的,因为大多数数码管显示的数字太小,远了看不清楚,想想手里还有一些电子元件,不如做一个电子钟,先看看手里都有什么元件,于是开始就动手做,把原来的指针表改造了一下,改造好感觉的还可以,唯一遗憾的就是没有掉电记忆,要不然还得上网买元件,再说现在也不轻易停电,调一下时间也很简单,不过时间精确度还可以,所以就将就着用吧!
废话不说上图看看
用万能板制作单片机AT89C2051,晶振还没有焊接
万能板背面焊接图
0.9元一个二手双色数码管,以前淘宝网上买的,带驱动,拆掉中间的一个,换上发光二极管
把线路全部焊接好装入电子表外壳中
找2块3合板,固定数码管线路板
猜猜这个是用来干什么的?
没有数码管滤光片,就用一次性塑料袋,用胶带固定粘在上面
改造电子钟面板,用大小合适的一张纸片定位
2017年的新挂历,要搞破坏了
裁剪大小合适的挂历纸做面板
把裁剪好的纸片全部粘贴的玻璃上
组装好的电子钟效果图
电子钟背面,用了三个开关来调整电子钟时间
最终显示的效果,看着还可以。

89C2051设计的电子钟

89C2051设计的电子钟
制作天地
HANDS ON PROJECTS 作 者 罗 俊
89C2051设计的电子钟
一、电路原理图
本 电 子 钟 主 要 由 89C2051 和 四 个 共 阳 极 LED 组成,结构简单,电路图如图 1 所示。 89C2051 单片机端口设置 : P1 口分别接数码 管的段码口(a~h) ; P3.0、P3.1、P3.2、P3.3 分别 接 LED 数码管的位驱动 ; P3.4 接按键 S1,P3.5 接 按键 S2 ; P3.7 驱动蜂鸣器。C3、R15 构成上电复 位电路。Q1、 Q2、 Q3、 Q4 为数码管显示驱动三极管。 电路中没有画出电源部分,电路中的电源可以利用 手机万用充电器作为本电路的供电部分。电路元件 清单见表 1。
元件参数 10K 10K 10K 10K 510 510 510 510 510 510 510
元件标号 R14 R15 R22 R23 R24 D1 D2 D3 D4 U1 Y
元件参数 510 10K 10K 10K 10K 共阳数码管 共阳数码管 共阳数码管 共阳数码管 89C2051 12M 晶体振器
图1 电磁阀阀体表面温度实测结果
圈施加 220V/50Hz 正弦电压,阀体中的阀芯(铁磁 体)被周期变化的电流交替正反向充磁,阀芯在每 一半波充磁后均存在有剩磁。在一个半波(如正半 波)对阀芯充磁后,接下来另一半波(负半波)反 向对阀芯充磁时,就要消耗相当一部分的能量来将 阀芯剩磁拨反为正,正因阀芯如此反复正反向充磁, 磁滞与涡流产生的铁损再加上有些为减少阀芯震动 而加有短路环产生的损耗,占有功消耗的绝大部份, 这些损耗最终大部分转化为热量散发掉。此电路就 是将交流电磁阀由原来交流启动、交流保持运行的 插反,是否压紧 ; 测量集成电路 1 脚电压是否为零, 正常时 1 脚电压电压为零 ; 测量 3 脚电压是否正常, 正常时为电源电压的一半,若不正常,先更换晶振 和电容 C1、C2。

AT89C2051组成的时钟电路制作

AT89C2051组成的时钟电路制作

课时授课计划讲授新课我们以P0口作为LED的字段位驱动输出,秒的“进位”采用分值闪烁提示,亮0.5秒,熄0.5秒。

,P3.1—P3.3用于位驱动,使用动态扫描方式显示,每位LED的显示时间10—25ms之间均可,扫描频率不能太高,否则每位LED显示的时间过短,亮度太低,不易于观看,以肉眼不感觉到LED闪烁为宜。

为了直观,我们的驱动输出没有采用集成电路,而是使用了分立元件—三极管,但工作原理却是一致的。

这个电路结构决定LED采用共阳极的数码管,可以采用LQ5101BS普通的发光二极管,驱动三极管可采用易得的2SA1015和2SC1815等型号,当然也可使用象S9012,S9013,S9014,2N5401,2N5555等小功率三极管,其它器件没有特殊要求。

为便于实验,单片机AT89C2051可采用DIP20P插座,程序编制好后,调试无错,即可烧写到AT89C2051中,值得一提的是,AT89C2051是Flash程序存储器,程序可反复擦写,对于做实验是非常方便的。

二、全套元件讲授新课三、套件元件包(配电路图及说明)1、电路原理图:S1复位键,S2功能键,S3置数键。

接通电源,时钟显示0.00,秒点闪动,开始计时。

2、系统时钟电路振荡电路用于产生单片机工作所需要的时钟信号。

单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2 。

在芯片的外部有XTAL1和XTAL2之间跨接的晶体振荡器和微调电容,共同构成了一个稳定的自激振荡器。

图中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,应正确选择参数(30±10 pF),并保证其对称性。

实验表明,这2个电容元件对闹钟的±走时误差有较大关系。

讲授新课AT89C2051管脚图:安装好的成品套件本课小结对AT89C205时钟电路制作过程写出体会,并写出实习小结。

课后作业写出程序并调试电路,实现电路功能。

51_52单片机(89c52)数码管时钟程序

51_52单片机(89c52)数码管时钟程序
P0=0xfd;wx();P0=table[sss];dx();delay(1);P0=0xff;dx();
P0=0xfe;wx();P0=table[ssg];dx();delay(1);P0=0xff;dx();
}
if(set1==3)//显示闹钟定时
{
P0=0x7f;wx();P0=table[nhhs];dx();delay(1);P0=0xff;dx();
P0=0xfb;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xfd;wx();P0=table[nsss];dx();delay(1);P0=0xff;dx();
P0=0xfe;wx();P0=table[nssg];dx();delay(1);P0=0xff;dx();
//52单片机程序
/************************************************************/
/*数码管时钟89c52 */
/************************************************************/
/*程序可调时间,可设闹钟,数码管共阳驱动。*/
//加一函数
uchar incone(uchar n)
{
if(k3==0)
{
delay(20);
if(k3==0)
{
n++;
while(!k3);
}
}
return(n);
}
/************************************************************/

单片机AT89C2051制作计时器

单片机AT89C2051制作计时器

单片机AT89C2051制作计时器
 本文介绍的用单片机AT89C2051制作的计时器,采用倒计时方式,剩余时间一目了然。

时间到了还会发出报警声。

 一、硬件电路工作原理
 电路见附图,由单片机电路和数码显示电路等组成。

使用复位和开始两个按钮,用三位数码管分别显示分和秒。

 AT89C205l、TX、R1、C1等组成单片机电路。

数码管DS1~DS3、
VT1~VT3、R3~R12等组成数码显示电路。

本机采用动态显示方式,使用共阳数码管,P3.3~P3.5口作数码管的位码输出,通过三极管驱动数码管。

P1.0~P1.6口作段码输出,用以驱动数码管的各字段。

BL是自带振荡器的讯响器。

当P3.0输出低电平时,BL发出报警声。

 二、软件设计
 程序用C语言编写,由主程序、定时器T0中断服务程序、定时器T1中断服务程序、延时子程序等模块组成。

主程序主要完成程序的初始化和对开始按键S1的检测。

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

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 ;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秒定时用初值(50MS×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 ET0 ;关T0中断允许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小时小时计时单元清0 OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放T0中断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 ;指向前一地址SW AP 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 ;指向当前地址单元SW AP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;对计时单元复零用CLR0: CLR A ;清累加器MOV @R0,A ;清当前地址单元DEC R0 ;指向前一地址MOV @R0,A ;前一地址单元清0RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟调整程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序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不显示)状态。

开T0中断SETB TR0 ;开启T0定时器(开时钟)CLOSE: JB P3.7,CLOSE ;无按键按下,等待。

LCALL DISPLAY ;有键按下,调显示子程序延时削抖JB P3.7,CLOSE ;是干扰返回CLOSE等待W AITH: JNB P3.7,W AITH ;等待键释放LJMP START1 ;返回主程序(LED数据显示亮)SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)SETHH1: JNB P3.7,SET5 ;等待键释放SETB 01H ;小时调整标志置1SET6: JB P3.7,SET7 ;等待按键按下LCALL DL05S ;有键按下延时0.5秒JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整MOV R0,#79H ;按下时间小于0.5秒加1小时操作LCALL ADD1 ;调加1子程序MOV A,R3 ;CLR C ;CJNE A,#24H,HOUU ;计时单元数据与24比较HOUU: JC SET6 ;小于24转SET6循环LCALL CLR0 ;大于或等于24时清0操作AJMP SET6 ;跳转到SET6循环SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。

等待键释放LCALL DISPLAY ;延时削抖JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待CLR 01H ;清调小时标志CLR 00H ;清调分标志CLR 02H ;清闪烁标志CLR TR1 ;关闭定时器T1CLR ET1 ;关定时器T1中断SETB TR0 ;开启定时器T0SETB ET0 ;开定时器T0中断(计时开始)LJMP START1 ;跳回主程序SET1: LCALL DISPLAY ;键释放等待时调用显示程序(调分)AJMP SET2 ;防止键按下时无时钟显示SET3: LCALL DISPLAY ;等待调分按键时时钟显示用AJMP SET4SET5: LCALL DISPLAY ;键释放等待时调用显示程序(调小时)AJMP SETHH1 ;防止键按下时无时钟显示SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用AJMP SET6SETOUT1: LCALL DISPLAY ;退出时钟调整时键释放等待AJMP SETOUT ;防止键按下时无时钟显示; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 显示程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作; 扫描控制,每个LED数码管亮1MS时间再逐位循环。

相关文档
最新文档