51单片机如何设置与主函数并行运行的定时器?

51单片机如何设置与主函数并行运行的定时器?,第1张

在51单片机中,可以使用定时器(Timer)来实现与主函数并行运行。以下是一般的步骤:

选择定时器:根据需要选择定时器0或定时器1。定时器0使用TH0和TL0寄存器,定时器1使用TH1和TL1寄存器。

设置定时器模式:可以选择模式0到模式3中的一个模式。模式0为13位定时模式,模式1为16位定时模式,模式2为8位自动重装模式,模式3为双重8位自动重装模式。

设置计数值:将计数值(需要倒数的时间值)写入THx和TLx寄存器中。

启动定时器:设置定时器控制寄存器的相应位,启动定时器。

处理定时器中断:可以使用定时器中断服务程序,在定时器溢出时执行相应的处理 *** 作。

以下是一个简单的例子,使用定时器1来实现每隔一定时间向P1口输出一个脉冲:

#include <reg52.h>

sbit P1_0 = P1^0  // 定义P1.0口

void Timer1() interrupt 3 {  // 定义定时器1中断服务程序

TF1 = 0  // 清除中断标志

P1_0 = ~P1_0  // 翻转P1.0口状态

}

void main() {

TMOD |= 0x10  // 设置定时器1为16位定时器模式

TH1 = 0xFC  // 设置计数值为65535-50000=15535

TL1 = 0x1B  // 50000的低8位为0x1B

ET1 = 1  // 允许定时器1中断

EA = 1  // 开启总中断

TR1 = 1  // 启动定时器1

while (1) {  // 主函数循环

// 这里可以写主函数的处理代码

}

}

在上面的例子中,使用定时器1的16位定时器模式,并设置计数值为50000,即每隔50000个机器周期定时器溢出一次。定时器1的中断服务程序中将P1.0口状态翻转,实现了每隔一定时间向P1.0口输出一个脉冲。同时,在主函数中可以编写相应的处理代码,实现与定时器并行运行的功能。

假设晶振为12MHz,不用中断时程序语句如下:

TMOD=0x01;//定时器0工作方式1

TH0=(65536-1000)/256;//装入初值

TL0=(65536-1000)%256

TF0=0;//清溢出标志;

TR0=1//启动定时器0

while(TF0==0);//等待定时时间到

TR0=0;

TF0=0;

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

#include <reg52.h>

#include <intrins.h>

#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)//50ms*20=1000ms

{

P0 = _crol_(P0,1)

P2 = _crol_(P2,1)

T_Count = 0

}

}

}

}


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

原文地址:https://54852.com/yw/11578088.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存