c51单片机交通灯程序
51单片机的交通灯c程序

#include<reg52.h>#define uint unsigned int#define uchar unsigned charchar TAB[11]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x00}; //数码管状态表void delay_100ms(uint );void delay(uint );void display(uint );void yejian(void);int i,k,t,flag=0;sbit A1=P1^0;sbit A2=P1^1;sbit A3=P1^2;sbit A4=P1^3;sbit SB=P3^7;void main () //主程序{EA=1;//初始化,开所有中断ET1=1;//开定时器T1中断TMOD=0x10;//设置定时器工作方式2TH1=(65536-50000)/256;//设置定时器初值TL1=(65536-50000)%256;while(1){if(SB==0) flag=1;if(flag==1) yejian();P2=0x69;k=8;while(k>0)//状态1南北红灯,东西绿灯{if(SB==0) flag=1;if(flag==1) yejian();TR1=1;//开启T1while(t!=10) display(k); //显示倒计时if(t==10) t=0;k--;TR1=0;//关闭T1}if(k==0) k=3;while(k>=0)//状态2南北红灯,东西绿灯闪烁三次{if(SB==0) flag=1;if(flag==1) yejian();P2=0x69;delay_100ms(5);P2=0x41;delay_100ms(5);k--;}k=2;flag=1;while(k>=0)//状态3南北红灯,东西黄灯{if(SB==0) flag=1;if(flag==1) yejian();P2=0x7d;delay_100ms(10);k--;}P2=0x96;k=8;while(k>0)//状态4南北绿灯,东西红灯{if(SB==0) flag=1;if(flag==1) yejian();TR1=1;//开启T1while(t!=10) display(k);// 显示倒计时if(t==10) t=0;k--;TR1=0;//关闭T1}k=3;while(k>=0)//状态5东西红灯,南北绿灯闪烁三次{if(SB==0) flag=1;if(flag==1) yejian();P2=0x96;delay_100ms(5);P2=0x14;delay_100ms(5);k--;}k=2;while(k>=0)//状态6东西红灯,南北黄灯{if(SB==0) flag=1;if(flag==1) yejian();P2=0xd7;delay_100ms(10);k--;}}}void yejian(void){uint m=k;while(flag==1){if(SB==1) flag=0;k=11;P2=0xff;delay_100ms(5);P2=0x00;delay_100ms(5);}k=m;}void delay_100ms(uint z)//显示数码管延时100ms {TR1=1;//开启T1while(t!=z) display(k);if(t==z){t=0;TR1=0;//关闭T1}}void exter0() interrupt 3//定时器中断程序{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t++;}void display(uint i)//倒计时显示{A1=A2=A3=A4=0;A4=1;P0=TAB[i];//显示第一位数值delay(4);A4=0;A3=1;P0=TAB[i];//显示第二位数值delay(4);A3=0;A2=1;P0=TAB[i];//显示第三位数值delay(4);A2=0;A1=1;P0=TAB[i];//显示第四位数值delay(4);A1=0;}void delay(uint z)//软件延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
51单片机交通灯

