当前位置:   article > 正文

【51单片机】路口红黄绿交通灯设计(附代码)_单片机红绿灯

单片机红绿灯

实践任务

1.1  实践目的

分析路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并完成路口红黄绿交通灯线路的搭建与调试,培养学生电子电路图的分析、设计、搭建与调试能力,培养团队协作能力与创新意识,增强学生的劳动观念和社会责任感。

1.2  实验内容

 分析根据路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并进行功能分析;

运用单片机、电阻、二极管、7段LED、导线等材料,并进行路口红黄绿交通灯电子电路的搭建与焊接;

完成路口红黄绿交通灯的电路的调试;

对路口红黄绿交通灯电路调试结果的分析与总结,并提出改进建议。

1.3 实现目标

东西向红灯33秒,南北向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;南北向红灯33秒,东西向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;循环动作。能在7段码上显示时间;

硬件设计

d61ae80bfa574d498ccc3fdcb53e9235.png

图1.1    Proteus仿真电路图

  1. 东西南北四方向LED红绿灯采用共阳极接法,单片机接口P1.0-P1.2控制东西向红黄绿LED,单片机接口P1.3-P1.5控制南北方向红黄绿LED
  2. 四位七段码数码管使用P2.0-P2.3作为控制位,P3接口作为段选位。
  3. 元器件清单:STC89c52RC单片机*1、LED灯若干、杜邦线若干、9012三极管*4、10K电阻*4、4位七段码数码管*1、510Ω电阻*8等元件。

软件设计

3.1  程序流程图

51532d41fc5f471ebe9e04e9344bec94.png

 3.2  软件代码:

  1. #include "REGX52.H"
  2. #include "smg.h"
  3. #include "delay.h"
  4. #include "Timer0.h"
  5. int Time_SMG = 0, Timer0Count = 0, blink = 0, Timer0Count2 = 0;
  6. int flag = 1;
  7. // 定义IO口连接
  8. sbit RedEastWest = P1 ^ 0; // 东西向红灯
  9. sbit YellowEastWest = P1 ^ 1; // 东西向黄灯
  10. sbit GreenEastWest = P1 ^ 2; // 东西向绿灯
  11. sbit RedNorthSouth = P1 ^ 3; // 南北向红灯
  12. sbit YellowNorthSouth = P1 ^ 4; // 南北向黄灯
  13. sbit GreenNorthSouth = P1 ^ 5; // 南北向绿灯
  14. // 主函数
  15. void main()
  16. {
  17. Timer0Init();
  18. P3_7 = 0;
  19. while (1) {
  20. // 过程:东西红灯33秒,南北绿灯27秒,绿灯以占空比50闪烁3秒,黄灯三秒;
  21. if (flag == 0) {
  22. RedEastWest = 0;
  23. GreenEastWest = 1;
  24. YellowEastWest = 1;
  25. if (Time_SMG < 27) {
  26. GreenNorthSouth = 0;
  27. RedNorthSouth = 1;
  28. YellowNorthSouth = 1;
  29. } else if (Time_SMG >= 27 && Time_SMG <= 30) {
  30. blink = 1; // 绿灯闪烁
  31. } else if (Time_SMG > 30) {
  32. blink = 0;
  33. GreenNorthSouth = 1;
  34. YellowNorthSouth = 0;
  35. RedNorthSouth = 1;
  36. }
  37. } else if (flag == 1) {
  38. RedNorthSouth = 0;
  39. GreenNorthSouth = 1;
  40. YellowNorthSouth = 1;
  41. if (Time_SMG < 27) {
  42. GreenEastWest = 0;
  43. YellowEastWest = 1;
  44. RedEastWest = 1;
  45. } else if (Time_SMG >= 27 && Time_SMG <= 30) {
  46. blink = 1; // 绿灯闪烁
  47. } else if (Time_SMG > 30) {
  48. blink = 0;
  49. GreenEastWest = 1;
  50. YellowEastWest = 0;
  51. RedEastWest = 1;
  52. }
  53. }
  54. smg(1, Time_SMG % 10);
  55. smg(2, Time_SMG / 10);
  56. }
  57. }
  58. void Timer0Routine() interrupt 1 // 中断
  59. {
  60. TL0 = 0x66; // 设置定时初值
  61. TH0 = 0xFC; // 设置定时初值【注意:这里的定时初值要与函数Timer0Init内的初值一样】10ms
  62. Timer0Count++; // 每1ms打断一次,计数器加1
  63. Timer0Count2++;
  64. if (Timer0Count >= 1000) // 当计数器到1000,即经过1秒
  65. {
  66. Time_SMG++;
  67. Timer0Count = 0;
  68. }
  69. if (Time_SMG > 33) {
  70. Time_SMG = 0;
  71. flag = !flag;
  72. }
  73. if (Timer0Count2 >= 500) // 当计数器到100,即经过0.1秒
  74. {
  75. Timer0Count2 = 0;
  76. if (blink == 1) {
  77. if (flag == 0) {
  78. GreenNorthSouth = !GreenNorthSouth;
  79. } else if (flag == 1) {
  80. GreenEastWest = !GreenEastWest;
  81. }
  82. }
  83. }
  84. }
  85. 数码管函数:
  86. unsigned char smgText[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  87. void smg(unsigned char location,number)
  88. {
  89. switch(location)
  90. {
  91. case 1:P2_0=0;P2_1=1;P2_2=1;P2_3=1;break;
  92. case 2:P2_0=1;P2_1=0;P2_2=1;P2_3=1;break;
  93. case 3:P2_0=1;P2_1=1;P2_2=0;P2_3=1;break;
  94. case 4:P2_0=1;P2_1=1;P2_2=1;P2_3=0;break;
  95. }
  96. P3=smgText[number];
  97. Delay(10);
  98. P3=0x00;
  99. }

4  系统调试与结论

首先,通过proteus搭建仿真电路,确定使用的元件和对应的接口。之后按照实现目标进行程序编写,结合proteus仿真在编程的过程中不断调试,以达到想要的实验结果。

e1bdfeae9c6945789599900e9ac749a1.png
LED单数表示南北方向,双数为东西方向。上电后先由南北向通行,27秒绿灯,27-30秒绿灯闪烁,30-33秒亮黄灯,之后切换为南北向通行。

上图为实际硬件,如图所示(a)(b)图表示在27秒时绿灯是闪烁状态。图(c)表示在30-33秒黄灯亮的效果。图(d)表示在换向之后的工作状态。

我的开发环境是vscode+eide
src文件夹里面是代码
自己需要自己移植到keil环境

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/790112
推荐阅读
相关标签
  

闽ICP备14008679号