网站说服力 营销...,ps做网页,唐山哪里做网站,保险平台官网基于51单片机十字路口交通灯_5s黄灯闪烁
#xff08;程序仿真仿真视频#xff09;
仿真#xff1a;proteus 7.8
程序编译器#xff1a;keil 4/keil 5
编程语言#xff1a;C语言
设计编号#xff1a;J006
功能要求
交通灯运行状态#xff1a;
#xff08;1…基于51单片机十字路口交通灯_5s黄灯闪烁
程序仿真仿真视频
仿真proteus 7.8
程序编译器keil 4/keil 5
编程语言C语言
设计编号J006
功能要求
交通灯运行状态
1模式1东西向红灯与南北向绿灯亮5s
2模式2南北向绿灯灭黄灯闪烁5s5次
3模式3东西向绿灯与南北向红灯各5s
4模式4东西向绿灯灭黄灯闪烁5s5次
5具体秒数可在程序改数字实现。
仿真图
南北通行
东西通行 程序 主要程序代码
#includereg52.h
#includeintrins.h//数据类型定义
typedef unsigned char uchar;
typedef unsigned int uint;void led_sacn();
void delay_ms(ms);
void seg_disp(uchar number,uchar wei);#define ON 1 //LED给告电平亮灯
#define OFF 0 //LED给低电平灭灯//通用IO引脚分配
sbit W0P3^4;
sbit W1P3^5;
sbit W2P3^6;
sbit W3P3^7;sbit NS_G P2^0;
sbit NS_Y P2^1;
sbit NS_R P2^2;
sbit WE_R P2^3;
sbit WE_Y P2^4;
sbit WE_G P2^5;bit flag1s;
bit half_1sflag;
uchar one_sec_flag,main_road_time,secondary_road_time,half_sec_flag;
//1秒定时标志位 南北方向显示时间 东西方向显示时间
uchar state0;//正常模式不同状态
uchar code seg_du[]{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};uchar main_green_straight_cnt5,yellow_cnt 5,2sec_green_straight_cnt 5;
//南北方向直行绿灯时间 _黄灯时间 _东西方向绿灯时间void main()
{EA1; //开总中断TMOD0X01;//T0的工作模式为模式1TH00X4C;TL00X00;//11.0592M晶振 50ms定时初值ET01; //允许定时器1中断TR01;//启动定时器0
// state2; while(1){ led_sacn(); //LED和数码管显示时刻刷新if(flag1s) //一秒刷新一次{flag1s0;main_road_time--; //红绿灯倒计时时间减secondary_road_time--;}if (half_1sflag){half_1sflag 0;if(state 0){//黄灯闪烁WE_Y ~WE_Y;}else if(state 2){NS_Y ~NS_Y;}}}
}void led_sacn()
{if(main_road_time0 || secondary_road_time0)//当南北方向或者东西方向倒数到0切换状态。//这一段程序只有倒计时为0才执行一次执行完一次等下一次倒计时为0才再执行一次{switch(state)//改变红绿灯的状态{case 0:{state1;//下次切换到下一个模式main_road_timemain_green_straight_cntyellow_cnt;//南北方向直行绿灯通行时间secondary_road_timesec_green_straight_cnt;//东西方向红灯时间NS_G ON;NS_Y OFF;NS_R OFF;WE_R ON;WE_Y OFF;WE_G OFF;}break;case 1:{state2;
// main_road_time yellow_cnt;//南北方向直行黄灯时间secondary_road_time yellow_cnt;NS_G OFF;NS_Y ON;NS_R OFF;WE_R ON;WE_Y OFF;WE_G OFF; }break;case 2:{state3;main_road_timesec_green_straight_cnt;secondary_road_timesec_green_straight_cntyellow_cnt;NS_G OFF;NS_Y OFF;NS_R ON;WE_R OFF;WE_Y OFF;WE_G ON;}break;case 3:{state0;
// secondary_road_timeyellow_cnt;//黄灯时间main_road_timeyellow_cnt;NS_G OFF;NS_Y OFF;NS_R ON;WE_R OFF;WE_Y ON;WE_G OFF;}break;default:break;}}seg_disp(main_road_time/10,0);//显示W0控制的数码管 时刻刷新seg_disp(main_road_time%10,1);//显示W1控制的数码管seg_disp(secondary_road_time/10,2);//显示W2控制的数码管seg_disp(secondary_road_time%10,3);//显示W3控制的数码管}void seg_disp(uchar number,uchar wei) //数码管动态显示程序 wei代表数码管W0 W1 W2 W3的位选
{P00XFF;//清零防止重影if(wei 0){//显示第一位W00;W11;W21;W31; P0seg_du[number];delay_ms(2);W01;}if(wei 1){//显示第二位W01;W10;W21;W31; P0seg_du[number];delay_ms(2);W11;}if(wei 2){//显示第三位W01;W11;W20;W31; P0seg_du[number];delay_ms(2);W21;}if(wei 3){//显示第四位W01;W11;W21;W30; P0seg_du[number];delay_ms(2);W31;}
}程序讲解
主要的核心点是倒计时主干道直行绿灯时间黄灯时间次干道红灯时间
在次干道红灯的过程中主干道完成了绿灯倒计时黄灯倒计时两个步骤。
倒计时的产生
记住这个点就可以设计软件了。首先要有时间基础倒计时从哪来呢
一般两个来源
1延时
delay(1000ms);通过死循环卡主软件的运行来达到延时效果程序执行效率极低不可取。
2定时
通过定时器产生时基。软件设置50ms产生一次定时中断在中断执行函数中做计数。 EA1; //开总中断TMOD0X01;//T0的工作模式为模式1TH00X4C;TL00X00;//11.0592M晶振 50ms定时初值ET01; //允许定时器1中断TR01;//启动定时器0 50ms执行一次中断函数通过one_sec_flag累加到20判断时间过去了一秒。设置一秒标志位flag1s置一。
void Timer0() interrupt 1
{TH00X4C;TL00X00;//11.0592M晶振 50ms定时初值if(half_sec_flag10){half_1sflag 1;half_sec_flag 0;}if(one_sec_flag20){return;//提前结束函数}one_sec_flag0;flag1s1;
}在主函数while循环里判断标志位如果是1则倒计时计数值减一即完成了倒计时的软件设计思路 if(flag1s) //一秒刷新一次{flag1s0;main_road_time--; //红绿灯倒计时时间减secondary_road_time--;}红黄绿灯状态处理 交通灯状态实际上分为四个状态
1.主干道绿灯通行次干道红灯
2.主干道黄灯通行次干道红灯
3.主干道红灯次干道绿灯通行
4.主干道红灯次干道黄灯通行
做一个状态机设置四个状态在四个状态的变化中设置红绿黄灯的亮和灭实现基础交通灯运行逻辑
if(main_road_time0 || secondary_road_time0)//当南北方向或者东西方向倒数到0切换状态。//这一段程序只有倒计时为0才执行一次执行完一次等下一次倒计时为0才再执行一次{switch(state)//改变红绿灯的状态{case 0:{state1;//下次切换到下一个模式main_road_timemain_green_straight_cntyellow_cnt;//南北方向直行绿灯通行时间secondary_road_timesec_green_straight_cnt;//东西方向红灯时间NS_G ON;NS_Y OFF;NS_R OFF;WE_R ON;WE_Y OFF;WE_G OFF;}break;case 1:{state2;
// main_road_time yellow_cnt;//南北方向直行黄灯时间secondary_road_time yellow_cnt;NS_G OFF;NS_Y ON;NS_R OFF;WE_R ON;WE_Y OFF;WE_G OFF; }break;case 2:{state3;main_road_timesec_green_straight_cnt;secondary_road_timesec_green_straight_cntyellow_cnt;NS_G OFF;NS_Y OFF;NS_R ON;WE_R OFF;WE_Y OFF;WE_G ON;}break;case 3:{state0;
// secondary_road_timeyellow_cnt;//黄灯时间main_road_timeyellow_cnt;NS_G OFF;NS_Y OFF;NS_R ON;WE_R OFF;WE_Y ON;WE_G OFF;}break;default:break;}}seg_disp(main_road_time/10,0);//显示W0控制的数码管 时刻刷新seg_disp(main_road_time%10,1);//显示W1控制的数码管seg_disp(secondary_road_time/10,2);//显示W2控制的数码管seg_disp(secondary_road_time%10,3);//显示W3控制的数码管
倒计时显示处理
实际上倒计时显示就是显示main_road_time–; secondary_road_time–;设计函数通过数码管分别显示主干道的main_road_time和次干道的secondary_road_time即可 seg_disp(main_road_time/10,0);//显示W0控制的数码管seg_disp(main_road_time%10,1);//显示W1控制的数码管seg_disp(secondary_road_time/10,2);//显示W2控制的数码管seg_disp(secondary_road_time%10,3);//显示W3控制的数码管资料清单
资料下载链接