AT89C51数字电子钟

发布者:mancozc最新更新时间:2018-01-08 来源: eefocus关键字:AT89C51  数字电子钟 手机看文章 扫描二维码
随时随地手机看文章

该数字钟可实现精度误差≤ 1S/天的变精度时钟,并能方便地调节时钟、时间、定时时间等.  
   
       LED1 bit p1.0       ;LED定义 
       led2 bit p1.1      
       led3 bit p1.2 
       led4 bit p1.3

       led5 bit p1.4
       led6 bit p1.5 
       led7 bit p1.6 
       led8 bit p1.7 

       s1 bit p0.0        ;数码管位数定义  
       s2 bit p0.1 
       s3 bit p0.2 
       s4 bit p0.3  
       s5 bit p0.4  
       s6 bit p0.5 
       s7 bit p0.6 
       s8 bit p0.7  

       led_data equ p2      ;数码管定义 

       key1 bit p3.5        ;按键定义 
       key2 bit p3.6 
       key3 bit p3.7 
       key equ 56h 

       time_h equ 57h       ;定时初值高位 
       time_l equ 58h       ;低位  

       t_h equ 60h        ;时分秒对应的地址 
       t_s equ 61h  
       t_m equ 62h 
       time equ 63h        ;时钟计数单元 
       timer_h equ 64h       ;定时时单元 
       timer_m equ 65h      ;定时分单元 
       
       timset bit 00h       ;设置时间标志 

       disstart equ 70h      ;显示单元首地址  

       int_data equ 45h      ;中断数据地址 
       count_data equ 44h     ;计数单元地址 
       timer_data equ 43h     ;定时地址 
; ************** 以上为预定义部分  

; ************** 以下程序开始  
       org 00h          ;程序开始地址  
       jmp main          ;跳转到代码开始处  

       org 1bh          ;定时器 T1 中断服务程序入口 
       jmp tim1  

       org 030h          ;主程序开始的地址 30H  

     main: MOV  sp,#30h        ;首先定义堆栈 
       lcall rest         ;初始化 
       lcall pro_set       ;设置定时器开始工作 
     lpp:lcall time_set       ;接受用户设置时间  
       lcall timer        ;时钟处理  
       lcall time_pro       ;时间格式处理,码型变化等  
       lcall time_display     ;显示 
       jmp lpp 
; ************* 初始化程序 *************************** 
     rest: MOV  a,#00h         ;累加器清零  
        MOV  b,#00h 
        MOV  p0,#0          ;数码管禁止显示  
        MOV  t_h,#0         ;时单元 
        MOV  t_m,#0         ;分单元 
        MOV  t_s,#0         ;秒单元 
        MOV  time,#00h       ;计数溢出次数,溢出20次为一秒  
       clr timset         ;定时设置标志位,0->增加 1 ->减少 
        MOV  timer_h,#12      ;定时器时单元,设置定时为 12:00  
        MOV  timer_m,#00h      ;定时器分单元 
        MOV  p2,#255        ;禁止显示数码管  
       clr beep          ;禁止蜂鸣器  
       ret            ;返回  
; *************** 定时器 T1 中断服务程序 ****  
     tim1:clr tr1          ;首先停止定时操作 
        MOV  th1,time_h       ; 
        MOV  tl1,time_l  
       inc time          ;自增 
        MOV  a,time         ;取得溢出次数 
       cjne a,#20,retend      ;如果满20此表示到 1 秒  
       cpl p1.0          ;取反p1.0,p1.1指示秒钟  
       cpl p1.1 
        MOV  time,#00h       ;重新开始等待1秒 
       inc t_s          ;秒单元加1  
    retend:setb tr1          ;定时开始  
       reti            ;中断返回 
