基于51单片机控制交通灯的程序设计.docx
- 文档编号:23613763
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:16
- 大小:17.49KB
基于51单片机控制交通灯的程序设计.docx
《基于51单片机控制交通灯的程序设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机控制交通灯的程序设计.docx(16页珍藏版)》请在冰豆网上搜索。
基于51单片机控制交通灯的程序设计
#include
unsignedcharcodedis_7[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,
0x86,0x8e,0xbf,0x89,0x8c,0x00,0xff};//共阳数码管段码
unsignedchardatadisbuf[6]={0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区:
时分秒使用
unsignedchardatacount_timedx[]={2,10,5,10,25};//东西方向倒计时时间
unsignedchardatacount_timenb[]={2,25,10,5,10};//南北方向倒计时时间
unsignedchardataHour=14,Minite=06,Second=0,Halfsec=0;//定义时钟位
unsignedcharxdata*ledaddr=0x2000;//锁存器选通地址
unsignedchardataMs=0,Lightcode=0,Light_step,Led_step,Light_num;
unsignedintdataFault_dx=0,Fault_nb=0,Fault_total=0,Countdx=0,Countnb=0;
sbitp10=P1^0;//第0位数码管位控制端
sbitp11=P1^1;//第1位数码管位控制端
sbitp12=P1^2;//第2位数码管位控制端
sbitp13=P1^3;//第3位数码管位控制端
sbitp14=P1^4;//第4位数码管位控制端
sbitp15=P1^5;//第5位数码管位控制端
sbitp16=P1^6;//发光二极管选通
sbitp17=P1^7;//按键选通
sbitp33=P3^3;//k1键用于切换四种功能
/*****************************************************************************/
/****************************1毫秒延时函数*******************************/
voiddelay1ms(intt)
{
unsignedinti,j;
for(i=0;i for(j=0;j<120;j++) ; } /***************************************************************************/ /*************************键盘扫描函数****************************************/ unsignedchargetkey(void) { unsignedcharYiwei; unsignedchartest=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; elsetest=(test<<1)+1; } returnYiwei; } elseif(p17==0){} else{tim=0;} } /*****************************************************************************/ /************************六位LED数码管显示***********************************/ voiddispled(unsignedinthour_shi,unsignedinthour_ge,unsignedintmin_shi,unsignedintmin_ge,unsignedintsec_shi,unsignedintsec_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; } /*****************************************************************************/ /******************************发光二极管显示函数*****************************/ voiddisplight(unsignedintstate) { if(state==0)//状态0: 各方向红灯全亮 { Lightcode=0xbb; } elseif(state==1)//状态1: 东西绿灯亮,南北红灯亮 { Lightcode=0xbe; } elseif(state==2)//状态2: 东西黄灯闪烁,南北红灯亮 { Lightcode=0xbd; } elseif(state==3)//状态3: 东西红灯亮,左行亮,南北红灯亮 { Lightcode=0xb3; } elseif(state==4)//状态4: 东西红灯亮,南北直行绿灯亮 { Lightcode=0xeb; } elseif(state==5)//状态5: 东西红灯亮,南北黄灯闪烁 { Lightcode=0xdb; } elseif(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; } /****************************************************************************/ /****************************违章车辆统计函数********************************/ voidweizhang(void)//红灯亮的时候是否有车通过,KL1键显示东西,KL2键显示南北 { unsignedcharkey1; key1=getkey();//获得键值 if((key1==0)&&(Light_step>=4)&&(Light_step<=6))//KL1键显示南北方向违章车辆,且只在南北方向为红灯时加1 { Fault_dx++; if(Fault_dx==99)//最大计数99辆 { Fault_dx=0; } } elseif((key1==2)&&(Light_step>=1)&&(Light_step<=3))//KL3键显示东西方向违章车辆,且只在东西方向为红灯时加1 { Fault_nb++; if(Fault_nb==99)//最大计数99辆 { Fault_nb=0; } } } /***************************************************************************/ /****************************数字钟函数***********************************/ voidshuzizhong(void)//数字钟: KL3键调节秒,KL4键调节分,KL5键调节时 { unsignedchardatakey2; 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; } /*****************************************************************************/ /**************修改倒计时间函数*********************************************/ voidchange_time(void)//注意: 只修改绿灯、黄灯或左行灯时间,红灯时间自动求出 { unsignedintdatakey3=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中断函数******************************/ voidtime_intt0(void)interrupt1 { TH0=0x4c;//赋初值定时50ms TL0=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服务函数********************************************/ voidint_1(void)interrupt2//数码管显示状态切换 { EX1=0;//关中断 if(Led_step<4) { Led_step++; } if(Led_step==4) { Led_step=0; } EX1=1;//开中断 } /************串行口中断服务函数*********************************************/ voidser_put(void)interrupt4//上位机发出字符'c',则清违章记录,若发出'g',则上传违章记录 { if(RI==1)//接收到上位机发出的字符 { RI=0; ACC=SBUF;//取字符 if(ACC=='c')//清违章记录 { Fault_dx=0; Fault_nb=0; } elseif(ACC=='g')//上传违章记录 { Fault_total=Fault_dx+Fault_nb; SBUF=Fault_total; } } if(TI==1)//发送中断 TI=0; } /*****************************************************************************/ /***************8051初始化函数************************************************/ voidIstr(void) { /*定时器初始化*/ TMOD=0x21;//定时器1工作于方式2,做波特率发生器;定时器0工作于方式1,做定时器 TH1=0xfa;//产生9.6kbit/s波特率 TL1=0xfa; TH0=0x4c;//50ms TL0=0x00; /*串行通信初始化*/ SCON=0x50; PCON=0X80|PCON; /*启动定时器,开中断*/ ET1=0;//禁止定时器1中断 ET0=1; TR1=1; TR0=1; IT1=1;//设置外部中断为边沿触发 EX1=1; ES=1; EA=1; } /************************主函数***********************************************/ voidmain(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***/ ..
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 控制 交通灯 程序设计