交通灯控制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清零}}。
交通灯控制器课程设计报告 c语言

目录目录 (1)摘要 (4)关键词 (4)Abstract (4)Keywords (4)1、引言 (5)2、设计方案论证 (5)2.1主控芯片选择方案 (5)2.2电源模块选择方案 (5)2.3显示模块选择方案 (5)2.4数码管显示模块选择方案 (5)2.5键盘接口模块选择方案 (5)3、简介 (6)3.1调试软件keil (6)3.2硬件仿真Proteus (6)4、课题描述与分析 (6)4.1系统需求描述与分析 (6)4.2系统工作流程 (7)5、课题设计 (8)5.1总体设计 (8)5.2硬件设计 (10)5.2.1单片机最小系统 (10)5.2.2 电源模块电路模块 (10)5.2.3时钟和复位电路模块 (11)5.2.4数码管显示电路模块 (11)5.2.5 LED灯显示模块 (12)5.2.6键盘接口电路模块 (13)5.2.7串行通信接口电路 (14)5.3软件设计 (14)5.3.1整体流程图 (14)5.3.2主程序模块 (15)5.3.3数码管显示模块 (15)5.3.4键盘扫描程序模块 (16)5.3.5闪烁显示程序模块 (17)5.3.6按键处理程序模块 (18)5.3.7定时器0和定时器1中断模块 (18)6、系统测试 (19)6.1硬件调试 (19)6.1.1 电源模块调试 (19)6.1.2 单片机最小系统模块调试 (20)6.1.3 MAX232下载模块检测 (21)6.14 红绿灯显示检测 (21)6.1.5 数码管显示检测 (21)6.2整体电路测 (22)6.3软件调试 (22)7、结论 (22)参考文献 (23)附录 (24)谢辞 (43)摘要本文介绍了交通灯系统的设计。
本系统硬件部分基于STC12C5410AD单片机,由键盘接口模块,稳压电源模块,串行通信接口模块和数码管、交通灯显示接口模块组成。
本系统的软件部分基于KeilC51软件系统。
本系统利用单片机的定时器产生秒信号,控制十字路口的红绿黄灯交替点亮和熄灭,并且用4只数码管显示十字路口两个方向的剩余时间。
交通灯C语言AT89S52程序

共同学习,共同进步.-----------2009 的竹蜻蜓
sbit EWR=P1^0; //东西红灯
sbit P27=P2^7; sbit P26=P2^6; sbit P23=P2^3; sbit P22=P2^2; /*===============倒计时=========================*/ uchar N=15,Y=12,Z=15,M=27,G=30,U=30; uchar C50ms; uchar seg=1; void InitialT1(void) { ET1=0;TMOD=0x10; TH1=(65536-time)>>8; TL1=(65536-time)&0xff; TR1=1; ET1=1; EA=1; } void ISRT1(void) interrupt 3 { TR1=0; TH1=(65536-time)>>8; TL1=(65536-time)&0xff; TR1=1; C50ms++; if(C50ms>19) { N--; M--; Y--; Z--; G--; U--; C50ms=0; } } /*=================延时=======================*/ void Delay10uS(uchar second) {
共同学习,共同进步.-----------2009 的竹蜻蜓
} void ISRT1(void) interrupt 3//倒计时 { TR1=0; TH1=(65536-time)>>8; TL1=(65536-time)&0xff; TR1=1; C50ms++; if(C50ms>19) { N--; G--; EW--; NS--; C50ms=0; } } /*=================延时 10us=======================*/ void Delay10uS(uchar second) { int i; while((second--)!=0) { for(i=0;i<3;i++){;} } } /*==================时间显示控制========================*/ uchar discode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void displayNS(uchar num1,uchar num2) { P0=discode[num1]; P37=ON; Delay10uS(1); P37=OFF; //控制南北 led 显示 P0=discode[num2]; P36=ON; Delay10uS(1); P36=OFF; } void displayEW(uchar num3,uchar num4) { P0=discode[num3]; P35=ON; Delay10uS(1); P35=OFF; //控制东西 led 显示 P0=discode[num4]; P34=ON; Delay10uS(1); P34=OFF; } void main()
红绿灯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清零}}。
C语言实训——交通灯程序

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语言源程序

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)
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; //接下来是转黄,绿。
简易交通灯c语言程序

