当前位置:   article > 正文

1914基于单片机的十字路口红绿灯控制器(仿真,程序,报告)【毕设课设】_单片机课设时间可调十字路口信号灯控制器

单片机课设时间可调十字路口信号灯控制器

一、系统概述

本系统基于单片机设计,用于控制十字路口的红绿灯信号。系统具备多种功能,包括红绿灯转换时的黄灯闪烁、主干道与辅干道的通行时间控制、手动/自动/特殊情况三种模式的切换、特殊情况下的红灯全亮以及自动模式下的倒计时显示,以及夜间模式的黄灯常亮。

二、硬件设计

  1. 单片机选型:选用合适的单片机作为主控芯片,如STC89C52等,具备足够的IO口和定时器资源。

  2. LED灯连接:红绿黄LED灯分别连接至单片机的P1口,通过控制P1口的电平状态实现LED灯的点亮和熄灭。

  3. 按键连接:使用单片机的P3口连接按键,实现手动、自动和特殊情况三种模式的切换。

  4. LED数码管连接:LED数码管连接至单片机的其他IO口,用于显示倒计时时间。

三、软件设计

  1. 初始化程序:初始化单片机的IO口、定时器等资源。

  2. 黄灯闪烁程序:利用延时函数实现黄灯闪烁三次,每次闪烁时间为2秒,总时间为6秒。

  3. 通行时间控制程序:设置主干道和辅干道的通行时间,利用定时器中断实现计时,并控制相应的LED灯状态。

  4. 模式切换程序:通过检测P3口的按键状态实现手动、自动和特殊情况三种模式的切换。

  5. 特殊情况处理程序:在特殊情况下,将所有路口的红灯点亮,其他灯熄灭。

  6. 倒计时显示程序:在自动模式下,利用定时器中断和LED数码管显示当前状态的倒计时时间。

  7. 夜间模式程序:在夜间模式下,使四个路口的黄灯常亮。

四、功能实现

  1. 功能1实现:在红绿灯转换时,先点亮黄灯并闪烁三次,然后切换至下一状态的灯。

  2. 功能2实现:设置主干道和辅干道的通行时间,以及单独左转信号的时长,并通过控制LED灯的状态实现通行信号的变化。

  3. 功能3实现:通过按键检测实现手动、自动和特殊情况三种模式的切换,并在不同模式下执行相应的控制逻辑。

  4. 功能4实现:在特殊情况下,将所有路口的红灯点亮,为紧急车辆(如120、110)提供通行。

  5. 功能5实现:在自动模式下,利用定时器中断和LED数码管显示当前状态的倒计时时间。

  6. 功能6实现:在夜间模式下,将四个路口的黄灯常亮,以提供足够的照明。

五、系统测试与调试

完成硬件制作和软件编程后,对系统进行全面的测试和调试,确保各项功能正常工作,并优化性能。

六、总结与展望

本文介绍了一种基于单片机的十字路口红绿灯控制器的设计方案。通过合理的硬件设计和软件编程,实现了多种功能,提高了交通管理的效率和安全性。未来,可以进一步优化算法和电路设计,提高系统的响应速度和稳定性,以适应更复杂的交通场景。

  1. include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit wela = P2^7; // 数码管位选
  5. sbit dula = P2^6; // 数码管段选
  6. // 下面是八个交通灯对应的位定义
  7. sbit LED1_blue = P1^0;
  8. sbit LED1_red = P1^1;
  9. sbit LED1_green = P1^2;
  10. sbit LED1_yellow = P1^3;
  11. sbit LED2_blue = P1^4;
  12. sbit LED2_red = P1^5;
  13. sbit LED2_green = P1^6;
  14. sbit LED2_yellow = P1^7;
  15. // 按键位定义
  16. sbit key_auto = P3^0; // 自动
  17. sbit key_step = P3^1; // 手动
  18. sbit key_emerg = P3^2; // 紧急情况 110/120通过
  19. sbit key_night = P3^6;// 夜间模式
  20. uint cnt = 0; // 记录定时器定时了多少毫秒
  21. uint sec = 0; // 记录定时器计时了多少秒
  22. uchar light_num = 0;
  23. // 四位八段共阴极数码管数字显示编码
  24. uchar code table[]={
  25. //"0" "1" "2" "3"
  26. 0x3f,0x06,0x5b,0x4f,
  27. //"4" "5" "6" "7"
  28. 0x66,0x6d,0x7d,0x07,
  29. //"8" "9" "A" "B"
  30. 0x7f,0x6f,0x77,0x7c,
  31. //"C" "D" "E" "F"
  32. 0x39,0x5e,0x79,0x71
  33. };
  34. uchar code light[]={
  35. // 主G辅R 主G辅R 主Y辅R
  36. 0xdb, 0xde, 0xd7,
  37. // 主R辅G 主R辅B 主R辅R
  38. 0xbd, 0xed, 0x7d,
  39. 0xdf, 0xee, 0xdd
  40. };
  41. /*************函数声明********************/
  42. void delay_ms(uint);
  43. void system_Init();
  44. void Display_R_time(uchar);
  45. void Display_C_time(uchar);
  46. void key_scan();
  47. void main()
  48. {
  49. system_Init();
  50. while(1)
  51. {
  52. key_scan();
  53. }
  54. }
  55. // 毫秒级延时
  56. void delay_ms(uint z)
  57. {
  58. uint x,y;
  59. for(x=z;x>0;x--)
  60. for(y=123;y>0;y--);
  61. }
  62. // 系统初始化
  63. void system_Init()
  64. {
  65. wela=0; // 关闭位选
  66. dula=0; // 关闭段选
  67. TMOD=0x01; // 定时器0方式1 16
  68. TH0=0x4c; // 定时器装初值 50ms(11.05926MHz TH0=0x4c TL0=0x00)
  69. TL0=0x00; // (12MHz 的初值是 TH0=0x3c TL0=0xb0)
  70. EA=1; // 开总中断
  71. ET0=1; // 开定时器0中断
  72. TR0=1; // 允许中断溢出
  73. }
  74. // 显示横向的(即辅干道)倒计时
  75. void Display_R_time(uchar time)
  76. {
  77. uchar time_tens, time_ones;
  78. time_tens = time / 10; // 提取倒计时时间的十位数
  79. time_ones = time % 10; // 提取倒计时时间的个位数
  80. // 下面对两位数倒计时时间进行显示(数码管)
  81. P0=0xff;
  82. wela=1;
  83. P0=0xbf;
  84. wela=0;
  85. dula=1;
  86. P0=table[time_tens];
  87. dula=0;
  88. delay_ms(1);
  89. P0=0xff;
  90. wela=1;
  91. P0=0x7f;
  92. wela=0;
  93. dula=1;
  94. P0=table[time_ones];
  95. dula=0;
  96. delay_ms(1);
  97. }
  98. // 显示竖向的(即主干道)倒计时
  99. void Display_C_time(uchar time)
  100. {
  101. uchar time_tens, time_ones;
  102. time_tens = time / 10;
  103. time_ones = time % 10;
  104. P0=0xff;
  105. wela=1;
  106. P0=0xfb;
  107. wela=0;
  108. dula=1;
  109. P0=table[time_tens];
  110. dula=0;
  111. ...部分代码

资料下载地址:

https://docs.qq.com/doc/p/ffc421513a628b30450ae742547c0b850456d7c8

 

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

闽ICP备14008679号