; ***************** 设置定时器初始化,定时时间为 50ms **** 
   pro_set: MOV  dptr,#0000h       ;数据指针清零  
        MOV  tmod,#10h       ;设置定时器1工作在方式1 
        MOV  time_h,#3ch       ;计算定时50ms需要的初值 
        MOV  th1,time_h       ;保存高位 
        MOV  time_l,#0c1h      ;低位  
        MOV  tl1,time_l       ;保存低位 
       setb ea          ;总的中断允许  
       setb et1          ;定时器1允许 
       setb tr1          ;定时器1开始运行 
       ret             ;返回  

; ****************** timer 程序主要完成数据的处理 ********** 
    timer: MOV  a,t_s          ;取得秒单元数据 
       cjne a,#60,tend       ;秒不到60返回 
        MOV  t_s,#00h         ;清除秒单元 
       inc t_m           ;为分单元加1 
        MOV  a,t_m          ;取得分单元数据 
       cjne a,#60,tend       ;分不等于60返回  
        MOV  t_m,#00h        ;分单元清零  
       setb beep          ;整点短鸣提示 
       lcall delay         ;鸣叫延时 
       clr beep          ;停止蜂鸣器 
       inc t_h           ;同时为时单元加1 
        MOV  a,t_h          ;取得时单元数据 
       cjne a,#24,timetest     ;如果不等于24,查看定时 
        MOV  t_h,#00h        ;时单元清零 
       jmp tend           ;返回  
   timetest:cjne a,timer_h,tend    ;不等于定时的时单元,返回  
        MOV  a,t_m         ;取得定时的分单元 
       cjne a,timer_m,tend    ;当前分不等于定时的分单元,返回 
       setb beep          ;定时到,蜂鸣提示  
       lcall delay 
       clr beep  
       lcall delay  
       setb beep 
       lcall delay 
       clr beep          ;连续发出短音提示  
     tend:ret            ;返回  

; ************ time_display 程序主要为显示时间值用 ************* 
time_display:  MOV  r0,#disstart      ;取得显示单元首地址  
        MOV  r1,#01h        ;从第一个数码管开始 
        MOV  r2,#06h        ;共6个数码管 
    dislp: MOV  led_data,@r0      ;获得当前单元数据 
       inc r0           ;指向下一个单元  
        MOV  p0,r1          ;数码显示 
        MOV  a,r1          ;为下一个数准备 
       rl a            ;下一个单元  
        MOV  r1,a          ;保存  
       lcall delay5ms       ;为了保证数码管亮度,  
                     ;但要防止闪烁,延时5ms 
       djnz r2,dislp       ;重复显示,直到全部数据刷新过  
       ret             ;返回  

; ******* time_pro 时间处理,主要为 bcd码转换,查表 ***********  
  time_pro:lcall bcd          ;BCD码转换 
        MOV  r0,#disstart      ;获得显示单元首地址 
        MOV  r2,#06h         ;需要转换的个数 
    prlp: MOV  a,@r0          ;取得当前需要转换的数据 
        MOV  dptr,#tab_nu      ;获得表头 
        MOV c a,@a+dptr       ;获得转换后的数据 
        MOV  @r0,a          ;存回去 
       inc r0            ;指向下一个 
       djnz r2,prlp         ;重复转换,直到6个全部完成 
       ret             ;返回 

; **************** 码型变换 **************************************** 
     bcd: MOV  r0,#disstart      ;获得首地址 
        MOV  a,t_s          ;获得待转化的低位 
        MOV  b,#10          ;转化进制,如果要进行十进制转换 改为 10  
       div ab            ;计算 A/B     
        MOV  @r0,b          ;第一位转换完毕,保存低位转化后的数据  
       inc r0            ;自增 
        MOV  @r0,a          ;保存高位 
       inc r0           ;取第二个数据地址 
        MOV  a,t_m          ;获得第二个需要转换的数据 
        MOV  b,#10          ;十六进制 
       div ab            ;计算 
        MOV  @r0,b          ;存低位  
       inc r0 
        MOV  @r0,a          ;存高位 
       inc r0            ;第三位 
        MOV  a,t_h          ;获得数据 
        MOV  b,#10          ;十六进制  
       div ab           ;计算 
        MOV  @r0,b          ;存低位 
       inc r0  
        MOV  @r0,a          ;存高位  
       ret             ;完毕,返回 
