找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8566|回复: 6
收起左侧

超详细的单片机交通信号灯控制程序

[复制链接]
ID:523178 发表于 2020-4-7 21:32 | 显示全部楼层 |阅读模式
利用定时器计时,注释非常详细,可自己改变定时时间。

单片机源程序如下:
  1. #include "reg52.h"
  2. #define GPIO_TRAFFIC P2
  3. #define GPIO_DIG P0
  4. typedef unsigned char u8;
  5. typedef unsigned int u16;

  6. //3-8译码器引脚位定义
  7. sbit LSA = P1^0;
  8. sbit LSB = P1^1;
  9. sbit LSC = P1^2;
  10. //交通信号灯南北方向控制引脚位定义
  11. sbit GREEN10 = P2^0;
  12. sbit RED10 = P2^1;
  13. sbit GREEN11 = P2^2;
  14. sbit YELLOW11 = P2^3;
  15. sbit RED11 = P2^4;
  16. //交通信号灯东西方向控制引脚位定义
  17. sbit GREEN00 = P1^6;
  18. sbit RED00 = P1^7;
  19. sbit GREEN01 = P2^5;
  20. sbit YELLOW01 = P2^6;
  21. sbit RED01 = P2^7;


  22. u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  23.                                                 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴
  24. u8 displaydata[8]; //储存信号灯倒计时

  25. //定义一个全局变量
  26. u8 second;


  27. //各种函数的声明
  28. void Timer0Init();
  29. void delay(u16 i);
  30. void Digdisplay();
  31. void trafficpros();
  32. /*******************************
  33.                 主函数:main
  34. *******************************/
  35. void main(void)
  36. {
  37.         second = 1;
  38.         Timer0Init();  //初始化定时器T0;
  39.         while(1)
  40.         {
  41.                  trafficpros();       
  42.         }
  43. }
  44. /*******************************
  45. 定时器T0配置函数,只选择TCON中TR
  46. 0触发,定时10ms。
  47. *******************************/
  48. void Timer0Init()
  49. {
  50.         TMOD |= 0x01;
  51.         TH0 = 0xd8;
  52.         TL0 = 0xf0;     //设定初值55536,定时10ms
  53.         IE = 0x82;      //开启T0中断和总中断
  54.         TR0 = 1;        //开启定时器T0
  55. }
  56. /*******************************
  57. 中断处理函数
  58. *******************************/
  59. void Time0() interrupt 1
  60. {
  61.         static u16 i;
  62.         TH0 = 0xd8;
  63.         TL0 = 0xf0;    //重装初值
  64.         i++;         //记下中断的次数,100次为一秒
  65.         if(100 == i)
  66.         {
  67.                  i = 0;
  68.                 second++;
  69.         }       
  70. }
  71. /*******************************
  72. 延时函数,延时约10μs
  73. *******************************/
  74. void delay(u16 i)
  75. {
  76.         while(i--);
  77. }
  78. /*******************************
  79. 8位数码管位选函数
  80. *******************************/
  81. void Digdisplay()
  82. {
  83.         u8 i;
  84.         for(i = 0; i < 8; i++)
  85.         {
  86.                    switch(i)
  87.                 {
  88.                         case 0:
  89.                                 LSA = 0; LSB = 0; LSC = 0; break;
  90.                          case 1:
  91.                                 LSA = 1; LSB = 0; LSC = 0; break;
  92.                         case 2:
  93.                                 LSA = 0; LSB = 1; LSC = 0; break;
  94.                         case 3:
  95.                                 LSA = 1; LSB = 1; LSC = 0; break;
  96.                         case 4:
  97.                                 LSA = 0; LSB = 0; LSC = 1; break;
  98.                         case 5:
  99.                                 LSA = 1; LSB = 0; LSC = 1; break;
  100.                         case 6:
  101.                                 LSA = 0; LSB = 1; LSC = 1; break;
  102.                         case 7:
  103.                                 LSA = 1; LSB = 1; LSC = 1; break;
  104.                 }
  105.                 GPIO_DIG = displaydata[i];
  106.                 delay(100);
  107.                 GPIO_DIG = 0x00;  //消影
  108.         }
  109. }
  110. /*******************************
  111. 交通信号灯控制函数
  112. *******************************/
  113. void trafficpros()
  114. {
  115.         if(second > 74)
  116.         {
  117.                  second = 1;
  118.         }
  119.         //南北方向通车和人行道
  120.         if(second < 32)
  121.         {
  122.                 displaydata[0] = 0x00; //第一位数码管不显示
  123.                 displaydata[1] = 0x00; //第二位数码管不显示       
  124.                 displaydata[2] = smgduan[(31 - second)/10];
  125.                 displaydata[3] = smgduan[(31 - second)%10];
  126.                 displaydata[4] = 0x00; //第五位数码管不显示
  127.                 displaydata[5] = 0x00; //第六位数码管不显示
  128.                 displaydata[6] = displaydata[2];
  129.                 displaydata[7] = displaydata[3];
  130.                 Digdisplay();
  131.                 //每次先所有的灯进行熄灭
  132.                 GPIO_TRAFFIC = 0xff;
  133.                 GREEN00 = 1;
  134.                 RED00 = 1;

  135.                 GREEN10 = 0;   //人行道绿灯亮
  136.                 GREEN11 = 0;   //车道绿灯亮

  137.                 RED00 = 0;     //东西方向人行道红灯亮
  138.                 RED01 = 0;     //东西方向车道红灯亮
  139.         }
  140.         //中间黄灯阶段
  141.         else if(second < 38)
  142.         {
  143.                  displaydata[0] = 0x00; //第一位数码管不显示
  144.                 displaydata[1] = 0x00; //第二位数码管不显示       
  145.                 displaydata[2] = smgduan[(37 - second)/10];
  146.                 displaydata[3] = smgduan[(37 - second)%10];
  147.                 displaydata[4] = 0x00; //第五位数码管不显示
  148.                 displaydata[5] = 0x00; //第六位数码管不显示
  149.                 displaydata[6] = displaydata[2];
  150.                 displaydata[7] = displaydata[3];
  151.                 Digdisplay();
  152.                 //每次先所有的灯进行熄灭
  153.                 GPIO_TRAFFIC = 0xff;
  154.                 GREEN00 = 1;
  155.                 RED00 = 1;

  156.                 RED10 = 0;           //南北方向人行道红灯亮
  157.                 YELLOW11 = 0;  //南北方向车道黄灯亮

  158.                 RED00 = 0;     //东西方向人行道红灯亮
  159.                 RED01 = 0;     //东西方向车道红灯亮               
  160.         }
  161.         //东西方向通车和人行道
  162.         else if(second < 69)
  163.         {
  164.                  displaydata[0] = 0x00; //第一位数码管不显示
  165.                 displaydata[1] = 0x00; //第二位数码管不显示       
  166.                 displaydata[2] = smgduan[(68 - second)/10];
  167.                 displaydata[3] = smgduan[(68 - second)%10];
  168.                 displaydata[4] = 0x00; //第五位数码管不显示
  169.                 displaydata[5] = 0x00; //第六位数码管不显示
  170.                 displaydata[6] = displaydata[2];
  171.                 displaydata[7] = displaydata[3];
  172.                 Digdisplay();
  173.                 //每次先所有的灯进行熄灭
  174.                 GPIO_TRAFFIC = 0xff;
  175.                 GREEN00 = 1;
  176.                 RED00 = 1;
  177.                
  178.                 GREEN00 = 0;           //东西方向人行道绿灯亮
  179.                 GREEN01 = 0;                   //东西方向车道绿灯亮

  180.                 RED10 = 0;             //南北方向人行道红灯亮
  181.                 RED11 = 0;                           //南北方向车道红灯亮
  182.         }
  183.         //中间黄灯阶段
  184.         else
  185.         {
  186.                  displaydata[0] = 0x00; //第一位数码管不显示
  187.                 displaydata[1] = 0x00; //第二位数码管不显示       
  188.                 displaydata[2] = smgduan[(74 - second)/10];
  189.                 displaydata[3] = smgduan[(74 - second)%10];
  190.                 displaydata[4] = 0x00; //第五位数码管不显示
  191.                 displaydata[5] = 0x00; //第六位数码管不显示
  192.                 displaydata[6] = displaydata[2];
  193.                 displaydata[7] = displaydata[3];
  194.                 Digdisplay();
  195.                 //每次先所有的灯进行熄灭
  196.                 GPIO_TRAFFIC = 0xff;
  197.                 GREEN00 = 1;
  198.                 RED00 = 1;
  199.                
  200.                 RED00 = 0;                       //东西方向人行道红灯亮
  201.                 YELLOW01 = 0;                   //东西方向车道黄灯亮
  202.                
  203.                 RED10 = 0;             //南北方向人行道红灯亮
  204.                 RED11 = 0;                           //南北方向车道红灯亮       
  205.         }
  206. }
复制代码

所有资料51hei提供下载:
交通信号灯.rar (24.3 KB, 下载次数: 66)
回复

使用道具 举报

ID:590833 发表于 2020-4-9 13:24 | 显示全部楼层
老哥有没有整个工程文件
回复

使用道具 举报

ID:523178 发表于 2020-4-10 09:03 | 显示全部楼层
尔与一扇窗 发表于 2020-4-9 13:24
老哥有没有整个工程文件

所有的Keil工程代码都在里面了,你还缺啥
回复

使用道具 举报

ID:773851 发表于 2020-6-9 12:49 | 显示全部楼层
老哥,有图吗
回复

使用道具 举报

ID:801175 发表于 2020-7-11 10:40 | 显示全部楼层
连仿真图都没有?
回复

使用道具 举报

ID:523178 发表于 2020-8-25 20:29 | 显示全部楼层
15975875172 发表于 2020-7-11 10:40
连仿真图都没有?

有,不出
回复

使用道具 举报

ID:933536 发表于 2021-6-5 21:24 | 显示全部楼层
想要图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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