当前位置:   article > 正文

51单片机模拟十字路口红绿灯小课设_51单片机红绿灯

51单片机红绿灯

如需要源文件可以添加qq群聊获取:662177587

概要

实际设计图

设计内容

    本课题对基于单片机的交通灯控制系统进行设计。以单片机为控制核心,设计并制作交通灯控制系统,用于十字路口的车辆及行人的交通管理。东西南北四个路口通行指示灯,并分别用计时器显示路口通行转换剩余时间, 在特种车辆如110、120通过路口时,系统可自动转为特种车辆放行,其他车辆禁止通行状态。模拟交通信号灯的交替变换;最大限度的提高交通的顺畅交替运行;系统硬件设计与实现;节省能源消耗。

(1) 设计交通灯状态的管理方案;

(2) 设计单片机的最小系统和周边电路;

(3) 设计整个系统的电路分布和接线;

(4) 使用C语言编写整个系统运行的程序。

研究目标

设计一个基于单片机的十字路口交通灯控制电路,要求南北方向和东西方向两个交叉路口的车辆交替运行,车流量大,通行时间长,车流量小,通行时间短。每次绿灯变红灯时,要求黄灯先亮5S,才能变换运行车辆。东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用数码管显示器进行显示(采用倒计时的方法)。考虑到特殊车辆情况,设置紧急转换开关。

整体架构流程

首先我们应知道实际的十字路口灯的运转情况,在十字路口观察可以发现,主要由红黄绿三种颜色构成,在绿灯向红灯切换时会有一小部分的黄灯警告阶段,而红灯向绿灯转换时并没有。

由此我们可以使用一个状态机,分别表示红绿灯在一个循环内的所有情况。

如图上图所示,设初始状态为0态,此时南北为绿灯,东西为红灯;1态为绿灯向红灯过渡的黄灯态;2态时东西为绿灯,南北为红灯;3态时东西为黄灯,南北依然是红灯,接着进入下一循环。

因此只要设定红灯的时间time和黄灯过渡的时间yellow即可,count是一个1秒自动加一的变量。通过该变量则可以判断出当前处于哪一状态,当count=time*2时,进入下一循环。

倒计时和状态的计算如下所示:

  1. 0-判断:count<time-yellow,
  2. 南倒计时=time-yellow-count,
  3. 东倒计时=time-count
  4. 1-判断:time-yellow<count<time,
  5. 南倒计时=yellow-(count-(time-yellow)),
  6. 东倒计时=time-count
  7. 2-判断:time<count<time*2-yellow,
  8. 南倒计时=time-(count-time)
  9. 东倒计时=(time-yellow)-(count-time)
  10. 3-判断:time*2-yellow<count<time*2
  11. 南倒计时=time-(count-time)
  12. 东倒计时=yellow-(count-time-(time-yellow))
  13. Count=2*time则清零

技术细节