uchar duanma[10]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码unchar weima [4]={0x01,0x02,0x04,0x08}; //位码unchar nanbei [3]={40,35,4}; //南北方向三组倒记时对应红,绿,黄灯unchar dongxi [3]={35,4,40}; //东西方向三组倒计时对应绿,黄,红灯unchar nbdeng [3]={0x01,0x04,0x02}; //南北方向三组灯的状态红绿黄unchar dxdeng [3]={0x8x,0x40,0x20} //东西方向三组灯的状态绿黄红unchar jishu1,jishu2,dxjishu,nbjishu,dxmiao,nbmiao,nbmiao; //定义变量unchar xianshi [4]={0,0,0,0}; //显示缓存器void yanshi10ms (void) //延时10ms函数{Unchar i,j;for (i=20;i>0;i--)for (j=250;j.0;j--);}Void chushihua (void) //初始化函数{TMOD=0x01; //定时器T0方式1THO=(65536-10000)/256 //10ms 定时高八位初值TLO=(65536-10000)%256; //10ms 定时低八位初值EA=1;ETO=1;EXO=1;ITO=1TRO=1;//CPU,T0,INTO允许中断,外部中断下降沿触发,启动定时器}void main(void) //主函数{dxmiao=dongxi [0] //东西倒计时赋初值nbmiao=nanbei [0] //南北倒计时赋初值chushihua (); //调试初始化函数while (1); //无限循环,踏步}Void anjian (void) interrupt 0 //外部中断 INTO 中断服务函数{yanshi10ms (); //延时去抖动if (INTO==0); //二次判断{If ((dxmiao<=50) && (nbmiao<=50)); //东西,南北当前显示值不大于50 {dxmiao+=10; //东西显示值+10nbmiao+=10 //南北显示着+10}//******************************************************************* }}void daojishi (void) interrupt 1 //定时器T0中断服务函数{THO=(65536-10000)/256; //高八位初值重装TLO=(65536-10000)/256; //低八位初值重装xiaoshi[0]=duanma [nbmiao/10]; //分离南北方向秒的十位xiaoshi[1]=duanma [nbmiao%10]; //分离南北方向秒的个位xiaoshi[2]=duanma [nbmiao/10]; //分离东西方向秒的十位xiaoshi[3]=duanma [nbmiao/10]; //分离东西方向秒的个位//**********************动态扫描*********************************** jishu1 ++; //指向扫描的下一位if (jishu1==4) jishu1=0; //完成四位扫描后计数归0P0=weima [jishu1]; //送位码P1=xiaoshi [jishu1]; //送段码//********************控制灯的状态********************************* P2=dxdeng [dxjishu] | nbdeng [nbjishu]; //送灯的状态码//东西方向状态和南北方向状态组合输出//********************产生1秒记时及处理程序*********************** jishu2++; //10ms 计数if (jishu2==100) //计够100次为1秒{jishu2=0; //计够1秒后,计数归0dxmiao --; nbmiao --; //东西,南北秒各减1,实现倒计时if (dxmiao==0xff) //东西方向是否减到0{dxjishu ++ ; //是,指东西方向交通灯的下一个状态if (dxjishu==3) dxjishu==0; //完成三个状态后再重新开始dxmiao=dongxi [dxjishu]; //送东西方向数码显示的初值}if (nanbei==0xff) //南北方向是否减到0}nbjishu++; //是,指向南北方向交通灯的下一个状态if (nbjishu==3) nbjishu=0; //完成三个状态后再重新开始nbmiao==nanbei[nbjishu]; //送南北方向数码显示的初值 }}}。
51单片机控制交通灯原理图及C语言程序

Proteus仿真原理图:Keil C源程序:#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;uint aa, bai,shi,ge,bb;uint shi1,ge1,shi2,ge2;uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uint code table1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};void delay(uint z);void init(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);}}void init3() //第三个状态:东西绿灯变为黄灯闪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);}}void init4()//第四个状态:东西亮绿灯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;//第一个状态东西、南北均亮红灯5SGREEN_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);}}void init5()//第五个状态:东西亮红灯、南北绿灯闪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);}}void 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);}void xint0() 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);return ;}void xint1() 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 ;}void xtimer0() interrupt 1 {TH0=(65535-50000)/256;TL0=(65535-50000)%256;aa++;}void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++); }。
交通灯 汇编和C语言程序

