logo资料库

十字路口交通灯C程序.pdf

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
两个十字路口十字路口红绿灯程序
#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
分享到:
收藏