具体的细节可以参照下面的代码:

  • main函数
  1. #include <STC89C5xRC.H>
  2. #include "Timer0.h"
  3. #include "Nexie.h"
  4. unsigned char short_time = 20; //³µÁ÷Á¿Ð¡Ê±¼ä
  5. unsigned char long_time = 35; //³µÁ÷Á¿´óʱ¼ä
  6. unsigned char yellow = 3; //»ÆµÆʱ¼äӦСÓÚÕý³£Ê±¼ä
  7. unsigned char run_flag = 0;
  8. unsigned char h_time,v_time;//ˮƽºÍ´¹Ö±·½Ïòµ¹¼ÆʱÏÔʾ±äÁ¿
  9. bit spec_flag=0;//ÓÐÎÞÌØÖÖ³µ±ê־λÓÐΪ1£¬ÎÞΪ0
  10. bit liul_flag=0;//³µÁ÷Á¿±ê־λСΪ0£¬´óΪ1
  11. unsigned int count=0; //¶¨Ê±Æ÷×ܼÆʱʱ¼ä
  12. unsigned char time; //´æ´¢ÕæʵʹÓõÄÊÇlong»¹ÊÇshortʱ¼ä
  13. /**
  14. * @brief ÑÕÉ«Åжϼ°ÏÔʾ
  15. * @param ÎÞ
  16. * @retval ÎÞ
  17. */
  18. void led_color(void)
  19. {
  20. if(spec_flag==0)//ÏÈÈ·¶¨²»ÊÇÔÚÌØÖÖ³µÇé¿öÏÂ,·Ö0-3ÖÖÇé¿öÌÖÂÛ
  21. {
  22. switch(run_flag)
  23. {
  24. case 0:
  25. P10=0;P11=0;P12=1;
  26. P13=1;P14=0;P15=0;break;
  27. case 1:
  28. P10=0;P11=1;P12=0;
  29. P13=1;P14=0;P15=0;break;
  30. case 2:
  31. P10=1;P11=0;P12=0;
  32. P13=0;P14=0;P15=1;break;
  33. case 3:
  34. P10=1;P11=0;P12=0;
  35. P13=0;P14=1;P15=0;break;
  36. }
  37. }
  38. else //ÌØÖÖ³µÇé¿öÈ«²¿ÁÁºìµÆ
  39. {
  40. P10=1;P11=0;P12=0;
  41. P15=0;P14=0;P13=1;
  42. }
  43. }
  44. /**
  45. * @brief °´¼üɨÃè
  46. * @param ÎÞ
  47. * @retval ÎÞ
  48. */
  49. void Key_Loop()
  50. {
  51. if(P30==0) //ÌØÖÖ³µ°´¼ü°´ÏÂÖñê־λspec_flag
  52. {
  53. spec_flag=1;
  54. }
  55. else
  56. {
  57. spec_flag=0;//·ñÔòspec_flagÇåÁã
  58. }
  59. if(P31==0)
  60. {
  61. liul_flag=1;//³µÁ÷Á¿´ó°´¼ü°´ÏÂÖñê־λliul_flag
  62. time=long_time;
  63. }
  64. else
  65. {
  66. liul_flag=0;//·ñÔòliul_flagÇåÁã
  67. time=short_time;
  68. }
  69. }
  70. /**
  71. * @brief ÊýÂë¹ÜÊý×ÖÏÔʾ
  72. * @param ÎÞ
  73. * @retval ÎÞ
  74. */
  75. void num_show()
  76. {
  77. if(spec_flag==0) //ÏÈÈ·¶¨²»ÊÇÔÚÌØÖÖ³µÇé¿öÏÂÏÔʾµ¹¼Æʱ
  78. {
  79. Nixie_SetBuf(1,v_time/10%10);
  80. Nixie_SetBuf(2,v_time%10);
  81. Nixie_SetBuf(3,h_time/10%10);
  82. Nixie_SetBuf(4,h_time%10);
  83. }
  84. else //ÊÇÔÚÌØÖÖ³µÇé¿öÏ£¬µ¹¼ÆʱÏÔʾ¡°--¡±
  85. {
  86. Nixie_SetBuf(1,10);
  87. Nixie_SetBuf(2,10);
  88. Nixie_SetBuf(3,10);
  89. Nixie_SetBuf(4,10);
  90. }
  91. }
  92. void main()
  93. {
  94. Timer0_Init(); //¶¨Ê±Æ÷0³õʼ»¯
  95. while(1)
  96. {
  97. num_show(); //Ñ­»·É¨Ãè
  98. led_color();
  99. }
  100. }
  101. /**
  102. * @brief ¶¨Ê±Æ÷0µÄÏà¹Ø²Ù×÷
  103. * @brief ¶¨Ê±Æ÷0Ϊģʽ1,16Ϊ²»×Ô¶¯ÖØÔØ,1msÖжÏ
  104. * @param ÎÞ
  105. * @retval ÎÞ
  106. */
  107. void Timer0_Routine() interrupt 1
  108. {
  109. static unsigned int T0Count0,T0Count1,T0Count2;//¶¨Ê±Æ÷Ïà¹Ø±äÁ¿
  110. TL0 = 0x18; //ÉèÖö¨Ê±³õʼֵ
  111. TH0 = 0xFC; //ÉèÖö¨Ê±³õʼֵ
  112. T0Count0++;T0Count1++;T0Count2++;//ÿ1ms½øÐÐÒ»´Î++£»
  113. if(T0Count0>=10)//10msµ÷ÓÃÒ»´ÎKey_Loop()º¯Êý
  114. {
  115. T0Count0=0;
  116. Key_Loop();
  117. }
  118. if(T0Count1>=2)//2msµ÷ÓÃÒ»´ÎNixie_Loop()º¯Êý
  119. {
  120. T0Count1=0;
  121. Nixie_Loop();
  122. }
  123. if(T0Count2>=1000)//1Ãë½øÈëÒ»´Î
  124. {
  125. T0Count2=0;
  126. if(spec_flag==0)//Èç¹û²»ÊÇÌØÊâÇé¿öÔò¿ªÆô¼ÆÊý
  127. {
  128. count++;
  129. if(count==2*time)
  130. {count=0;run_flag=0;}
  131. if(count<=time-yellow)
  132. {
  133. run_flag=0;//ÅжÏΪ״̬0
  134. v_time=time-yellow-count;
  135. h_time=time-count;
  136. }
  137. else if(time-yellow<count && count<=time)
  138. {
  139. run_flag=1;//ÅжÏΪ״̬1
  140. v_time=yellow-(count-(time-yellow));
  141. h_time=time-count;
  142. }
  143. else if(time<count && count<=time*2-yellow)
  144. {
  145. run_flag=2;//ÅжÏΪ״̬2
  146. v_time=time-(count-time);
  147. h_time=(time-yellow)-(count-time);
  148. }
  149. else if(time*2-yellow<count && count<time*2)
  150. {
  151. run_flag=3;//ÅжÏΪ״̬3
  152. v_time=time-(count-time);
  153. h_time=yellow-(count-time-(time-yellow));
  154. }
  155. }
  156. }
  157. }
  • 定时器初始化.c
  1. #include <STC89C5xRC.H>
  2. /**
  3. * @brief ¶¨Ê±Æ÷³õʼ»¯
  4. * @param ÎÞ
  5. * @retval ÎÞ
  6. */
  7. void Timer0_Init(void) //100us@12.000MHz
  8. {
  9. TMOD &= 0xF0; //¶¨Ê±Æ÷ʱÖÓ12Tģʽ
  10. TMOD |= 0x01; //ÉèÖö¨Ê±Æ÷ģʽ
  11. TL0 = 0x18; //ÉèÖö¨Ê±³õʼֵ
  12. TH0 = 0xFC; //ÉèÖö¨Ê±³õʼֵ
  13. TF0 = 0; //Çå³ýTF0±êÖ¾
  14. TR0 = 1; //¶¨Ê±Æ÷0¿ªÊ¼¼Æʱ
  15. ET0=1;
  16. EA=1;
  17. PT0=0;
  18. }
  • 定时器初始化.h
  1. #ifndef __TIMER0_H__
  2. #define __TIMER0_H__
  3. void Timer0_Init(void);
  4. #endif
  • 数码管.c
  1. #include <STC89C5xRC.H>
  2. #include "Delay.h"
  3. unsigned char Nixie_Buf[11]={0,10,10,10,10};//0ÊÇΪÁËÕÕÓ¦loopÖÐi=1
  4. unsigned char NixieNumb[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
  5. /**
  6. * @brief Íⲿµ÷ÓöÔÊý×éNixie_Buf[4]¸³Öµ
  7. * @brief ʹµÃloopº¯ÊýÑ­»·¶Ôscanº¯Êý¸³ÖµÊ±¶Áµ½ÏàÓ¦Êý¾Ý
  8. * @brief δ¸³ÖµµÄÊý×éλ¼´Îª10£»¶ÔÓ¦NixieNumb[]ÖеÄ0£»
  9. * @param Table,NumberÔÚNixie_BufÊý×éµÄÏÂ±ê ¸³µÄÖµ£¨¸ÃÖµ¼´¶ÔÓ¦NixieNumb[]ÖеÄÖµ£©
  10. * @retval ÎÞ
  11. */
  12. void Nixie_SetBuf(unsigned char Table,Number)
  13. {
  14. Nixie_Buf[Table]=Number;
  15. }
  16. /**
  17. * @brief ÊýÂë¹ÜÏÔʾ
  18. * @param Table,NumberÏÔʾµÄλÖà ÏÔʾµÄÊý×Ö
  19. * @param Á½²ÎÊýÓɶ¨Ê±Æ÷°´ÖÜÆÚɨÃèʱ¸ø¶¨
  20. * @retval ÎÞ
  21. */
  22. void Nixie_Scan(unsigned char Table,Number)
  23. {
  24. P0=0x00;//ÏûÒþ
  25. switch(Table)
  26. {// P2_4=C-4,P2_3=B-2;P2_2=A-1
  27. case 1:P24=1;P23=1;P22=1;break;
  28. case 2:P24=1;P23=1;P22=0;break;
  29. case 3:P24=1;P23=0;P22=1;break;
  30. case 4:P24=1;P23=0;P22=0;break;
  31. }
  32. P0=NixieNumb[Number];//²»ÓÃdelayÔÙÏûÒþ£¬ÒòΪ¶¨Ê±Æ÷½øÀ´ÓÐʱ¼ä¼ä¸ô
  33. }
  34. /**
  35. * @brief ¶¨Ê±Æ÷µ÷Óõĺ¯Êý
  36. * @param ÎÞ
  37. * @retval ÎÞ
  38. */
  39. void Nixie_Loop(void)//¶¨Ê±Æ÷ÿ½øÒ»´Î¾Íµ÷ÓÃÒ»´Îscanº¯Êý
  40. { //ʹµÃ3¸öÊýÂë¹ÜÒÀ´Î¿ìËÙÏÔʾ
  41. static unsigned char i=1;
  42. Nixie_Scan(i,Nixie_Buf[i]);
  43. i++;
  44. if(i>=5)i=1;
  45. }
  • 数码管.h
  1. #ifndef __NEXIE_H__
  2. #define __NEXIE_H__
  3. void Nixie_Scan(unsigned char Table,Number);
  4. void Nixie_Loop(void);
  5. void Nixie_SetBuf(unsigned char Table,Number);
  6. #endif

小结

本课题对基于单片机的交通灯控制系统进行设计。以单片机为控制核心,设计并制作交通灯控制系统,用于十字路口的车辆及行人的交通管理。

如需要源文件可以添加qq群聊获取:662177587

希望对你有所帮助!

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

闽ICP备14008679号