/*交通灯控制系统C语言源程序*//*Author:ZhaoWenjie All Rights Reserved*/ /*2009/10/18*/#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar data buf[4];uchar data sec_dx=20;//东西数默认uchar data sec_nb=30;//南北默认值uchar data set_timedx=20;uchar data set_timenb=30;int n;uchar data b;//定时器中断次数//sbit k1=P1^6;//定义5组开关//sbit k2=P1^7;//sbit k3=P2^7;//sbit k4=P3^0;//sbit k5=P3^1;//定义5组开关sbit k4=P3^7; //切换方向sbit k1=P3^5; //时间加sbit k2=P3^6; //时间减sbit k3=P3^4; //确认sbit k5=P3^1; //禁止// P3^2 //只允许东西方向通行// P3^3 //只允许南北方向通行sbit Y ellow_nb=P2^5; //南北黄灯标志sbit Y ellow_dx=P2^2; //东西黄灯标志sbit Green_nb=P2^4;sbit Green_dx=P2^1;sbit Buzz=P3^0;bit Buzzer_Indicate;bit time=0;//灯状态循环标志bit set=1;//调时方向切换键标志uchar code table[11]={ //共阴极字型码0x3f, //--00x06, //--10x5b, //--20x4f, //--30x66, //--40x6d, //--50x7d, //--60x07, //--70x7f, //--80x6f, //--90x00 //--NULL};//函数的声明部分void delay(int ms);//延时子程序void key();//按键扫描子程序void key_to1();//键处理子程序void key_to2();void key_to3();void display();//显示子程序void logo(); //开机LOGOvoid Buzzer();//主程序void main(){TMOD=0X01;TH0=0XD8;TL0=0XF0;EA=1;ET0=1;TR0=1;EX0=1;EX1=1;logo();P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯sec_nb=sec_dx+5;while(1){key(); //调用按键扫描程序display(); //调用显示程序Buzzer();}}//函数的定义部分void key() //按键扫描子程序{if(k1!=1){delay(10);if(k1!=1){while(k1!=1){key_to1();for(n=0;n<40;n++){ display();}}}}if(k2!=1){delay(10);if(k2!=1){while(k2!=1){key_to2();for(n=0;n<40;n++){ display();}}}}if(k3!=1){TR0=1; //启动定时器Buzzer_Indicate=0;sec_nb=set_timenb; //从中断回复,仍显示设置过的数值sec_dx=set_timedx;if(time==0){ P2=0X99;sec_nb=sec_dx+5; }else { P2=0xC3;sec_dx=sec_nb+5; }}if(k4!=1){delay(5);if(k4!=1){while(k4!=1);set=!set;}}if(k5!=1){delay(5);if(k5!=1){while(k5!=1)key_to3();}}}void display() //显示子程序{buf[1]=sec_dx/10; //第1位东西秒十位buf[2]=sec_dx%10; //第2位东西秒个位buf[3]=sec_nb/10; //第3位南北秒十位buf[0]=sec_nb%10; //第4位南北秒个位P1=0xff; // 初始灯为灭的P0=0x00;P1=0xfe; //片选LCD1P0=table[buf[1]];delay(1);P1=0xff;P0=0x00;P1=0xfd; //片选LCD2P0=table[buf[2]];delay(1);P1=0xff;P0=0x00;P1=0Xfb; //片选LCD3P0=table[buf[3]];delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=table[buf[0]]; //片选LCD4delay(1);}void time0(void) interrupt 1 using 1 //定时中断子程序{b++;if(b==19) // 定时器中断次数{ b=0;sec_dx--;sec_nb--;if(sec_nb<=5&&time==0) //东西黄灯闪{ Green_dx=0;Y ellow_dx=!Y ellow_dx;}if(sec_dx<=5&&time==1) //南北黄灯闪{ Green_nb=0;Y ellow_nb=!Y ellow_nb;}if(sec_dx==0&&sec_nb==5)sec_dx=5;if(sec_nb==0&&sec_dx==5)sec_nb=5;if(time==0&&sec_nb==0){ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}if(time==1&&sec_dx==0){P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}}}void key_to1() //键盘处理子程序之+{TR0=0; //关定时器if(set==0)set_timenb++; //南北加1Selseset_timedx++; //东西加1Sif(set_timenb==100)set_timenb=1;if( set_timedx==100)set_timedx=1; //加到100置1sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;}void key_to2() //键盘处理子程序之-{TR0=0; //关定时器if(set==0)set_timenb--; //南北减1Selseset_timedx--; //东西减1Sif(set_timenb==0)set_timenb=99;if( set_timedx==0 )set_timedx=99; //减到1重置99sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;}void key_to3() //键盘处理之紧急车通行{TR0=0;P2=0Xc9;sec_dx=00;sec_nb=00;Buzzer_Indicate=1;}void int0(void) interrupt 0 using 1 //只允许东西通行{TR0=0;P2=0Xc3;Buzzer_Indicate=0;sec_dx=00;sec_nb=00;}void int1(void) interrupt 2 using 1 //只允许南北通行{TR0=0;P2=0X99;Buzzer_Indicate=0;sec_nb=00;sec_dx=00;}void logo()//开机的Logo "- - - -"{ for(n=0;n<50;n++){P0=0x40;P1=0xfe;delay(1);P1=0xfd;delay(1);P1=0Xfb;delay(1);P1=0Xf7;delay(1);P1 = 0xff;}}void Buzzer(){if(Buzzer_Indicate==1)Buzz=!Buzz;else Buzz=0;}void delay(int ms) //延时子程序{uint j,k;for(j=0;j<ms;j++)for(k=0;k<124;k++);}。
51单片机交通灯程序

