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等多种编译器。
基于51单片机控制交通灯的程序设计
基于51单片机控制交通灯的程序设计#include<reg51.h>unsigned char code dis_7[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x89,0x8c,0x00,0xff};//共阳数码管段码unsigned char data disbuf[6]={0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区:时分秒使用unsigned char data count_timedx[]={2,10,5,10,25}; //东西方向倒计时时间unsigned char data count_timenb[]={2,25,10,5,10}; //南北方向倒计时时间unsigned char data Hour=14,Minite=06,Second=0,Halfsec=0; //定义时钟位unsigned char xdata *ledaddr=0x2000; //锁存器选通地址unsigned char data Ms=0,Lightcode=0,Light_step,Led_step,Light_num;unsigned int dataFault_dx=0,Fault_nb=0,Fault_total=0,Countdx=0,Countnb=0;sbit p10=P1^0; //第0位数码管位控制端sbit p11=P1^1; //第1位数码管位控制端sbit p12=P1^2; //第2位数码管位控制端sbit p13=P1^3; //第3位数码管位控制端sbit p14=P1^4; //第4位数码管位控制端sbit p15=P1^5; //第5位数码管位控制端sbit p16=P1^6; //发光二极管选通sbit p17=P1^7; //按键选通sbit p33=P3^3; //k1键用于切换四种功能/******************************************************************* **********//****************************1毫秒延时函数*******************************/ void delay1ms(int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}/******************************************************************* ********//*************************键盘扫描函数****************************************/ unsigned char getkey(void) {unsigned char Yiwei;unsigned char test=0x00,tim;*ledaddr=test;if(p17==0 && tim==0) //判断是否有按键按下{p17=1;tim=1;test=0xfe;delay1ms(5);for(Yiwei=0;Yiwei<8;Yiwei++) //处理按键{*ledaddr=test;if(p17==0)break;else test=(test<<1)+1;}return Yiwei;}else if(p17==0){}else {tim=0;}}/******************************************************************* **********//************************六位LED数码管显示***********************************/void displed(unsigned int hour_shi,unsigned int hour_ge,unsigned int min_shi,unsigned intmin_ge,unsigned int sec_shi,unsigned int sec_ge){*ledaddr=dis_7[hour_shi]; //时的十位显示p10=0;delay1ms(1);p10=1;*ledaddr=dis_7[hour_ge]; //时的个位显示p11=0;delay1ms(1);p11=1;*ledaddr=dis_7[min_shi]; //分的十位显示p12=0;delay1ms(1);p12=1;*ledaddr=dis_7[min_ge]; //分的个位显示p13=0;delay1ms(1);p13=1;*ledaddr=dis_7[sec_shi]; //秒的十位显示p14=0;delay1ms(1);p14=1;*ledaddr=dis_7[sec_ge]; //秒的个位显示p15=0;delay1ms(1);p15=1;}/******************************************************************* **********//******************************发光二极管显示函数*****************************/void displight(unsigned int state){if(state==0) //状态0:各方向红灯全亮{Lightcode=0xbb;}else if(state==1) //状态1:东西绿灯亮,南北红灯亮{Lightcode=0xbe;}else if(state==2) //状态2:东西黄灯闪烁,南北红灯亮{Lightcode=0xbd;}else if(state==3) //状态3:东西红灯亮,左行亮,南北红灯亮{Lightcode=0xb3;}else if(state==4) //状态4:东西红灯亮,南北直行绿灯亮{Lightcode=0xeb;}else if(state==5) //状态5:东西红灯亮,南北黄灯闪烁{Lightcode=0xdb;}else if(state==6) //状态6:东西红灯亮,南北红灯亮,左行亮{Lightcode=0x3b;}//黄灯闪烁if((Halfsec%2)==0){if(state==2)Lightcode=0xbf; //东西闪烁if(state==5)Lightcode=0xfb; //南北闪烁}*ledaddr=Lightcode; //送交通灯显示状态p16=0;delay1ms(1);p16=1;}/******************************************************************* *********//****************************违章车辆统计函数********************************/void weizhang(void) // 红灯亮的时候是否有车通过,KL1键显示东西,KL2键显示南北 {unsigned char key1;key1=getkey(); //获得键值if((key1==0)&&(Light_step>=4)&&(Light_step<=6)) //KL1键显示南北方向违章车辆,且只在南北方向为红灯时加1{Fault_dx++;if(Fault_dx==99) //最大计数99辆{Fault_dx=0;}}else if((key1==2)&&(Light_step>=1)&&(Light_step<=3)) //KL3键显示东西方向违章车辆,且只在东西方向为红灯时加1{Fault_nb++;if(Fault_nb==99) //最大计数99辆{Fault_nb=0;}}}/******************************************************************* ********//****************************数字钟函数***********************************/void shuzizhong(void) //数字钟:KL3键调节秒,KL4键调节分,KL5键调节时 {unsigned char data key2;key2=getkey(); //获得键值if(key2==2) //调节秒,按一次KL3,则加一秒{Second++;if(Second==60)Second=0;}if(key2==3) //调节分,按一次KL4,则加一分{Minite++;if(Minite==60)Minite=0;}if(key2==4) //调节时,按一次KL5,则加一时{Hour++;if(Hour==24)Hour=0;}disbuf[0]=Second%10; //时钟显示,送缓冲区disbuf[1]=Second/10;disbuf[2]=Minite%10;disbuf[3]=Minite/10;disbuf[4]=Hour%10;disbuf[5]=Hour/10;}/******************************************************************* **********//**************修改倒计时间函数*********************************************/void change_time(void) //注意:只修改绿灯、黄灯或左行灯时间,红灯时间自动求出 {unsigned int data key3=0;key3=getkey();if(key3==4) //KL5键选择要修改东西向倒计时{Light_num++;if(Light_num>4) Light_num=0;}if(key3==5) //KL2键用于修改东西方向倒计时,加1 {count_timedx[Light_num]++;if(count_timedx[Light_num]>=99)count_timedx[Light_num]=99;}if(key3==1)//KL6键用于修改东西方向倒计时,减1 {count_timedx[Light_num]--;if(count_timedx[Light_num]<1)count_timedx[Light_num]=1;}if(key3==6) //KL7键用于修改南北方向倒计时,加1 {count_timenb[Light_num]++;if(count_timenb[Light_num]>=99)count_timenb[Light_num]=99;}if(key3==2)//KL3键用于修改南北方向倒计时,减1 {count_timenb[Light_num]--;if(count_timenb[Light_num]<1)count_timenb[Light_num]=1;}count_timedx[4]=count_timenb[2]+count_timenb[3]+count_timenb[4]; //调整,求各方向红灯时间count_timenb[1]=count_timedx[1]+count_timedx[2]+count_timedx[3]; //红灯时间=绿灯+黄灯+左行灯}/******************************************************************* *********//************************定时器/计数器t0中断函数******************************/void time_intt0(void) interrupt 1 {TH0=0x4c; //赋初值定时50msTL0=0x00;Ms++;if(Ms>9){Ms=0;Halfsec++; //计时半秒if(Halfsec==2){Halfsec=0;Second++; //计时一秒Countdx--; //东西、南北倒计时减一Countnb--;}if(Second==60){Second=0;Minite++;//计时一分}if(Minite==60){Minite=0;Hour++; //计时一小时}if(Hour==24)Hour=0;}if((Countdx==0)||(Countnb==0)) //转换交通灯显示状态{Light_step++;if(Light_step>6){Light_step=1;}if(Countnb==0)Countnb=count_timenb[Light_step];//东西为红灯,南北绿、黄、左切换if(Countdx==0)Countdx=count_timedx[Light_step];//南北为红灯,东西绿、黄、左切换}}/******************************************************************* **********//****************外部中断1服务函数********************************************/void int_1(void) interrupt 2 //数码管显示状态切换 {EX1=0; //关中断if(Led_step<4){Led_step++;}if(Led_step==4){Led_step=0;}EX1=1;//开中断}/************串行口中断服务函数*********************************************/void ser_put(void) interrupt 4 //上位机发出字符'c',则清违章记录,若发出'g',则上传违章记录{if(RI==1) //接收到上位机发出的字符{RI=0;ACC=SBUF; //取字符if(ACC=='c') //清违章记录{Fault_dx=0;Fault_nb=0;}else if(ACC=='g')//上传违章记录{Fault_total=Fault_dx+Fault_nb;SBUF=Fault_total;}}if(TI==1) //发送中断TI=0;}/******************************************************************* **********//***************8051初始化函数************************************************/void Istr(void) {/*定时器初始化*/TMOD=0x21;//定时器1工作于方式2,做波特率发生器;定时器0工作于方式1,做定时器TH1=0xfa; //产生9.6kbit/s波特率TL1=0xfa;TH0=0x4c; //50msTL0=0x00;/*串行通信初始化*/SCON=0x50;PCON=0X80|PCON;/*启动定时器,开中断*/ET1=0; //禁止定时器1中断ET0=1;TR1=1;TR0=1;IT1=1; //设置外部中断为边沿触发EX1=1;ES=1;EA=1;}/************************主函数***********************************************/ void main(void) {Istr(); //调用初始化函数Led_step=0;Light_step=0;Light_num=0;Countdx=count_timedx[0];Countnb=count_timenb[0];SBUF='s';while(1){if(Led_step==0) //显示倒计时{displed(20,(Countdx/10),(Countdx%10),20,(Countnb/10),(Countnb%10));}if(Led_step==1) //显示时钟{shuzizhong(); //调用数字钟函数displed(disbuf[5],disbuf[4],disbuf[3],disbuf[2],disbuf[1],disbuf[0]);}if(Led_step==2) //修改倒计时数{change_time(); //调用修改倒计时时间函数displed(Light_num,count_timedx[Light_num]/10,count_timedx[Light_num]%10,Light_num,count_timenb[Light_num]/10,count_timenb[Light_num]%10);}if(Led_step==3) //显示并统计违章数{weizhang(); //调用违章记录函数displed(15,Fault_dx/10,Fault_dx%10,15,Fault_nb/10,Fault_nb%10);}displight(Light_step);//显示交通灯}}/*********over*******over************over*********over*********over* ******over***/。
基于80C51单片机的交通灯C语言源程序
#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SH_CP=P2^0;sbit DS=P2^1;sbit ST_CP=P2^2;uchar temp;uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void NB_tong();void DX_tong();void NBY_show();void DXY_show();sbit RED_A=P1^0;//A代表NB南北sbit YELLOW_A=P1^1;sbit GREEN_A=P1^2;sbit RED_B=P1^3;//B代表DX东西sbit YELLOW_B=P1^4;sbit GREEN_B=P1^5;sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^3;sbit SPK=P3^7;//蜂鸣器uchar time=0,Count=0;//--------------------------------//延时//--------------------------------void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//---------------------------------------//74HC595的驱动//---------------------------------------void In_595(){uchar i;for(i=0;i<8;i++){temp<<=1;DS=CY;SH_CP=1;_nop_();_nop_();SH_CP=0;}void Out_595(){ST_CP=0;_nop_();ST_CP=1;_nop_();ST_CP=0;}//---------------------------------------//T0定时器定时及各种情况下灯亮的调用//---------------------------------------void Timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;Count++;time=time%60;if(Count==20){time++;Count=0;}if(time<=30) NB_tong();if((time>30)&&(time<=35)) NBY_show();if((time>35)&&(time<=55)) DX_tong();if((time>55)&&(time<=60)) DXY_show();}//------------------------------------//按键处理//------------------------------------void EX_INT0() interrupt 0{if(K1==0) //K1按下强制NB南北通行,倒计时黑屏暂停;断开继续以前动作。
基于51单片机交通灯程序完整版
#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intbit Flag_SN_Yellow; //SN黄灯标志位bit Flag_EW_Yellow;//EW黄灯标志位uchar Time_EW;//东西方向倒计时单元uchar Time_SN;//南北方向倒计时单元uchar EW=15,SN=10,EWL=19,SNL=19; //程序初始化赋值,正常模式uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量ucharFlag_Moden=1; //模式变量1正常模式 2 禁止南北通东西 3 禁止东西通南北 4 禁止东西南北5 夜间模式ucharFlag_key=0;uchar codetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码sbit HC164_Data =P0^0;sbit HC164_Clk =P0^1;sbitEW_green =P0^2;sbitEW_yellow =P0^3;sbitEW_red =P0^4;sbitSN_red =P0^5;sbitSN_green =P0^7;sbitSN_yellow =P0^6;sbitSN_RXD_red =P2^7;sbitSN_RXD_green =P2^6;sbitEW_RXD_red =P2^5;sbitEW_RXD_green =P2^4;sbit FMQ = P1^0;sbit key1 = P3^3;sbit key2 = P3^4;sbit key3 = P3^5;sbit WEI1 =P2^3; // 东西数码管第一位sbit WEI2 =P2^2; // 东西数码管第二位sbit WEI3 =P2^1; // 南北数码管第一位sbit WEI4 =P2^0; // 南北数码管第二位//ucharew=40;sn=35;//函数 delay(uchar z)//功能能延时void Delay(uchar z){uchara,b;for(a=z;a>0;a--)for(b=200;b>0;b--);}void HC_164_Set_byte(ucharduan) {uchar i;for(i=0;i<8;i++){HC164_Data =duan& 0x80;HC164_Clk =0;HC164_Clk =1;duan =duan<<1;}}void display_smg(ucharwei,ucharnum){switch(wei){case 1:WEI1=0;WEI2=1;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break; case 2: WEI1=1;WEI2=0;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break; case 3: WEI1=1;WEI2=1;WEI3=0;WEI4=1;HC_164_Set_byte(table[num]);break; case 4: WEI1=1;WEI2=1;WEI3=1;WEI4=0;HC_164_Set_byte(table[num]);break; default: break;}}void Display(void){ucharh,l;h=Time_EW/10;l=Time_EW;display_smg(1,h);Delay(8);display_smg(2,l); Delay(8);h=Time_SN/10;l=Time_SN; display_smg(3,h); Delay(8);display_smg(4,l); Delay(8);}void Key(){if(key1==0){ Delay(10);if(key1==0){ while(!key1); Flag_key++;if(Flag_key==1) {Flag_Moden=2;}if(Flag_key==2) {Flag_Moden=3;}if(Flag_key==3) {Flag_Moden=4;}if(Flag_key==4) {Flag_Moden=5;FMQ=1;TR0=1;}if(Flag_key==5) {Flag_EW_Yellow=0; //SN关黄灯信号位 Flag_SN_Yellow=0; //SN关黄灯信号位 FMQ=1;Flag_Moden=1;TR0=1;//启动定时Flag_key=0;}}}if(key2==0){while(!key2);Flag_Moden=2;}if(key3==0){while(!key3);Flag_Moden=3;}}void timer0(void)interrupt 1 using 1 {static uchar count;TH0=(65536-50000)/256;TL0=(65536-50000)%6;count++;if(count==10){if(Flag_SN_Yellow==1) //测试南北黄灯标志位{SN_yellow=~SN_yellow;}if(Flag_EW_Yellow==1) //测试东西黄灯标志位{EW_yellow=~EW_yellow;}}if(count==20){if(Flag_Moden==1){Time_EW--;Time_SN--;}if(Flag_SN_Yellow==1)//测试南北黄灯标志位{SN_yellow=~SN_yellow;}if(Flag_EW_Yellow==1)//测试东西黄灯标志位{EW_yellow=~EW_yellow;}count=0;}}//模式1void Zc_moshi(){//*******S0状态**********EW_RXD_red=0; //EW人行道禁止EW_RXD_green=1;//EW人行道禁止SN_RXD_red=1; //EW人行道通行SN_RXD_green=0;//SN人行道通行Flag_EW_Yellow=0; //EW关黄灯显示信号 Flag_SN_Yellow=0; //SN关黄灯显示信号Time_EW=EW; //EW=45;SN=40;Time_SN=SN;SN_green =0; //SN通行,EW红灯SN_red =1;EW_red =0;EW_green =1;while(Time_EW>5){if(key1==0 || key2==0||key3==0){//Flag_Moden=1;TR0=0;//启动定时break;}Display();}SN_yellow=0; //SN黄灯亮开始闪烁5秒 SN_green =1; //灭//*******S1状态**********Time_SN=5;while(Time_EW<=5){if(key1==0 || key2==0||key3==0){//Flag_Moden=1;TR0=0;//启动定时break;}Flag_SN_Yellow=1; //SN开黄灯信号位 Display();}//*******S2状态**********Flag_SN_Yellow=0; //SN关黄灯显示信号 SN_yellow=1; EW_RXD_red=1; //EW人行道通行SN_RXD_green=1;//SN人行道禁止EW_RXD_green=0; //EW人行道通行SN_RXD_red=0;//SN人行道禁止Time_EW=SN; //EW=45;SN=40;Time_SN=EW;SN_green=1;//南北绿灯禁止东西通行 SN_red=0; //亮EW_red=1;EW_green=0; //亮while(Time_SN>5){if(key1==0 || key2==0||key3==0){//Flag_Moden=1;TR0=0;//启动定时break;}Display();}//*******S3状态**********EW_green=1;EW_yellow=0;Time_EW=5;while(Time_SN<=5){if(key1==0 || key2==0||key3==0){TR0=0;//启动定时break;}Flag_EW_Yellow=1; //SN开黄灯信号位 Display(); }Flag_EW_Yellow=0;EW_yellow=1;}////模式2 禁止南北通东西蜂鸣器响void Jsn() {EW_green =0;EW_yellow =1;EW_red =1;SN_red =0;SN_green =1;SN_yellow =1;SN_RXD_red =0;SN_RXD_green =1;EW_RXD_red =1;EW_RXD_green =0;FMQ =~ FMQ;Delay(10);WEI1=1;WEI2=1;WEI3=1;WEI4=1;}////模式3 禁止东西通南北蜂鸣器响void Jew() {EW_green =1;EW_yellow =1;EW_red =0;SN_red =1;SN_green =0;SN_yellow =1;SN_RXD_red =1;SN_RXD_green =0;EW_RXD_red =0;EW_RXD_green =1;FMQ =~ FMQ;Delay(10);WEI1=1;WEI2=1;WEI3=1;WEI4=1; }//模式4 禁止东西南北蜂鸣器响void JEwSn(){EW_green =1;EW_yellow =1;EW_red =0;SN_red =0;SN_green =1;SN_yellow =1;SN_RXD_red =0;SN_RXD_green =1;EW_RXD_red =0;EW_RXD_green =1;FMQ =~ FMQ;Delay(10);WEI1=1;WEI2=1;WEI3=1;WEI4=1;}//模式5 夜间模式,东西南北黄灯闪烁void Yejian() {EW_green =1;//EW_yellow =1;EW_red =1;SN_red =1;SN_green =1;//SN_yellow =1;SN_RXD_red =1;SN_RXD_green =1;EW_RXD_red =1;EW_RXD_green =1;Flag_EW_Yellow=1; //SN开黄灯信号位 Flag_SN_Yellow=1; //SN开黄灯信号位}void main (){P1=0xff;P2=0xff ;P3=0xff;P0=0xff;EW_green =1;EW_yellow =1;EW_red =1;SN_red =1;SN_green =1;SN_yellow =1;SN_RXD_red =1;SN_RXD_green =1;EW_RXD_red =1;EW_RXD_green =1;WEI1=1;WEI2=1;WEI3=1;WEI4=1;IT0=1; //INT0负跳变触发TMOD=0x01;//定时器工作于方式1TH0=(65536-50000)/256;//定时器赋初值 TL0=(65536-50000)%6; EA=1; //CPU开中断总允许ET0=1;//开定时中断// EX0=1;//开外部INTO中断TR0=1;//启动定时while(1){switch(Flag_Moden) {case 1:Zc_moshi(); break; case 2:Jsn(); break;case 3: Jew();break;case 4: JEwSn();break; case 5: Yejian();break; default :break;}Key(); }}。
C51交通灯程序设计
C51期末课程设计大作业课程名称:交通灯程序设计学院:信息技术学院系别:计算机应用系专业:计算机应用技术班级: Z090X组序号:第二组组员X X学号 XXXXXXXX一、功能要求 (1)二、方案论证 (1)三、硬件解读 (2)四、流程图 (5)五、软件设计 (8)六、设计总结 (15)一、功能要求(一)设计所要完成的功能如下:1、信号灯受一个起动开关控制,当起动开关接通时,信号系统开始工作,且先南北红灯亮,东西绿灯亮。
当起动开关断开时,所有信号灯都熄灭。
2、南北红灯亮维持25S。
在南北红灯亮的同时东西绿灯也亮,并维持20S。
到20S时,东西绿灯闪烁,闪烁3S后熄灭。
在东西绿灯熄灭时,东西黄灯亮,并维持2S。
到2S时,东西黄灯熄,东西红灯亮。
同时,南北红灯熄灭,南北绿灯亮。
东西红灯亮维持30S。
南北绿灯亮维持25S。
然后闪烁3S,熄灭。
同时南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮3、要有倒计时数码显示。
(二)设计要求:1、功能要求2、方案论证3、系统硬件电路设计(给出键盘电路、LED显示电路)4、系统程序设计(要求给出流程图和程序清单)二、方案论证(一)方案的选择和论证根据题目要求,系统可以划分为几个基本模块:1、时钟模块2、时钟设置模块3、显示译码模块4、复位电路对各模块的实现,分别有以下一些不同的设计方案:(1) 标准时基模块方案一:采用直接从晶振分频得到12MHz信号。
该方案比较容易实现,但精确度不高,很难达到题目精确度的要求。
方案二:采用单片机C51经过延时程序产生12MHz时基信号。
在单片机程序设计中通过延时程序的循环产生所需要的12MHz的时基信号,该方案精确度比较高,而且也易于程序调整,电路结构简单,系统资源占用较小。
基于上述理论分析,拟订方案二。
(2)时钟控制模块方案一:采用单片机对键盘扫描和读取来控制不同时间值。
通过单片机对键盘的引脚不停的扫描,读入某时刻按下的键,通过单片机内部查表程序译出按键所对应的值从而使时间的值发生改变。
C51交通灯程序设计
引言概述:
正文内容:
一、设计目的
1.1.实现交通灯的循环变化控制
1.2.提高交通流畅性和效率
1.3.确保交通安全性和顺畅进行
二、设计原理
2.1.使用C51单片机来进行交通灯的控制
2.2.通过输入和输出控制来实现交通灯的变化
2.3.利用定时器来控制交通灯的时间间隔
2.4.使用状态机来管理不同交通灯状态的切换
三、实现步骤
3.1.设计交通路口的几个不同方向的交通流线
3.2.根据交通流量和优先级确定交通灯的时间间隔
3.3.编写C语言程序,在C51单片机上实现交通灯控制3.
4.进行硬件连接和测试,确保程序正常运行
3.5.进行调试和优化,使交通灯控制更加精准和稳定
四、注意事项
4.1.注意交通流量的变化和应对策略的调整
4.2.确保交通灯程序适应不同交通流量和交通情况的变化4.3.防止信号错误和故障导致交通混乱或事故发生
4.4.遵守相关交通规则和法规,确保交通安全
总结:。
基于51单片机的交通灯C语言程序
基于51单片机的交通灯C语言程序
/*南北:P1-0红,P1-1黄,P1-2绿,
东西:P1-4红,P1-5黄,P1-6绿,*/
#include"REG51.H"
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
TR0=1;
EA=1;ET0=1;
while (1)
{
if(time>24)
P1=0xeb; //P1--2=0,P1_4=0,南北绿东西红
else if(time>19)
{ //南北绿熄灭,南北黄闪烁
P1_2=1;
P1_1=~P1_1; }
//P1=0xed;
else if(time>4 )
P1=0xbe; //P1--0=0,P1_6=0,南北红东西绿
else
{
P1_6=1; //东西绿熄灭,东西黄闪烁
P1_5=~P1_5;
}
if(time>=25)
display((time-20)+(time-25)*100);
else if(time>=20)
display((time-20)*101);
else if(time>=5)
display(time*100+(time-5));
zt=zt/10;
a[1]=zt%10;
zt=zt/10;
a[0]=zt%10;
lie=0x01;
for ( i=0;i<4;i++)
{
P3=~lie;
P2=chr[a[i]];
C51单片机的交通灯控制系统.
基于C51单片机的交通灯控制系统1、实验方案论证:进行十字路口的交通信号灯控制电路设计,画出电路原理图及实验电路图,进行软件编程、以及使用说明文档的建立等一整套工作任务。
进行十字路口的交通信号灯控制程序设计,提交一个符合上述功能要求的十字路口的交通信号灯控制系统设计。
2、控制流程分析:对设计要求进行分析后可得出以下交通工作状态表:3、硬件设计概要:根据设计要求,可用6个LED灯分别模拟东西、南北的交通灯。
具体接法如下:AT89C51的P1口接LED灯,P1.0、P1.1、P1.2分别接东西方向红、绿、黄交通灯,P1.3、P1.4、P1.5分别接南北方向的红、绿、黄交通灯。
P1口和LED 灯之间要接限流保护电阻。
两位数码管段选接P2口,位选接P0口低两位,P0口低两位接上拉电阻使其可以输出高电平。
紧急情况按钮一端接地,另一端与外中断1引脚相连;恢复正常按钮一端接地,另一端与外中断0引脚相连。
三、原理图设计1、LED显示部分电路设计:把单片机AT89C51的P1口作为红黄绿灯显示部分,用6个LED灯分别模拟东西、南北的交通灯。
P1.0、P1.1、P1.2各通过一个300Ω的限流保护电阻接东西方向的红、绿、黄LED灯;P1.3、P1.4、P1.5各通过一个300Ω的限流保护电阻接南北方向的红、绿、黄LED灯。
LED灯的一端接电源,另一端经电阻接P1口,因此当P1口引脚输出低电平时LED灯发光,即此方案采取低电平驱动方式。
具体电路如下:2、紧急情况处理电路设计:紧急情况按钮一端接地,另一端与外中断1引脚相连;恢复正常按钮一端接地,另一端与外中断0引脚相连。
在程序设计时,我会将其设置为下降沿触发方式。
具体电路如下:3、数字显示电路设计:选用共阴极两位数码管。
两位数码管A~G引脚各通过一个300Ω的限流保护电阻分别接P2.0~P2.6,位选1引脚和2引脚分别接P0.0口低两位,P0口低两位接5kΩ的上拉电阻使其可以输出高电平。
51单片机交通灯程序带车流量
#include <reg52.h> //52系列单片机头文件#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit key1=P3^0; //按键口定义sbit key2=P3^1;sbit key3=P3^4; //蜂鸣器口定义sbit key4=P3^5;sbit key5=P3^6;sbit Beer=P3^7;sbit DX_Red=P1^5; //红绿灯DX口定义sbit DX_Yellow=P1^4;sbit DX_Green=P1^3;sbit NB_Red=P1^2; //红绿灯NB口定义sbit NB_Yellow=P1^1;sbit NB_Green=P1^0;sbit NB_Blue=P1^6;sbit DX_Blue=P1^7;//sbit NB_JS=P3^5;//sbit DX_JS=P3^6;uchar code table[]={ //共阳极段码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delayms(uint xms);int DX_Num=23,NB_Num=10; //数码管显示数字int numt0; //定时器计时int JS_NB_Num,JS_DX_Num;int NB_Num_GREEN,DX_Num_GREEN;int XZ=0; //按键2选择int BJ=0; //按键1选择int JS=0; //按键5选择int Temp1=1; //中断是否int temp=1 ; //数码管是否循环//int flag=0;int DX_Flag=0,NB_Flag=1; //红绿灯状态int DX_RED=33,DX_GREEN=15,DX_YELLOW=3; //红绿灯时间int NB_RED=38,NB_GREEN=10,NB_YELLOW=3;int NB_BLUE=10,DX_BLUE=10; //左转时间void display(uchar num1dis,uchar num2dis);void keyscan();void init() //中断红绿灯初始化函数{Beer=1; //蜂鸣器关断TMOD=0x01; //中断程序初始化TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;// EX1=1;//开外部中断1// IT1=1;//外部中断下降沿触发// EX0=1;//开外部中断0// IT0=1;//外部中断下降沿触发DX_Red=0; //红绿灯初始化DX_Yellow=1;DX_Green=1;NB_Red=1;NB_Yellow=1;NB_Green=0;}void main() //主函数{init();while(1){keyscan();if(temp==1){display(NB_Num,DX_Num);}}}void display(uchar num1dis,uchar num2dis) //数码管显示函数{int NB_Shi,NB_Ge,DX_Shi,DX_Ge;NB_Shi=num1dis/10;NB_Ge=num1dis%10;DX_Shi=num2dis/10;DX_Ge=num2dis%10;P0=table[NB_Shi]; //送十位段选数据P2=0xfe;delayms(3);P0=table[NB_Ge]; //送十位段选数据P2=0xfd;delayms(3);P0=table[DX_Shi]; //送十位段选数据P2=0xfb;delayms(3);P0=table[DX_Ge]; //送十位段选数据P2=0xf7;delayms(3);}void keyscan() //按键扫描函数{if(key1==0){delayms(10);if(key1==0){if(BJ==0){BJ=1;Beer=0;Temp1=2;temp=2;NB_Blue=1;DX_Blue=1;DX_Yellow=1;DX_Green=1;DX_Red=0;NB_Yellow=1;NB_Green=1;NB_Red=0;while(!key1);}else if(BJ==1){Beer=1;BJ=0;NB_Red=1;NB_Green=0;NB_Blue=1;DX_Blue=1;DX_Num=DX_RED-10;NB_Num=NB_GREEN;NB_Flag=1;DX_Flag=0;temp=1;Temp1=1;while(!key1);}}}if(key2==0){delayms(10);if(key2==0){if(XZ==0){XZ=1;EA=0;DX_Yellow=1;DX_Green=1;DX_Red=0;NB_Yellow=1;NB_Green=0;NB_Red=1;NB_Blue=1;DX_Blue=1;DX_Num=DX_RED;NB_Num=NB_GREEN;while(!key2);}else if(XZ==1){DX_Green=0;DX_Red=1;NB_Green=1;NB_Red=0;XZ=2;DX_Num=DX_GREEN;NB_Num=NB_RED;while(!key2);}else if(XZ==2){XZ=0;DX_Green=1;DX_Red=0;NB_Green=0;NB_Red=1;DX_Num=DX_RED-10;NB_Num=NB_GREEN;NB_Flag=1;DX_Flag=0;EA=1;ET0=1;TR0=1;while(!key2);}}}if(key3==0){delayms(10);if(key3==0){if(XZ==1){DX_Num++;DX_RED++;NB_Num++;NB_GREEN++;while(!key3);}else if(XZ==2){DX_Num++;DX_GREEN++;NB_Num++;NB_RED++;while(!key3);}}}if(key4==0){delayms(10);if(key4==0){if(XZ==1){DX_Num--;DX_RED--;NB_Num--;NB_GREEN--;while(!key4);}else if(XZ==2){DX_Num--;DX_GREEN--;NB_Num--;NB_RED--;while(!key4);}}}if(key5==0){delayms(10);if(key5==0){if(JS==0){JS=1;Temp1=2;DX_Yellow=1;DX_Green=1;DX_Red=0;NB_Yellow=1;NB_Green=1;NB_Blue=1;DX_Blue=1;NB_Red=0;DX_Num=0;NB_Num=0;EX1=1;//开外部中断1IT1=1;//外部中断下降沿触发EX0=1;//开外部中断0IT0=1;//外部中断下降沿触发while(!key5);}else if(JS==1){JS=0;// DX_Green=1;// DX_Red=0;NB_Green=0;NB_Red=1;if(NB_Num>5){if(DX_Num>5){NB_Num_GREEN=NB_GREEN;DX_Num_GREEN=DX_GREEN;JS_NB_Num=NB_Num;JS_DX_Num=DX_Num;NB_GREEN=JS_NB_Num*(NB_Num_GREEN+DX_Num_GREEN)/(JS_NB_Num+JS_D X_Num);DX_GREEN=NB_Num_GREEN+DX_Num_GREEN-NB_GREEN;NB_RED=NB_GREEN+23;DX_RED=DX_GREEN+23;}}EX1=0;//开外部中断1IT1=0;//外部中断下降沿触发EX0=0;//关外部中断0IT0=0;//关外部中断下降沿触发DX_Num=DX_RED-10;NB_Num=NB_GREEN;NB_Flag=1;DX_Flag=0;Temp1=1;temp=1;while(!key5);}}}}void delayms(uint xms) //延时函数{uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void T0_time()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;numt0++;if(BJ==1){P2=0xff;if(numt0>4){numt0=0;Beer=~Beer;}}if(Temp1==1){if(numt0>20){numt0=0;NB_Num--;DX_Num--;if(NB_Num<1){if(NB_Flag==1){NB_Flag=2;NB_Num=NB_YELLOW;NB_Green=1;NB_Yellow=0;}else if(NB_Flag==2){NB_Flag=0;NB_Num=NB_RED;NB_Yellow=1;NB_Red=0;NB_Blue=0;}else if(NB_Flag==0){NB_Flag=1;NB_Num=NB_GREEN;NB_Red=1;NB_Green=0;DX_Blue=1;}}if(DX_Num<1){if(DX_Flag==0){DX_Flag=1;DX_Num=DX_GREEN;DX_Red=1;DX_Green=0;NB_Blue=1;}else if(DX_Flag==1){DX_Flag=2;DX_Num=DX_YELLOW;DX_Green=1;DX_Yellow=0;}else if(DX_Flag==2){DX_Flag=0;DX_Num=DX_RED;DX_Yellow=1;DX_Red=0;DX_Blue=0;}}}}}void T1EXT() interrupt 2 //使用了外部中断1的键盘扫描子函数{EX1 = 0;if(numt0>4){numt0=0;NB_Num++;}EX1 = 1;}void T0EXT() interrupt 0 //使用了外部中断1的键盘扫描子函数{EX0 = 0;if(JS==1){ if(numt0>4){numt0=0;DX_Num++;}}EX0 = 1;}。