1 引言随着世界范围内城市化和机动化进程的加快,城市交通越来越成为一个全球化的问题。
在我国,随着经济实力的飞速发展,城市机动车量也随之增加,许多大中城市出现了交通超负荷运行的情况,道路超负荷承载的程度进一步加大,致使交通事故逐年增加,每年因交通事故死亡的人数占所有事故死亡总人数的比例逐年上升。
在一个交通十字路口,如果还是像以前一样由单纯的一种信号灯和交通警察的协调来维持交通是不够的。
所以这就需要一个更为合理和智能且成本不高的路口交通灯控制系统。
与此同时,随着科学技术的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测技术日新月异。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,它可以嵌入到任何微型或小型仪器或设备中,同时结合具体的硬件结构进行相关的软件设计,来弥补单片机在某些方面的不足。
本次课程设计采用了一个MCS-51系列单片机和可编程并行I/O接口设计交通灯控制器的实现方法。
交通灯控制系统由AT89C51单片机、LED指示灯组成,实现了对交通的有效控制。
通过对交通灯智能控制,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
2 系统功能用单片机AT89S51实现十字路口交通信号灯的控制,完成系统的软硬件设计及调试。
交通灯控制器的具体功能如下:1、正常情况下交通信号灯的控制时序给定。
南北绿灯、黄灯、红灯分别用P1.0,P1.1,P1.2控制,东西绿黄红分别用P1.3,P1.4,P1.5控制。
2、设定东西方向、南北方向紧急切换按钮各一个,当紧急按钮按下时,相应方向紧急切换为绿灯,以便特种车辆通行。
实际设置的功能如下:东西红灯亮10s,南北绿灯亮6s;南北绿灯亮6s后,南北黄灯闪烁4s;南北黄灯闪烁4s后,南北红灯开始亮,东西红灯变绿灯;东西绿灯亮6s,南北红灯亮10s;6s之后,东西黄灯闪烁4s,东西变为红灯,南北红灯变绿灯,开始循环。
交通灯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毫秒的延时}。
单片机C语言交通灯设计

单片机C语言交通灯设计交通灯是城市中至关重要的设施之一,它可以引导车辆和行人的行为,并维持市民的出行秩序。
单片机C语言交通灯设计项目旨在使用C语言编程语言,通过单片机的控制,实现交通灯的开关并维护路面交通秩序。
本文将介绍单片机C语言交通灯设计的背景、基本原理以及设计过程。
一、背景随着城市化的快速发展,交通流量急剧增加,城市中交通拥堵、交通安全等问题越来越严重。
为了能够有效维护交通秩序,交通灯成为城市交通管理中必不可缺的部分。
为了更好地控制交通灯的开关,我们需要借助单片机这个高效的控制设备。
二、基本原理单片机指的是集成了中央处理器、存储器、输入输出端口、定时器/计数器、中断控制器等模块的芯片。
通过单片机的控制,可以对交通灯的开关进行精准控制,并实现不同路段之间的时序交替配合。
具体实现过程如下:1. 单片机需要连接交通灯的各个灯组,包括红灯、黄灯、绿灯等。
2. 设计好程序后,单片机开始运作,不断循环,按照预定的时间间隔实现各种信号灯的交替亮起。
3. 单片机可以根据交通灯的需求,设定不同的工作模式。
例如,可以在繁忙路段长亮绿灯,而在交通流量较少的路段则可以将绿灯调整为短亮,以节约能源。
4. 当有行人或车辆通过交通灯时,单片机可以自动检测,即时调整信号灯的亮灭状态,以避免事故发生。
三、设计过程实现单片机C语言交通灯设计,需要进行以下步骤:1. 确定交通灯需要工作的时间,例如绿灯需要亮的时间、红灯需要亮的时间等。
2. 编写程序,使用C语言完成程序设计。
可以通过调用预先定义好的控制函数,实现对单片机的控制。
3. 程序编写完成后,将程序通过编译器编译,并将二进制代码下载到单片机中,以实现程序运行。
4. 调试程序,确保程序可以正常运行,交通灯的不同信号灯可以按照预定时间间隔交替亮灭。
5. 根据实际情况进行程序优化,例如可以增加灯光亮度控制、检测模块和声音提示器等功能,以提高交通灯的安全性和可靠性。
四、总结在现代城市中,交通灯成为了城市交通管理不可或缺的部分。
vc红绿灯控制