#ifndef __IAP_H__#define __IAP_H__#include <reg51.h>#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;/*Declare SFR associated with the IAP */sfr IAP_DATA = 0xE2; //Flash data registersfr IAP_ADDRH = 0xE3; //Flash address HIGHsfr IAP_ADDRL = 0xE4; //Flash address LOWsfr IAP_CMD = 0xE5; //Flash command register sfr IAP_TRIG = 0xE6; //Flash command trigger sfr IAP_CONTR = 0xE7; //Flash control register/*Define ISP/IAP/EEPROM command*/#define CMD_IDLE 0 //Stand-By#define CMD_READ 1 //Byte-Read#define CMD_PROGRAM 2 //Byte-Program#define CMD_ERASE 3 //Sector-Erase/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*///#define ENABLE_IAP 0x80 //if SYSCLK<40MHz#define ENABLE_IAP 0x81 //if SYSCLK<20MHz//#define ENABLE_IAP x82 //if SYSCLK<10MHz//#define ENABLE_IAP 0x83 //if SYSCLK<5MHz//Start address for STC89C51xx EEPROM#define IAP_ADDRESS 0x02000void IapIdle();BYTE IapReadByte(WORD addr);void IapProgramByte(WORD addr, BYTE dat);void IapEraseSector(WORD addr);#endif#include "IAP_EEPROM.h"/*----------------------------Disable ISP/IAP/EEPROM functionMake MCU in a safe state----------------------------*/void IapIdle(){IAP_CONTR = 0; //Close IAP functionIAP_CMD = 0; //Clear command to standbyIAP_TRIG = 0; //Clear trigger registerIAP_ADDRH = 0x20; //Data ptr point to non-EEPROM areaIAP_ADDRL = 0; //Clear IAP address to prevent misuse}/*----------------------------Read one byte from ISP/IAP/EEPROM areaInput: addr (ISP/IAP/EEPROM address)Output:Flash data----------------------------*/BYTE IapReadByte(WORD addr){BYTE dat; //Data bufferIAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait timeIAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ commandIAP_ADDRL = addr; //Set ISP/IAP/EEPROM address lowIAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address highIAP_TRIG = 0x46; //Send trigger command1 (0x46)IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation completedat = IAP_DATA; //Read ISP/IAP/EEPROM dataIapIdle(); //Close ISP/IAP/EEPROM functionreturn dat; //Return Flash data}/*----------------------------Program one byte to ISP/IAP/EEPROM areaInput: addr (ISP/IAP/EEPROM address)dat (ISP/IAP/EEPROM data)Output:-----------------------------*/void IapProgramByte(WORD addr, BYTE dat){IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait timeIAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM commandIAP_ADDRL = addr; //Set ISP/IAP/EEPROM address lowIAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address highIAP_DATA = dat; //Write ISP/IAP/EEPROM dataIAP_TRIG = 0x46; //Send trigger command1 (0x46)IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation completeIapIdle();}/*----------------------------Erase one sector areaInput: addr (ISP/IAP/EEPROM address)Output:-----------------------------*/void IapEraseSector(WORD addr){IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait timeIAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE commandIAP_ADDRL = addr; //Set ISP/IAP/EEPROM address lowIAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address highIAP_TRIG = 0x46; //Send trigger command1 (0x46)IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation completeIapIdle();}#include <reg51.h>#include "IAP_EEPROM.h"#define SN_SET_TIME_ADDR 0x2000#define EW_SET_TIME_ADDR 0x2001sbit SET_BTN = P1^0;sbit ADD_BTN = P1^1;sbit DEL_BTN = P1^2;sbit MODE_BTN = P1^3;sbit SN_DG1 = P1^4;sbit SN_DG2 = P1^5;sbit EW_DG1 = P1^6;sbit EW_DG2 = P1^7;sbit LED_SN_RED = P0^0;sbit LED_SN_GREEN = P0^1;sbit LED_SN_YELLOW = P0^2;sbit LED_EW_RED = P0^3;sbit LED_EW_GREEN = P0^4;sbit LED_EW_YELLOW = P0^5;unsigned char WorkMode = 0;#define NORMAL_MODE 0#define SET_SN_MODE 1#define SET_EW_MODE 2#define NIGHT_MODE 3#define SN_PASS_MODE 4#define EW_PASS_MODE 5#define URGENCY_MODE 6 //紧急模式unsigned char NormalModeStep = 0;#define NORMAL_MODE_STEP1 0#define NORMAL_MODE_STEP2 1#define NORMAL_MODE_STEP3 2#define NORMAL_MODE_STEP4 3unsigned char SN_TimeSetValue = 0;unsigned char EW_TimeSetValue = 0;unsigned char SN_DisplayTime = 0;unsigned char EW_DisplayTime = 0;unsigned char duanxuan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void Work_NORMAL_Mode();void Work_SETSN_Mode();void Work_SETEW_Mode();void Work_Night_Mode();void Work_SNPass_Mode();void Work_EWPass_Mode();void Work_Urgency_Mode();void SetBtn_Check_Work(void);void Display(unsigned char SNData, unsigned char EWData); void delay2ms(void);void InitTimer0(void);void delay10ms(unsigned char num);void main(){SN_TimeSetValue = IapReadByte(SN_SET_TIME_ADDR);EW_TimeSetValue = IapReadByte(EW_SET_TIME_ADDR);if(SN_TimeSetValue==0 || SN_TimeSetValue==255) SN_TimeSetValue = 30;if(EW_TimeSetValue==0 || EW_TimeSetValue==255) EW_TimeSetValue = 30;SN_DisplayTime = SN_TimeSetValue;EW_DisplayTime = SN_TimeSetValue+5;//SN_TimeSetValue = 20;//EW_TimeSetValue = 30;//SN_DisplayTime = SN_TimeSetValue;//EW_DisplayTime = SN_TimeSetValue+5;WorkMode = NORMAL_MODE;NormalModeStep = NORMAL_MODE_STEP1;InitTimer0();while(1){switch(WorkMode){case NORMAL_MODE:Work_NORMAL_Mode();break;case SET_SN_MODE:Work_SETSN_Mode();break;case SET_EW_MODE:Work_SETEW_Mode();break;case NIGHT_MODE:Work_Night_Mode();break;case SN_PASS_MODE:Work_SNPass_Mode();break;case EW_PASS_MODE:Work_EWPass_Mode();break;case URGENCY_MODE:Work_Urgency_Mode();break;}SetBtn_Check_Work();Display(SN_DisplayTime, EW_DisplayTime);}}void Work_NORMAL_Mode(){switch(NormalModeStep){case NORMAL_MODE_STEP1:LED_SN_RED = 1;LED_SN_GREEN = 0;LED_SN_YELLOW = 1;LED_EW_RED = 0;LED_EW_GREEN = 1;LED_EW_YELLOW = 1;if(SN_DisplayTime == 0){NormalModeStep = NORMAL_MODE_STEP2;SN_DisplayTime = 5;}break;case NORMAL_MODE_STEP2:LED_SN_RED = 1;LED_SN_GREEN = 1;LED_SN_YELLOW = 0;LED_EW_RED = 0;LED_EW_GREEN = 1;LED_EW_YELLOW = 1;if(SN_DisplayTime == 0){NormalModeStep = NORMAL_MODE_STEP3;EW_DisplayTime = EW_TimeSetValue;SN_DisplayTime = EW_TimeSetValue+5;}break;case NORMAL_MODE_STEP3:LED_SN_RED = 0;LED_SN_GREEN = 1;LED_SN_YELLOW = 1;LED_EW_RED = 1;LED_EW_GREEN = 0;LED_EW_YELLOW = 1;if(EW_DisplayTime == 0){NormalModeStep = NORMAL_MODE_STEP4;EW_DisplayTime = 5;}break;case NORMAL_MODE_STEP4:LED_SN_RED = 0;LED_SN_GREEN = 1;LED_SN_YELLOW = 1;LED_EW_RED = 1;LED_EW_GREEN = 1;LED_EW_YELLOW = 0;if(EW_DisplayTime == 0){NormalModeStep = NORMAL_MODE_STEP1;SN_DisplayTime = SN_TimeSetValue;EW_DisplayTime = SN_TimeSetValue+5;}break;}}void Work_SETSN_Mode(){LED_SN_RED = 0;LED_SN_GREEN = 0;LED_SN_YELLOW = 0;LED_EW_RED = 1;LED_EW_GREEN = 1;LED_EW_YELLOW = 1;SN_DisplayTime = SN_TimeSetValue;EW_DisplayTime = 0xff;void Work_SETEW_Mode(){LED_SN_RED = 1;LED_SN_GREEN = 1;LED_SN_YELLOW = 1;LED_EW_RED = 0;LED_EW_GREEN = 0;LED_EW_YELLOW = 0;EW_DisplayTime = EW_TimeSetValue;SN_DisplayTime = 0xff;}void Work_Night_Mode(){LED_SN_RED = 1;LED_SN_GREEN = 1;LED_SN_YELLOW = 0;LED_EW_RED = 1;LED_EW_GREEN = 1;LED_EW_YELLOW = 0;SN_DisplayTime = 0xff;EW_DisplayTime = 0xff;}void Work_SNPass_Mode(){LED_SN_RED = 1;LED_SN_GREEN = 0;LED_SN_YELLOW = 1;LED_EW_RED = 0;LED_EW_GREEN = 1;LED_EW_YELLOW = 1;SN_DisplayTime = 0xff; //display "-"EW_DisplayTime = 0xff;}void Work_EWPass_Mode(){LED_SN_RED = 0;LED_SN_GREEN = 1;LED_SN_YELLOW = 1;LED_EW_RED = 1;LED_EW_GREEN = 0;LED_EW_YELLOW = 1;SN_DisplayTime = 0xff;EW_DisplayTime = 0xff;void Work_Urgency_Mode(){LED_SN_RED = 0;LED_SN_GREEN = 1;LED_SN_YELLOW = 1;LED_EW_RED = 0;LED_EW_GREEN = 1;LED_EW_YELLOW = 1;SN_DisplayTime = 0xff;EW_DisplayTime = 0xff;}void SetBtn_Check_Work(void){if(SET_BTN == 0){delay10ms(5);if(SET_BTN == 0){if(WorkMode == NORMAL_MODE){TR0 = 0;WorkMode = SET_SN_MODE;}else if(WorkMode == SET_SN_MODE){TR0 = 0;WorkMode = SET_EW_MODE;}else if(WorkMode == SET_EW_MODE){TR0 = 1;SN_DisplayTime = SN_TimeSetValue;EW_DisplayTime = SN_TimeSetValue+5;WorkMode = NORMAL_MODE;NormalModeStep = NORMAL_MODE_STEP1;}}}if(ADD_BTN == 0){delay10ms(5);if(ADD_BTN == 0){if(WorkMode == SET_SN_MODE){SN_TimeSetValue++;IapEraseSector(IAP_ADDRESS);IapProgramByte(SN_SET_TIME_ADDR, SN_TimeSetValue);IapProgramByte(EW_SET_TIME_ADDR, EW_TimeSetValue);SN_DisplayTime = SN_TimeSetValue;}if(WorkMode == SET_EW_MODE){EW_TimeSetValue++;IapEraseSector(IAP_ADDRESS);IapProgramByte(EW_SET_TIME_ADDR, EW_TimeSetValue);IapProgramByte(SN_SET_TIME_ADDR, SN_TimeSetValue);EW_DisplayTime = EW_TimeSetValue;}}}if(DEL_BTN == 0){delay10ms(5);if(DEL_BTN == 0){if(WorkMode == SET_SN_MODE){SN_TimeSetValue--;IapEraseSector(IAP_ADDRESS);IapProgramByte(SN_SET_TIME_ADDR, SN_TimeSetValue);IapProgramByte(EW_SET_TIME_ADDR, EW_TimeSetValue);SN_DisplayTime = SN_TimeSetValue;}if(WorkMode == SET_EW_MODE){EW_TimeSetValue--;IapEraseSector(IAP_ADDRESS);IapProgramByte(EW_SET_TIME_ADDR, EW_TimeSetValue);IapProgramByte(SN_SET_TIME_ADDR, SN_TimeSetValue);EW_DisplayTime = EW_TimeSetValue;}}}if(MODE_BTN == 0){delay10ms(5);if(MODE_BTN == 0){if(WorkMode == NORMAL_MODE){TR0 = 0;WorkMode = NIGHT_MODE;}else if(WorkMode == NIGHT_MODE){TR0 = 0;WorkMode = SN_PASS_MODE;}else if(WorkMode == SN_PASS_MODE){TR0 = 0;WorkMode = EW_PASS_MODE;}else if(WorkMode == EW_PASS_MODE){TR0 = 0;WorkMode = URGENCY_MODE;}else if(WorkMode == URGENCY_MODE){TR0 = 1;SN_DisplayTime = SN_TimeSetValue;EW_DisplayTime = SN_TimeSetValue+5;WorkMode = NORMAL_MODE;NormalModeStep = NORMAL_MODE_STEP1;}}}}void Display(unsigned char SNData, unsigned char EWData) {if(SNData == 0xff)P2 = 0xbf;elseP2 = duanxuan[SNData/10];SN_DG1 = 1;delay2ms();SN_DG1 = 0;if(SNData == 0xff)P2 = 0xbf;elseP2 = duanxuan[SNData%10];SN_DG2 = 1;delay2ms();SN_DG2 = 0;if(EWData == 0xff)P2 = 0xbf;elseP2 = duanxuan[EWData/10];EW_DG1 = 1;delay2ms();EW_DG1 = 0;if(EWData == 0xff)P2 = 0xbf;elseP2 = duanxuan[EWData%10];EW_DG2 = 1;delay2ms();EW_DG2 = 0;}void delay2ms(void) //误差0us{unsigned char a,b;for(b=4;b>0;b--)for(a=248;a>0;a--);_nop_(); //if Keil,require use intrins.h }void InitTimer0(void){TMOD = 0x01;TH0 = 0x3C;TL0 = 0xB0;EA = 1;ET0 = 1;TR0 = 1;}void Timer0Interrupt(void) interrupt 1{static unsigned char TimeOutNum = 0;TH0 = 0x3C;TL0 = 0xB0;//add your code here!TimeOutNum++;if(TimeOutNum>=20)//50ms*20 = 1s{TimeOutNum = 0;SN_DisplayTime--;EW_DisplayTime--;}}void delay10ms(unsigned char num) //误差0us {unsigned char i,a,b,c;for(i=0;i<num;i++)for(c=5;c>0;c--)for(b=4;b>0;b--)for(a=248;a>0;a--);}。
基于51单片机控制交通灯的电路图与C语言程序

}
p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1); //南北黄灯闪烁三秒完毕
}
void main() //主函数入口处
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。
三、硬件电路设计
此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。
p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
else
51单片机用C语言实现交通灯_红绿灯_源程序

