AT89C51数字电子钟

最新更新时间:2011-02-19来源: 互联网关键字:驱动  LED驱动  LED芯片 手机看文章 扫描二维码
随时随地手机看文章

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      ;获得表头
       MOVc 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 带小数点代码
       end ;

关键字:驱动  LED驱动  LED芯片 编辑:探路者 引用地址:AT89C51数字电子钟

上一篇:2011印度国际照明及LED展览会
下一篇:LED12864经典例程序

推荐阅读最新更新时间:2023-10-18 15:06

STM32F103单片机驱动TM1637数码管显示模块
最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考。 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637四位数码管显示模块 实际运行效果 下面先看一下TM1637和数码管连接的具体线路图 实际使用的模块没有带按键,只用了4个数码管,模块和单片机连接只需要4根线VCC、GND、CLK、DIO。芯片和单片机通信使用的是I2C总线,下面就来说一下如何通过I2C总线驱动这个数码管模块。 为了方便移植,这里使用 IO口模拟I2C总线,所以首先要将延时函数准备好,延时函数使用任何一种方式都可以,可以根据自己的习惯使用自己的
[单片机]
STM32F103单片机<font color='red'>驱动</font>TM1637数码管显示模块
大联大品佳集团推出汽车LED前大灯驱动整体解决方案
致力于亚太地区市场的领先半导体元器件分销商---大联大控股2016年2月23日宣布,其旗下品佳推出基于英飞凌(Infineon)技术和产品的汽车LED大灯驱动整体解决方案。大联大品佳在今天推出的汽车LED大灯驱动整体解决方案中整合了英飞凌的TLD5097EL和TLD5098EL汽车LED DC-DC驱动芯片、IPD25N06S4L-30 MOSFET、汽车级16位MCU SAK-XC2331D,以及SBC芯片TLE9262。 图示1-大联大品佳推出基于英飞凌(Infineon)技术和产品的汽车LED大灯驱动整体解决方案系统框架图 目前,LED在车内照明和刹车灯、应急灯、日行灯等方面的应用已经取得了显
[汽车电子]
大联大品佳集团推出汽车LED前大灯<font color='red'>驱动</font>整体解决方案
一种新型白光LED模组驱动电路的设计
0 引言 由于当前温室效应和能源危机的影响,使得人们对节能技术越来越关注。LED照明具有节能、寿命长等优点,LED照明技术作为新型绿色照明技术,目前的应用日趋广泛。LED的白光照明通常是使用蓝、绿、红三原色多芯片LED模组构成,由于这种LED模组中每种LED芯片的老化特性不同,因此色温会随着时间和温度而发生变化,这就给白光LED的使用带来了限制。本文中分析了对白光LED模组的驱动模式,提出了一种新型白光LED模组驱动电路的设计方案。 1 白光LED模组的驱动    对于传统光源的驱动方式而言,大都是以恒定电压的形式存在,这就使得传统光源的驱动十分简单。在线性范围内,LED的发光强度与其驱动电流及
[安防电子]
一种新型白光LED模组<font color='red'>驱动</font>电路的设计
单正激驱动变压器的磁通复位问题分析
1 引言 晶闸管触发驱动电路的作用是产生符合要求的门极触发脉冲,保证晶闸管在需要的时刻由阻断转为导通 。广义上讲,晶闸管触发电路通常包括驱动电路以及对其触发时刻进行控制的相位控制电路。本文集中研究触发脉冲的放大和输出驱动环节,有关相位控制电路在有关教科书中已有讨论。现今晶闸管主要应用于交流—直流相控整流和交流—交流相控调压等,适用于这些应用的各种驱动触发器都已集成化、系列化。例如目前国内生产的KJ系列和KC系列的晶闸管驱动(触发)器,都可供研制选用。 为保证晶闸管可靠触发导通,门极的脉冲电流必须有足够大的幅值和持续时间,以及尽可能短的电流上升时间 。控制电路和主电路之间的隔离,通常既可以通过光耦亦可以采用脉冲变压器来实现,
[电源管理]
单正激<font color='red'>驱动</font>变压器的磁通复位问题分析
ADUM3220:4A双通道门极驱动
ADuM3220是一款基于ADI公司 iCoupler® 技术的4 A隔离式双通道门极驱动器。这款隔离器件结合了高速CMOS工艺和单片变压器技术,能够提供比脉冲变压器和门极驱动器组合等传统解决方案更优异的性能特性。   ADuM3220隔离器提供两个独立的隔离通道。最大传播延迟为60 ns,通道间匹配为5 ns。与采用高压电平转换方法的门极驱动器相比,ADuM3220的输入与各输出之间具有真电流隔离优势,能够跨越隔离栅实现电压转换功能。ADuM3220具有门极驱动应用所需的直通保护逻辑和默认低压输出特性。其输入电源电压范围为3.0 V至5.5 V,与低压系统兼容。输出电源电压范围为5 V至18 V,支持同步DC/DC转换器的
[模拟电子]
ADUM3220:4A双通道门极<font color='red'>驱动</font>器
STM32移植USB驱动总结
//=========================By xiaowei /* */ //========================= 1、硬件介绍 1、SGM7227,USB高速切换开关,OE是芯片使能,低电平才能使总线导通; S脚是切换控制; USB协议 https://segmentfault.com/a/1190000015995506 2、软件移植 移植文件分析 stm32自带USB接口,OTG-FS(全速)和OTG-HS(高速),因为stm32f4只带有高速PHY,想使用高速模式,就需要外扩高速PHY,在此为USB3300。 系统配置一个Device端口,一个Host端口; Device端
[单片机]
STM32移植USB<font color='red'>驱动</font>总结
高效率DC/DC恒流电源LED驱动创新设计方案
  1 引言   半导体照明作为21 世纪的新型光源,具有节能、环保、寿命长、易维护等优点。用大功率高亮度发光二极管(LED)取代白炽灯、荧光灯等传统照明光源已是大势所趋。由于LED 自身特性,必须采用恒流源为其供电。因此,高效率恒流驱动电源的设计成为LED 应用中一个重要研究对象。LLC半桥谐振变换器以其高效率、高功率密度等优点成为现今倍受青睐的热门拓扑, 但一般用于恒压输出场合,传统LLC 被认为不适合应用于宽范围恒流输出。此处提出一种半桥LLC 新的设计方法,使其在宽范围恒流输出场合依然保持高效率。   因此,LLC 可作为LED 驱动的很好的拓扑选择。   2 恒流LLC 谐振变流器的设计方法   
[电源管理]
高效率DC/DC恒流电源<font color='red'>LED驱动</font>创新设计方案
如何在工业驱动器中实现精密的运动控制
乘坐电梯时,您肯定希望平稳安全地从一层到达另一层。在电梯驱动中,精密的运动控制使电梯能够停在指定位置,并平稳地减速直到完全停止。缺乏精密的运动控制可能会导致电梯误停在两层之间,这会让乘坐电梯的人感到头晕不适或不安全。 机器人、计算机数控机器和工厂自动化设备都需要通过伺服驱动器进行精密的位置控制,此外在许多情况下还需要进行精密的速度控制,以便正确地制造产品并维护工作流程。 工业驱动器的诸多方面都对实现精密的运动控制很重要,精密运动控制涉及实时控制设计中的三个基础子系统,即感应、处理和驱动。本文将论述各个子系统的支持技术示例。 感应 缺乏精密的位置和速度感应,就无法实现精密的运动控制。感应可以包括电机轴角位置和速度感应或传
[嵌入式]
如何在工业<font color='red'>驱动</font>器中实现精密的运动控制
小广播
最新电源管理文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved