51单片机定时器程序汇编序

51单片机定时器应用(C程序)
> 51单片机定时器应用(C程序)
51单片机定时器应用(C程序)
用Keil C51开发定时器/计数器基本的51单片机内部有两个16位可编程的定时器/计数器T0和T1。它们各自具有4种工作状态,其控制字和状态均在相应的特殊功能寄存器中,可以通过软件对控制寄存器编程设置,使其工作在不同的定时状态或计数状态。现在,许多厂家生产的8051兼容单片机上,还加入了定时器/计数器2,使单片机的应用更为灵活,适应性更强。很多8051单片机的书籍都对定时器/计数器有详细的介绍,我们在此不再详细地讨论。但因为编写或或阅读程序时经常要查阅定时器/计数器的设置情况,因此我们仅对一些编程时经常要用到的较重要的寄存器和设置方式进行简要简介。1 定时器/计数器简介8051单片机的定时器/计数器基本结构如图1-1所示,定时器T0由两个8位计数器TH0和TL0构成,定时器T1也由两个8位计数器TH1和TL1构成,TMOD寄存器控制定时器的工作方式,TCON寄存器控制定时器的启动和停止以及定时器的状态。图1-1 定时器/计数器结构在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的。实际上,定时器就是单片机机器周期的计数器。因为每个机器周期包含晶体振荡器的12个振荡周期,而每一个机器周期定时器加1,故其频率为晶振频率的1/12。如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间为1&s。选择计数器工作方式时,计数脉冲来自相应的外部输入引脚T0(P3.4)或T1(P3.5)。在这种情况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加1。2 控制和状态寄存器(1)定时器控制寄存器(TCON)TCON为定时器/计数器的控制寄存器,同时也锁存外部中断请求标志,各位定义如下。? TF1:定时器/计数器1中断请求标志位。当定时器计数满溢出回零时,由硬件置位,并可申请中断。当CPU响应中断并进入中断服务程序后,TF1自动清零。? TR1:定时器/计数器1运行控制位,靠软件置位或清除。置位时,定时器/计数器1接通工作,清除时停止工作。? TF0:定时器/计数器0中断请求标志位,其功能和操作情况类同于TF1。? TR0:定时器/计数器0运行控制位,其功能和操作情况类同于TR1。? IEl:外部中断1的中断申请标志,检测到在INT引脚上出现的外部中断信号的下降沿时,由硬件置位,申请中断。进入中断服务程序后被硬件自动清除。? IT1:外部中断1的类型控制位。IT1=1,由下跳沿触发;IT1=0,由低电平触发。可以由软件来设置或清除。? IE0:外部中断0的中断申请标志。其功能和操作情况类同于IE1。? IT0:外部中断0的类型控制位。其功能和操作情况类同于IT1。(2)工作方式寄存器(TMOD)。TMOD确定定时器的工作方式及功能选择,不能位寻址。其中,高4位用于控制定时器1,低4位用于控制定时器0。TMOD各位的定义如下。? GATE:门控位,当GATE=1时,只有?I?N?T?0或?I?N?T?1引脚为高电平,且TR0或TR1置1时,定时器/计数器才工作。当GATE=0时,定时器/计数器仅受TR0或TR1的控制,而不管?I?N?T?0或?I?N?T?1引脚的电平是高还是低。? C/?T:定时器/计数器功能选择位,C/?T=0时,设置为定时功能;C/?T=1时,设置为计数功能。? M1 M0 :工作方式选择位。由M1M0共2位形成4种编码,对应以下4种工作方式。n M1M0=00:工作方式0(13位方式)。n M1M0=01:工作方式1(16位方式)。n M1M0=10:工作方式2(8位自动装入时间常数方式)。n MlM0=11:工作方式3(2个8位方式&&仅对T0)。3 定时器/计数器设置实例以定时器/计数器T0为例,在方式0下,TL0的低5位和TH0的8位构成13位计数器,因此计数工作方式时,计数值的范围是:1~)。当设定为定时工作方式时,定时时间的计算公式为:(213-计数初值)&晶振周期&12 或(213-计数初值)&机器周期这样,我们可以算出,若单片机系统的外接晶振频率为6MHz,则该系统的最小定时时间为:[213-(213-1)]&[1/(6&106)]&12=2&10-6=2(?s)最大定时时间为:(213-0)&[1/(6&106)]&12==16384(?s)=16.384(ms)或:最小定时单位&(?s)=16.384(ms)【例】某单片机系统的外接晶振频率为6MHz,使用定时器1,以方式0定时,从P1.0输出2ms方波的计算和设置方法如下:① 计算计数初值。欲产生2ms的等宽正方波脉冲,只需在P1.0端以1ms为周期交替输出高低电平即可实现,为此定时时间应为1ms。使用6MHz晶振,则机器周期为:机器周期=12/晶振频率=12/(6&106)=2(?s)方式0为13位计数结构。设待求的计数初值为X,则:(213-X)&2&10-6=1&10-3求解得:X=7692化为二进制数表示为0。用十六进制表示,高8位为F0H,放入TH1;低5位为0CH,放入TL1。② TMOD寄存器初始化。为把定时器/计数器1设定为方式0,设置M1M0=00;为实现定时功能,应使C/?T =0;为实现定时器/计数器1的运行控制,设置GATE=0。定时器/计数器0不用,有关位设定为0。因此TMOD寄存器应初始化为00H。③ 由定时器控制寄存器TCON中的TR1位控制定时的启动和停止,TR1=1启动,TR1=0停止。若使其工作在方式1,定时器/计数器为16 位定时器/计数器,即加法计数器由 TH0 全部8位和TL0全部8位构成16位,其余与方式0完全相同,因此计算TH0和TL0初值的方法也和工作方式0类似,只是需注意原来13位的地方现在要换成16位。4 定时器/计数器28051单片机中,有一部分型号有三个定时器/计数器,如Intel的8032、Atmel的89C52、89C55、Philips的89C51RC、89C58,等等。这些单片机的第三个定时器/计数器叫T2,其控制寄存器是T2CON,它的各位定义如下:? TF2:定时器2溢出标志。定时器溢出时置位,并申请中断,只能靠软件清除。当RCLK或TCLK =1 时TF2 将不会置位。? EXF2:定时器2外部标志。当EXEN2为1,且T2EX 引脚上出现负跳变产生捕获或重装时EXF2置位,申请中断。若已允许定时器2 中断,EXF2=1 将使CPU 从中断向量处执行定时器2中断子程序。EXF2 位必须用软件清零。当定时器/计数器2工作在向上递增或向下递减计数器模式(方式控制寄存器T2MOD的DCEN位=1)时,EXF2 不能激活中断。? RCLK:接收时钟标志。靠软件置位或清除。RCLK=1时,用定时器2溢出脉冲作为串行口(工作于方式1或3时)的接收时钟。RCLK=0时,用定时器1的溢出脉冲作为接收时钟。? TCLK:发送时钟标志。靠软件置位或清除。TCLK=1时,用定时器2溢出脉冲作为串行口(工作于方式1或3时)的发送时钟。TCLK=0时,用定时器1的溢出脉冲作为发送时钟。? EXEN2:定时器2外部允许标志。靠软件置位或清除。当EXEN2=1时,如果定时器2未用作串行口的波特率发生器,在T2EX端出现负跳变脉冲时,激活定时器2捕获或重装,并置EXF2标志为1,请求中断。EXEN2=0时,T2EX端的外部信号无效。? TR2:定时器2启动/停止控制位。靠软件置位或清除。TR2=1时,启动定时器2,否则停止。? C/?T?2:定时器2定时方式或计数方式控制位。C/?T?2=0,选择定时方式;C/?T?2=1时,选择对外部计数方式(下降沿触发)。? CP/?R?L?2:捕获/重装载选择。CP/?R?L?2=1时,如果EXEN2=1,且T2EX端出现负跳变脉冲时发生捕获操作,即把TH2和TL2的内容传递给RCAP2H和RCAP2L。CP/?R?L?2=0时,若定时器2溢出或EXEN2=1,T2EX端出现负跳变脉冲,会出现重装载操作,即把RCAP2H和RCAP2L的内容传递给TH2和TL2。当RCLK=1或TCLK=1时,该位无效,在定时器2溢出时强制其自动重装载。通过软件设置T2CON,可使定时/计数器以三种基本工作方式之一工作。第一种为捕捉方式。设置为捕捉方式时,和定时器0 或定时器1 一样以16 位方式工作。这种方式通过复位EXEN2来选择。当置位EXEN2时,如果T2EX有负跳变电平,将把当前的数锁存在(RCAP2H和RCAP2L)中。这个事件可用来产生中断。第二种工作方式为自动重装方式,其中包含了两个子功能,由EXEN2来选择,当EXEN2复位时,16 位定时器溢出将触发一个中断并将RCAP2H 和RCAP2L 中的数装入定时器中。当EXEN2 置位时,除上述功能外,T2EX 引脚的负跳变将产生一次重装操作。最后一种方式用来产生串行口通信所需的数据传输率,这通过同时或分别置位RCLK 和TCLK来实现。在这种方式中,每个机器周期都将使定时器加1,而不像定时器0 和1 那样,需要12个机器周期。这使得串行通信的数据传输率更高。定时器2还有一个不可寻址的方式控制寄存器T2MOD,其内容如下:? &:保留位。? T2OE:定时器2输出允许位。? DCNE:置位时,允许定时器2作为向上/向下计数器。5 编程实例【例1】这是一个简单的定时器程序,由一个循环组成,在点亮接在P1.0 口的LED之后,延时一段时间,再灭掉LED,又延时一段时间,之后循环到前面。按全速运行,可以看到P1.0口上接的LED 灯不断地闪烁。#include //包括一个52标准内核的头文件sbit P10 = P1^0; //要控制的LED灯sbit K1= P3^2; //按键K1//用定时器中断闪烁LEDvoid main(void) //主程序{TMOD=0x01; //定时器0,16位工作方式TR0=1; //启动定时器ET0=1; //打开定时器0中断EA=1; //打开总中断while(1) //程序循环{; //主程序在这里就不断自循环,实际应用中,这里是做主要工作}}//定时器0中断timer0() interrupt 1 // 定时器0中断是1号{TH0=0x00; //写入定时器0初始值0x0005TL0=0x06;P10=~P10; //反转LED灯的亮和灭}程序中,使用了定时器0,工作在方式1,即16位工作方式。【例2】这是一个跑马灯程序,使用了定时器2。#include //包括一个52标准内核的头文件sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;bit ldelay=0; //长定时溢出标记,预置是0//定时器中断方式的跑马灯void main(void) //主程序{unsigned char code ledp[4]={0xfe,0xfd,0xfb,0xf7};//预定的写入P1的值 //用来指示显示顺序RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟RCAP2L =0x00;TR2=1; //启动定时器ET2=1; //打开定时器2中断EA=1; //打开总中断while(1) //主程序循环{if(ldelay) //发现有时间溢出标记,进入处理{ldelay=0; //清除标记P1=ledp[ledi]; //读出一个值送到P1口ledi++; //指向下一个if(ledi==4)ledi=0; //到了最后一个灯就换到第一个}}}//定时器2中断timer2() interrupt 5 // 中断向量是5{stTF2=0;t++;if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22.118400 MHZ{t=0;ldelay=1; //每次长时间的溢出,就置一个标记,以便主程序处理}}
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一51单片机串口中断与定时器中断冲突怎么改?中断程序如下:? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。2被浏览665分享邀请回答0添加评论分享收藏感谢收起0添加评论分享收藏感谢收起写回答51单片机中断系统详解(定时器、计数器)
我的图书馆
51单片机中断系统详解(定时器、计数器)
51单片机中断级别
默认中断级别
序号(C语言用)
INT0---外部中断0
T0---定时器/计数器0中断
INT1---外部中断1
T1----定时器/计数器1中断
TX/RX---串行口中断
T2---定时器/计数器2中断
中断允许寄存器IE
EA---全局中允许位。
EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
EA=0,关闭全部中断。
-------,无效位。
ET2---定时器/计数器2中断允许位。&&&EA总中断开关,置1为开;
ET2=1,打开T2中断。&&&&&&&&&&&&&&&&&&&&EX0为外部中断0(INT0)开关,……
ET2=0,关闭T2中断。&&&&&&&&&&&&&&&&&&&&ET0为定时器/计数器0(T0)开关,…… &&&&&
ES---串行口中断允许位。 &&&&&&&&&&&&&&&&&&EX1为外部中断1(INT1)开关,……
ES=1,打开串行口中断。&&&&&&&&&&&&&&&&&&ET1为定时器/计数器1(T1)开关,……
ES=0,关闭串行口中断。&&&&&&&&&&&&&&&&&&ES为串行口(TX/RX)中断开关,……
ET1---定时器/计数器1中断允许位。&&&&&&&&ET2为定时器/计数器2(T2)开关,……
ET1=1,打开T1中断。
ET1=0,关闭T1中断。
EX1---外部中断1中断允许位。
EX1=1,打开外部中断1中断。
EX1=0,关闭外部中断1中断。
ET0---定时器/计数器0中断允许位。
ET0=1,打开T0中断。
ET0=0,关闭T0中断。
EX0---外部中断0中断允许位。
EX0=1,打开外部中断0中断。
EX0=0,关闭外部中断0中断。
中断优先级寄存器IP
-------,无效位。
PS---串行口中断优先级控制位。
PS=1,串行口中断定义为高优先级中断。
PS=0,串行口中断定义为低优先级中断。
PT1---定时器/计数器1中断优先级控制位。
PT1=1,定时器/计数器1中断定义为高优先级中断。
PT1=0,定时器/计数器1中断定义为低优先级中断。
PX1---外部中断1中断优先级控制位。
PX1=1,外部中断1中断定义为高优先级中断。
PX1=0,外部中断1中断定义为低优先级中断。
PT0---定时器/计数器0中断优先级控制位。
PT0=1,定时器/计数器0中断定义为高优先级中断。
PT0=0,定时器/计数器0中断定义为低优先级中断。
PX0---外部中断0中断优先级控制位。
PX0=1,外部中断0中断定义为高优先级中断。
PX0=0,外部中断0中断定义为低优先级中断。
定时器/计数器工作模式寄存器TMOD
&&&&&&&&|-----------------定时器1------------------------|--------------------定时器0----------------------|
GATE---门控制位。
GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX(X=0,1)来控制。
GATE=1,定时器计数器启动与停止由TCON寄存器中TRX(X=0,1)和外部中断引脚(INT0或INT1)上的电平状态来共同控制。
C/T---定时器和计数器模式选择位。
C/T=1,为计数器模式;C/T=0,为定时器模式。
M1M0---工作模式选择位。
方式0,为13位定时器/计数器
方式1,为16位定时器/计数器
方式2,8位初值自动重装的8位定时器/计数器
方式3,仅适用于T0,分成两个8位计数器,T1停止工作
定时器/控制器控制寄存器TCON
TF1---定时器1溢出标志位。
当定时器1记满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。
TR1---定时器1运行控制位。
由软件清0关闭定时器1。当GATE=1,且INIT为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器1。
TF0---定时器0溢出标志,其功能及其操作方法同TF1。
TR0---定时器0运行控制位,其功能及操作方法同TR1。
IE1---外部中断1请求标志。
当IT1=0时,位电平触发方式,每个机器周期的S5P2采样INT1引脚,若NIT1脚为定电平,则置1,否则IE1清0。
当IT1=1时,INT1为跳变沿触发方式,当第一个及其机器周期采样到INIT1为低电平时,则IE1置1。IE1=1,表示外部中断1正向CPU中断申请。当CPU响应中断,转向中断服务程序时,该位由硬件清0。
IT1外部中断1触发方式选择位。
IT1=0,为电平触发方式,引脚INT1上低电平有效。
IT1=1,为跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效。
IE0---外部中断0请求标志,其功能及操作方法同IE1。
IT0---外部中断0触发方式选择位,其功能及操作方法同IT1。
从上面的知识点可知,每个定时器都有4种工作模式,可通过设置TMOD寄存器中的M1M0位来进行工作方式选择。
方式1的计数位数是16位,对T0来说,由TL0寄存器作为低8、TH0寄存器作为高8位,组成了16位加1计数器。
关于如何确定定时器T0的初值问题。定时器一但启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为一个机器周期,那么此时机器周期为1us,记满TH0和TL0就需要216&-1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需65536us,约等于65.6ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上记50000个数后,定时器溢出,此时刚好就是50ms中断一次,当需要定时1s时,我们写程序时当产生20次50ms的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是=15536.,把15536对256求模:装入TH0中,把15536对256求余:6装入TL0中。
以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为TCY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/TCY&,装入THX和TLX中的数分别为:
THX=(65536-N)/256&&&&,&&&&&&TLX=(65536-N)%256&&&&&&&&x为0或1&
中断服务程序的写法
void&函数名()interrupt&中断号&using&工作组
&&&中断服务程序内容
在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下:
(1)对TMOD赋值,以确定T0和 T1的工作方式。
(2)计算初值,并将初值写入TH0、TL0或TH1、TL1。
(3)中断方式时,则对IE赋值,开放中断。
(4)使TR0和TR1置位,启动定时器/计数器定时或计数。
例:利用定时器0工作方式1,实现一个发光管以1s亮灭闪烁。
程序代码如下:
&&TMOD=0x01;&&&&&&//设置定时器0位工作模式1(M1,M0位0,1)
&&TH0=()/256; &//装初值11.0592M晶振定时50ms数为45872
&&EA=1;&&&&//开总中断
&&ET0=1;&&&//开定时器0中断
&&TR0=1;&&&//启动定时器0
&&&&&if(num==20)&&&&//如果到了20次,说明1秒时间
&&&&led1=~led1;&&&&//让发光管状态取反
&&&TH0=()/256; &//重新装载初值
喜欢该文的人也喜欢单片机、电路板
连接器、接插件
其他元器件
51单片机电子钟程序
51单片机电子钟程序
来源: 单片机 应用与实践&&& 作者:佚名
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;& 定时器T0、T1溢出周期为50MS,T0为秒计数用,T1为调整时闪烁用,;& P3.5为调整按钮,P0口 为字符输出口,P2口为位选端,采用共阳显示管。;& 时间调整方法:按P
来源: 单片机 应用与实践&&& 作者:佚名
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;& 定时器T0、T1溢出周期为50MS,T0为秒计数用,T1为调整时闪烁用,;& P3.5为调整按钮,P0口 为字符输出口,P2口为位选端,采用共阳显示管。;& 时间调整方法:按P3.5未超过1s进入省电模式,数码管不亮,内部时钟计时;& 按P3.5超过1s进入调整模式,要调整的时间会闪动,此时,按下P3.5超过0.5S,;& 进入下位调整,按下P3.5未超过0.5S,当前位加一;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&& 中断入口程序&&&&&&&&&&&&& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&&&&& 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.5,SETMM1&&& ;P3.5口为0时转时间调整程序&&&&&&&&&&&&&&&&&& SJMP& START1&&&&&&&& ;P3.5口为1时跳回START1&&&&&&&&&& SETMM1: LJMP& SETMM&&&&&&&&& ;转到时间调整程序SETMM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&& 1秒计时程序&&&&&&&&&&&&& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序&&&&&&&&&&& INTT0: PUSH& ACC&&&&&&&&&& ;累加器入栈保护&&&&&&&&&&&&&&&&&& PUSH& PSW&&&&&&&&&& ;状态字入栈保护&&&&&&&&&&&&&&&&&& CLR&& ET0&&&&&&&&&& ;关T0中断允许&&&&&&&&&&&&&&&&&& CLR&& TR0&&&&&&&&&& ;关闭定时器T0&&&&&&&&&&&&&&&&&& MOV&& A,#0B7H&&&&&& ;中断响应时间同步修正&&&&&&&&&&&&&&&&&& ADD&& A,TL0&&&&&&&& ;低8位初值修正&&&&&&&&&&&&&&&&&& MOV&& TL0,A&&&&&&&& ;重装初值(低8位修正值)&&&&&&&&&&&&&&&&&& MOV&& A,#3CH&&&&&&& ;高8位初值修正&&&&&&&&&&&&&&&&&& ADDC& A,TH0&&&&&&&& ;&&&&&&&&&&&&&&&&&& MOV&& TH0,A&&&&&&&& ;重装初值(高8位修正值)&&&&&&&&&&&&&&&&&& SETB& TR0&&&&&&&&&& ;开启定时器T0&&&&&&&&&&&&&&&&&& DJNZ& 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秒时对秒计时单元清0&&&&&&&&&&&&&&&&&& MOV&& R0,#77H&&&&&& ;指向分计时单元(76H-77H)&&&&&&&&&&&&&&&&&& ACALL ADD1&&&&&&&&& ;分计时单元加1分钟&&&&&&&&&&&&&&&&&& MOV&& A,R3&&&&&&&&& ;分数据放入A&&&&&&&&&&&&&&&&&& CLR&& C&&&&&&&&&&&& ;清进位标志&&&&&&&&&&&&&&&&&& CJNE& A,#60H,ADDHH& ;&&&&&&&&&&& ADDHH: JC&&& OUTT0&&&&&&&& ;小于60分时中断退出&&&&&&&&&&&&&&&&&& ACALL CLR0&&&&&&&&& ;大于或等于60分时分计时单元清0&&&&&&&&&&&&&&&&&& 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&&&&&&&&&&& 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&&&&&& ;取当前计时单元数据到A&&&&&&&&&&&&&&&&&& DEC&& R0&&&&&&&&& ;指向前一地址&&&&&&&&&&&&&&&&&& SWAP& A&&&&&&&&&& ;A中数据高四位与低四位交换&&&&&&&&&&&&&&&&&& ORL&& A,@R0&&&&&& ;前一地址中数据放入A中低四位&&&&&&&&&&&&&&&&&& ADD&& A,#01H&&&&& ;A加1操作&&&&&&&&&&&&&&&&&& DA&&& A&&&&&&&&&& ;十进制调整&&&&&&&&&&&&&&&&&& MOV&& R3,A&&&&&&& ;移入R3寄存器&&&&&&&&&&&&&&&&&& ANL&& A,#0FH&&&&& ;高四位变0&&&&&&&&&&&&&&&&&& MOV&& @R0,A&&&&&& ;放回前一地址单元&&&&&&&&&&&&&&&&&& MOV&& A,R3&&&&&&& ;取回R3中暂存数据&&&&&&&&&&&&&&&&&& INC&& R0&&&&&&&&& ;指向当前地址单元&&&&&&&&&&&&&&&&&& SWAP& A&&&&&&&&&& ;A中数据高四位与低四位交换&&&&&&&&&&&&&&&&&& ANL&& A,#0FH&&&&& ;高四位变0&&&&&&&&&&&&&&&&&& MOV&& @R0,A&&&&&& ;数据放入当削地址单元中&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&& ;子程序返回&& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&& 清零程序&&&&&&&&&&&&&&&&& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;对计时单元复零用&&&&&&&&&&&& CLR0: CLR&& A&&&&&&&&&& ;清累加器&&&&&&&&&&&&&&&&&& MOV&& @R0,A&&&&&& ;清当前地址单元&&&&&&&&&&&&&&&&&& DEC&& R0&&&&&&&&& ;指向前一地址&&&&&&&&&&&&&&&&&& MOV&& @R0,A&&&&&& ;前一地址单元清0&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&& ;子程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&& 时钟调整程序&&&&&&&&&&&&& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序&&&&&&&&&& SETMM:& cLR&& ET0&&&&&&&&&&& ;关定时器T0中断&&&&&&&&&&&&&&&&&& CLR&& TR0&&&&&&&&&&& ;关闭定时器T0&&&&&&&&&&&&&&&&&& LCALL DL1S&&&&&&&&&& ;调用1秒延时程序&&&&&&&&&&&&&&&&&& JB&&& P3.5,CLOSEDIS& ;键按下时间小于1秒,关闭显示(省电)&&&&&&&&&&&&&&&&&& MOV&& R2,#06H&&&&&&& ;进入调时状态,赋闪烁定时初值&&&&&&&&&&&&&&&&&& SETB& ET1&&&&&&&&&&& ;允许T1中断&&&&&&&&&&&&&&&&&& SETB& TR1&&&&&&&&&&& ;开启定时器T1&&&&&&&&&&& SET2:& JNB&& P3.5,SET1&&&&& ;P3.5口为0(键未释放),等待&&&&&&&&&&&&&&&&&& SETB& 00H&&&&&&&&&&& ;键释放,分调整闪烁标志置1&&&&&&&&&&& SET4:& JB&&& P3.5,SET3&&&&& ;等待键按下&&&&&&&&&&&&&&&&&& LCALL DL05S&&&&&&&&& ;有键按下,延时0.5秒&&&&&&&&&&&&&&&&&& JNB&& P3.5,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时清0&&&&&&&&&&&&&&&&&& CLR&& C&&&&&&&&&&&&& ;清进位标志&&&&&&&&&&&&&&&&&& AJMP& SET4&&&&&&&&&& ;跳转到SET4循环&&&&&&& CLOSEDIS:& SETB& ET0&&&&&&&&&&& ;省电(LED不显示)状态。开T0中断&&&&&&&&&&&&&&&&&& SETB& TR0&&&&&&&&&&& ;开启T0定时器(开时钟)&&&&&&& CLOSE:&&&& JB&&& P3.5,CLOSE&&&& ;无按键按下,等待。&&&&&&&&&&&&&&&&&& LCALL DISPLAY&&&&&&& ;有键按下,调显示子程序延时削抖&&&&&&&&&&&&&&&&&& JB&&& P3.5,CLOSE&&&& ;是干扰返回CLOSE等待&&&&&&& WAITH:&&&& JNB&& P3.5,WAITH&&&& ;等待键释放&&&&&&&&&&&&&&&&&& LJMP& START1&&&&&&&& ;返回主程序(LED数据显示亮)&&&&&&&&&& SETHH:& CLR&& 00H&&&&&&&&&&& ;分闪烁标志清除(进入调小时状态)&&&&&&&&& SETHH1:& JNB&& P3.5,SET5&&&&& ;等待键释放&&&&&&&&&&&&&&&&&& SETB& 01H&&&&&&&&&&& ;小时调整标志置1&&&&&&&&&&& SET6:& JB&&& P3.5,SET7&&&&& ;等待按键按下&&&&&&&&&&&&&&&&&& LCALL DL05S&&&&&&&&& ;有键按下延时0.5秒&&&&&&&&&&&&&&&&&& JNB&& P3.5,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.5,SETOUT1&& ;调时退出程序。等待键释放&&&&&&&&&&&&&&&&&& LCALL DISPLAY&&&&&&& ;延时削抖&&&&&&&&&&&&&&&&&& JNB&& P3.5,SETOUT&&& ;是抖动,返回SETOUT再等待&&&&&&&&&&&&&&&&&& CLR&& 01H&&&&&&&&&&& ;清调小时标志&&&&&&&&&&&&&&&&&& CLR&& 00H&&&&&&&&&&& ;清调分标志&&&&&&&&&&&&&&&&&& CLR&& 02H&&&&&&&&&&& ;清闪烁标志&&&&&&&&&&&&&&&&&& CLR&& TR1&&&&&&&&&&& ;关闭定时器T1&&&&&&&&&&&&&&&&&& CLR&& ET1&&&&&&&&&&& ;关定时器T1中断&&&&&&&&&&&&&&&&&& SETB& TR0&&&&&&&&&&& ;开启定时器T0&&&&&&&&&&&&&&&&&& SETB& ET0&&&&&&&&&&& ;开定时器T0中断(计时开始)&&&&&&&&&&&&&&&&&& LJMP& START1&&&&&&&& ;跳回主程序&&&&&&&&&&& SET1:& LCALL DISPLAY&&&&&&& ;键释放等待时调用显示程序(调分)&&&&&&&&&&&&&&&&&& AJMP& SET2&&&&&&&&&& ;防止键按下时无时钟显示&&&&&&&&&&& SET3:& LCALL DISPLAY&&&&&&& ;等待调分按键时时钟显示用&&&&&&&&&&&&&&&&&& AJMP& SET4&&&&&&&&&&& SET5:& LCALL DISPLAY&&&&&&& ;键释放等待时调用显示程序(调小时)&&&&&&&&&&&&&&&&&& AJMP& SETHH1&&&&&&&& ;防止键按下时无时钟显示&&&&&&&&&&& SET7:& LCALL DISPLAY&&&&&&& ;等待调小时按键时时钟显示用&&&&&&&&&&&&&&&&&& AJMP& SET6&&&&&&&& SETOUT1:& LCALL DISPLAY&&&&&&& ;退出时钟调整时键释放等待&&&&&&&&&&&&&&&&&& AJMP& SETOUT&&&&&&&& ;防止键按下时无时钟显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&& 显示程序&&&&&&&&&&&&&&&&& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作; 扫描控制,每个LED数码管亮1MS时间再逐位循环。&&&&&&&&& DISPLAY: MOV&& R1,#70H&&&&&&& ;指向显示数据首址&&&&&&&&&&&&&&&&&& MOV&& R5,#0FEH&&&&&& ;扫描控制字初值&&&&&&&&&&&& PLAY: MOV&& A,R5&&&&&&&&&& ;扫描字放入A&&&&&&&&&&&&&&&&&& MOV&& P2,A&&&&&&&&&& ;从P3口输出&&&&&&&&&&&&&&&&&& MOV&& A,@R1&&&&&&&&& ;取显示数据到A&&&&&&&&&&&&&&&&&& MOV&& DPTR,#TAB&&&&& ;取段码表地址&&&&&&&&&&&&&&&&&& MOVC& A,@A+DPTR&&&&& ;查显示数据对应段码&&&&&&&&&&&&&&&&&& MOV&& P0,A&&&&&&&&&& ;段码放入P1口&&&&&&&&&&&&&&&&&& LCALL DL1MS&&&&&&&&& ;显示1MS&&&&&&&&&&&&&&&&&& INC&& R1&&&&&&&&&&&& ;指向下一地址&&&&&&&&&&&&&&&&&& MOV&& A,R5&&&&&&&&&& ;扫描控制字放入A&&&&&&&&&&&&&&&&&& JNB&& ACC.5,ENDOUT&& ;ACC.5=0时一次显示结束&&&&&&&&&&&&&&&&&& RL&&& A&&&&&&&&&&&&& ;A中数据循环左移&&&&&&&&&&&&&&&&&& MOV&& R5,A&&&&&&&&&& ;放回R5内&&&&&&&&&&&&&&&&&& AJMP& PLAY&&&&&&&&&& ;跳回PLAY循环&&&&&&&&&& ENDOUT: SETB& P2.5&&&&&&&&&& ;一次显示结束,P3口复位&&&&&&&&&&&&&&&&&& MOV&& P0,#0FFH&&&&&& ;P1口复位&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&& ;子程序返回&&&&&&&&&&&& TAB:& DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳段码表&&&&&&&&&&& "0""& 1""& 2" " 3" "4" "5" "6"& "7" "8" "9""不亮";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&& 延时程序&&&&&&&&&&&&&&&&& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1MS延时程序,LED显示程序用&&&&&&&&&&& DL1MS: MOV& R6,#14H&&&&&&&&&&& DL1:&& MOV& R7,#19H&&&&&&&&&&& DL2:&& DJNZ& R7,DL2&&&&&&&&&&&&&&&&&& DJNZ& R6,DL1&&&&&&&&&&&&&&&&&& RET;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象&&&&&&&&&& DS20MS: ACALL&& DISPLAY&&&&&&&&&&&&&&&&&& ACALL& DISPLAY&&&&&&&&&&&&&&&&&& ACALL& DISPLAY&&&&&&&&&&&&&&&&&& RET;延时程序,用作按键时间的长短判断&&&&&&&&&& DL1S:&& LCALL&&&&& DL05S&&&&&&&&&&&&&&&&&& LCALL&&&&& DL05S&&&&&&&&&&&&&&&&&& RET&&&&&&&&& DL05S:&& MOV&&&&&&& R3,#20H&&&&& ;8毫秒*32=0.196秒&&&&&&&&& DL05S1:& LCALL&&&&& DISPLAY&&&&&&&&&&&&&&&&&& DJNZ&&&&&& R3,DL05S1&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&& END&&&&&&&&&&&&&&&&&&&& ;程序结束
型号/产品名
深圳市诚信通优惠有限公司
深圳市福田区科鑫电子商行
深圳市福田区科鑫电子商行
深圳市福田区科鑫电子商行
深圳市福田区科鑫电子商行

我要回帖

更多关于 单片机定时器中断程序 的文章

 

随机推荐