一、仿真环境
- Proteus8.9
- Keil5
二、Proteus模型搭建
三、软件代码
需求:fosc = 12MHz,利用T0实现在P1.0输出周期为1ms的方波
机器周期:T = 12/fosc = 1us
每隔一定时间让P1.0信号翻转,就能得到方波信号
方波周期为1ms,半周期为500us
所以t = 500us,T = 1us
定时器初值:
将TC拆为高8位和低5位,其中高8位1111 0000B(F0H)、低5位0 1100B(0CH),分别送TH0和TL0
T0工作在模式0,因此TMOD=0000 0000
写法1:采用while(1)循环,使用查询方式,不使用中断
#include <reg51.h>
sbit rect_wave = P1^0;
void timelover(void);
void main()
{
TMOD = 0x00; // 不门控,定时器方式,13位定时器/计数器
TH0 = 0xf0; // 高8位
TL0 = 0x0c; // 低5位
IE = 0x00; // 不允许中断,这里采用查询方式,不触发中断
TR0 = 1; // 启动T0计数
while(1)
{
if(TF0) // 如果T0溢出
{
timelover();
TF0 = 0; // 软件清除标志位
}
}
}
void timelover(void)
{
TR0 = 0; // 停止计数
TH0 = 0xf0; //重赋初值
TL0 = 0x0c;
rect_wave = !rect_wave; // 信号反转
TR0 = 1; // 启动计数
}
写法2:使用T0中断实现方波输出文章来源:https://www.toymoban.com/news/detail-519010.html
#include <reg51.h>
sbit rect_wave = P1^0;
void timelover(void);
void main()
{
TMOD = 0x00;
TH0 = 0xf0;
TL0 = 0x0c;
IE = 0x82; // 1000 0010 允许T0中断
TR0 = 1; // 启动T0计数
while(1)
{
}
}
void time0int(void) interrupt 1
{
EA = 0; // 禁止所有中断请求
TR0 = 0; // 停止计数
TH0 = 0xf0; // 重赋初值
TL0 = 0x0c;
rect_wave = !rect_wave;
TR0 = 1; // 启动计数
EA = 1; // 开放中断
}
四、仿真波形
文章来源地址https://www.toymoban.com/news/detail-519010.html
到了这里,关于从头开始学51单片机之实例4:用定时器输出方波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!