标题: 初学10天单片机,仿制交通信号灯,请多指导 [打印本页]

作者: jwulang    时间: 2020-3-1 07:23
标题: 初学10天单片机,仿制交通信号灯,请多指导
我是一名高中物理教师,因需指导学生进行小发明创造而利用寒假自学单片机,10天时间简单了解了一些单片机的功能,这是我仿制的交通信号灯程序及效果视频,望大家多多指导。


单片机源程序如下:
  1. #include "reg52.h"
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. sbit smg1=P3^1;
  5. sbit smg2=P3^2;
  6. sbit smg3=P3^3;
  7. sbit smg4=P3^4;
  8. #define GPIO_DIG P0
  9. #define GPIO_TRAFFIC P1
  10. sbit RED1 = P1^1;
  11. sbit YELLOW1= P1^2;
  12. sbit GREEN1 = P1^3;
  13. sbit RED2 = P1^4;
  14. sbit YELLOW2= P1^5;
  15. sbit GREEN2 = P1^6;
  16. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显 示 0~F 的值
  17. u8 DisplayData[4];
  18. u8 Second;
  19. /*函 数 名 : delay*/
  20. void delay(u16 i)
  21. {
  22. while(i--);
  23. }
  24. /*函 数 名 : DigDisplay*/
  25. void DigDisplay()
  26. {
  27. u8 i;
  28. for(i=0;i<4;i++)
  29. {
  30. switch(i)  
  31. {
  32.    case(0): smg1=0;smg2=1;smg3=1;smg4=1; break;
  33.    case(1): smg1=1;smg2=0;smg3=1;smg4=1; break;
  34.    case(2): smg1=1;smg2=1;smg3=0;smg4=1; break;
  35.    case(3): smg1=1;smg2=1;smg3=1;smg4=0; break;
  36. }
  37. GPIO_DIG=DisplayData[i];//发送段码
  38. delay(100); //间隔一段时间扫描
  39. GPIO_DIG=0x00;//消隐
  40. }
  41. }
  42. /*函 数 名 : Timer0Init*/
  43. void Timer0Init()
  44. {
  45. TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。
  46. TH0=0XFC; //给定时器赋初值,定时 1ms
  47. TL0=0X18;
  48. ET0=1;//打开定时器 0 中断允许
  49. EA=1;//打开总中断
  50. TR0=1;//打开定时器
  51. }
  52. /*函 数 名 : main*/
  53. void main()
  54. {
  55. Second = 1;
  56. Timer0Init();
  57. while(1)
  58. {
  59. if(Second == 30)
  60. {
  61. Second = 1;
  62. }
  63. if(Second < 11)
  64. {
  65. //周期1/4:南北1方向通行10秒//
  66. DisplayData[0] = smgduan[(10 - Second) % 100 / 10];
  67. DisplayData[1] = smgduan[(10 - Second) %10];
  68. DisplayData[2] = DisplayData[0];
  69. DisplayData[3] = DisplayData[1];
  70. DigDisplay();
  71. GPIO_TRAFFIC = 0x00;
  72. GREEN1 = 1;  
  73. RED2 = 1;  
  74. }
  75. //周期2/4:南北1方向黄灯5秒//
  76. else if(Second < 16)
  77. {
  78. DisplayData[0] = smgduan[(15 - Second) % 100 / 10];
  79. DisplayData[1] = smgduan[(15 - Second) %10];
  80. DisplayData[2] = DisplayData[0];
  81. DisplayData[3] = DisplayData[1];
  82. DigDisplay();  
  83. GPIO_TRAFFIC = 0x00;  
  84. YELLOW1 = 1;
  85. RED2 = 1;
  86. delay(20000);
  87. YELLOW1 = 0;
  88. delay(20000);
  89. }
  90. //周期3/4:东西2方向通行10秒//
  91. else if(Second < 26)
  92. {
  93. DisplayData[0] = smgduan[(25 - Second) % 100 / 10];
  94. DisplayData[1] = smgduan[(25 - Second) %10];
  95. DisplayData[2] = DisplayData[0];
  96. DisplayData[3] = DisplayData[1];
  97. DigDisplay();
  98. GPIO_TRAFFIC = 0x00;  
  99. RED1 = 1;  
  100. GREEN2 = 1;  
  101. }
  102. //周期4/4:东西2方向黄灯5秒//
  103. else
  104. {
  105. DisplayData[0] = smgduan[(30 - Second) % 100 / 10];
  106. DisplayData[1] = smgduan[(30 - Second) %10];
  107. DisplayData[2] = DisplayData[0];
  108. DisplayData[3] = DisplayData[1];
  109. DigDisplay();
  110. GPIO_TRAFFIC = 0x00;  
  111. RED1 = 1;
  112. YELLOW2 = 1;
  113. delay(20000);
  114. YELLOW2 = 0;
  115. delay(20000);
  116. }
  117. }
  118. }
  119. /*函 数 名 : void Timer0() interrupt 1*/
  120. void Timer0() interrupt 1
  121. {
  122. static u16 i;
  123. TH0=0XFC;
  124. TL0=0X18;
  125. i++;
  126. if(i==1000)
  127. {
  128. i=0;
  129. Second ++;
  130. }
  131. }
复制代码



作者: hantu    时间: 2020-3-1 20:09
加油!

不过,C语言代码呢最好还是要规范缩进排版比较好,不然真的不想看。
作者: jwulang    时间: 2020-3-2 05:46
hantu 发表于 2020-3-1 20:09
加油!

不过,C语言代码呢最好还是要规范缩进排版比较好,不然真的不想看。

嗯嗯,我会继续学习的,谢谢了!!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1