任务的提出
• 任务的提出
– 当我们走在城市的十字路口时,都会遇到红绿 灯,按照一定的时间间隔变换着红绿灯,指挥 着交通。现在交通红绿灯的控制都是用计算机 (单片机)自动控制,今天我们就在实验室模 拟“交通红绿灯的控制”,通过学习进一步掌 握顺序、循环程序设计。
工作过程分析
路口交通红绿灯
南北红灯亮,东西绿灯亮; 延时30秒; 南北红灯亮,东西黄灯亮; 延时4秒; }
谢谢!
红
● 红 ● 黄 ● 绿
● 红 ● 黄 ● 绿 ● 红 ● 黄 ● 绿
工作过程分析
路口交通红绿灯
南北绿灯亮 南北黄灯亮 东西绿灯亮 ● 黄 ● 绿 ●
红
● 红 ● 黄 ● 绿
● 红 ● 黄 ● 绿 ● 红 ● 黄 ● 绿
东西黄灯亮工作Βιβλιοθήκη 程分析• 任务完整的工作过程
– 控制南北红灯亮,东西绿灯亮 – 等待30秒 – 控制南北红灯灯,东西黄灯亮 – 等待2秒 – 控制南北绿灯亮,东西红灯亮 – 等待30秒 – 控制南北黄灯亮,东西红灯亮 – 等待2秒 – 以此循环
调用system("color ab"); 设置默认的控制台前景和背景颜色。 color [attr] attr 指定控制台输出的颜色属性 颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为 前景。每个数字可以为以下任何值之一: 0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 浅绿色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色 6 = 黄色 E = 淡黄色 7 = 白色 F = 亮白色
南北绿灯亮 ● 黄 ● 绿 ●
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(++Flash_Count!=6) return; //闪烁
Flash_Count=0;
Operation_Type=1;
break;
}
}
//主程序
void main()
{
TMOD=0x11; //T0方式1
EA=1;
ET0=1; //定时器0 中断允许位
TL1=0X00;
if(++count1==200) //10S(50MS*200=10000MS)
{
TR0=1;
count1=0;
}
}
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P1^5; //东西向指示灯
sbit YELLOW_A=P1^4;
sbit GREEN_A=P1^3;
sbit RED_B=P1^2; //南北向指示灯
if(++Time_Count!=20) return; // 1s(50*20=1000ms)
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_B=1;
RED_B=1;
if(++Flash_Count!=6) return; //闪烁次数
Flash_Count=0;
Operation_Type=3;
break;
case 3: //东西向红灯与南北向绿灯亮5s
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
if(++Time_Count!=400) return; //20s(400*50ms)切换
ET1=1; //定时器1 中断允许位
TR0=1; //打开定时器0
EX0=1; //外部中断0 中断允许位
IT0=1; //外部中断请求0 跳沿触发方式
while(1);
}
void int0() interrupt 0
{
TR0=0; //关闭定时器0
RED_A=0;YELLOW_A=1;GREEN_A=1;
sbit YELLOW_B=P1^1;
sbit GREEN_B=P1^0;
//延时倍数,闪烁次数,操作类型变量
uint Time_Count=0,Flash_Count=0,Operation_Type=1;
unsigned int count1=0;
//定时器0中断函数
void T0_INT() interrupt 1
{
TL0=0X00; //初值50ms 11.0592MHZ
TH0=0X4C;
switch(Operation_Type)
{
case 1: //东西向绿灯与南北向红灯亮5s
RED_A=0;YELLOW_A=1;GREEN_A=1;
Time_Count=0;
Operation_Type=4;
break;
case 4: //南北向黄灯开始闪烁,绿灯关闭
if(++Time_Count!=20) return; //1s(20*50ms=1000ms)
Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=1;
RED_B=0;YELLOW_B=1;GREEN_B=1;
EA=1;
TMOD=0X11;
ET1=1;
TR1=1;
PT1=1; //设置定时器1 中断优先 50MS初值
}
void timer1() interrupt 3
{
TH1=0X4C;
RED_B=1;YELLOW_B=1;GREEN_B=0;
if(++Time_Count!=400) return; //20s(400*50ms)切换
Time_Count=0;
Operation_Type=2;
break;
case 2: //东西向黄灯开始闪烁,绿灯关闭