51实现demo交通指示灯
选材
芯片:AT89C51,仿真工具Professional7.8,代码编写工具Keil5
想法
我们有东南西北四个方向的交通指示灯,东西是同一种指示灯信号,南北是一种信号。交通信号灯有红黄绿三种不同的信号,红色指示灯可以直接变绿,绿色指示灯变化却需要先变为黄灯闪三下才可以变为红灯。
当东西为红灯时南北为绿灯
东西绿灯变为红灯时黄灯闪三下南北红灯
东西变为绿灯时南北为红灯
南北为红灯东西为绿灯
南北为绿灯东西为红灯
南北变为红灯时黄灯闪三下东西红灯
综合考虑:
根据指示灯的引脚,东西引脚为P0,P1,P2(红黄绿);南北引脚为P3,P4,P5(红黄绿).
给予低电平相应灯光会亮。
状态:
- 东西红南北绿 1101 1110 0xde
- 东西绿灯变为红灯时黄灯闪三下南北红灯
- 东西黄灯,南北红灯1111 0101 0xf5
- 南北红灯,1111 0111 0xf7
- 东西绿南北红 1111 0011 0xf3
- 南北变为红灯时黄灯闪三下东西为红灯
- 东西红灯,南北黄灯 1110 1110 0xee
- 东西红灯 1111 1110 0xfe
逻辑思路:
由东西绿灯开始
- 东西绿灯 南北红灯 长一点时间 (0xf3)
- 东西变红黄闪三次
- 东西黄 南北红 (0xf5)
- 东西灭 南北红 (0xf7)
- 东西红 南北绿 长一点时间 (0xde)
- 南北变红黄闪三次
- 东西红 南北黄 ( 0xee)
- 东西红 (0xfe)
仿真图示
C代码
#include <reg52.h>
#include <intrins.h>
void Delay(unsigned int x){
unsigned char i;
while(x--){
for(i=121;i>0;i--);
}
}
unsigned int j;
void main(){
unsigned char a[6]={0xf3,0xf5,0xf7,0xde,0xee,0xfe};
unsigned char i;
while(1){
P0 = a[0];
Delay(1150);
for(i=0;i<3;i++)
{
P0 = a[1];
Delay(150);
P0 = a[2];
Delay(150);
}
P0 = a[3];
Delay(1150);
for(i=0;i<3;i++)
{
P0 = a[4];
Delay(150);
P0 = a[5];
Delay(150);
}
}
}