51单片机实验 - 红绿灯控制

实验目的

本实验旨在使用51单片机控制一个简单的红绿灯系统,实现交通信号灯的功能。通过这个实验,学习如何使用51单片机的定时器和I/O口控制LED灯的亮灭,以及如何编写状态机程序实现红绿灯的切换。

实验原理

本实验使用51单片机的定时器模块来控制红绿灯的切换时序。通过编程设置定时器中断,在中断服务程序中切换红绿灯的状态。同时,使用I/O口直接控制LED灯的亮灭。整个过程可以抽象为一个简单的状态机,根据当前状态切换到下一个状态。

实验步骤

1. 硬件连接

将红色LED灯连接到51单片机的P1.0引脚,绿色LED灯连接到P1.1引脚。


红色LED - P1.0
绿色LED - P1.1
                    

2. 软件编程

编写51单片机程序,实现以下功能:

  • 初始化定时器,设置中断时间为1秒
  • 在定时器中断服务程序中切换红绿灯的状态
  • 使用I/O口直接控制LED灯的亮灭
  • 编写状态机程序,实现红绿灯的循环切换

#include <reg51.h>

sbit RED_LED = P1^0;
sbit GREEN_LED = P1^1;

unsigned char light_state = 0; // 0-红灯 1-绿灯

void timer0_isr() interrupt 1 {
    TH0 = (65536 - 50000) / 256; // 重载定时器
    TL0 = (65536 - 50000) % 256;
    
    // 切换红绿灯状态
    if (light_state == 0) {
        RED_LED = 1;
        GREEN_LED = 0;
        light_state = 1;
    } else {
        RED_LED = 0;
        GREEN_LED = 1;
        light_state = 0;
    }
}

void main() {
    TMOD = 0x01; // 设置定时器0为模式1
    TH0 = (65536 - 50000) / 256; // 初始化定时器
    TL0 = (65536 - 50000) % 256;
    ET0 = 1; // 允许定时器0中断
    EA = 1; // 开启总中断
    TR0 = 1; // 启动定时器0
    
    while (1) {
        // 主循环,不需要任何操作
    }
}
                    

代码解析

该程序实现了以下功能:

  • 定义了红色LED和绿色LED的引脚
  • 在timer0_isr()中断服务程序中,切换红绿灯的状态
  • 在main()函数中,初始化定时器0并启动
  • 使用light_state变量记录当前的红绿灯状态

在这个程序中,我们使用定时器0以1秒的间隔产生中断,在中断服务程序中切换红绿灯的状态。通过直接控制I/O口,我们可以点亮对应的LED灯。整个过程可以看作是一个简单的状态机,在红灯和绿灯之间循环切换。这种方式可以用于实现各种交通信号灯的控制。

实验结果

红绿灯切换

实验完成后,红色LED和绿色LED会交替亮灭,模拟交通信号灯的工作。每隔1秒,红灯和绿灯会切换一次。


红灯亮 - 绿灯灭
(1秒后)
绿灯亮 - 红灯灭
(1秒后)
红灯亮 - 绿灯灭
...
                    

通过这个实验,我们学会了如何使用51单片机的定时器模块控制LED灯的亮灭,以及如何编写状态机程序实现红绿灯的切换。这些都是51单片机开发中非常基础和重要的知识。

返回上一篇