⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traffic.c

📁 用keil51编写的控制交通灯程序,使用可编程通用并行接口8255,内有详细流程图和注释
💻 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 + -