找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1951|回复: 0
打印 上一主题 下一主题
收起左侧

单片机交通灯仿真程序 具有夜间模式

[复制链接]
跳转到指定楼层
楼主
proteus 仿真,具有夜间模式

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. //东西 红黄绿
  5. sbit RED_A=P0^0;
  6. sbit YELLOW_A=P0^1;
  7. sbit GREEN_A=P0^2;
  8. //南北 红黄绿
  9. sbit RED_B=P0^3;
  10. sbit YELLOW_B=P0^4;
  11. sbit GREEN_B=P0^5;
  12. //加减按键
  13. sbit k1=P3^0;
  14. sbit k2=P3^1;
  15. //变量
  16. uchar Flash_Count = 0,scount=0,flag_mode=1,time_flag=0;
  17. uchar GT1=8,YT1=2,RT1=6;
  18. uchar GT2=8,YT2=2,RT2=6;
  19. //数码管0-13
  20. uchar code DSY_CODE[]=
  21. {
  22.         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1
  23. };
  24. //也是函数
  25. void DelayMS(uint x)
  26. {
  27.         uchar t;
  28.         while(x--)
  29.         {
  30.                  for(t=120;t>0;t--);
  31.         }
  32. }
  33. //定时器初始化
  34. void time_init()
  35. {
  36.         TMOD=0X01;
  37.         TH0=(65536-10000)/256;
  38.         TL0=(65536-10000)%256;
  39.         ET0=1;  
  40.         EA=1;
  41.         TR0=1;//定时器开
  42.         IT0=1;//中断0
  43.         EX0=1;
  44.         IT1=1;//中断1
  45.         EX1=1;
  46. }
  47. //交通灯处理函数
  48. void Traffic_lignt()
  49. {
  50.         if(flag_mode%2)  //默认白天
  51.         {       
  52.                 if(scount>GT1+YT1+RT1)  //东西
  53.                         scount=0;
  54.                 if(scount<GT1)  //绿灯
  55.                 {
  56.                         P2=DSY_CODE[GT1-scount];  //数码管显示时间
  57.                         RED_A=1;
  58.                         YELLOW_A=1;
  59.                         GREEN_A=0;
  60.                 }
  61.                 else if(scount<GT1+YT1)  //黄灯
  62.                 {
  63.                         P2=DSY_CODE[GT1+YT1-scount];//数码管显示时间
  64.                         RED_A=1;
  65.                         YELLOW_A=0;
  66.                         GREEN_A=1;
  67.                 }
  68.                 else if(scount<GT1+YT1+RT1) //红点
  69.                 {
  70.                         P2=DSY_CODE[GT1+YT1+RT1-scount];//数码管显示时间
  71.                         RED_A=0;
  72.                         YELLOW_A=1;
  73.                         GREEN_A=1;
  74.                 }
  75.                  //南北
  76.                 if(scount<RT2)         //红灯   
  77.                 {
  78.                         P1=DSY_CODE[RT2-scount];//数码管显示时间
  79.                         RED_B=0;
  80.                         YELLOW_B=1;
  81.                         GREEN_B=1;
  82.                 }
  83.                 else if(scount<RT2+GT2) //绿灯
  84.                 {
  85.                         P1=DSY_CODE[RT2+GT2-scount];//数码管显示时间
  86.                         RED_B=1;
  87.                         YELLOW_B=1;
  88.                         GREEN_B=0;
  89.                 }
  90.                 else if(scount<RT2+GT2+YT2)//黄灯
  91.                 {
  92.                         P1=DSY_CODE[RT2+GT2+YT2-scount];//数码管显示时间
  93.                         RED_B=1;
  94.                         YELLOW_B=0;
  95.                         GREEN_B=1;
  96.                 }
  97.         }
  98.         else  //晚上 黄灯闪烁
  99.         {
  100.                     RED_A=RED_B=1;
  101.                         YELLOW_A=YELLOW_B=0;
  102.                         GREEN_A=GREEN_B=1;
  103.                    DelayMS(500);
  104.                     RED_A=RED_B=1;
  105.                         YELLOW_A=YELLOW_B=1;
  106.                         GREEN_A=GREEN_B=1;
  107.                    DelayMS(500);
  108.         }
  109. }
  110. void key_pose()  //按键处理
  111. {
  112.        
  113.         if(time_flag==1)        //GT1
  114.         {
  115.                 if(k1==0)
  116.                 {
  117.                         DelayMS(5);
  118.                         if(k1==0)
  119.                         {
  120.                                 GT1++;     //时间+
  121.                         }
  122.                         while(!k1);
  123.                 }
  124.                 if(k2==0)
  125.                 {
  126.                         DelayMS(5);
  127.                         if(k2==0)
  128.                         {
  129.                                 GT1--; //时间-
  130.                         }
  131.                         while(!k2);
  132.                 }
  133.                 if(GT1>=9)  //限制时间
  134.                         GT1=9;
  135.                 if(GT1<=3)
  136.                         GT1=3;
  137.                 RED_B=1;
  138.                         YELLOW_B=1;
  139.                         GREEN_B=1;
  140.                 P1=0XFF;
  141.                 P2=DSY_CODE[GT1];//数码管显示时间
  142.                 RED_A=1;
  143.                         YELLOW_A=1;
  144.                         GREEN_A=0;
  145.                         GT2=RT1-YT1;
  146.         YT2=YT1;
  147.         RT2=GT1+YT1;
  148.         }
  149.         else if(time_flag==2)        //RT1
  150.         {
  151.                
  152.                 if(k1==0)
  153.                 {
  154.                         DelayMS(5);
  155.                         if(k1==0)
  156.                         {
  157.                                 RT1++;  //时间+
  158.                         }
  159.                         while(!k1);
  160.                 }
  161.                 if(k2==0)
  162.                 {
  163.                         DelayMS(5);
  164.                         if(k2==0)
  165.                         {
  166.                                 RT1--;//时间-
  167.                         }
  168.                         while(!k2);
  169.                 }
  170.                 if(RT1>=9)  //限制时间
  171.                         RT1=9;
  172.                 if(RT1<=3)
  173.                         RT1=3;
  174.                 P2=DSY_CODE[RT1];//数码管显示时间
  175.                 RED_A=0;
  176.                         YELLOW_A=1;
  177.                         GREEN_A=1;
  178.                
  179.                 //东西南北时间处理
  180.                         GT2=RT1-YT1;
  181.         YT2=YT1;   
  182.         RT2=GT1+YT1;
  183.         }

  184. }
  185. void main()
  186. {
  187.         time_init();//定时器初始化
  188.        
  189.         GT2=RT1-YT1;//东西南北时间处理
  190.         YT2=YT1;
  191.         RT2=GT1+YT1;
  192.         P1=P2=0XFF;
  193.         /*主函数*/
  194.         while(1)
  195.         {
  196.                 if(time_flag==0)
  197.                    Traffic_lignt();          //交通灯处理函数
  198.                 key_pose();  //按键处理
  199.         }
  200. }
  201. //定时器0服务函数
  202. void tim0() interrupt 1
  203. {
  204.         static uchar i;
  205.         TH0=(65536-10000)/256;
  206.         TL0=(65536-10000)%256;
  207.         i++;
  208.         if(i==100)  //时间1S
  209.         {
  210.                 scount++;
  211.                 i=0;
  212.         }
  213. }
  214. //中断0服务函数   模式设置
  215. void init0() interrupt 0
  216. {
  217.         flag_mode++;
  218.         P1=P2=0XFF;
  219.         if(flag_mode%2)  //默认白天
  220.         {
  221.                 TR0=1;
  222.                 scount=0;
  223.         }
  224.         else
  225.                 TR0=0;
  226. }
  227. //中断1服务函数   时间设置
  228. void init1() interrupt 2
  229. {
  230.         time_flag++;  //时间选择
  231.         P1=0XFF;
  232.         RED_B=1;
  233.                         YELLOW_B=1;
  234.                         GREEN_B=1;
  235.         if(time_flag>=3)  //
  236.         {
  237.                 time_flag=0;
  238.                 TR0=1;
  239.                 scount=0;
  240.         }
  241.         else
  242.         {
  243.                 TR0=0;
  244.                
  245.         }
  246. }
复制代码

所有资料51hei提供下载:
05 LED模拟交通灯.zip (2.84 MB, 下载次数: 33)





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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