基于MCS-51单片机使用定时器编写时钟程序(汇编)

发布者:乡村乐园最新更新时间:2022-09-07 来源: csdn关键字:MCS-51  单片机  定时器  时钟程序 手机看文章 扫描二维码
随时随地手机看文章

1、仔细想想还不错的思路

用定时器写一个时钟程序,想想都觉得头大。撇开其他花里胡哨的功能,先从最基本的时间显示开始吧,剩下的以后再说。


我们一般希望的是时钟能不停地计时,在需要的时候调用显示来显示当前时间,同时也可以干其他事,所以当然不能用延时来写,不然这个时钟除了只能显示时间之外就是个废物了。


我们希望每定时到一秒的时候来个中断,在中断里使存储里的时间序列加一秒(时间序列以时分秒各一个字节的方式存储)。51单片机定时器0方式1的最大定时时间是216=65536μs,也就是大约65ms出头。但我们可以每50ms来一次中断,中断到第20次的时候时间序列加一秒;或者每20ms来一次中断,到第50次的时候时间序列加一秒。一般来说,尽量使单次定时的时间大一点可以减小误差,但我还是想用20ms为例QwQ

关于时间序列,在加一秒时,要能满足60秒进位分,满60分进位秒,满24时归零的功能。

显示部分,采用动态显示的方法,即调用显示子程序时,从左到右每一位轮流显示0.5ms的时间,不停循环,对人眼的视觉效果来说就是常亮的时间显示。


由于显示用的是6位八段数码管,所以显示之前又必须将时间序列(3字节的压缩BCD码)拆分成6位0XH存入显示缓冲区


理一遍思路,首先定时器设置20ms产生一次中断,每中断到第50次时调用子程序使存储中的时间序列加一秒。主程序中暂时只要进行拆分BCD→显示的循环操作即可(后续添加功能时就可以直接在主程序中添加)。


2、快进到画程序框图

主程序框图

image.png

定时器T0中断程序框图
image.png
时间序列加一秒子程序
image.png

image.png

image.png

BCD拆分子程序

image.png

显示子程序框图

image.png

image.png

3、还凑合的源代码

一些说明

本代码对应的单片机时钟晶振为12MHz

仿真机的6位8段数码管,段码口地址为8004H,位码口地址为8002H

20H 21H 22H 单元分别存储【时 分 秒】的BCD数值

30H~36H共6个单元作为显示缓冲区

由于指令的执行本身占据一定的机器周期,所以时钟每秒可能有微秒级的误差,后续可以使用示波器进行调试校正,修改代码

目前只有时间显示的功能,其余功能待后续更新

源代码

ORG 0000H

SJMP MAIN

ORG 000BH

LJMP SER0

ORG 0030H

MAIN:

MOV SP,#70H ;设置堆栈SP

CLR EA ;关中断

MOV 30H,#23H ;设置初始时间值

MOV 31H,#59H

MOV 32H,#55H

MOV TMOD,#01H ;使用定时器0,软件控制,定时模式,方式1

MOV TH0,0B1H ;定时初值:2^16-20ms/1us=45536=B1E0H

MOV TL0,0E0H

MOV R6,#50 ;设定计数次数50,作为中断次数计数的全局变量

SETB EA ;开中断

SETB ET0 ;允许T0中断

SETB TR0 ;启动定时器0

SHOW:

LCALL LOOSE ;调用子程序拆分BCD码并存入显示缓冲区

LCALL DISP ;调用显示子程序进行显示

LJMP SHOW


SER0: ;中断子程序

CLR EA ;关中断

MOV TH0,#0B1H ;再次填装定时初值

MOV TL0,#0E0H

DJNZ R6,EXIT ;计到50次就继续执行下面指令,否则出中断

MOV R6,#50 ;重置计数次数

PUSH ACC ;保护工作寄存器

PUSH PSW

CLR RS1 ;选择寄存器组01

SETB RS0

