基于51单片机的简易交通灯设计

描述

J028 51单片机简易交通灯_代码易懂版_仿真代码_报告_讲解

仿真图proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:J028

工作状态:

状态1:南北方向绿灯通行12秒,东西红灯禁止通行15秒,分别倒计时;

状态2:南北方向黄灯提醒3秒,东西继续红灯倒计时;

状态3:东西方向绿灯通行9秒,南北方向禁止通行12秒;

状态4:东西方向黄灯提醒3秒,南北继续红灯倒计时;

状态5:执行状态1,反复循环。

 程序部分讲解

主要的核心点是倒计时,和LED灯亮灭控制

记住这个就可以设计软件了。首先要有时间基础,倒计时从哪来呢?

一般两个来源:

1,延时

 


```C
delay(1000ms);
```

 

通过死循环卡主软件的运行来达到延时效果,程序执行效率极低,不可取。

2,定时

通过定时器产生时基。软件设置50ms产生一次定时中断,在中断执行函数中做计数。

 

  EA=1;  //开总中断
//  EX1=1;//外部中断1
//  IT1=1;//设置下降沿触发中断1
  TMOD|= 0X01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;//12M晶振 50ms定时初值
  ET0=1; //允许定时器0中断
  TR0=1;//启动定时器0  
  state=0;

 

50ms执行一次中断函数,通过one_sec_flag累加到20判断时间过去了一秒。设置一秒标志位scan_flag置一。

 

void Timer0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;//12M晶振 50ms定时初值




  if(++half_sec_flag>10){
    half_sec_flag=0;
    half_flag1s=1;




  }
  if(++one_sec_flag<20){
    return;//提前结束函数
    }
  


  one_sec_flag=0;
  if(run_mode==0){//不是正常运行时,不红绿灯数值不减一 
    flag1s=1;  


  }
}

 

在主函数while循环里判断标志位,如果是1,则倒计时计数值减一,即完成了倒计时的软件设计思路

 

//LED和数码管显示,时刻刷新
    if(flag1s)//一秒执行一次
    {
      flag1s=0;
      main_road_time--;      //红绿灯倒计时时间减
      secondary_road_time--;
    }

 

仿真图(提供源文件):

led

led

led

led

程序(提供源文件源码):

led

程序流程框图

led

系统硬件框图

led

设计报告

led

资料清单(提供资料清单所有文件):

led

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
jf_39206130 2023-01-01
0 回复 举报
你好,方便把完整版分享一下吗? 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分