;*************************************************************************************** 
;******** time_set 设置时间 *******************************************************  
; *                                        * 
; *    检测用户按键,1-> 设置时单元 2-> 设置分单元,3->设置增减方式      * 
; *    如果需要增加 时,先将方式设置为 增加(默认为减),即,按下 KEY3一下,  * 
; *    然后按 KEY1 ,如果要减少时单元,需要再次按下KEY3,然后按KEY1;      * 
; *    分的设置也是如此。                           * 
;***************************************************************************************  
  time_set: MOV  p0,#00h         ;禁止数码管显示 
        MOV  p2,#255         ;防止按键时闪烁 
       lcall pro_key        ;查找用户按键情况  
        MOV  a,key          ;查找键值 
       jz tsend          ;如果等于0,表示没用按键,直接返回 
       cjne a,#1,tset1       ;是否等于1?没有到下一个处理程序 
        MOV  key,#00h        ;等于1,表示设置时 请零,否则会引起重复设置 
       jb timset,tset10      ;时间设置标志位,1 ->减少,0->增加 
        MOV  a,t_h          ;标志位 0 ,增加,取得时单元  
       cjne a,#23,ts1       ;如果时单元不等于23,转移到增加操作 
       jmp tsend          ;等于23 直接返回 
     ts1:inc t_h           ;时单元增加1  
       jmp tsend          ;返回  
   tset10:  MOV  a,t_h          ;这里处理为减少的情况 
       jz tsend           ;如果时单元为0,直接返回 
       dec t_h           ;否则,数据减1  
       jmp tsend          ;返回,以下关于分的设置一样  
    tset1:cjne a,#2,tset2       ;如果按键不是 2 则 转移到下一个处理 
        MOV  key,#00h        ;是2,表示设置 分 
       jb timset,tset20      ;其余同上  
        MOV  a,t_m  
       cjne a,#59, 
       ts2 jmp tsend 
     ts2:inc t_m 
       jmp tsend 
   tset20: MOV  a,t_m 
       jz tsend  
       dec t_m  
       jmp tsend 
    tset2:cjne a,#3,tsend       ;等于 3 表示设置标志 
        MOV  key,#00h        ;清零 
       cpl timset         ;标志取反 
    tsend:ret             ;返回 
;********* 按键处理 读取键盘 ************************* 
;参见有关键盘查询的说明,和前面的有关程序 
   pro_key:              ;键盘查询子程序  
       setb key1           ;首先输出高电平,检测低电平的到来  
       setb key2          ;不同电路,可能检测方式不一样  
       setb key3 
       jb key1,ke1        ;如果用户没有按第一个键,到第下个处理部分, 
        MOV  key,#1         ;表示用户按了第一个键  
       lcall delay20ms       ;软件延时,防止干扰 
       jmp pro_key         ;重新查询,直到用户释放按键 
     ke1:jb key2,ke2        ;处理第二个按键,如果没有到下一个处理部分 
        MOV  key,#2         ;以下和第一个处理单元相似。 
       lcall delay20ms 
       jmp pro_key 
     ke2:jb key3,ke3 
        MOV  key,#3  
       lcall delay20ms 
       jmp pro_key  
     ke3:ret  
;************************************** 
;******** 定时器 T0 设置 **************  
;定时器工作在方式1,为提高精度,总定时时间为50ms, 
;定时器溢出20次为1秒, 

  pro_timer: MOV  tmod,#01h        ;设置定时器为定时方式1 
        MOV  th0,#0ffh        ;初始化定时初值 
        MOV  tl0,#0a1h        ; 
       setb ea           ;总中断允许 
       setb et0           ;定时器0 允许 
       setb tr0           ;开始定时 
       ret              ;返回  