LCALL NUMINC ;调用子程序使时间值加一秒

POP PSW

POP ACC

EXIT:

RETI


LOOSE: ;拆分子程序,压缩BCD码->0XH

MOV R5,#03H ;总共3个字节,需要循环3次

MOV R0,#30H ;显示缓冲区首地址

MOV R1,#20H ;时间序列存储首地址

LOOP1:

MOV A,@R0

ANL A,#0F0H ;取高位

SWAP A

MOV @R1,A

INC R1

MOV A,@R0 ;存高位

ANL A,#0FH ;取低位

MOV @R1,A ;存低位

INC R0

INC R1

DJNZ R5,LOOP1


DISP: ;显示子程序

MOV R2,#20H ;位码初值

MOV R3,#06H ;总共6个位

MOV R0,#20H ;显示缓冲区首地址

SIX:

MOV R7,#250 ;延时自循环次数

MOV DPTR,#8002H ;位码口地址

MOV A,#00H

MOVX @DPTR,A ;关显示

MOV A,@R0

MOV DPTR,#DATA0

MOVC A,@A+DPTR ;查表取段码值

MOV DPTR,#8004H ;段码口首地址

MOVX @DATR,A ;段码值送段码口

MOV DPTR,#8002H

MOV A,R2

MOVX @DPTR A ;送位码,段码显示

DJNZ R7,$ ;原地循环R7次,起到延时效果

INC R0

RR A

MOV R2,A

DJNZ R3,SIX

RET


NUMINC: ;时间序列加一秒子程序

MOV R1,#32H ;时间序列末地址(秒)

MOV A,@R1

ADD A,#01H ;加1

DA A ;转BCD码

MOV @R1,A ;保存

CJNE @R1,#60H,TORET;若未到60秒,直接返回,否则执行下面程序

MOV @R1,#00H ;秒数清零

DEC R1 ;进行分钟位的操作

MOV A,@R1

ADD A,#01H

DA A

MOV @R1,A

CJNE @R1,#60H,TORET;若未到60分,直接返回,否则执行下面程序

MOV @R1,#00H ;分钟数清零

DEC R1 ;进行时数的操作

MOV A,@R1

ADD A,#01H

DA A

MOV @R1,A

CJNE @R1,#24H,TORET;若未到24时,直接返回,否则执行下面程序

MOV @R1,#00H ;小时数清零

TORET:

RET

DATA0: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0 1 2 3 4 5 6 7 8 9

DB 77H,7CH,39H,5EH,79H,71H,00H ;A B C D E F 灭

END


4、关于数码管动态显示

共阴数码管字符段码

八段数码管外形

段码
段码

数码管动态显示原理

动态显示的原理是每一个数码管的公共端分别由一条 I/O 输出控制,实现分时选通;而各个数码管的段相并联后,与一片锁存器的输出端相连接,当CPU通过数据总线输出欲显示的字符的编码,经锁存器锁存,此时,仅当由 I/O口输出选通的那一位才显示,其它的均不显示。为了使每位显示不同的字符,必须采用扫描方式,即在单位时间内,CPU通过 I/O口输出不同的数值,选通不同的位,逐一轮流显示(某一时刻只有一位显示);只要每位显示的时间间隔足够短,由于人眼视觉存在暂留现象,使得看起来每位均在显示各自的字符。为了稳定显示字符,CPU必须不断地刷新各个数码管,所以,这种显示方式虽然降低硬件成本,但要占用 CPU的时间,亮度也较低。


仿真机数码显示线路

仿真机数码管实验线路

上图为仿真系统的显示电路,8 位段码、6 位位码是由两片 74LS374 输出。

位码经 MC1413 或 ULN2003 倒相驱动后,选择相应显示位。U1 的输出 Q1~Q8 用于段码输出口(需要显示的数据送到该口);U2 的输出 Q1~Q8 中的低 6 位为位码输出口(即选通哪一位显示的输出口);当数码管需要显示某一字符时,该字符的段码通过数据总线送入 U1,经 74LS374 锁存送到数码管的 a~g、dp;然后,需要使哪个数码管显示的位码也通过数据总线送入 U2,也是通过 74LS374锁存控制6 个数码管,从左到右的位码分别为20H、10H、08H、04H、02H、01H。

