Zhllxynxy 2023-04-12 10:19 采纳率: 0%
浏览 32

单片机:利用定时器0中断编程

通过对定时器0编制程序使定时器0每隔60ms中断一次,并对P1.0端口的输出状态取反一次。单片机系统主频为12MHz。利用定时器0中断编程。

  • 写回答

1条回答 默认 最新

  • 丘比特惩罚陆 新星创作者: Java技术领域 2023-04-12 11:12
    关注
    
    #include <reg52.h>
    
    sbit LED = P1^0;  // 定义LED连接的IO口
    
    void InitTimer0(void);
    
    void main(void)
    {
        InitTimer0();  // 初始化定时器0
    
        while(1) {
            // 程序运行在中断中,不需要在主函数中添加其他代码
        }
    }
    
    void InitTimer0(void)
    {
        TMOD |= 0x01;  // 定时器0工作在模式1(16位自动重装载)
    
        TH0 = (65536 - 12000/1000*60) / 256;  // 设置定时器0初值高位
        TL0 = (65536 - 12000/1000*60) % 256;  // 设置定时器0初值低位
    
        ET0 = 1;       // 开启定时器0中断
        EA = 1;        // 开启总中断
    
        TR0 = 1;       // 启动定时器0
    }
    
    void Timer0_ISR(void) interrupt 1
    {
        static unsigned int count = 0;
    
        count++;
    
        if (count == 50) {  // 50次中断后约等于60ms
            count = 0;
            LED = ~LED;    // 取反LED的状态
        }
    
        TH0 = (65536 - 12000/1000*60) / 256;  // 重新设置定时器0初值高位
        TL0 = (65536 - 12000/1000*60) % 256;  // 重新设置定时器0初值低位
    }
    
    

    解释:

    在程序开始处定义了一个 sbit 类型的变量 LED,用于指定 LED 灯所连接的 IO 口(本程序中为 P1.0)。
    定义了一个 InitTimer0() 函数,用于初始化定时器0。在该函数中,设置了定时器0的工作模式为模式1(16位自动重装载),设置了定时器0的初值为 (65536 - 12000/1000*60),即每隔 60ms 中断一次。此外,开启了定时器0中断和总中断,启动了定时器0。
    定义了一个 Timer0_ISR() 函数,用于处理定时器0中断。在该函数中,定义了一个静态变量 count,每次中断 count 加 1,当 count 等于 50 时(约等于 60ms),取反 LED 的状态,然后将 count 重置为 0。最后,重新设置定时器0的初值,使其继续工作。
    在主函数中,调用 InitTimer0() 函数进行初始化。由于程序运行在中断中,因此不需要在主函数中添加其他代码。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月12日