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

    四、仿真波形

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机学习实例4:使用定时器生成方波信号

    发表回复