从头开始学51单片机之实例4:用定时器输出方波

一、仿真环境

  • Proteus8.9
  • Keil5

二、Proteus模型搭建

三、软件代码

需求:fosc = 12MHz,利用T0实现在P1.0输出周期为1ms的方波

机器周期:T = 12/fosc = 1us

每隔一定时间让P1.0信号翻转,就能得到方波信号

方波周期为1ms,半周期为500us

所以t = 500us,T = 1us

定时器初值:TC=2^{13}-t/T=8192-500=7692=1 1110 0000 1100 B

将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中断实现方波输出

#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;         // 开放中断        
}

四、仿真波形

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值