关键字:MCS-51  单片机  定时器  时钟程序 引用地址:基于MCS-51单片机使用定时器编写时钟程序(汇编)

上一篇:基于51单片机设计N字节十六进制除法——以6字节除以3字节为例
下一篇:51单片机输出方波问题

推荐阅读最新更新时间:2024-11-12 18:46

瑞萨电子将AliOS嵌入MCU,就物联网平台开发与阿里巴巴展开合
2018年3月14日,中国上海讯 – 全球领先的半导体解决方案供应商萨瑞电子株式会社(TSE:6723)今日宣布,与阿里巴巴(NYSE:BABA)旗下云计算科技公司阿里云合作,加速以阿里物联网操作系统AliOS 为基础的物联网解决方案的开发,为中国物联网发展做出贡献。双方将通过由双方工程师组成的联合团队展开合作开发,将阿里物联网操作系统AliOS嵌入瑞萨电子丰富的微控制器产品线,由此轻松创建物联网节点和网关,无缝连接阿里云。 在中国,伴随着互联网服务的繁荣发展,强大的互联网生态应运而生,并逐步扩展到物联网服务市场,吸引众多企业进入该市场。瑞萨电子推出开发平台,以加强对用户的产品开发支持。借助该解决方案平台,用户可以轻松开发出适
[物联网]
MCS-51系统中断优先级的软扩展
鉴于MCS-51系统只提供“二级中断嵌套”,提出扩展51系统中断优先级的纯软件方法。其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现;以C51的形式,给出这种扩展方法的函数库实现,为该方法的使用赋予友好、简洁的用户接口。 关键词:MCS-51单片机 中断优先级 软扩展 C51 引言 众所周知,MCS-51系统只提供“二级中断嵌套”,而大多数嵌入式系统希望有多于两级的优先级别。因为一般来说,系统都有掉电中断,且应置为最高优先级,这样所有其它中断只能共用一个最低优先级,如此,往往不能满足实际的逻辑需求。为了使系统具有多于两级的中断优先级别,可以利用8259A之类的中断控制芯片实现中断优先级的硬扩展,但
[电源管理]
<font color='red'>MCS-51</font>系统中断优先级的软扩展
PIC 单片机之AD转换
AD转换 我们先看看R1和R2,R2是个可调电阻 如果我们将R2变大 RA1这个管脚上的电压就越大。R2变小 RA1这个管脚上的电压就越小。那单片机是怎么知道电压变化的。这就需要AD转换。就是将模拟量转换成数字量。 PIC单片机如何表示电压 PIC用十位二进制位的数来表示电压,也就是数值0~1023来表示电压。那比如现在这个数值是400那这代表多少的电压?这就要根据参考电压来确定了。 比如我们设置正参考电压为3.3V ,当输入的电压为0时,数值就为0。当输入的电压为3.3V时,数值就是1023. 那如果输入的电压是1.2V代表多少电压。 首先,先算出一个数值代表多少的电压 3.3V除以1023 约等于 0
[单片机]
基于单片机设计的机车空调逆变电源控制系统
引言: 随着电力电子学科的发展,逆变器控制技术与工业现场总线应用范围越来越广,本系统成功应用这两项技术,设计了机车空调电源用逆变器控制系统。原有空调电源逆变器控制系统的缺点是:不能根据设定温度控制空调机组变频运行,体积大,各逆变器协调控制困难。本文设计了一种机车空调机组用多逆变器控制系统,与原有空调电源逆变器控制系统相比,有体积小、重量轻、数据交换方便、运行可靠、利于维修等优点。 1 系统工作原理: 由图1可知,上位微机控制电路是该系统的核心控制部分,通过CAN总线将控制指令传给逆变器控制电路,逆变器控制电路根据控制指令产生不同频率的SPWM信号控制逆变器工作;逆变器控制电路将各逆变器实际工作状态、故障信号等通过CAN总
[单片机]
基于<font color='red'>单片机</font>设计的机车空调逆变电源控制系统
8051单片机的C语言编程
8051的C语言编程和传统的C语言编程是类似的。当然其中有些数据类型是不一样的,我们知道8051支持强大的位寻址能力,因此8051的C语言编程增加了一些新的数据类型,为了不使的8051的能力被浪费。下面给出新增的数据类型。 bit ——用于定义1个位变量,用于8051的位寻址空间(仅仅限于内部RAM的20H——2FH的字节空间(00H——7FH的位地址空间)).(不得不说8051的地址重叠搞得人很烦) 例如:bit flag = 0; 定义flag为一个位变量,并且初始化为0. sbit ——用于定义一个位变量,用于8051的特殊功能寄存器(内部RAM的80H——FFH的字节
[单片机]
8051<font color='red'>单片机</font>的C语言编程
嵌入式学习笔记7——51单片机之独立键盘
1. 51单片机的P1、P2、P3口自有上拉电阻,P0口要想当做I/O口使用,必须也加个上拉电阻。 2. 如果用51单片机的I/O口用于输入,必须先将I/O口输出1,即置1。 3. 单片机组成的系统中,用的最多的是非编码键盘,其又分为独立式非编码键盘和行列式非编码键盘。 4. 数字电路中线与、线或的概念: 如上图,线与两端电平做与运算,即当一端为高电平,另一端为低电平时,开关闭合,整个电路为低电平。 线或,Z为高阻态,当另一端为高电平时,开关闭后,整个电路为高电平;若另一端为低电平,开关闭后,整个电路为低电平。 5. 按键消抖(软件方法和物理方法),本文只介绍软件方法:按键按下的实际波形如下图 整个
[单片机]
嵌入式学习笔记7——51<font color='red'>单片机</font>之独立键盘
51单片机故障分析一个
故障现象: 做了一个单片机温度监测系统,仿真机上一切正常,烧写芯片无法工作。 相关电路框图: 用51做处理器,外围电路如图,一片双积分转换芯片ICL7135做AD,它的时钟需要125K,用51的ALE经过一片CD4024分频得到。1403提供基准源。另外,一片7660提供7135工作所需要的负压。 为了省电,把所有模拟电路部分电源用一个晶体管管理起来,由P1.0来控制。(上图为示意图,省去了电阻没画)P1.0为地的时候,模拟系统才上电 现在怪现象如下: 仿真机正常运行,烧写芯片后无反应。 仿真正常,说明外围芯片完全正常,电路也没有错误。 经过检查,晶体正常,复位可靠,EA高,程序堆栈都没有溢出,并排除其
[单片机]
51<font color='red'>单片机</font>故障分析一个
CPLD和MSP430单片机在导波雷达物位计中的应用
摘要:导波雷达物位计是一种利用时域反射原理实现的高性能物位计。为了实现导波雷达物位计这一高精度时差测量系统,采用了CPLD和MSP430单片机协同工作的电路设计。CPLD为信号收发模块的核心,为发射电路中提供窄脉冲产生电路的周期触发信号,并在接收电路中控制可编程延时器件AD9500实现等效时间采样,把高频的回波脉冲信号在时间轴上放大为低频信号。以MSP430为核心的信号处理模块根据收发模块传来的信号计算物位,并把物位信息以4-20 mA信号、串口等方式输出,同时MSP430还对液晶屏、按键等外围器件进行控制。实际试验表明系统各模块的工作状态与理论分析相符。 导波雷达物位计具有受温度、压力、雾气、泡沫及被测介质物理特性变化的影响
[单片机]
CPLD和MSP430<font color='red'>单片机</font>在导波雷达物位计中的应用
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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