找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1888|回复: 2
打印 上一主题 下一主题
收起左侧

初学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. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:462827 发表于 2020-3-1 20:09 | 只看该作者
加油!

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

使用道具 举报

板凳
ID:700456 发表于 2020-3-2 05:46 | 只看该作者
hantu 发表于 2020-3-1 20:09
加油!

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

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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