C51交通控制体系的操持与实现

打印 上一主题 下一主题

主题 1061|帖子 1061|积分 3183

实行要求:
本标题拟操持一个工作在十字路口的交通讯号灯控制体系,设东西方向为主干道A,南北方向为辅助干道B。要求:(1)用发光二极管模仿交通灯信号;(2)灵活控制主、辅干道交通指示灯的表现时间;(3)操持交通灯控制体系硬件电路;(4)运用C51语言完成对控制体系的软件编程。


一、需求分析

1.1   实行背景

随着科技的快速发展,时间的流逝,单片机技术的应用产物已经走进了千家万户。计算器给人们一样寻常生活中的计算带来了很多方便。随着微电子技术的高速发展,单片机已经在国民经济的个人领域得到了广泛的应用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通讯装备、信息处置惩罚等各种测控领域的应用中独占鳌头、单片机开发技术已成为电子信息、电气、通讯、自动化等专业技术人员必须把握的技术。

单片机单芯片的微小体积和低的本钱,可广泛地嵌入到如玩具、家用电器、机器人、仪器仪表、汽车电子体系、工业控制单位、办公自动化装备、金融电子体系、舰船、个人信息终端及通讯产物中,成为今世电子体系中最紧张的智能化工具,于是基于单片机的计算器也顺应而生。基于单片机的计算器用按键来模仿数字、运算符的输入,从而得出效果送给表现装备表现出来,方便人们的生活。

1.2   标题形貌

操持一个工作在十字路口的交通讯号灯控制体系,设东西方向为主干道A,南北方向为辅助干道B。用Proteus软件进行仿真,实现此次功能。
 1.3   根本要求

1.  完成的形式

(1)  熟悉操持标题内容、查找相关资料。

(2)  确定体系的总体操持方案。

(3)  编写语言代码,并调试。

(4)  用Proteus模仿实现交通灯控制


二、 概要操持

2.1     操持方案

2.1.1交通灯四种通行模式及行车方向指示


  •  按照简单的交通路口规则,有四种模式
南北绿灯亮 东西红灯亮;
南北黄灯闪 东西红灯亮;
南北红灯亮 东西绿灯亮;
南北红灯亮 东西黄灯闪;

 2.2   步伐流程图


                                                               步伐流程图


2.3   模块功能

2.3.1   信号灯表现模块由于南北方向的信号灯始终是同一种状态,所以南北信号灯为一组,只需将对应的信号灯并联即可,东西方向同理。



2.3.2   倒计时表现模块

选取8个7段数码管分别模仿表现四个方向的倒计时,数码管采用共阴极接法。

为了进步P0、P2端口的电流输出能力,保证数码管亮度,掩护端口引脚,在P0端口与数码管之间增长了74LS245芯片。


2.3.3   复位模块

此体系可以通过复位按键实现从新工作,电路图如图所示


三、详细操持

3.1   实行原理

3.1.1   外部停止原理
本体系主要利用了外部停止,停止信号有引脚INTO和INT1输入,低电平有效,CPU每个时钟周期都会检测INTO和INT1上的信号,AT89C51答应外部停止以电平方式或负边沿方式两种停止方式输入停止哀求信号,可由用户通过设置TCON中ITO和IT1位的状态来实现。以ITO为例,ITO=0,为电平触发方式,ITO=1,为负边沿触发方式,本操持采用电平方式,IEO为其停止标志位,有停止信号则置位,停止服务子步伐相应后,IEO自动清零。IE中的EA为答应停止的总控制位,为1开启,EXO为外部停止答应控制位,为1开启。
在优先级的答应下,一旦有外部停止信号产生,单片机CPU起首掩护断点,PC值进栈,然后执行相应的停止服务子步伐,执行完后,用RETI指令返回,此时CPU会从堆栈中取生存的断点地点,送回PC,步伐再正常执行。


3.1.2  软件延时原理
MCS-51的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12∗(1/12MHZ)=1us。我们可以知道具体每条指令的周期数这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速很快其他的指令执行时间可以忽略不计。


3.1.3  数码管表现原理
共阴数码管是指将全部发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
3.2   操持思路

