交通灯 C语言程序

合集下载

红绿灯C语言程序

红绿灯C语言程序

红绿灯C语言程序(P0口接数码管,平口接发光二极管)#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar i=0,c=0,s=1;//m_flag=1;////////////////////////////////////////void dxlv1_nbh1(void) //{P1=0x5a;}void dx0_nbh1(void) //{P1=0x0a;}void dxh1_nbl1(void) //{P1=0xa5;}void dxh1_nb0(void) //{P1=0xa0;}void nbs(void) // 南北灯闪{if(m_flag==1){dxh1_nb0();}else {dxh1_nbl1();}}void dxs(void){ // 东西灯闪if(m_flag==1){dx0_nbh1();}else {dxlv1_nbh1();}}//////主程序//////////////////void main(){TMOD=0x01;//定时器0工作在方式1TH0=-5000/256;//50msTL0=-5000%256;//20msIE=0x82;///允许定时器0中断TR0=1;///启动定时器0while(1){//0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6fif(s==10){P0=0x3f;} // 东西绿灯亮,南北红灯亮倒计时开始if(s==9)P0=0x06;if(s==8)P0=0x5b;if(s==7)P0=0x4f;if(s==6)P0=0x66;if(s==5)P0=0x6d;if(s==4)P0=0x7d;if(s==3)P0=0x07;if(s==2)P0=0x7f;if(s==1){P0=0x6f;P1=0x5a;}if(s>9&&s<13){dxs();} //10秒结束南北红灯继续,东西绿灯一秒一闪闪三次if(s==13){dxh1_nbl1(); P0=0x6f; }//东西红灯亮,南北绿灯亮倒计时开始if(s==22){P0=0x3f;}if(s==21)P0=0x06;if(s==20)P0=0x5b;if(s==19)P0=0x4f;if(s==18)P0=0x66;if(s==17)P0=0x6d;if(s==16)P0=0x7d;if(s==15)P0=0x07;if(s==14)P0=0x7f;if(s>21&&s<25){nbs();} //10秒结束东西向红灯亮继续,南北绿灯一秒一闪三次if(s==25){s=1; }// s归位}}/////T0中断子程序////////////void T0_INT()interrupt 1{TH0=-50000/256;//50msTL0=-50000%256;if(c==10)m_flag=0;c++;if(c==20)//50ms*20=1s{m_flag=1;c=0;s++;//s清零}}。

基于AT89C52单片机的交通灯C语言程序

基于AT89C52单片机的交通灯C语言程序

