一、简介
基于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无限循环:
点击【proteus经典实战】定时器控制交通灯指示灯——古月居可查看全文