(1)利用仿真软件绘制仿真实例

   1.用 traffic light 和一个led灯表示红、黄、绿的信号灯。

   2.用p0口控制交通灯,用P1口控制数码管的段选,P2口控制数码管的位选。

   3.p3.6和p3.7接收停止信号并返回给INT0接口处置惩罚。

 (2)利用keil软件按要求编写步伐实现相应功能。

3.3   主要步伐编写

  1. #include <reg51.h>
  2. #define        uchar        unsigned char
  3. #define        uint        unsigned int
  4. sbit        SN_LED2=P2^3;        //SN_LED2控制位
  5. sbit        SN_LED1=P2^2;        //SN_LED1控制位
  6. sbit        EW_LED2=P2^1;        //EW_LED2控制位
  7. sbit        EW_LED1=P2^0;        //EW_LED1控制位
  8. sbit  EW_Yellow=P1^6; //EW黄灯
  9. sbit  EW_Red=P1^7;    //EW红灯
  10. sbit  EW_Green=P1^5;  //EW绿灯
  11. sbit  SN_Yellow=P1^2; //SN黄灯
  12. sbit  SN_Red=P1^3;    //SN红灯
  13. sbit  SN_Green=P1^1;  //SN绿灯
  14. bit          Restore_flag=0;                        //恢复正常标志位
  15. bit   Flag_EW_Yellow;     //EW黄灯标志位
  16. bit   Flag_SN_Yellow;     //SN黄灯标志位
  17. char        Time_SN;  //南北方向倒计时单元
  18. char        Time_EW;  //东西方向倒计时单元
  19. uchar SN=15,EW=20;     //程序初始化赋值      
  20. uchar SN1=15,EW1=10;   //用于存放修改值的变量
  21. uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~~~~9段选码
  22. uchar code S[9]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84,0x88};//交通信号灯控制代码
  23. /**********************延时子程序************************/
  24. void delay_ms(uint x) //延时ms
  25. {
  26.         uint i,j;
  27.         for(i=x;i>0;i--)
  28.         for(j=110;j>0;j--);
  29. }
  30. /*****************显示函数**************************/
  31. void Display(void)
  32. {
  33.         char h,l;
  34.         h=Time_SN/10;
  35.         l=Time_SN%10;
  36.   P0=table[l];SN_LED2=1;delay_ms(1);SN_LED2=0;
  37.   P0=table[h];SN_LED1=1;delay_ms(1);SN_LED1=0;                                //南北方向数码管显示
  38.        
  39.         h=Time_EW/10;
  40.         l=Time_EW%10;
  41.         P0=table[l];EW_LED2=1;delay_ms(1);EW_LED2=0;
  42.   P0=table[h];EW_LED1=1;delay_ms(1);EW_LED1=0;                                //东西方向数码管显示       
  43. }
  44. /**********************T0中断服务程序*******************/
  45. void timer0()  interrupt 1
  46. {
  47.         static uchar count;                         //count为静态变量初值为0
  48.         TL0 = 0xB0;                                                          //重赋定时初值50ms
  49.         TH0 = 0x3C;                                                         //重赋定时初值50ms
  50.         count++;                                                                 //计数
  51.         if(count==10)                                           //加快闪烁速度
  52.         {
  53.           if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
  54.           {EW_Yellow=~EW_Yellow;}//东西黄灯闪烁
  55.           if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
  56.           {SN_Yellow=~SN_Yellow;}//南北黄灯闪烁
  57.         }
  58.         if(count==20)                                                                         //20*50=1000ms=1S       
  59.         {
  60.                 Time_SN--;                                                                         //南北方向倒计时
  61.                 Time_EW--;                                                                   //东西方向倒计时
  62.         if(Flag_EW_Yellow==1)                                        //测试东西黄灯标志位
  63.             {EW_Yellow=~EW_Yellow;}                //东西黄灯闪烁
  64.         if(Flag_SN_Yellow==1)                                        //测试南北黄灯标志位
  65.             {SN_Yellow=~SN_Yellow;}                //南北黄灯闪烁
  66.         count=0;
  67.         }
  68. }
  69. /*********************主程序开始**********************/
  70. void main(void)
  71. {
  72. /*********************中断初始化**********************/
  73.         IT0=1;                                                                         //设置外部中断0触发方式(下降沿触发)
  74.         EX0=1;                                                                         //打开外部中断0的IE寄存器中断
  75.         EA=1;                                                                           //CPU开中断总允许
  76.         ET0=1;                                                                         //开定时中断
  77.         TMOD=0x01;                                                         //定时器工作于方式1
  78.         TL0 = 0xB0;                                                          //设置定时初值50ms
  79.         TH0 = 0x3C;                           //设置定时初值50ms
  80.         TF0 = 0;                             //清除TF0标志
  81.         TR0 = 1;                             //定时器0开始计时
  82. while(1)                                                                               
  83.         {
  84.                 if(Restore_flag)
  85.                 break;               
  86.                 /*******S1状态(南北直行状态)**********/
  87.                 Time_SN=SN;                                                        //南北数码管赋值10s       
  88.                 Time_EW=EW;                                                        //东西数码管赋值15s
  89.           while(Time_EW>=6)                                //东西方向倒计时前10s循环体
  90.            {  
  91.                          Flag_EW_Yellow=0;          //南北关黄灯显示信号                          
  92.                          P1=S[4];                                                         //南北通行,东西红灯
  93.                          Display();                                          //调用显示函数
  94.                          if(Restore_flag)
  95.                          break;
  96.                  }
  97.                 /*******S2状态(南北直行黄灯闪烁状态)**********/
  98.             P1=0x00;                                                        //所有路口红绿灯短时熄灭
  99.                  if(Time_EW==5)                                        //当东西倒计时为5s时
  100.                                 Time_SN=5;                                        //南北重新从5s开始倒计时
  101.           while(Time_EW>=1)                                //东西方向倒计时最后5s循环体
  102.            {
  103.                          Flag_SN_Yellow=1;                //南北开黄灯信号位
  104.              EW_Red=1;                                                //南北黄灯开始闪烁,东西红灯亮       
  105.              Display();                                                //调用显示函数
  106.                          if(Restore_flag)
  107.                          break;                         
  108.            }
  109.                 /***********赋值(南北通行变东西通行)**********/
  110.                 SN=SN1;                                                                        //南北10s-->15s
  111.                 EW=EW1;                                                                        //东西15s-->10s         
  112.                 /*******S3状态(东西直行状态)**********/                       
  113.                 Time_SN=SN;                                                        //南北数码管赋值15s
  114.                 Time_EW=EW;                                                        //东西数码管赋值10s
  115.            while(Time_SN>=6)                        //南北方向倒计时前10s循环体
  116.             {
  117.                                 Flag_SN_Yellow=0;          //南北关黄灯显示信号
  118.                                 P1=S[0];                                                 //东西通行,南北红灯
  119.               Display();                                  //调用显示函数
  120.                                 if(Restore_flag)
  121.                           break;               
  122.                   }
  123.                 /*******S4状态(东西直行黄灯闪烁状态)**********/
  124.                         P1=0X00;                                             //所有路口红绿灯短时熄灭
  125.                         if(Time_SN==5)                                //当南北倒计时为5s时
  126.                                 Time_EW=5;                                        //东西重新从5s开始倒计时
  127.                 while(Time_SN>=1)                                //南北方向倒计时最后5s循环体
  128.            {
  129.              Flag_EW_Yellow=1;          //东西开黄灯信号位
  130.                          SN_Red=1;            //东西黄灯开始闪烁,南北红灯亮
  131.              Display();                                    //调用显示函数
  132.                          if(Restore_flag)
  133.                          break;                                 
  134.            }
  135.           /***********赋值(东西通行变南北通行)**********/
  136.           SN=EW1;                                                                        //南北15s-->10s
  137.                 EW=SN1;                                                                        //东西10s-->15s         
  138.         }                             
  139. }
复制代码


  • 四、测试与分析
 
4.1   仿真效果

起首焊接各个电路板,焊接完每个电路板以后,对电路板对的每个模块分别进行测试,以确保在整个体系焊接完能正常的工作。单独测试后,将2个电路板连接起来,进行最后的效果测试。

实行效果与预期相符:


                      


                           
 



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表