_nop_(); _nop_(); delay(1); _nop_(); _nop_(); _nop_(); delay(1); } void shu5() { d0=0; d1=0;
d2=0; delay(1); d0=0; d1=1; d2=0; delay(1); d0=1; d1=1; d2=0; delay(1); d0=1; d1=0; d2=1;
d2=0; delay(1); d0=1; d1=0; d2=0; delay(1); d0=0; d1=1; d2=0; delay(1); d0=1; d1=1;
d2=0; delay(1); d0=0; d1=1; d2=1; delay(1); _nop_(); _nop_(); _nop_(); delay(1); _nop_(); _nop_(); _nop_();
基于 AT89C52 单片机的交通灯 C 语言程序
如图,简易交通灯 。 有四个状态 0,1,2,3 数码管为 2 位 7 段共阳数码管,可以通过修改 i,j 的值进而修改倒计时的长 短。 不当地方,敬请批评指正! 图一:十字路口交通灯 图二:状态 0 绿灯:0x42 红灯:0xbd
_nop_(); delay(1); _nop_(); _nop_(); _nop_(); delay(1); _nop_(); _nop_(); _nop_(); delay(1); _nop_(); _nop_();
_nop_(); delay(1); } void shu2() { d0=0; d1=0; d2=0; delay(1); d0=1; d1=0; d2=0; delay(1);
图三:状态 1 绿灯:0x25 红灯:0xda 图四:状态 2 绿灯:0x90 红灯:0x6f 图五:状态 3 绿灯:0x2c 红灯:0xd3

C语言实训——交通灯程序

C语言实训——交通灯程序
MOV TL1,#0B0H
DJNZ R3,LP1
RET
END
C语言编程如下:
#include <REG51.H>
unsigned char t0,t1;//定义全局变量,用来保存延时时间循环次数
//函数名:delay0_5s1
//函数功能:用T1的方式1编制0.5秒延时程序,假定系统采用12MHz晶振,定
22pF
2
电阻
300
12
发光二极管
12
跟我做3——制作电路板
采用万能板焊接电路元器件,制作电路板。
跟我做4——编写交通灯控制程序
程序设计的思路为:由主程序负责向P1口发送交通灯显示数据,
用寄存器R2存放调用0.5s延时子程序的次数,只要修改调用次数就可获得不同的延时时间。延时子程序采用定时器T1,工作方式1实现50ms定时,用寄存器R3存放循环次数,循环10次便可获得0.5s的延时。主程序流程图如图1.8.3所示。
DJNZ R2,YEL1
MOV P1,#0KEH
MOV R2,#32H
DISP2: ACALL DELAY_500MS
DJNZ R2,DISP2
MOV R2,#06H
WARN2: CPL P1.0
ACALL DELAY_500MS
DJNZ R2,WARN2
MOV P1,#0DDH
MOV R2,#04H
i=P1;//保护现场,暂存P1口、t0、t1、TH1、TH0
j=t0;
k=t1;
l=TH1;
m=TH0;
EA=1;//开中断
P1=0xf3;// A道放行
delay_t1(10);//延时5秒
EA=0;//关中断

交通信号灯C语言源程序

交通信号灯C语言源程序
{
disp_ew = set_value[1];
EW_LED_GREEN=1;
EW_LED_YELLOW =0;
sign[1]=1;
sign[0]=0;
}
if(disp_ew == 0 && sign[1] ==1)
{
disp_ew = set_value[2] + set_value[3];
disp_sn = set_value[2];
disp_ew = set_value[0];
P1 = 0xf3;
falsh_sign = 0;
ET1 = 1;
TR1 = 1;
}
}
void scan_key()
{
while(P3^0 && P3^2 && P3^3);
delay_ms(15);
if(!P3^0)
{
set_process();
}
if(!P3^2)
if(set_value[2] < 0)
{
set_value[2] = set_value[2] + 100;
}
disp_sn = set_value[2];
}
if(key == 4)
{
set_value[3]--;
if(set_value[3] < 0)
{
set_value[3] = 9;
}
disp_sn = set_value[3];
}
delay_ms(1200);
}
}ቤተ መጻሕፍቲ ባይዱ
else
{
while(!P3^3);
if(key == 1)

基于80C51单片机的交通灯C语言源程序

基于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南北通行,倒计时黑屏暂停;断开继续以前动作。

交通灯C程序

交通灯C程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit led1=P2^0;sbit led2=P2^1;uchar gc10ms,gcCount10ms,Sec;void disp(uchar nsecondsleft);delay(uchar t){uchar i=0;for(i=0;i<142;i++);}void main(void){uchar flicker=0;IE=0x82;TMOD=0x01;TL0=0x78;TH0=0xec;TR0=1;while(1){/********状态1******/Sec=10; //倒计时30SP3=0x7e; //东西绿灯亮,南北红灯亮while(Sec>0); //3S倒计时结束标志/*******状态2*****/P3=0xbe; // 东西黄灯亮,南北红灯闪烁Sec=5; //倒计时5Swhile(Sec>0); //5S倒计时结束标志for(flicker=0;flicker<5;flicker++){gcCount10ms=0;while(gcCount10ms<50);// WR=~WR;RXD=~RXD; //红灯闪烁}/*******状态3*******/P3=0xcf; //东西红灯亮,南北绿灯亮Sec=20; //倒计时20Swhile(Sec>0); //20S倒计时结束标志/********状态4******/P3=0xdd; //东西红灯闪烁,南北黄灯亮Sec=5; //倒计时5Swhile(Sec>0); //5S倒计时结束标志for(flicker=0;flicker<5;flicker++){gcCount10ms=0;while(gcCount10ms<50);// TXD=~TXD;T1=~T1; //红灯闪烁}}}void Timer_0(void) interrupt 1 using 1{uchar uctemp;TL0=0x78;TH0=0xec;if(INT0!=0){gcCount10ms++;gc10ms++;if(gc10ms>=100){gc10ms=0;Sec--;}disp(Sec);return;}TR0=0; //紧急按键按下uctemp=P3;P3=0xde;while(INT1==1){disp(88);}P3=uctemp;TR0=1;}void disp(uchar nsecondsleft){const uchar asegcodetable[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x88 //共阳数码管编码// 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 //共阴数码管};uint i=0;P1=asegcodetable[nsecondsleft/10];led1=1;delay();led1=0;P1=asegcodetable[nsecondsleft%10];led2=1;delay();led2=0;}。

交通灯C程序及PROTUES仿真

交通灯C程序及PROTUES仿真

交通灯C程序及PROTUES仿真#include<reg51.h>//头文件#include<intrins.h>//头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义sbit RED_ZHU = P0^0;sbit YELLOW_ZHU = P0^2;sbit GREEN_ZHU = P0^1;sbit RED_ZHI = P0^3;sbit YELLOW_ZHI = P0^5;sbit GREEN_ZHI = P0^4;uint aa, bai,shi,ge,bb; //定义变量/*数码管显示0-9*/uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /*子函数声明*/void delay(uint z);void delay0(uint z);//void init(uint a);void display(uint ge,uint shi);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=0X00;P1=0x00;P2=0x00;EA=1;//打开外部中断EX1=1;//允许外部中断1中断IT1=0;//INT0为沿触发方式init1();while(1){init2();//第2个状态init3(); //第3个状态init4(); //第4个状态init5();//第5个状态}}void init1()//第一个状态:主干道、支干道均亮红灯5S{uint temp;temp=6;//变量赋初值TMOD=0x01;//定时器0工作于方式1TH0=0x4c;TL0=0x00;//定时器赋初值EA=1;//开外部中断ET0=1;//开定时中断TR0=1;//开定时器0while(1){RED_ZHU=1; //第一个状态主干道、支干道均亮红灯5SRED_ZHI=0;GREEN_ZHU=1;GREEN_ZHI=1;YELLOW_ZHI=1;if(aa==20)//定时20*50MS=1S{aa=0;//定时完成一次后清0temp--;//变量自增YELLOW_ZHU=~YELLOW_ZHU;//delay(10);if(temp>250)//定时100mS{temp=6;//变量清0break;}shi=temp%100/10;//显示十位ge=temp%10;//显示个位}display(ge,shi);}}void init2()//第二个状态:主干道亮绿灯30S、支干道亮红灯{uint temp;temp=26;//变量赋初值TMOD=0x01;//定时器0工作于方式1TH0=0x4c;TL0=0x00;//定时器赋初值EA=1;//开外部中断ET0=1;//开定时中断TR0=1;//开定时器0while(1){RED_ZHU=1;RED_ZHI=0;GREEN_ZHU=0;GREEN_ZHI=1;YELLOW_ZHU=1;//第二个状态:主干道亮绿灯30S、支干道亮红灯YELLOW_ZHI=1;if(aa==20)//定时20*50MS=1S{aa=0;//定时完成一次后清0temp--;//变量自增if(temp==5)//定时100S{temp=30;//变量清0break;}shi=temp%100/10;//显示十位ge=temp%10;//显示个位}display(ge,shi);}}void init3() //第三个状态:{uint temp;temp=6;//变量赋初值TMOD=0x01;//定时器0工作于方式1TH0=0x4c;TL0=0x00;//定时器赋初值EA=1;//开外部中断ET0=1;//开定时中断TR0=1;//开定时器0while(1){RED_ZHI=0;GREEN_ZHU=1;if(aa==20)//定时20*50MS=1S{aa=0;//定时完成一次后清0temp--;//变量自增YELLOW_ZHU=~YELLOW_ZHU;if(temp>200)//定时100S{temp=6;//变量清0break;}shi=temp%100/10;//显示十位ge=temp%10;//显示个位}display(ge,shi);;}}void init4()//第四个状态:主干道亮红灯、支干道亮绿灯25S {uint temp;temp=26;//变量赋初值TMOD=0x01;//定时器0工作于方式1TH0=0x4c;TL0=0x00;//定时器赋初值EA=1;//开外部中断ET0=1;//开定时中断TR0=1;//开定时器0while(1){RED_ZHU=0;RED_ZHI=1;YELLOW_ZHU=1;YELLOW_ZHI=1;GREEN_ZHU=1;GREEN_ZHI=0;if(aa==20)//定时20*50MS=1S{aa=0;//定时完成一次后清0temp--;//变量自增if(temp==5)//定时100S{temp=25;//变量清0break;}shi=temp%100/10;//显示十位ge=temp%10;//显示个位}display(ge,shi);}}void init5()//第五个状态:{uint temp;temp=6;//变量赋初值TMOD=0x01;//定时器0工作于方式1TH0=0x4c;TL0=0x00;//定时器赋初值EA=1;//开外部中断ET0=1;//开定时中断TR0=1;//开定时器0while(1){RED_ZHI=1;RED_ZHU=0;GREEN_ZHU=1;GREEN_ZHI=1;if(aa==20)//定时20*50MS=1S{aa=0;//定时完成一次后清0temp--;//变量自增YELLOW_ZHI=~YELLOW_ZHI;if(temp>250)//定时100S{temp=6;//变量清0break;}shi=temp%100/10;//显示十位ge=temp%10;//显示个位}display(ge,shi);}}/*显示子函数*/void display(uint ge,uint shi){P2=0x02;P1=table[shi];//显示十位delay0(5);P2=0x01;P1=table[ge];//显示个位delay0(5);}void xint0() interrupt 2 //外部中断1,这里用2是INT1的优先级为0 {LED_ON();}void LED_ON()//外部中断0显示子程序{RED_ZHI=0;RED_ZHU=0;GREEN_ZHI=1;GREEN_ZHU=1;YELLOW_ZHI=1;YELLOW_ZHU=1;delay0(1000);return ;}/*定时中断子函数*/void xtimer0() interrupt 1{TH0=0x4c;TL0=0x00;aa++;}/*延时子函数*/void delay0(uint z){uint i,j;for(i=0;i<z;i++)for(j=0;j<110;j++);}/******** 500ms延时函数晶振:12MHz *******/void delay( uint j){uint k;uint i;while(j){i=1250; while(i){k=180;while(k){k--;};i--;}j--;}}。

单片机-交通灯程序(C语言)

单片机-交通灯程序(C语言)

/****************************************************************************** ** 实验名: 动态显示数码管实验* 使用的IO :* 实验效果: 数码管显示76543210。

* 注意:当位选用P1口的时候注意可能会有一位不亮,那么调整J21******************************************************************************* /#include<reg51.h>//--定义使用的IO口--//#define GPIO_DIG P0#define GPIO_PLACE P1#define GPIO_TRAFFIC P2sbit RED10 = P2^0; //上人行道红灯sbit GREEN10 = P2^1; //上人行道绿灯sbit RED11 = P2^2;sbit YELLOW11= P2^3;sbit GREEN11 = P2^4;sbit RED00 = P3^0; //右人行道红灯sbit GREEN00 = P3^1; //右人行道绿灯sbit RED01 = P2^5;sbit YELLOW01= P2^6;sbit GREEN01 = P2^7;//--定义全局变量--//unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制unsigned char code DIG_CODE[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char DisplayData[8];//用来存放要显示的8位数的值unsigned char Time, Second; //用来存放定时时间//--声明全局函数--//void DigDisplay(); //动态显示函数void Timer0Cofig(void);/****************************************************************************** ** 函数名: main* 函数功能: 主函数* 输入: 无* 输出: 无******************************************************************************* /void main(void){Second = 1;Timer0Cofig();while(1){if(Second == 70){Second = 1;}//--宝田路通行,30秒--//if(Second < 31){DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10];DisplayData[3] = DIG_CODE[(30 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00;DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();//--宝田路通行--//GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭RED00 = 1;GREEN00 = 1;GREEN11 = 0; //宝田路绿灯亮GREEN10 = 0; //宝田路人行道绿灯亮RED01 = 0; //前进路红灯亮RED00 = 0; //前进路人行道红灯亮}//--黄灯等待切换状态,5秒--//else if(Second < 36){DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10];DisplayData[3] = DIG_CODE[(35 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00;DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();//--黄灯阶段--//GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭RED00 = 1;GREEN00 = 1;YELLOW11 = 0; //宝田路黄灯亮RED10 = 0; //宝田路人行道红灯亮YELLOW01 = 0; //前进路红灯亮RED00 = 0; //前进路人行道红灯亮}//--前进路通行--//else if(Second < 66){DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10];DisplayData[3] = DIG_CODE[(65 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00;DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();//--黄灯阶段--//GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭RED00 = 1;GREEN00 = 1;RED11 = 0; //宝田路红灯亮RED10 = 0; //宝田路人行道红灯亮GREEN01 = 0; //前进路绿灯亮GREEN00 = 0; //前进路人行道绿灯亮}//--黄灯等待切换状态,5秒--//else{DisplayData[0] = 0x00;DisplayData[1] = 0x00;DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];DisplayData[3] = DIG_CODE[(70 - Second) %10];DisplayData[4] = 0x00;DisplayData[5] = 0x00;DisplayData[6] = DisplayData[2];DisplayData[7] = DisplayData[3];DigDisplay();//--黄灯阶段--//GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭RED00 = 1;GREEN00 = 1;YELLOW11 = 0; //宝田路黄灯亮RED10 = 0; //宝田路人行道红灯亮YELLOW01 = 0; //前进路红灯亮RED00 = 0; //前进路人行道红灯亮}}}/****************************************************************************** ** 函数名: DigDisplay* 输入: 无* 输出: 无******************************************************************************* /void DigDisplay(){unsigned char i;unsigned int j;for(i=0; i<8; i++){GPIO_PLACE = DIG_PLACE[i]; //发送位选GPIO_DIG = DisplayData[i]; //发送段码j = 10; //扫描间隔时间设定while(j--);GPIO_DIG = 0x00; //消隐}}/****************************************************************************** ** 函数名: Timer0Cofig* 函数功能: 配置定时器* 输入: 无* 输出: 无******************************************************************************* /void Timer0Cofig(void){TMOD = 0x01; //定时器0选择工作方式1TH0 = 0x3C; //设置初始值,定时50MSTL0 = 0xB0;EA = 1; //打开总中断ET0 = 1; //打开定时器0中断TR0 = 1; //启动定时器0}/****************************************************************************** ** 函数名: Timer0* 输入: 无* 输出: 无******************************************************************************* /void Timer0() interrupt 1{TH0 = 0x3C; //设置初始值TL0 = 0xB0;Time++;if(Time == 20){Second ++;Time = 0;}}。

交通灯C语言程序

交通灯C语言程序

#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 countt0;//定时器0中断次数//定义5组开关sbit k4=P3^7; //切换方向sbit k1=P3^5; //时间加sbit k2=P3^6; //时间减sbit k3=P3^4; //确认sbit k5=P3^1; //禁止// P3^2 //只允许东西方向通行,中断0// P3^3 //只允许南北方向通行,中断1sbit Red_nb=P2^6; //南北红灯标志sbit Yellow_nb=P2^5; //南北黄灯标志sbit Green_nb=P2^4; //南北绿灯标志sbit Red_dx=P2^3; //东西红灯标志sbit Yellow_dx=P2^2; //东西黄灯标志sbit Green_dx=P2^1; //东西绿灯标志sbit Buzz=P3^0;bit Buzzer_Indicate;bit set=0; //调时方向切换键标志=1时,南北,=0时,东西bit dx_nb=0; //东西南北控制位bit shanruo=0;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=0X11; //定时器设置TH0=0X3C; //定时器0置初值0.05STL0=0XB0;EA=1; //开总中断ET0=1; //定时器0中断开启TR0=1; //启动定时0EX0=1; //开外部中断0EX1=1; //开外部中断1logo();P2=0Xc3; // 开始默认状态,东西绿灯,南北黄灯sec_nb=sec_dx+5; //默认南北通行时间比东西多5秒while(1){key(); //调用按键扫描程序display(); //调用显示程序Buzzer();}}//函数的定义部分void key(void) //按键扫描子程序{if(k1!=1) //当K1(时间加)按下时{display(); //调用显示,用于延时消抖if(k1!=1){TR0=0; //关定时器shanruo=0;P2=0x00;if(set==0)set_timedx++; //南北加1Selseset_timenb++; //东西加1Sif(set_timenb==100)set_timenb=1;if( set_timedx==100)set_timedx=1; //加到100置1sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx; //do{display();}while(k1!=1);}}if(k2!=1) //当K2(时间减)按键按下时{display(); //调用显示,用于延时消抖if(k2!=1){TR0=0; //关定时器shanruo=0;P2=0x00;if(set==0)set_timedx--; //南北减1Selseset_timenb--; //东西减1Sif(set_timenb==0)set_timenb=99;if( set_timedx==0 )set_timedx=99; //减到1重置99sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;do{display(); //调用显示,用于延时}while(k2!=1);}}if(k3!=1) //当K3(确认)键按下时{display(); //调用显示,用于延时消抖if(k3!=1){TR0=1; //启动定时器Buzzer_Indicate=0;sec_nb=set_timenb; //从中断回复,仍显示设置过的数值sec_dx=set_timedx; //显示设置过的时间if(set==0) //时间倒时到0时{P2=0X00; //东西绿灯,南北红灯Green_dx=1;Red_nb=1;sec_nb=sec_dx+5; //回到初值}else{P2=0x00; //南北绿灯,东西红灯Green_nb=1;Red_dx=1;sec_dx=sec_nb+5;}}}if(k4!=1) //当K4(切换)键按下{display(); //调用显示,用于延时消抖if(k4!=1){TR0=0;set=!set; //取反set标志位,以切换调节方向dx_nb=set;do{display();}while(k4!=1);}}if(k5!=1) //当K5(禁止)键按下时{display(); //调用显示,用于延时消抖if(k5!=1){TR0=0; //关定时器P2=0x00;Red_dx=1;Red_nb=1; //全部置红灯sec_dx=00; //四个方向的时间都为00sec_nb=00;Buzzer_Indicate=1;do{display();}while(k5!=1);}}}void display(void) //显示子程序{buf[1]=sec_nb/10; //第1位东西秒十位buf[2]=sec_nb%10; //第2位东西秒个位buf[3]=sec_dx/10; //第3位南北秒十位buf[0]=sec_dx%10; //第4位南北秒个位P1=0xff; // 初始灯为灭的P0=0x00;P1=0xfe; //片选LED1P0=table[buf[1]]; //送东西时间十位的数码管编码delay(1); //延时P1=0xff; //关显示P0=0x00;P1=0xfd; //片选LED2P0=table[buf[2]];delay(1);P1=0xff;P0=0x00;P1=0Xfb; //片选LED3P0=table[buf[3]];delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=table[buf[0]]; //片选LED4delay(1);}void time0(void) interrupt 1 using 1 //定时中断子程序{TH0=0X3C; //重赋初值TL0=0XB0;TR0=1; //重新启动定时器countt0++; //软件计数加1if(countt0==10){if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1)) //东西黄灯闪{Green_dx=0;Yellow_dx=0;}if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1)) //南北黄灯闪{Green_nb=0;Yellow_nb=0;}}if(countt0==20) // 定时器中断次数=20时(即1秒时){ countt0=0; //清零计数器sec_dx--; //东西时间减1sec_nb--; //南北时间减1if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1)) //东西黄灯闪{Green_dx=0;Yellow_dx=1;}if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1)) //南北黄灯闪{Green_nb=0;Yellow_nb=1;}if(sec_dx==0&&sec_nb==5) //当东西倒计时到0时,重置5秒,用于黄灯闪烁时间{sec_dx=5;shanruo=1;}if(sec_nb==0&&sec_dx==5) //当南北倒计时到0时,重置5秒,用于黄灯闪烁时间{sec_nb=5;shanruo=1;}if(dx_nb==0&&sec_nb==0) //当黄灯闪烁时间倒计时到0时,{P2=0x00; //重置东西南背方向的红绿灯Green_nb=1;Red_dx=1;dx_nb=!dx_nb;shanruo=0;sec_nb=set_timenb; //重赋南北方向的起始值sec_dx=set_timenb+5; //重赋东西方向的起始值}if(dx_nb==1&&sec_dx==0) //当黄灯闪烁时间到{P2=0X00; //重置东西南北的红绿灯状态Green_dx=1;Red_nb=1;dx_nb=!dx_nb;shanruo=0;sec_dx=set_timedx; //重赋东西方向的起始值sec_nb=set_timedx+5; //重赋南北方向的起始值}}}//外部中断0void int0(void) interrupt 0 using 1 //只允许东西通行{TR0=0; //关定时器P2=0x00;Green_dx=1; //东西方向置绿灯Red_nb=1; //南北方向为红灯Buzzer_Indicate=0;sec_dx=00; //四个方向的时间都为00sec_nb=00;}//外部中断1void int1(void) interrupt 2 using 1 //只允许南北通行{TR0=0; //关定时器P2=0x00;Green_nb=1; //置南北方向为绿灯Red_dx=1; //东西方向为红灯Buzzer_Indicate=0;sec_nb=00; //四个方向的时间都为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=1;}void delay(int ms) //延时子程序{uint j,k;for(j=0;j<ms;j++) //延时msfor(k=0;k<124;k++); //大约1毫秒的延时}。

基于51单片机的交通灯C语言程序

基于51单片机的交通灯C语言程序
p120p140南北绿东西红elseiftime19南北绿熄灭南北黄闪烁p121
基于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]];

交通灯C实现--AT89S51单片机--红黄绿灯

交通灯C实现--AT89S51单片机--红黄绿灯

交通灯C语言实现单片机:AT89C51#include<reg52.h>#define uchar unsigned char#define ON 1#define OFF 0sbit NSG=P2^5; //南北绿灯sbit NSY=P2^4; //南北黄灯sbit NSR=P2^3; //南北红灯sbit EWG=P2^2; //东西绿灯sbit EWY=P2^1; //东西黄灯sbit EWR=P2^0; //东西红灯sbit LED_D=P3^7; //南北数码管sbit LED_C=P3^6;sbit LED_B=P3^1; //东西数码管sbit LED_A=P3^0;/*===============倒计时=========================*/uchar EWF=15,NSF=12,X=15,Y=27,Z=30,SHU=30;uchar count;void InitialT1(void){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;}//中断void ISRT1(void) interrupt 1{TMOD=0x01;TH0=(65536-50000)/256; //重装初值TL0=(65536-50000)%256;EA=1;TR0=1;ET0=1;count++;if(count>19) //定时到了1秒{EWF--;NSF--;X--;Y--;Z--;SHU--;count=0;}}/*=================延时=======================*/void Delay10uS(uchar second){uchar x,y;for(x=second;x>0;x--)for(y=110;y>0;y--);}/*==================led控制========================*/ uchar discode[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void display1(uchar num1,uchar num2) //东西方向{P0=discode[num1]; LED_A=ON; Delay10uS(1); LED_A=OFF;P0=discode[num2]; LED_B=ON; Delay10uS(1); LED_B=OFF;}void display2(uchar num3,uchar num4) //南北方向{P0=discode[num3]; LED_C=ON; Delay10uS(1); LED_C=OFF;P0=discode[num4]; LED_D=ON; Delay10uS(1); LED_D=OFF;}main(){int i;/*=============初始状态:东西南北都红灯==================*/ NSR=ON; //南北红灯开NSY=OFF;NSG=OFF;EWR=ON; //东西红灯开EWY=OFF;EWG=OFF;for(i=0;i<500;i++) //~=1s{Delay10uS(20);}NSR=OFF; //南北红灯关EWR=OFF; //东西红灯关while(1){InitialT1(); // 初始化计时器/*=============状态1:东西绿灯(12s) 南北红灯(15s)==================*/ /*=============状态2:东西黄灯(3s) 南北红灯(15s)=================*/ EWG=ON; //东西绿灯开NSR=ON; //南北红灯开while(EWF!=0){display2(EWF/10,EWF%10);// 南北红灯(15s)display1(NSF/10,NSF%10);// 东西绿灯(12s)while(EWF==3){while(X!=0){display2(EWF/10,EWF%10);// 南北红灯(3s)display1(X/10,X%10);// 东西黄灯(3s)EWG=OFF; // 东西绿灯关EWY=ON; //东西黄灯开}}}NSR=OFF; //南北红灯关EWG=OFF; //东西绿灯关EWY=OFF; //东西黄灯关/*=============状态3:东西红灯(15s) 南北绿灯(12s)==================*/ /*=============状态4:东西红灯(15s) 南北黄灯(3s)==================*/ EWR=ON; //东西红灯开NSG=ON; //南北绿灯开while(Z!=0){display1(Z/10,Z%10);// 东西红灯(15s)display2(Y/10,Y%10);// 南北绿灯(12s)while(Z==3){while(SHU!=0){display2(Z/10,Z%10);// 东西红灯(3s)display1(SHU/10,SHU%10);// 南北绿灯(3s)NSG=OFF; //南北绿灯关NSY=ON; //南北黄灯开}}}EWR=OFF; //东西红灯关NSG=OFF; //南北绿灯关NSY=OFF; //南北黄灯关/*=====================重新赋值===============================*/EWF=15,NSF=12,X=15,Y=27,Z=30,SHU=30;}}。

基于单片机的交通灯设计c语言程序

基于单片机的交通灯设计c语言程序

基于单片机的交通灯设计c语言程序交通信号灯是城市交通中非常常见的设施之一,起到了引导和控制车辆、行人通行的重要作用。

基于单片机的交通信号灯设计是一个非常典型的实际应用案例,通过编写C语言程序,可以实现对交通信号灯状态的控制和调节。

首先,我们需要了解交通信号灯的基本原理和工作流程。

一般而言,交通信号灯包括红灯、黄灯和绿灯三种状态,分别对应停止、准备和通行的指示。

交通信号灯会按照一定的时间间隔,循环地在这三个状态之间切换,以控制车辆和行人的通行。

在基于单片机的交通信号灯设计中,我们可以借助定时器和IO口来实现状态的切换和指示灯的亮灭。

下面是一个简单的C语言程序示例:```c#include <reg52.h>sbit red = P1^0; //红灯控制引脚sbit yellow = P1^1; //黄灯控制引脚sbit green = P1^2; //绿灯控制引脚void delay(unsigned int xms) //延时函数{unsigned int i, j;for(i=xms; i>0; i--){for(j=110; j>0; j--);}}void main(){while(1){red = 1; //红灯亮yellow = 0; //黄灯灭green = 0; //绿灯灭delay(3000); //延时3秒red = 0; //红灯灭yellow = 1; //黄灯亮green = 0; //绿灯灭delay(2000); //延时2秒red = 0; //红灯灭yellow = 0; //黄灯灭green = 1; //绿灯亮delay(5000); //延时5秒}}```上述程序通过P1口的不同引脚控制红灯、黄灯和绿灯的亮灭。

通过循环的方式,定时器每隔一段时间就切换交通信号灯的状态,从而实现交通信号灯的正常工作。

这只是一个简单的交通信号灯设计示例,实际的交通信号灯设计还可能涉及到更多的状态和控制逻辑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

十字路口交通灯C语言控制程序
LSX编写 2011年5月长沙
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tamp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar
num,num1,n1,n2,e1,e2,s1,s2,w1,w2,x,x1,y,y1,a,a1,a2,b,b1,b2; void init(uchar n1,uchar n2,uchar e1,uchar e2,uchar s1,uchar s2,uchar w1,uchar w2);
void deley(uint z);
void zhixing();
void zhixing1();
void traffic();
void max();
sbit green=P2^3;
sbit yellow=P2^4;
sbit red=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
LSX编写 2011年5月长沙//主函数//
void main()
{
P1=0x00;
deley(1);//延时消影//
yellow=1;
P0=0x00;
yellow=0;
deley(1);//延时消影//
red=1;
P1=0xfd;
red=0;
deley(1);//延时消影//
green=1;
P1=0x02;
green=0;
deley(1);//延时消影//
x=25;
y=45;
a=60;
b=120;
x1=60;
a1=85;
b1=105;
y1=120;
a2=25;
b2=45;
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256;
while(1)
{
init(n1,n2,e1,e2,s1,s2,w1,w2);
}
}
LSX编写 2011年5月长沙
//单片机各个端口的控制,及函数体//
void init(uchar n1,uchar n2,uchar e1,uchar e2,uchar s1,uchar s2,uchar w1,uchar w2)
{
/*【北边两位数码管】*/
//北边十位数码管//
wela=1;
P0=0xfe;//开D1数码管//
wela=0;
//P0=0xff;
dula=1;
P0=tamp[n1];
dula=0;
deley(5);//延时消影//
wela=1;
P0=0xfd;//开D2数码管//
wela=0;
//P0=0xff;
dula=1;
P0=tamp[n2];
dula=0;
deley(5);//延时消影//
/*【东边两位数码管】*/
//东边十位数码管//
wela=1;
P0=0xfb;
wela=0;
//P0=0xff;
dula=1;
P0=tamp[e1];
dula=0;
deley(5);//延时消影//
wela=1;
P0=0xf7;
wela=0;
//P0=0xff;
dula=1;
P0=tamp[e2];
dula=0;
deley(5);//延时消影//
/*【南边两位数码管】*/
//南边十位数码管//
wela=1;
P0=0xef;//开D5数码管//
wela=0;
//P0=0xff;
dula=1;
P0=tamp[s1];
dula=0;
deley(5);//延时消影// //南边个位数码管//
wela=1;
P0=0xdf;//开D6数码管//
wela=0;
//P0=0xff;
dula=1;
P0=tamp[s2];
dula=0;
deley(5);//延时消影//
/*【西边两位数码管】*/
//西边十位数码管//
wela=1;
P0=0xbf;
wela=0;
//P0=0xff;
dula=1;
P0=tamp[w1];
dula=0;
deley(5);//延时消影//
//西边个位数码管//
wela=1;
P0=0x7f;
wela=0;
//P0=0xff;
dula=1;
P0=tamp[w2];
dula=0;
deley(5);//延时消影//
}
LSX编写 2011年5月长沙//延时函数//
void deley(uint z)
{
int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
//中断服务程序//
void ZHONGDUN() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
max();
}
LSX编写 2011年5月长沙//中断调用函数//
void max()
{
if(num==20)
{
num=0;//把秒钟调0
zhixing();/*(执行函数)*/
zhixing1();/*(执行函数1)*/
/*分离常数*/
/*(北边)*/
n1=x/10;
n2=x%10;
/*(南边)*/
s1=x/10;
s2=x%10;
/*(东边)*/
e1=x1/10;
e2=x1%10;
/*(西边)*/
w1=x1/10;
w2=x1%10;
}
}
LSX编写 2011年5月长沙
/*执行函数*/
void zhixing()
{
x--;
y--;
a--;
b--;
if(x==-1) //执行20秒倒计时条件{
x=20;
x--;
red=1;
P1=0x39;
red=0;
deley(1);//延时消影//
green=1;
P1=0x06;
green=0;
deley(1);//延时消影//
}
if(y==-1) //执行15秒倒计时条件{
x=15;
x--;
red=1;
P1=0x3a;
red=0;
deley(1);//延时消影//
green=1;
P1=0x05;
green=0;
deley(1);//延时消影//
}
if(a==-1) //执行60秒倒计时条件{
x=60;
x--;
}
if(b==-1) //各个参数复原
{
x=24;
y=44;
a=59;
b=119;
}
}
LSX编写 2011年5月长沙/*执行函数1*/
void zhixing1()
{
x1--;
a1--;
b1--;
y1--;
if(x1==-1) //执行25秒倒计时条件{
x1=25;
x1--;
red=1;
P1=0x2f;
red=0;
deley(1);//延时消影//
green=1;
P1=0x10;
green=0;
deley(1);//延时消影//
}
if(a1==-1) //执行20秒倒计时条件{
x1=20;
x1--;
red=1;
P1=0x0f;
red=0;
deley(1);//延时消影//
green=1;
P1=0x30;
green=0;
deley(1);//延时消影//
}
if(b1==-1) //执行15秒倒计时条件{
x1=15;
x1--;
red=1;
P1=0x17;
red=0;
deley(1);//延时消影//
green=1;
P1=0x28;
green=0;
deley(1);//延时消影// }
if(y1==-1) //各个参数复原{
x1=59;
a1=84;
b1=104;
y1=119;
red=1;
P1=0x3d;
red=0;
deley(1);//延时消影//
green=1;
P1=0x02;
green=0;
deley(1);//延时消影// }
}。

相关文档
最新文档