这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » C51单片机定时器中断问题

共3条 1/1 1 跳转至

C51单片机定时器中断问题

工程师
2024-12-19 21:24:23     打赏

C51单片机定时器中断
1.编写程序,用P1.0口作为控制端口,利用定时器一个LED灯周期性点亮5秒,熄灭5秒。按一下P1.0口开始周期闪烁,再按一下停止周期性闪烁。
2.编写程序,用P1.0口作为控制端口,利用定时器控制数码管,按下按键,数码管每隔1s从9倒计时到0,到0时停止,按下按键后,再次倒计时。




关键词: 单片机     C51    

助工
2024-12-19 21:24:47     打赏
2楼

为了完成这两个任务,我们需要编写两个C51单片机程序。以下是两个任务的详细步骤和代码实现。

任务1:周期性点亮和熄灭LED灯

1. 初始化定时器,设置定时器模式和计数器初值。
2. 配置P1.0口为输入模式。
3. 使用定时器中断实现周期性闪烁。
4. 检测P1.0口的按键状态,控制开始和停止闪烁。

任务1的C51单片机代码实现:

```c
#include

#define LED P1^0
sbit key = P1^0;
unsigned char count = 0;
bit flag = 0;

void Timer0_Init(void)
{
    TMOD = 0x01; // 设置定时器模式为模式1
    TH0 = 0xFC;  // 设置定时器初值
    TL0 = 0x18;
    ET0 = 1;     // 开启定时器0中断
    EA = 1;      // 开启总中断
    TR0 = 1;     // 启动定时器
}

void Timer0_ISR() interrupt 1 using 1
{
    static unsigned int timer_count = 0;
    timer_count++;
    if (timer_count >= 125) // 5秒
    {
        timer_count = 0;
        flag = !flag; // 切换闪烁状态
    }
    LED = flag;
}

void main()
{
    Timer0_Init();
    while (1)
    {
        if (key == 0) // 检测按键
        {
            while (key == 0); // 等待按键释放
            if (flag == 0) // 开始闪烁
            {
                TR0 = 1;
            }
            else // 停止闪烁
            {
                TR0 = 0;
            }
        }
    }
}
```

任务2:数码管倒计时

1. 初始化定时器,设置定时器模式和计数器初值。
2. 配置P1.0口为输入模式。
3. 使用定时器中断实现数码管倒计时。
4. 检测P1.0口的按键状态,控制倒计时开始和停止。

任务2的C51单片机代码实现:

```c
#include

#define DISPLAY P0
sbit key = P1^0;
unsigned char count = 0;
unsigned char time = 9;
bit flag = 0;

void Timer0_Init(void)
{
    TMOD = 0x01; // 设置定时器模式为模式1
    TH0 = 0xFC;  // 设置定时器初值
    TL0 = 0x18;
    ET0 = 1;     // 开启定时器0中断
    EA = 1;      // 开启总中断
    TR0 = 1;     // 启动定时器
}

void Timer0_ISR() interrupt 1 using 1
{
    static unsigned int timer_count = 0;
    timer_count++;
    if (timer_count >= 125) // 1秒
    {
        timer_count = 0;
        time--; // 倒计时
        if (time == 0)
        {
            DISPLAY = 0xFF; // 显示0
            flag = 0; // 停止倒计时
            TR0 = 0; // 停止定时器
        }
        else
        {
            DISPLAY = ~(0x00FF & time); // 显示当前时间
        }
    }
}

void main()
{
    Timer0_Init();
    while (1)
    {
        if (key == 0) // 检测按键
        {
            while (key == 0); // 等待按键释放
            if (flag == 0) // 开始倒计时
            {
                time = 9; // 重置时间
                DISPLAY = ~(0x00FF & time); // 显示9
                flag = 1; // 开始倒计时
                TR0 = 1; // 启动定时器
            }
            else // 停止倒计时
            {
                TR0 = 0; // 停止定时器
            }
        }
    }
}
```


高工
2024-12-20 00:25:39     打赏
3楼

感谢楼主分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]