找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简单的基于51单片机交通灯,需要的拿走

[复制链接]
跳转到指定楼层
楼主
  1. #include <reg51.h>                                //头文件
  2. #define uchar unsigned char
  3. #define uint  unsigned int                //宏定义

  4. uchar data buf[5];                                        //秒显示的变量
  5. uchar data sec_dx=20;                          //东西数默认
  6. uchar data sec_nb=20;                        //南北默认值
  7. uchar data set_timedx=20;                //设置东西方向的时间
  8. uchar data set_timenb=20;                //设置南北方向的时间

  9. uchar data countt0,countt1;//定时器0中断次数
  10. //定义6组开关

  11. sbit  k1=P3^1;               
  12. sbit  k2=P3^4;               
  13. sbit  k3=P3^3;
  14. sbit  k4=P3^0;
  15. sbit Red_nb=P2^6;                //南北红灯标志
  16. sbit Yellow_nb=P2^5;        //南北黄灯标志
  17. sbit Green_nb=P2^4;     //南北绿灯标志

  18. sbit Red_dx=P2^3;                //东西红灯标志
  19. sbit Yellow_dx=P2^2;        //东西黄灯标志
  20. sbit Green_dx=P2^1;                //东西绿灯标志
  21.                
  22. bit set=0;                                //调时方向切换键标志 =1时,南北,=0时,东西
  23. bit dx_nb=0;                        //东西南北控制位
  24. bit shanruo=0;                        //闪烁标志位
  25. bit key1=1;
  26. bit key2=1;
  27. uchar code table[11]={        0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  28.                         0x7d,0x07,0x7f,0x6f,0x00};

  29. //函数的声明部分
  30. void delay(int ms);                        //延时子程序
  31. void key();                                        //按键扫描子程序
  32. void key_to1();                                //键处理子程序
  33. void key_to2();
  34. void key_to3();
  35. void display();                                //显示子程序
  36. //主程序
  37. void main()
  38. {
  39.         TMOD=0X11;                                           //定时器设置
  40.         TH1=0X3C;               
  41.         TL1=0XB0;
  42.         TH0=0X3C;                                        //定时器0置初值 0.05S
  43.         TL0=0XB0;
  44.         EA=1;                                                //开总中断
  45.         ET0=1;                                                //定时器0中断开启
  46.         ET1=1;                                           //定时器1中断开启
  47.         TR0=1;                                                //启动定时0
  48.         TR1=1;                                                         //关闭定时1
  49.         EX0=1;                                                //开外部中断0
  50.         EX1=1;                                                //开外部中断1
  51.   
  52.         P2=0Xc3;                                        // 开始默认状态,东西绿灯,南北黄灯   
  53.                             //默认南北通行时间比东西多5秒
  54.         while(1)                                          //主循环
  55.         {         
  56.                 key();                                         //调用按键扫描程序
  57.                 display();                                 //调用显示程序
  58.         }       
  59. }
  60. //函数的定义部分
  61. void key(void)        //按键扫描子程序
  62. {         
  63.        
  64. if(k1!=1)                                                        //当K1(禁止)键按下时
  65. {
  66.          if(dx_nb==0)
  67.         {
  68.                 sec_dx=10;
  69.         sec_nb=10;                       
  70.         }
  71.          if(dx_nb==1)
  72.         {
  73.                 sec_dx=10;
  74.         sec_nb=10;                       
  75.         }
  76. }
  77.         if(k2!=1)                                                        //当K2(确认)键按下时
  78.         {               
  79.          if(dx_nb==0)
  80.                 {  key1=0;
  81.                 sec_dx=10;
  82.         sec_nb=10;               
  83.                 }
  84.                  if(dx_nb==1)
  85.                  {
  86.         TR0=0;                                                                //关定时器0
  87.         TR1=0;
  88.         Green_nb=1;
  89.         sec_nb=99;                                                        //四个方向的时间都为00
  90.         sec_dx=99;
  91.                 }
  92.         }       
  93. if(k3!=1)                                                        //当K2(确认)键按下时
  94.         {               
  95.          if(dx_nb==1)
  96.                 {  key2=0;
  97.                 sec_dx=10;
  98.         sec_nb=10;               
  99.                 }
  100.                  if(dx_nb==0)
  101.                  {
  102.         TR0=0;                                                                //关定时器0
  103.         TR1=0;
  104.         Green_dx=1;
  105.         sec_nb=99;                                                        //四个方向的时间都为00
  106.         sec_dx=99;
  107.                 }
  108.         }

  109. void display(void) //显示子程序
  110. {               
  111.         buf[1]=sec_nb/10;                 //第1位 东西秒十位
  112.         buf[2]=sec_nb%10;                 //第2位 东西秒个位
  113.         buf[3]=sec_dx/10;                 //第3位 南北秒十位
  114.         buf[0]=sec_dx%10;                 //第4位 南北秒个位               
  115.         P1=0xff;                          // 初始灯为灭的
  116.         P0=0x00;                                     //灭显示
  117.        
  118.         P1=0xfe;                           //片选LED1
  119.         P0=table[buf[1]];                //送东西时间十位的数码管编码                       
  120.         delay(1);                                //延时
  121.         P1=0xff;                                //关显示
  122.         P0=0x00;                                //灭显示
  123.                                                   
  124.         P1=0xfd;                     //片选LED2
  125.         P0=table[buf[2]];                 //送东西时间个位的数码管编码
  126.         delay(1);                                 //延时
  127.         P1=0xff;                                //关显示
  128.         P0=0x00;                                //关显示
  129.        
  130.         P1=0Xfb;                                  //片选LED3
  131.         P0=table[buf[3]];        //送南北时间十位的数码管编码
  132.         delay(1);                                //延时
  133.         P1=0xff;                                 //关显示
  134.         P0=0x00;                                 //关显示
  135.        
  136.         P1=0Xf7;                                 //片选LED4       
  137.         P0=table[buf[0]];        //送南北时间个位的数码管编码
  138.         delay(1);                                //延时
  139. }
  140. void time1(void) interrupt 3 using 1
  141. {    TH1=0X3C;                                                        //重赋初值
  142.          TL1=0XB0;
  143.          TR1=1;
  144.        
  145.         if(key1==0&&sec_dx==1)
  146.         {
  147.                
  148.         sec_dx=99;                        //重赋东西方向的起始值
  149.         sec_nb=99;
  150.         Green_dx=0;
  151.                 Green_nb=1;
  152.                 Red_dx=1;
  153.                 Red_nb=0;
  154.                
  155.                 TR0=0;       
  156.         }
  157.         if(key2==0&&sec_nb==1)
  158.         {
  159.                
  160.         sec_dx=99;                        //重赋东西方向的起始值
  161.         sec_nb=99;
  162.         Green_nb=0;
  163.                 Green_dx=1;
  164.                 Red_nb=1;
  165.                 Red_dx=0;
  166.                
  167.                 TR0=0;       
  168.         }
  169. }       
  170. void time0(void) interrupt 1 using 1          //定时中断子程序
  171. {
  172.         TH0=0X3C;                                                        //重赋初值
  173.         TL0=0XB0;                                                        //12m晶振50ms//重赋初值
  174.         TR0=1;                                                                //重新启动定时器
  175.         countt0++;        //软件计数加1

  176.        
  177.         if(countt0==10)                                                //加到10也就是半秒
  178.         {
  179.                 if((sec_dx<=10)&&(dx_nb==0)&&(shanruo==1))                  //东西黄灯闪               
  180.         {
  181.                         Green_dx=0;
  182.                        
  183.                 }                                                  
  184.             if((sec_nb<=10)&&(dx_nb==1)&&(shanruo==1))                  //南北黄灯闪               
  185.         {  
  186.                         Green_nb=0;
  187.                
  188.                 }       
  189.         }
  190.        
  191.                
  192.         if(countt0==20)              // 定时器中断次数=20时(即1秒时)
  193.         {        countt0=0;                                        //清零计数器
  194.                 sec_dx--;                                                //东西时间减1
  195.                 sec_nb--;                                                //南北时间减1

  196.                 if((sec_dx<=10)&&(dx_nb==0)&&(shanruo==1))                  //东西黄灯闪               
  197.         {
  198.                         Green_dx=1;
  199.                
  200.                 }                                                  
  201.             if((sec_nb<=10)&&(dx_nb==1)&&(shanruo==1))                  //南北黄灯闪               
  202.         {  
  203.                         Green_nb=1;
  204.                        
  205.                 }                                                                
  206.                
  207.                 if(dx_nb==0&&sec_dx==0)                        //当黄灯闪烁时间倒计时到0时,
  208.                 {
  209.                         P2=0x00;                                               //重置东西南北方向的红绿灯
  210.                         Green_nb=1;
  211.                         Red_dx=1;
  212.                         dx_nb=!dx_nb;
  213.                         shanruo=0;
  214.                         sec_nb=set_timenb;                        //重赋南北方向的起始值
  215.                         sec_dx=set_timenb;                //重赋东西方向的起始值
  216.                 }               
  217.                 if(dx_nb==1&&sec_nb==0)                        //当黄灯闪烁时间到
  218.                 {
  219.                         P2=0X00;                                         //重置东西南北的红绿灯状态
  220.                         Green_dx=1;                         //东西绿灯亮
  221.                         Red_nb=1;                          //南北红灯亮
  222.                         dx_nb=!dx_nb;         //取反
  223.                         shanruo=0;          //闪烁
  224.                         sec_dx=set_timedx;                        //重赋东西方向的起始值
  225.                         sec_nb=set_timedx;                //重赋南北方向的起始值
  226.                 }
  227.         }       
  228.         if(sec_dx==10&&dx_nb==0)
  229.         {
  230.                 shanruo=1;         
  231.         }
  232.         if(sec_nb==10&&dx_nb==1)
  233.         {
  234.                 shanruo=1;         
  235.         }
  236.        
  237.        
  238.        
  239. }


  240. //外部中断0

  241. void delay(int ms)                //延时子程序
  242. {
  243.         uint j,k;
  244.         for(j=0;j<ms;j++)                        //延时ms
  245.            for(k=0;k<124;k++);                //大约1毫秒的延时
  246. }
复制代码


评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:746907 发表于 2022-3-23 09:49 | 只看该作者
楼主能给个清楚点的仿真图吗?
你这个压缩包里没有仿真
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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