; ***************************************** 
; *************** 软件延时 ************* 
    delay:push psw          ;保存原来的寄存器内容 
       clr psw.3          ; 
       clr psw.4          ;设置新的寄存器组 
        MOV  r0,#2          ;延时参数1  
        MOV  r1,#250         ;延时参数2 
        MOV  r2,#2          ;延时参数3 
     dl1:djnz r0,dl1         ;延时循环1 
        MOV  r0,#250         ; 
     dl2:djnz r1,dl1         ;延时循环2 
        MOV  r0,#240         ; 
        MOV  r1,#248         ; 
     dl3:djnz r2,dl1         ;延时循环3 
       nop             ;定时精度调整 
       pop psw           ;恢复原来的寄存器 
       ret             ;返回 
;*****************************************  
;*************** 键盘延时 *************** 
  delay20ms:push psw 
       clr psw.3 
       clr psw.4 
        MOV  r0,#250  
        MOV  r1,#40 
     d20:djnz r0,d20 
        MOV  r0,#250  
       djnz r1,d20 
       pop psw 
       ret 
;************************************** 
;*********** 延时 5ms **************** 
  delay5ms:push psw 
       clr psw.3  
       setb psw.4 
        MOV  r0,#250 
        MOV  r1,#10 
     d5:djnz r0,d5  
        MOV  r0,#250 
       djnz r1,d5  
       pop psw 
       ret 
;************************************************************************************  
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16 
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推  
   tab_nu:db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h   ;数字0-7 不带小数点代码 
       db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh    ;数字8-f 不带小数点代码  
       db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h    ;数字0-7 带小数点代码 
       db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh    ;数字8-f 带小数点代码 


关键字:AT89C51  数字电子钟 引用地址:AT89C51数字电子钟

上一篇:秒计时器程序
下一篇:10位温度传感器AD7416驱动程序

推荐阅读最新更新时间:2024-03-16 15:52

