一、简介

基于8051系列单片机实现,旨在模拟一个简单的交通灯系统,实现红、黄、绿灯的交替亮灭。使用了特殊功能寄存器(SFR)和位操作来控制硬件,使用定时器0的中断功能来控制交通灯信号的切换。通过软件控制,实现交通灯的红、黄、绿灯的亮灭和闪烁。

二、头文件选择,变量定义

在8051微控制器上基于嵌入式C语言的程序片段。定义一系列的宏定义、全局变量和特殊功能位(sbit),用于简化寄存器操作和提高代码可读性。

2.1头文件:

头文件:包含了针对8051微控制器的头文件REG52.H。

2.2宏定义:

uint 和 uchar 分别定义为 unsigned int 和 unsigned char,用于简化代码中的类型声明。

2.3全局变量:

定义了 Time_Count、Flash_Count 和 Operation_Type 三个无符号字符变量,用于控制交通灯的计时和操作类型。

2.4特殊功能位定义:

使用 sbit 关键字定义了6个特殊功能位,分别对应两个交通灯的红、黄、绿灯。

2.5主要引脚口定义:

P0 的 0~5引脚连接红绿灯,由于同方向的灯显示方式相同。

P0.0 ~ P0.2: 分别对应横向的红灯,黄灯,绿灯
P0.3 ~ P0.5: 分别对应纵向的红灯,黄灯,绿灯

三、中断函数说明

T0_INT 用于处理定时器0(Timer 0)的中断。这个中断服务程序是交通灯信号控制逻辑的核心部分,负责根据预设的时间间隔改变交通灯的状态。

3.1中断标识:

interrupt 1 表示这是一个响应定时器0中断的服务程序。数字 1 是定时器0中断的标识符。

3.2定时器重新加载:

TH0 = -50000/256; 和 TL0 = -50000%256; 这两行代码重新加载定时器0的高八位(TH0)和低八位(TL0)寄存器。这里通过计算 -50000 的高八位和低八位,设置定时器的溢出时间。这决定了交通灯状态切换的时间间隔。

3.3状态机逻辑:

使用 switch 语句根据 Operation_Type 的值来决定当前应该执行哪个操作。Operation_Type 是一个全局变量,用于跟踪交通灯的当前状态。

3.4交通灯状态控制:

在每个 case 语句中,根据当前的 Operation_Type,设置相应的交通灯信号位(RED_A, YELLOW_A, GREEN_A, RED_B, YELLOW_B, GREEN_B)。这些位与硬件上的LED灯相连,控制灯的亮灭。

3.5时间计数和状态切换:

Time_Count 用于跟踪当前状态持续的时间。当达到预设的时间(例如100个中断周期)后,Time_Count 被重置,Operation_Type 更新为下一个状态。

3.6闪烁控制:

对于黄灯闪烁的状态(Operation_Type 为2和4),使用 Flash_Count 来跟踪闪烁的次数。当黄灯闪烁了预设的次数(例如10次)后,Flash_Count 被重置,Operation_Type 更新为下一个状态。

3.7状态循环:

状态机的设计使得交通灯的状态在四个状态之间循环:红灯亮、黄灯闪烁、绿灯亮、黄灯闪烁。

3.8代码展示:

void T0_INT() interrupt 1
{
    TH0 = -50000/256;
    TL0 = -50000%256;
    switch(Operation_Type)
    {
        case 1:
            RED_A=0; YELLOW_A=0; GREEN_A=1;
            RED_B=1; YELLOW_B=0; GREEN_B=0;
            if(++Time_Count != 100) return;
            Time_Count=0;
            Operation_Type = 2;
            break;
        case 2:
            if(++Time_Count != 8) return;
            Time_Count=0;
            YELLOW_A=!YELLOW_A;
            GREEN_A=0;
            if(++Flash_Count != 10) return;
            Flash_Count=0;
            Operation_Type = 3;
            break;
        case 3:
            RED_A=1; YELLOW_A=0; GREEN_A=0;
            RED_B=0; YELLOW_B=0; GREEN_B=1;
            if(++Time_Count != 100) return;
            Time_Count=0;
            Operation_Type = 4;
            break;
        case 4:
            if(++Time_Count != 8) return;
            Time_Count=0;
            YELLOW_B=!YELLOW_B;
            GREEN_B=0;
            if(++Flash_Count !=10) 
                return;
            Flash_Count=0;
            Operation_Type = 1;
            break;
    }
}

四、主函数说明

main 函数是程序的入口点,负责初始化微控制器的定时器和中断系统,以便能够周期性地改变交通灯的状态。

