两个十字路口十字路口红绿灯程序 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#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