基于单片机AT89C51RC的红外遥控密码锁的设计与实现
1 引言   根据用户的要求和需要,主要为了解决当前市场上无遥控密码锁的问题,以提高门禁系统的可靠性和安全性,适应市场需要而设计的该红外红外遥控密码锁系统。该系统具有普通电子密码锁功能的同时,还增加了遥控功能。该锁采用6位数作为密码,总密码组有106组,完全满足用户对密码安全性高的要求。该系统具有较强的实际应用价值,所涉及的技术包括:红外载波数据传输技术、单片机控制技术、红外遥控系统编码及译码技术、电路设计与演示板制作技术等。   2 系统硬件设计与实现(单元电路设计)   2.1 硬件结构图:   系统以单片机AT89C51RC为核心。系统结构框图如图1所示。本系统的功能设计目标应该包括以下几个方面:红外发射功能模块,红
[单片机]
基于单片机<font color='red'>AT89C51</font>RC的红外遥控密码锁的设计与实现
AT89C51单片机智能语音拨号报警系统
随着人们生活水平的提高和安防意识的增强, 急需开发面向大众、价格低廉、运行可靠的自动报警系统。鉴于住宅电话和移动通信设备的普及, 以及电话语音报警的快捷、有效及价格低廉等优点, 公共通信网成了报警系统的最佳传输媒介。本文介绍的报警系统就是在此基础上发展起来的一种智能语音拨号报警系统, 该系统可广泛用于各种对安防要求较高的场合, 如智能楼宇、商场、银行和工厂等。 电话自动报警的主要功能为: 用户根据需要把自己的手机号码、办公室电话或报警监控中心的电话预存入报警主机。报警主机不断地对所监控的设备( 门禁、烟雾探测器、窗磁、摄像头等) 状况进行巡检, 当有不安全情况( 如火灾、非法入室、视频丢失等) 发生时, 报警主机拨通预先存
[单片机]
<font color='red'>AT89C51</font>单片机智能语音拨号报警系统
at89c51电子时钟电路图和程序
at89c51电子时钟电路图: 1.功能: 1 开机时,显示12:00:00的时间开始计时; 2 P0.0/AD0控制“秒”的调整,每按一次加1秒; 3 P0.1/AD1控制“分”的调整,每按一次加1分; 4 P0.2/AD2控制“时”的调整,每按一次加1个小时; 2. 系统板上硬件连线 (1)把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上; (2)把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3)把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/A
[单片机]
<font color='red'>at89c51</font>电子时钟电路图和程序
基于AT89C51单片机为核心的数显超声波测距仪设计
超声波由于其指向性强、能量消耗缓慢、传播距离较远等优点,而经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。超声波测距主要应用于倒车雷达、建筑施工工地以及一些工业现场。例如:液位、井深、管道长度等场合。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在测控系统的研制上也得到了广泛的应用。 1 超声波测距原理 1.1 超声波发生器 超声波是一种频率超过20kHz的机械波。为了研究和利用超声波,人们已经设计和制成了许多超声波发生器。总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波。一类是用机械方式产生超声波。电气方式包括压电型、磁致伸
[单片机]
基于<font color='red'>AT89C51</font>单片机为核心的数显超声波测距仪设计
AT89C51与nRF401芯片在RFID系统中的应用
1 RFID系统简述 RFID即为非接触的识别系统,它是一种从20世纪90年代兴起的一项自动识别技术,它利用无线射频方式进行 非接触双向通信,以达到识别目的并交换数据,其数据存储在电子数据载体(称应答器)之中。然而,应答器的能量供应以及应答器与阅读器之间的数据交换不是通 过电流的触点接通而是通过磁场或电磁场,这方面采用了无线电和雷达技术。射频识别是无线电频率识别的简称,即通过无线电波进行识别。同其他识别系统相比, 射频识别系统具有许多优点。因此,射频识别系统开始占据了巨大的销售市场。这方面的例子有:用非接触Ic卡作短距离公共交通车票、公路收费系统以及在安全 系统、银行、医院、商店、宾馆及个人通信等场所广泛应用的无线呼叫系统,该
[单片机]
基于AT89C51单片机的变频调速控制系统设计
   1.概述   在电气传动领域中,随着自关断器件技术水平的不断提高,脉宽调制技术(简称PWM技术)也日趋成熟。PMW交流变频调速以其高效率、高功率因数、输出波形好、结构简单等优点,在井下风机、水泵、造纸机等设备中得到了广泛的应用。将单片机应用于交流变频调速系统,可有效地避免传统调速方案中的一些缺点,达到了提高控制精度的目的 ,其特点:   (1)采用单片机可以使绝大多数控制逻辑通过软件实现,简化了电路。   (2)单片机具有更强的逻辑功能,运算速度快,精度高,有大容量的存储单元,可以实现较为复杂的控制。   (3)无零点漂移,控制精度高。   (4)可以提供人机界面,多机连网工作。   根据国内外有关变频调速的最
[单片机]
基于<font color='red'>AT89C51</font>单片机的变频调速控制系统设计
LED数字电子钟方案设计
LED电子钟的制作方法在很多电子报刊杂志上都可以见到,但大多数在断电后都要重新设置时间等参数,给使用带来很多不便。也有用后备电池作为备用电源的,但往往体积较大。本文介绍的LED电子钟克服了以往的弊端,而且采用了家电通用的红外遥控器进行控制,方便使用。有一路闹铃输出,可以通过遥控器设置闹铃时间及允许与否。 电子钟的正面 电子钟的背面 一.工作原理 DS1302为达拉斯公司的一种实时时钟芯片,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32768Hz晶振。 AT89C2051作为主控芯片,一是对接收到的红外遥控编码进行判断识别,并执行相应的处理;第二就是定期的读
[单片机]
LED<font color='red'>数字电子钟</font>方案设计
at89c51芯片管脚图引脚图
at89c51芯片管脚图引脚图 AT89C51内部功能图:
[单片机]
<font color='red'>at89c51</font>芯片管脚图引脚图
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved