51单片机定时器汇编程序

51单片机定时器汇编程序,第1张

试试下列程序:

;

ORG 0000H

SJMP BEGIN

ORG 000BH

MOV TH0, #3CH ;定时100ms

MOV TL0, #0B0H

DJNZ R7, E_T0

MOV R7, #5

SETB F0 ;每500ms置一

E_T0:RETI

;------------------------------------

BEGIN:

MOV TMOD, #01H ;T0定时方式1

MOV TH0, #3CH ;50ms@12MHz

MOV TL0, #0B0H ;100ms@6MHz

MOV R7, #5

SETB TR0

SETB ET0

SETB EA

;------------------------

M_LOOP:

MOV A, #255

L1:

MOV P1, A

JNB F0, $

CLR F0

CLR C

RLC A

JC L1

;------------------------

L2:

MOV P1, A

JNB F0, $

CLR F0

SETB C

RRC A

JNC L2

;------------------------

MOV R2, #8 ;全亮全灭8次

L3:

MOV P1, #0 ;全亮

JNB F0, $

CLR F0

MOV P1, #255;全灭

JNB F0, $

CLR F0

DJNZ R2, L3

;------------------------

JMP M_LOOP

;------------------------------------

END

本程序可实现:

L1-L8依次点亮----L1-L8依次熄灭----8个灯全亮全灭8次~循环 各时序间隔05s。

简单啊。

大致说来就是

你先开启个定时器,根据你选用的晶振,计算出你要用定时器定时的基准时间,

就假设是10毫秒吧。

然后给定时器的THx,TLx写入初值,开启中断,进行定时。

然后就等待中断。

在你响应中断的程序中,再次给单片机送入初值,

由于是10毫秒中断一次,因此我们设置几个“软件计数器

比如每此中断,软甲计数器+1,

例如“软件计数器1”在中断程序中计数100次,则是10ms100=1s

而“软件计数器2”在1的基础上继续计数100次,则是1S100=100S

而“软件计数器3”在2的基础上继续计数36次,则是100S36=3600S=1小时。

本程序来自《单片机C语言程序设计实训100例——基于8051+Proteus仿真》没用中断。

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

void main()

{

uchar T_Count = 0;

P0 = 0xfe;

P2 = 0xfe;

TMOD = 0x10;//定时器1方式1

TH1 = (65535-50000)/256;//定时50000us=50ms

TL1 = (65535-50000)%256;

TR1 = 1;//启动定时器1

while(1)

{

if(TF1== 1)//查询方式定时时间到后TF1=1

{

TF1 = 0;

TH1 = (65535-50000)/256;

TL1 = (65535-50000)%256;

if(++T_Count == 20)//50ms20=1000ms

{

P0 = _crol_(P0,1);

P2 = _crol_(P2,1);

T_Count = 0;

}

}

}

}

方法:首先:要学会数码管的显示程序

然后:按键的 *** 作,注意软件的消抖(具体的是延时,10ms左右)。

假设有k1~停表,k2~复位,k3~继续运行

先说停表和继续运行的

停表:如果k1按下,TR0=0;

继续运行:如果k3按下,TR0=1;

复位:直接用硬件复位单片机或者k2按下,数据清零。

要实现数据的循环:只要定时器计数到最大值时,再把最小值赋给它!

51单片机定时器的使用

51单片机定时器/计时器的使用

步骤:

1、 打开中断允许位:

对IE寄存器进行控制,IE寄存器各位的信息如下图所示:

EA: 为0时关所有中断;为1时开所有中断

ET2:为0时关T2中断;为1时开T2中断,只有8032、8052、8752才有此中断 ES: 为0时关串口中断;为1时开串口中断 ET1:为0时关T1中断;为1时开T1中断 EX1:为0时关1时开 ET0:为0时关T0中断;为1时开T0中断 EX0:为0时关1时开

2、 选择定时器/计时器的工作方式:

定时器TMOD格式

CPU在每个机器周期内对T0/T1检测一次,但只有在前一次检测为

1和后一次检测为0时才会使计数器加1。因此,计数器不是由外部时钟负边沿触发,而是在两次检测到负跳变存在时才进行计数的。由于两次检测需要24个时钟脉冲,故T0/T1线上输入的0或1的持续时间不能少于一个机器周期。通常,T0或T1输入线上的计数脉冲频率总小于100kHz。

方式0:定时器/计时器按13位加1计数,这13位由TH中的高8位和TL中的低5位组成,其中TL中的高3位弃之不用(与MCS-48兼容)。

13位计数器按加1计数器计数,计满为0时能自动向CPU发出溢出中断请求,但要它再次计数,CPU必须在其中断服务程序中为它重装初值。

方式1:16位加1计数器,由TH和TL组成,在方式1的工作情况和方式0的相同,只是计数器值是方式0的8倍。

1

1/3

方式2:计数器被拆成一个8位寄存器TH和一个8位计数器TL,CPU对它们初始化时必须送相同的定时初值。当计数器启动后,TL按8位加1计数,当它计满回零时,一方面向CPU发送溢出中断请求,另一方面从TH中重新获得初值并启动计数。

方式3:T0和T1工作方式不同,TH0和TL0按两个独立的8位计数器工作,T1只能按不需要中断的方式2工作。 在方式3下的TH0和TL0是有区别的:TL0可以设定为定时器/计时器或计数器模式工作,仍由TR0控制,并采用TF0作为溢出中断标志;TH0只能按定时器/计时器模式工作,它借用TR1和TF1来控制并存放溢出中断标志。因此,T1就没有控制位可以用了,故TL1在计满回零时不会产生溢出中断请求的。 显然,T0和T1设定为方式3实际上就相当于设定了3个8位计数器同时工作,其中TH0和TL0为两个由软件重装的8位计数器,TH1和TL1为自动重装的8位计数器,但无溢出中断请求产生。由于TL1工作于无中断请求状态,故用它来作为串口可变波特

3、 为计数器赋值

计数器初值计算

TC=M−C

TC:计数器初值,M:计数器模值(2k),C:把计数器计满的计数值 定时器初值计算

T=(M−TC)T计数

TC=M−T/

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9355684.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存