4.1定时器模式设置:

TMOD = 0x01; 

这行代码设置了定时器模式寄存器(TMOD)。值 0x01 表示定时器0被设置为模式1,这是一个16位的定时器/计数器模式,适用于精确的时间延迟和事件计数。

4.2中断使能设置:

IE = 0x82;

这行代码设置了中断使能寄存器(IE)。值 0x82 表示允许定时器0的中断(TCON.IT0 = 1,允许定时器0的中断)和全局中断(IE.EA = 1,允许所有中断)。

4.3定时器启动:

TR0 = 1;

这行代码启动了定时器0。一旦定时器启动,它将根据系统时钟的频率计数,直到溢出并触发中断。

4.4无限循环:

while(1); 

这个无限循环确保了程序在没有外部干预的情况下持续运行。由于中断系统被激活,程序的执行实际上是由定时器0的中断来驱动的。每次定时器溢出,都会调用 T0_INT 中断服务程序来更新交通灯的状态。

4.5代码展示:

void main()
{
     TMOD = 0x01;
    IE = 0x82;
    TR0 = 1;
    while(1);
}

五、仿真电路图

电路图设计:

电路设计思路:

通过了解,得知红绿灯同方向的灯亮起的情况是相同的,所以在设计电路时,将同方向的灯连在了同一个I/O口,这样可以节约I/O口资源,同时也方便代码编写。

微控制器:AT89C51位于中心位置。
时钟源:12MHz晶振连接到XTAL1和XTAL2。
I/O端口:P0.0 ~ P0.2: 分别对应横向的红灯,黄灯,绿灯
        P0.3 ~ P0.5: 分别对应纵向的红灯,黄灯,绿灯
LED灯:红、黄、绿LED灯分别代表不同的信号灯。
限流电阻:每个LED串联一个电阻,如220Ω。
电源:通常使用5V或3.3V稳压电源。
复位按钮:连接到RST引脚,用于初始化微控制器。
定时器:Timer 0配置为特定模式,用于控制交通灯的切换。

四种状态:

状态1:横向绿灯亮起,其他灯熄灭,纵向红灯亮起,其他灯熄灭,持续一段时间后进入状态2。

状态2:横向黄灯开始闪烁,其他灯熄灭,纵向红灯继续亮,其他灯熄灭,闪烁一定次数后进入状态3。

状态3:横向红灯亮起,其他灯熄灭,纵向绿灯亮起,其他灯熄灭,持续一段时间后进入状态

状态4:横向红灯继续亮,其他灯熄灭,纵向黄灯闪烁,其他灯灭,与状态2相同,可能用于另一组交通灯。

六、总结

6.1 基本结构和概念

程序结构:理解了C语言程序的基本结构,包括头文件、宏定义、全局变量、中断服务程序和主函数。
寄存器操作:学习了如何通过直接操作微控制器的寄存器来控制硬件。

6.2 硬件接口

特殊功能位(sbit):掌握了如何使用 sbit 关键字来定义和操作单片机的特定引脚。
I/O操作:了解了如何通过读写引脚状态来控制外部设备,如LED灯。

6.3 中断系统

中断服务程序:理解了中断服务程序的作用和实现方式,以及如何使用 interrupt 关键字声明中断服务程序。
定时器中断:学习了如何使用定时器中断来实现周期性的任务,如交通灯的状态切换。

6.4 状态机

状态控制:通过 switch 语句实现了一个简单的状态机,用于控制交通灯的信号变化。
状态转换逻辑:掌握了如何根据当前状态和计时器来决定下一个状态。

6.5 定时器配置

定时器模式:学习了如何配置定时器的工作模式,如设置为模式1进行精确计时。
定时器初值:了解了如何给定时器设定初值,以控制中断发生的频率。

6.6 控制流程

主循环:理解了主函数中的无限循环用于等待中断发生,从而驱动程序的执行。
中断驱动:掌握了中断驱动的程序执行方式,这是一种常见的嵌入式系统编程范式。

6.7 实践应用

交通灯模拟:通过模拟交通灯的控制,实践了嵌入式系统编程中对时间敏感的应用开发。
硬件控制:加深了对如何通过软件程序控制硬件设备的理解。

6.8 编程技巧

位操作:学习了位操作在控制硬件时的便捷性,如使用 sbit 和位取反操作。
中断使能:掌握了如何启用和禁用中断,以及这对程序实时性的影响。
通过该项目的学习获得了有关8051微控制器编程的基础知识,还能对嵌入式系统开发有一个实际的认识。