找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3747|回复: 0
收起左侧

交通灯仿真工程+程序-带按键-LED数码管显示数值

[复制链接]
ID:247413 发表于 2017-11-8 19:03 | 显示全部楼层 |阅读模式
交通灯,仅供参考!

交通灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

0.png 0.png 0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. bit red,green,yellow,turnred;          //定义红、黄、绿及转红标志
  3. code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  4.                                         0x7f,0x6f}; //共阴极数码管码表
  5. #define  LIGHT P0
  6. #define  SEG P1
  7. #define  BITR P2
  8. unsigned char Dis_Shiwei;//定义十位
  9. unsigned char Dis_Gewei; //定义个位
  10. unsigned char second,count=0; //初值60

  11. #define uchar unsigned char
  12. #define uint unsigned int

  13. sbit add=P3^3;                                 //定义东西绿灯时间加按键
  14. sbit sub=P3^4;                                 //定义东西绿灯时间减按键
  15. sbit K1=P3^1;                                 //定义设定时间按键
  16. sbit add2=P3^5;                             //定义调南北绿灯时间加按键
  17. sbit sub2=P3^6;                             //定义调南北绿灯时间减按键


  18. unsigned char timeDX=13,timeNB=15; //定义东西和南北绿灯亮时可调变量并赋予初值2S

  19. void delay(unsigned int cnt)          //用于动态扫描数码管的延时程序
  20.         {
  21.         while(--cnt);
  22.         }
  23. /*********************************延时子程序*************************************/
  24. void DelayMS(unsigned int x)                  //延时ms
  25. {
  26.     unsigned char t;
  27.     while(x--)
  28.     {
  29.         for(t=120;t>0;t--);
  30.     }
  31. }



  32. void key_scan( )
  33. {
  34.         uchar s1num=0;                        //s1num记录光标的位置的编号
  35.         
  36.         if(K1==0)
  37.         {
  38.                 DelayMS(5);
  39.                 if(K1==0)
  40.                 {
  41.                         while(!K1);          //menum测试到由0到1的变化,也就是按下松开的变化,s1num加1
  42.                         s1num++;
  43.                         while(1)
  44.                         {
  45.                                 if(K1==0)
  46.                                 {
  47.                                 DelayMS(5);
  48.                                 if(K1==0)
  49.                                 {
  50.                                 while(!K1);
  51.                                 s1num++;        //menum测试到由0到1的变化,也就是按下松开的变化,s1num再加1
  52.                                 }
  53.                                 }

  54.                
  55.                
  56.                                 if(s1num==1)
  57.                                 {
  58.                         
  59.                         

  60.                 while(add==0)                                    //如果第一个按键按下东西方向绿灯延续时间加1秒
  61.                                         {
  62.                                             DelayMS(10);
  63.                                                 while(add==0);
  64.                                                 timeDX++;
  65.                                                 if(timeDX>60)   //当时间超过60秒将时间置为60秒
  66.                                                 {timeDX=0;}

  67.                                                 Dis_Shiwei=tab[timeDX/10];//十位显示值处理
  68.                                                 Dis_Gewei=tab[timeDX%10]; //个位显示处理  


  69.                                         }
  70.                         while(sub==0)                                   //如果第二个按键按下东西方向绿灯延续时间减1秒
  71.                                         {        
  72.                                                 DelayMS(10);
  73.                                                 while(sub==0);
  74.                                                 timeDX--;
  75.                                                 if(timeDX<=0)           //当时间减到小于或等于0时将时间置为1秒
  76.                                                 {timeDX=60;}

  77.                                                 Dis_Shiwei=tab[timeDX/10];//十位显示值处理
  78.                                                 Dis_Gewei=tab[timeDX%10]; //个位显示处理  



  79.                                         }
  80.                     while(add2==0)                                   //如果第三个按键按下南北方向绿灯延续时间加1秒
  81.                                         {        
  82.                                                 DelayMS(10);
  83.                                                 while(add2==0);
  84.                                                 timeNB++;
  85.                                                 if(timeNB>60)   //当时间超过60秒将时间置为60秒
  86.                                                 {timeNB=0;}

  87.                                                  Dis_Shiwei=tab[timeNB/10];//十位显示值处理
  88.                         Dis_Gewei=tab[timeNB%10]; //个位显示处理



  89.                                         }
  90.                         while(sub2==0)                                   //如果第四个按键按下南北方向绿灯延续时间减1秒
  91.                                         {                                          
  92.                                                 DelayMS(10);
  93.                                                 while(sub2==0);
  94.                                                 timeNB--;
  95.                                                 if(timeNB<=0)           //当时间减到小于或等于0时将时间置为1秒
  96.                                                 {timeNB=60;}

  97.                                                  Dis_Shiwei=tab[timeNB/10];//十位显示值处理
  98.                         Dis_Gewei=tab[timeNB%10]; //个位显示处理

  99.                                            }
  100.                                 }

  101.                                 if(s1num==2)
  102.                                 {

  103.                                 s1num=0;//s1num清零//
  104.                                 break;
  105.                                 }
  106.                         }
  107.                 }
  108.         }
  109. }

  110. void LINGHTLED( )

  111. {
  112.         if (count==100)
  113.             {
  114.             count=0;
  115.             second--;//秒减1
  116.                 if(second==0)
  117.             { //这里添加定时到0的代码 ,可以是灯电路,继电器吸合等,或者执行一个程序
  118.                         if(red)   //红灭,先转黄
  119.                         {
  120.                                 red=0;
  121.                                 yellow=1;
  122.                                 second=4;
  123.                                 LIGHT=0xdd;//黄灯亮4秒,黄灯为过渡灯,再根据情况转绿或转红
  124.                         while(K1==0);        

  125.                         }
  126.             else if(yellow && !turnred)
  127.                                         {
  128.                                         yellow=0;
  129.                                         green=1;
  130.                                         second=timeDX;
  131.                                         LIGHT=0xf3;//绿灯亮25秒,
  132.                                 while(K1==0);        
  133.                                         }
  134.                                 else if(green)
  135.                                                 {
  136.                                                 yellow=1;
  137.                                                 green=0;
  138.                                                 second=4;
  139.                                                 LIGHT=0xeb;//黄灯亮4秒
  140.                                         while(K1==0);        
  141.                                                 turnred=1;

  142.                                                 }
  143.                                                 else if(yellow && turnred)   //绿灯灭,转黄灯,后红灯,turnred=1时
  144.                                                         {
  145.                                                         red=1;
  146.                                                         yellow=0;
  147.                                                         LIGHT=0xde;//红灯亮60秒
  148.                                                 while(K1==0);        
  149.                                                         second=timeNB;
  150.                                                         turnred=0;   //接下来是转黄,绿。
  151.                                                         }
  152.              }

  153.         }

  154.         Dis_Shiwei=tab[second/10];//十位显示值处理
  155.         Dis_Gewei=tab[second%10]; //个位显示处理  







  156. }


  157. void inti( )
  158. {

  159.         TMOD |=0x11;//定时器设置 10ms in 12M crystal定时器0,工作方式1,16位定时器
  160.         TH0=0xd8;            //65535-10000=55535=D8F0(十六进制)
  161.         TL0=0xf0;
  162.         IE= 0x8A; //中断控制,EA=1开总中断,ET0=1:定时器0中断允许
  163.         IP=0x02;
  164.         TR0=1;    //开定时器0中断
  165. TR1=1;    //开定时器0中断


  166. }



  167. void main()
  168. {

  169.         
  170. inti( );


  171.         LIGHT=0xde;//红灯亮,根据红黄绿接灯的顺序。
  172.         red =1;
  173.    second=timeDX;

  174.         while(1)
  175.         {


  176.          key_scan();//键盘扫描程序


  177.    
  178.    LINGHTLED( );






  179.         }
  180. }

  181. /********************************/
  182. /*      定时中断                */
  183. /********************************/
  184. void tim(void) interrupt 1
  185. {

  186.         TH0=(65536-10000)/256;//重新赋值,10毫秒定时
  187.         TL0=(65536-10000)%256;;               
  188.         count++;
  189. }


  190. /********************************/
  191. /*      定时中断                */
  192. /********************************/
  193. void tim2(void) interrupt 3
  194. {
  195.         TR1=0;
  196.    TH1=(65536-5000)/256;//重新赋值,5毫秒定时
  197.         TL1=(65536-5000)%256;;                        
  198.         

  199.         BITR=0xfE;
  200.         SEG=Dis_Shiwei;//显示十位,这里实现用8位数码管,即左1位
  201.         delay(30);//短暂延时
  202.         BITR=0XfD;
  203.         SEG=Dis_Gewei; //显示个位,左数,2位
  204.         delay(30);

  205.         TR1=1;
  206. …………
  207. …………
  208. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
交通灯.rar (53.16 KB, 下载次数: 49)


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表