📄 traffic.c
字号:
#include <at89x51.h>
#include <absacc.h>
#define RED XBYTE[0XE000] // 8255 port A red light
#define YELLOW XBYTE[0XE001] // 8255 port B yellow light
#define GREEN XBYTE[0XE002] // 8255 port C green light
#define Command XBYTE[0XE003] // 8255 configuration word
#define byte unsigned char
#define word unsigned int
#define DELAY_SHORT 10
#define FLASH_TIMES 10
#define DELAY_LONG 600
/*
[4] [3] [2] [1]
RED PA3 PA2 PA1 PA0
YELLOW PB3 PB2 PB1 PB0
GREEN PC3 PC2 PC1 PC0
*/
#define ON_1_3 0x05
#define ON_2_4 0xA0
#define ALL_ON 0x0F
#define ALL_OFF 0x00
word d_short;
word d_long;
byte stop;
byte wait_flag;
byte flash;
void iniVal(void);
void ini8255(void);
void Traffic_Running(void);
void iniVal(void)
{
d_short = 0;
d_long = 0;
stop = 0;
wait_flag = 0;
flash = 0;
TMOD = 0x01;// 16 bit timer
TH0 = (65536-50000) / 256;
TL0 = (65536-50000) % 256;
TR0 = 1;
ET0 = 1; // enable timer0 interrupt
EX0 = 1; // enable INT0 interrupt
IT0 = 1; // INT0 interrupt at falling edge
EA = 1; // enable cpu interrupt
}
void ini8255(void)
{
Command = 0x80; // 0B10000000
RED = ALL_ON;
YELLOW = ALL_OFF;
GREEN = ALL_OFF;
}
void int_0(void) interrupt 0 using 1
{
stop = 1; // 外部按钮停止工作
}
void Timer_0(void) interrupt 1 using 0
{
TH0 = 0xC3; // 50ms
TL0 = 0x50;
if (1 == wait_flag){
// 半秒短延时
if (d_short >= DELAY_SHORT){
d_short = 0;
wait_flag = 0;
}else {
d_short++;
}
}else if (2 == wait_flag){
// 30秒长延时
if (d_long >= DELAY_LONG){
d_long = 0;
wait_flag = 0;
}else {
d_long++;
}
}
if (1 == stop){
wait_flag = 0;
d_short = 0;
d_long = 0;
}
}
void Traffic_Running(void)
{
while (0 == stop){
GREEN = ON_1_3; // 1,3绿灯亮
RED = ON_2_4; // 2,4红灯亮
YELLOW = ALL_OFF; // 黄灯灭
wait_flag = 2;
while (2 == wait_flag); // 延时30秒
GREEN = ALL_OFF; // 绿灯灭
while (flash <= FLASH_TIMES){ // 1,3黄灯闪烁
flash++; // 闪烁次数
if (0 == flash & 0x01){
YELLOW = ALL_OFF; // 偶次灭
}else{
YELLOW = ON_1_3; // 奇次亮
}
wait_flag = 1;
while (1 == wait_flag); // 延时半秒
}
flash = 0;
GREEN = ON_2_4; // 2,4绿灯亮
RED = ON_1_3; // 1,3红灯亮
YELLOW = ALL_OFF; // 黄灯灭
wait_flag = 2;
while (2 == wait_flag);
GREEN = ALL_OFF;
while (flash <= FLASH_TIMES){ // 2,4黄灯闪烁
flash++;
if (0 == flash & 0x01){
YELLOW = ALL_OFF;
}else{
YELLOW = ON_2_4;
}
wait_flag = 1;
while (1 == wait_flag);
}
flash = 0;
}
}
void main(void)
{
iniVal();
ini8255();
Traffic_Running();
for(;;);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -