单片机智能交通灯proteus仿真源码元文件

控制/MCU

1814人已加入

描述

一、单片机设计交通灯的设计要求:

 状态一:南北绿灯亮,东西红灯亮,南北人行道绿灯,东西人行道红灯,南北左拐绿灯,东西左拐红灯。(时间为15S

          状态二:南北黄灯亮,东西红灯亮,南北人行道绿灯,东西人行道红灯,南北左拐绿灯,东西左拐红灯。(时间为5S

          状态三:南北红灯亮,东西绿灯亮,南北人行道红灯,东西人行道绿灯,南北左拐红灯,东西左拐绿灯。(时间为15S

          状态四:南北红灯亮,东西黄灯亮,南北人行道红灯,东西人行道绿灯,南北左拐红灯,东西左拐绿灯。(时间为5S

二、设计原理分析

1、首先了解实际交通灯的变化情况和规律。假设一个十字路口如上图所以,为东南西北走向。初始状态0:为东西绿灯亮,南北红灯亮;然后转状态1:东西绿灯亮黄灯亮,南北红灯亮黄灯亮;过后转状态2:东西红灯亮,南北绿灯亮;再转状态3:东西红灯亮黄灯亮,南北绿灯亮黄灯亮。一段时间后,又循环至状态0。中间可通过中断按钮产生中断,跳入中断程序执行中断。

2对于交通信号灯来说,应该有东西南北共四组灯,但由于同一道上的两组的信号灯的显示情况是相同的,所以只要用两组就行了,因此,采用单片机内部的I/O口上的P1口中的6个引脚即可来控制6个信号灯。

3通过编写程序,实现对发光二极管的控制,来模拟交通信号灯的管理。每延时一段时间,灯的显示情况都会按交通灯的显示规律进行状态转换。

4通过延时时间送显,可以在原有的交通信号灯系统的基础上,增添其倒计时间的显示功能,实现其功能的扩展。

5.通过脉冲中断编写中断程序,可实现中断。

三、设计的仿真图如下:

其接法为:P0接数码管的端选段,

P1接数码管的位选端,

P2接交通灯,接法如下:

P20P21P22,分别接南北向的红黄绿灯,

P23接南北左拐绿灯,

P24P25,P26,分别接东西向的红黄绿灯,

P27接东西左拐红灯

东西人行到红绿灯和南北红绿灯接到一起

南北人行到红绿灯和东西红绿灯接到一起

四、AT89C51KILL程序

#include "reg51.h"

#define uchar unsigned char

#define uint unsigned int

uchar code wei[]={0x01,0x02,0x04,0x08}; //位码选择

uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码选择

uchar table[4]={0,0,0,0};//四位为选端赋值区间

uchar num=0;

uchar ID=1;

uchar sec=15;

uchar n=0;

void init(void)

{

   P0=0xff;//端口初始化

   P1=0x00;//端口初始化

   P2=0x00;//端口初始化

       TMOD=0x01;//使用定时器0的工作方式

       EA=1;//开总中断

       ET0=1;//开定时器0的中断

       TH0=(65536-10000)/256;//定时10毫秒

       TL0=(65536-10000)%256;

       TR0=1;

}

void main(void)

{

       init();

       while(1)

       {

              switch(ID)//选择函数

              {

                     case 1:P2=0x14;break;//东西红,南北绿,

                     case 2:P2=0x12;break;//东西红,南北黄,

                     case 3:P2=0x41;break;//东西绿,南北红,

                     case 4:P2=0x21;break;//东西黄,南北红,

                     default:break;

              }           

       }

}

void timer0() interrupt 1//对应中断定时器0

{

       TH0=(65536-10000)/256;

       TL0=(65536-10000)%256;

       P1=wei[num];//位选端送值

       P0=duan[table[num]];//端选端送值

       num++;

       if(num==4)

              num=0;

       table[0]=(sec-1)/10;

       table[1]=(sec-1)%10;

       table[2]=(sec-1)/10;

       table[3]=(sec-1)%10;

       n++;

       if(n==100)//10毫秒执行一百次为一秒

       {

              n=0;

              sec--;

              if(sec==0)

              {

                     ID++;

                     if(ID==5)//

                            ID=1;

                     switch(ID)

                     {

                            case 2:sec=3;break;//

                            case 3:sec=15;break;//

                            case 4:sec=3;break;//

                            default:break;/*default就是默认情况,这个是用在switch中,意思是若case都不满足,则执行default后面的语句 */

                     }

              }

       }

      

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

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

×
20
完善资料,
赚取积分