两个十字路口十字路口红绿灯程序
#include
#include
#include
#include
/*************************************程序主函数
************************************
*******************************************************************************
******/
void main() {
IO_Init();
timer0init();
for(;;) {
}
}
/*************************************灭灯功能功能
***********************************
***程序开始之前,所有的灯处于熄灭状态
*******************************************************************************
******/
void IO_Init() {
EWG1_LIGHTOFF();
EWY1_LIGHTOFF();
EWR1_LIGHTOFF();
NSG1_LIGHTOFF();
NSY1_LIGHTOFF();
EW1_LED1OFF();
EW1_LED2OFF();
NS1_LED1OFF();
NS1_LED2OFF();
NSR1_LIGHTOFF();
EWG2_LIGHTOFF();
EWY2_LIGHTOFF();
EWR2_LIGHTOFF();
NSG2_LIGHTOFF();
NSY2_LIGHTOFF();
NSR2_LIGHTOFF();
EW2_LED1OFF();
EW2_LED2OFF();
NS2_LED1OFF();
NS2_LED2OFF();
}
/*************************************定时器 0 初始化函数
*******************************
***初始化定时器 0 的值,以及开中断,初始化各方向的计数值
*******************************************************************************
******/
void timer0init(void){
TH0=0;
TL0=0;
TMOD=0x01;
TCON=0X10;
IE=0X82;
count = 1000;
nsr_count = nsr_ini;
nsg_count = nsg_ini;
nsy_count = nsy_ini;
ewr_count = ewr_ini;
ewg_count = ewg_ini;
ewy_count = ewy_ini;
ns2r_count = ns2r_ini;
ns2g_count = ns2g_ini;
ns2y_count = ns2y_ini;
ew2r_count = ew2r_ini;
ew2g_count = ew2g_ini;
ew2y_count = ew2y_ini;
}
/*************************************定时器中断功能
*********************************
***定时一秒,但下面的初值只能定时 1ms,在 traficc_display()中 count 计数一千次,即 1s
***每隔 1ms 会定时刷新数码管的值这样就不会出现闪烁现象
*******************************************************************************
******/
void delay_1s() interrupt 1{
TH0=0xfb;
TL0=0x18;
traficc_display();
count--;
}
void traficc_display() {
if(count == 0) {
}
traficc1_display();
count = 1000;
traficc1_calculate();
traficc2_calculate();
traficc2_display();
}
/*************************************延时函数
***************************************
***如果数码管有闪烁现象,可以稍微调节一下这个函数
*******************************************************************************
******/
void delay_ms(int count) {
while(count--);
}
#ifndef TRAFICCLIGHT_H
#define TRAFICCLIGHT_H
/*************************************开关值设定
*************************************
***主要是有些硬件共阴极和共阳极不同,可以通过修改这里的值
*******************************************************************************
******/
#define LIGHT_ON 0
#define LIGHT_OFF 1
#define LED_ON 0
#define LED_OFF 1
/*************************************初始值设定
*************************************
***定义数码管上面的初始时间值,这里要注意初始时间要比想要显示的时间值大 1,因为
***显示之前我们已经做了减一操作
*******************************************************************************
******/
#define nsr_ini 21
#define nsg_ini 18
#define nsy_ini 3
#define ewr_ini 21
#define ewg_ini 18
#define ewy_ini 3
#define ns2r_ini 31
#define ns2g_ini 28
#define ns2y_ini 3
#define ew2r_ini 31
#define ew2g_ini 28
#define ew2y_ini 3
/*************************************程序中所有函数的申明
**********************
***函数申明中的树状结构,表示了程序中的函数包含关系,这样主要是为了函数的清晰
***display 显示函数,calculate 计算各个数码管的剩余时间函数
*******************************************************************************
******/
void delay_ms(int);
void IO_Init();
void timer0init(void);
void traficc_display();
void traficc1_calculate();
void NS1_calculate();
void EW1_calculate();
void traficc1_display();
void NSR1_display();
void NSG1_display();
void NSY1_display();
void EWG2_display();
void EWY2_display();
void EWR2_display();
void EWR1_display();
void EWG1_display();
void EWY1_display();
void NSR2_display();
void NSG2_display();
void NSY2_display();
void NS1_display();
void EW1_display();
void traficc2_calculate();
void NS2_calculate();
void EW2_calculate();
void traficc2_display();
void NS2_display();
void EW2_display();
/*************************************定义引脚功能
***********************************
*** 其中 EW1 表示第一个十字路口的东西方向,其中 EW2 表示第二个十字路口的东西方向,
*** NS 代表南北方向,LED 代表 8 段 LED 数码管,P1 口为位选信号,P3 口为数据信号
*** G 代表绿灯,Y 代表黄灯,R 代表红灯
***P0 口为第二个十字路口红绿黄灯的控制信号,P2 口为第一个十字路口的黄绿黄灯的控
制信号
*******************************************************************************
******/
sbit EWG2 = P0^0;
sbit EWY2 = P0^1;
sbit EWR2 = P0^2;
sbit NSG2 = P0^3;
sbit NSY2 = P0^4;
sbit NSR2 = P0^5;
sbit EW1_LED1 = P1^0;
sbit EW1_LED2 = P1^1;
sbit NS1_LED1 = P1^2;
sbit NS1_LED2 = P1^3;
sbit EW2_LED1 = P1^4;
sbit EW2_LED2 = P1^5;
sbit NS2_LED1 = P1^6;
sbit NS2_LED2 = P1^7;
sbit EWG1 = P2^0;
sbit EWY1 = P2^1;
sbit EWR1 = P2^2;
sbit NSG1 = P2^3;
sbit NSY1 = P2^4;
sbit NSR1 = P2^5;
#define LED P3
/*************************************定义灯及数码管的开关功能
**********************
***EW/NS+G/Y/R+1/2+LIGHT+ON/OFF 表示东西/南北方向+绿/黄/红灯+第一/二个十字路
口+开/关;
***EW/NS+1/2+LED1/LED2+ON/OFF 表示东西/南北方向+第一/二个十字路口+数码管
1/2+开/关;
*******************************************************************************
******/
#define EWG1_LIGHTON() (EWG1 = LIGHT_ON)
#define EWG1_LIGHTOFF() (EWG1 = LIGHT_OFF)
#define EWY1_LIGHTON() (EWY1 = LIGHT_ON)
#define EWY1_LIGHTOFF() (EWY1 = LIGHT_OFF)
#define EWR1_LIGHTON() (EWR1 = LIGHT_ON)
#define EWR1_LIGHTOFF() (EWR1 = LIGHT_OFF)
#define NSG1_LIGHTON() (NSG1 = LIGHT_ON)
#define NSG1_LIGHTOFF() (NSG1 = LIGHT_OFF)
#define NSY1_LIGHTON() (NSY1 = LIGHT_ON)
#define NSY1_LIGHTOFF() (NSY1 = LIGHT_OFF)
#define NSR1_LIGHTON() (NSR1 = LIGHT_ON)
#define NSR1_LIGHTOFF() (NSR1 = LIGHT_OFF)
#define EWG2_LIGHTON() (EWG2 = LIGHT_ON)
#define EWG2_LIGHTOFF() (EWG2 = LIGHT_OFF)
#define EWY2_LIGHTON() (EWY2 = LIGHT_ON)
#define EWY2_LIGHTOFF() (EWY2 = LIGHT_OFF)
#define EWR2_LIGHTON() (EWR2 = LIGHT_ON)
#define EWR2_LIGHTOFF() (EWR2 = LIGHT_OFF)
#define NSG2_LIGHTON() (NSG2 = LIGHT_ON)
#define NSG2_LIGHTOFF() (NSG2 = LIGHT_OFF)
#define NSY2_LIGHTON() (NSY2 = LIGHT_ON)
#define NSY2_LIGHTOFF() (NSY2 = LIGHT_OFF)
#define NSR2_LIGHTON() (NSR2 = LIGHT_ON)
#define NSR2_LIGHTOFF() (NSR2 = LIGHT_OFF)
#define EW1_LED1ON() (EW1_LED1 = LED_ON)
#define EW1_LED1OFF() (EW1_LED1 = LED_OFF)
#define EW1_LED2ON() (EW1_LED2 = LED_ON)
#define EW1_LED2OFF() (EW1_LED2 = LED_OFF)
#define NS1_LED1ON() (NS1_LED1 = LED_ON)
#define NS1_LED1OFF() (NS1_LED1 = LED_OFF)
#define NS1_LED2ON() (NS1_LED2 = LED_ON)
#define NS1_LED2OFF() (NS1_LED2 = LED_OFF)
#define EW2_LED1ON() (EW2_LED1 = LED_ON)
#define EW2_LED1OFF() (EW2_LED1 = LED_OFF)
#define EW2_LED2ON() (EW2_LED2 = LED_ON)
#define EW2_LED2OFF() (EW2_LED2 = LED_OFF)
#define NS2_LED1ON() (NS2_LED1 = LED_ON)
#define NS2_LED1OFF() (NS2_LED1 = LED_OFF)
#define NS2_LED2ON() (NS2_LED2 = LED_ON)
#define NS2_LED2OFF() (NS2_LED2 = LED_OFF)
/*************************************定义数码管译码数组
*****************************
***定义译码数组以及程序中要求使用的变量
*******************************************************************************
******/
//int LED_INDEX[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xae,0xe0,0xfe,0xf6};
int LED_INDEX[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char
nsrhight_bit,nsrlow_bit,nsghight_bit,nsglow_bit,nsyhight_bit,nsylow_bit,nsr_count,nsg_count,
nsy_count,
ewrhight_bit,ewrlow_bit,ewghight_bit,ewglow_bit,ewyhight_bit,ewylow_bit,ewr_count,ewg_
count,ewy_count;
ns2rhight_bit,ns2rlow_bit,ns2ghight_bit,ns2glow_bit,ns2yhight_bit,ns2ylow_bit,ns2r_count,ns
2g_count,ns2y_count,
ew2rhight_bit,ew2rlow_bit,ew2ghight_bit,ew2glow_bit,ew2yhight_bit,ew2ylow_bit,ew2r_cou
nt,ew2g_count,ew2y_count; // 计数的高地位,红绿黄灯初值变量
int count; // 用于 1000 次计数,每次延时 1ms
#endif