c o d eu n s i g n e dc h a rt a b [ ] = { 0 x 3 f , 0 x 0 6 , 0 x 5 b , 0 x 4 f , 0 x 6 6 , 0 x 6 d , 0 x 7 d , 0 x 0 7 , 0 x 7 f , 0 x 6 f } ; / / 共阴数码管 0 9 u n s i g n e dc h a rD i s _ S h i w e i ; / / 定义十位 u n s i g n e dc h a rD i s _ G e w e i ;/ / 定 g n e di n tc n t ) { w h i l e ( c n t ) ; } m a i n ( ) { T M O D| = 0 x 0 1 ; / / 定时器设置 1 0 m si n1 2 Mc r y s t a l 定时器 0 ,工作方式 1 ,1 6 位定时器 T H 0 = 0 x d 8 ; / / 6 5 5 3 5 1 0 0 0 0 = 5 5 5 3 5 = D 8 F 0 (十六进制) T L 0 = 0 x f 0 ; I E =0 x 8 2 ;/ / 中断控制,E A = 1 开总中断,E T 0 = 1 :定时器 0 中断允许 T R 0 = 1 ; / / 开定时器 0 中断 P 1 = 0 x f c ; / / 红灯亮,根据红黄绿接灯的顺序。 r e d= 1 ; w h i l e ( 1 ) { P 0 = D i s _ S h i w e i ; / / 显示十位,这里实现用 8 位数码管,即左 1 位 P 2 = 0 ; d e l a y ( 3 0 0 ) ; / / 短暂延时 P 0 = D i s _ G e w e i ;/ / 显示个位,左数,2 位 P 2 = 1 ;
单片机80C51 交通灯程序

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_DONGXI = P1^0;//南北方向红灯亮sbit YELLOW_DONGXI = P1^1;//南北方向黄灯亮sbit RED_NANBEI = P1^3;//东西方向红灯亮sbit GREEN_DONGXI = P1^2;//南北方向绿灯亮sbit YELLOW_NANBEI = P1^4;//东西方向黄灯亮sbit GREEN_NANBEI = P1^5;//东西方向绿灯亮sbit DXweixuan1 = P1^6;//南北方向数码管位选1sbit DXweixuan2 = P1^7;//南北方向数码管位选2sbit NBweixuan1 = P3^0;//东西方向数码管位选1sbit NBweixuan2 = P3^1;//东西方向数码管位选2sbit L1=P3^5; sbit L2=P3^6;sbit L3=P3^7;uintaa, bai,shi,ge,bb;uint shi1,ge1,shi2,ge2;uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uint code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uint z);voidinit(uint a);void display(uint shi1,uint ge1,uint shi2,uint ge2);void xtimer0();void init1();void init2();void init3();void init4();void init5();void xint1();void xint0();void LED_ON();void LED_OFF();void main(){P0=0xFF;P1=0xFF;P2=0x00;P3=0xFF;EA=1;EX0=1;IT0=0;init1();while(1){init2();//第2个状态init3(); //第3个状态init4(); //第4个状态init5();//第5个状态}}void init1()//第一个状态:东西、南北方向均亮红灯5S{uint temp;temp=5;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0; //第一个状态东西、南北均亮红灯5SRED_NANBEI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;YELLOW_DONGXI=1;YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;}shi1=shi2=temp/10;ge1=ge2=temp%10;if(temp==0){temp=5;break;}display(ge1,shi1,ge2,shi2);}}void init2()//第二个状态:东西亮红灯30S~5S、南北亮绿灯25~0S; {uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=1;RED_NANBEI=0;GREEN_DONGXI=0;GREEN_NANBEI=1;YELLOW_DONGXI=1;//第二个状态:东西亮绿灯25S、南北亮红灯YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;shi1=(temp+5)/10;ge1=(temp+5)%10;shi2=temp/10;ge2=temp%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}voidinit3() //第三个状态:东西绿灯变为黄灯闪5次、南北亮红灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=0;GREEN_DONGXI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;YELLOW_DONGXI=~YELLOW_DONGXI;shi1=temp/10;shi2=shi1;ge1=temp%10;ge2=ge1;}if(temp==0){temp=6;break;}display(ge1,shi1,ge2,shi2);}}voidinit4()//第四个状态:东西亮绿灯25~0S,南北方向亮红灯30~5S;{uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0;RED_NANBEI=1;YELLOW_DONGXI=1;//第一个状态东西、南北均亮红灯5S GREEN_NANBEI=0;if(aa==20){aa=0;temp--;shi1=temp/10;shi2=(temp+5)/10;ge1=temp%10;ge2=(temp+5)%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}voidinit5()//第五个状态:东西亮红灯、南北绿灯闪5次转亮黄灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=1;RED_DONGXI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;if(aa==20){aa=0;temp--;YELLOW_NANBEI=~YELLOW_NANBEI;shi1=temp/10;shi2=shi2;ge1=temp%10;ge2=ge1;if(temp==0){temp=6;break;}}display(ge1,shi1,ge2,shi2);}}display(uint shi1,uint ge1,uint shi2,uint ge2) {DXweixuan1=0;DXweixuan2=1;NBweixuan1=1;NBweixuan2=1;P0=table[ge1];delay(5);DXweixuan1=1;DXweixuan2=0;NBweixuan1=1;NBweixuan2=1;P0=table[shi1];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=0;NBweixuan2=1;P0=table[ge2];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=1;NBweixuan2=0;P0=table[shi2];delay(5);}voidxint0() interrupt 0{RED_NANBEI=0;RED_DONGXI=0;GREEN_NANBEI=1;GREEN_DONGXI=1;YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);returnvoidxint1() interrupt 2{RED_NANBEI=1;RED_DONGXI=1; GREEN_NANBEI=0; GREEN_DONGXI=0; YELLOW_NANBEI=1; YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0; NBweixuan2=0; DXweixuan1=0; DXweixuan2=0;delay(2);return;}voidxtimer0() interrupt 1 {TH0=(65535-50000)/256; TL0=(65535-50000)%256; aa++;}voiddelay(uint z){uintx,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}。
51单片机用C语言实现交通灯

51单片机用C语言实现交通灯51 单片机用C 语言实现交通灯(红绿灯)源程序交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。
源程序如下:#include bit red,green,yellow,turnred; //定义红、黄、绿及转红标志code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0- 9unsigned char Dis_Shiwei;//定义十位unsigned char Dis_Gewei; //定义个位void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{while(--cnt);}main() {TMOD |=0x01;//定时器设置10ms in 12M crystal 定时器0,工作方式1,16 位定时器TH0=0xd8; //65535-10000=55535=D8F0(十六进制)TL0=0xf0;IE= 0x82; //中断控制,EA=1 开总中断,ET0=1:定时器0 中断允许TR0=1; //开定时器0中断P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。
red =1;while(1) {P0=Dis_Shiwei;//显示十位,这里实现用8 位数码管,即左1 位P2=0;delay(300); //短暂延时P0=Dis_Gewei; //显示个位,左数,2 位P2=1;delay(300);}}void tim(void) interrupt 1 using 1{static unsigned char second=60,count; //初值60TH0=0xd8;//重新赋值,10 毫秒定时TL0=0xf0;count++;if (count==100) {count=0;second--;//秒减1if(second==0){ //这里添加定时到0 的代码,可以是灯电路,继电器吸合等,或者执行一个程序if(red) //红灭,先转黄{red=0;yellow=1;second=4;P1=0xF3;//黄灯亮4 秒,黄灯为过渡灯,再根据情况转绿或转红}else if(yellow && !turnred){yellow=0;green=1;second=25;P1=0xCF;// 绿灯亮25 秒,}else if(green){yellow=1;green=0;second=4;P1=0xF3;//黄灯亮4 秒turnred=1;}else if(yellow && turnred) //绿灯灭,转黄灯,后红灯,turnred=1 时{red=1;yellow=0;P1=0xFC;//红灯亮60 秒second=60;turnred=0; //接下来是转黄,绿。
51单片机的交通灯设计(可用)

基于51单片机的交通灯设计2.AT89C51单片机最小实现电路及配套发光二极管电路。
3.设计要求1.编程要求:主程序利用 C 语言编写。
2.实现功能:使用AT89C51单片机控制 4个方向的交通灯(红﹑黄﹑绿)并用数码管显示其时间。
3. 实验现象:状态一:主干道、支干道均亮红灯5秒;状态二:主干道亮绿灯30秒、支干道亮红灯;状态三:主干道绿灯闪3次转亮黄灯、支干道亮红灯3秒;状态四:主干道亮红灯、支干道亮绿灯25秒;状态五:主干道亮红灯、支干道绿灯闪3次转亮黄灯3秒;返回到第二个状态。
4.设计相关知识4.1 硬件设计1. AT89C51简介:AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器。
它是一种带2K字节闪存可编程可擦除只读存储器的单片机。
AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2. 2位8段数码管工作原理:2位8段数码管电路采用“共阴”连接,阴极公共端(COM)由晶体管推动。
如图4-3所示:段码和位码,段码即段选信号 SEG,它负责数码管显示的内容,图中 a~g、dp组成的数据(a 为最低位,dp 为最高位)就是段码。
位码即位选信号 DIG,它决定哪个数码管工作,哪个数码管不工作。
当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。
4.2 软件应用1. Proteus7.5简介:Proteus软件不仅具有EDA工具软件的仿真功能,还能仿真单片机及外围器件Proteus从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。
在编译方面,它支持IAR、Keil和MPLAB等多种编译器。