找回密码
 立即注册

QQ登录

只需一步,快速开始

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

交通灯单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:208311 发表于 2017-6-6 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. #include<at89x51.h>
  3. #define uchar unsigned char/*定义字符串类型为无符号型*/
  4. uchar code a[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. uchar code b[4]={0x0D,0x0E,0x07,0x0B};/****P2口,低有效*/
  6. uchar code c[4]={0xDE,0xDD,0xF3,0xEB};/****P1口,低有效*/
  7. char SN=25,WE=30;
  8. char SN_G=25,WE_G=15,Y=5;
  9. uchar i,k=0,count=0;
  10. void delay(uchar t);/*定义函数*/
  11. void?light();/*定义函数*/
  12. void?led();/*定义函数*/
  13. sbit K0=P3^7;/*开关K0接P3^7管脚*/
  14. sbit K1=P3^6;/*开关K1接P3^6管脚*/
  15. sbit K2=P3^3;/*开关K2接P3^3管脚*/
  16. sbit K3=P3^5;/*开关K3接P3^5管脚*/
  17. sbit K4=P3^2;/*开关K4接P3^2管脚*/
  18. /*程序初始化*/
  19. void init(void)
  20. {
  21. /*12MHz*/
  22. TMOD=0x01;/**计数器用模式1,为16位计数器*****/
  23. TH1=(65536-50000)/256;/*0x3C*/
  24. TL1=(65536-50000)%256;/*0xB0*//*计50000个数,用时50ms*/
  25. IT0=1;/*外部中断0为边沿触发方式*/
  26. ET0=1;/*允许T0中断*/
  27. TR0=1;/*启动计数器*/
  28. EA=1;/*CPU开放总中断*/
  29. EX0=1;/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/
  30. EX1=1;/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/
  31. }
  32. /*中断0处理程序*/
  33. void int0(void) interrupt0
  34. {
  35. EA=0;/*CPU禁止响应一切中断*/
  36. P1=0xDB,P0=a[0];/*东西南北方向均红灯亮,P0口输出0*/
  37. for(;;)/*无条件循环*/
  38. {
  39. P2=b[0],P0=a[(SN_G+Y)%10];/*南北方向数码管显示可通行时间的个位*/
  40.    delay(5);/*延时*/
  41.   P2=b[1],P0=a[(SN_G+Y)/10];/*南北方向数码管显示可通行时间的十位*/
  42.    delay(5);/*延时*/
  43.   P2=b[2],P0=a[(WE_G+Y)%10];/*东西方向数码管显示可通行时间的个位*/
  44.    delay(5);/*延时*/
  45.   P2=b[3],P0=a[(WE_G+Y)/10];/*东西方向数码管显示可通行时间的十位*/
  46.    delay(5);/*延时*/
  47.    
  48. /*设置南北方向通行时间*/
  49. if(K0==0)/*P3^7=0*/
  50. {
  51.    delay(10);/*延时,把抖动的时间抛掉*/
  52.    if(K0==0)
  53. {
  54.    while(!K0)/*当松开K0开关时,跳出空循环,执行后面的程序*/
  55. {
  56. }
  57.    SN_G++;/*南北方向绿灯时间+1*/
  58.    if(SN_G==100)
  59.    SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/
  60. }
  61. }
  62. /*设置南北方向通行时间*/
  63. if(K0==0)/*P3^7=0*/
  64. {
  65.    delay(10);/*延时,把抖动的时间抛掉*/
  66.    if(K0==0)
  67. {
  68.    while(!K0)/*当松开K0开关时,跳出空循环,执行后面的程序*/
  69. {
  70. }
  71.    SN_G++;/*南北方向绿灯时间+1*/
  72.    if(SN_G==100)
  73.    SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/
  74. }
  75. }
  76. /*设置东西方向通行时间*/
  77. if(K1==0)/*P3^6=0*/
  78. {
  79.    delay(10);/*延时,把抖动的时间抛掉*/
  80.    if(K1==0)
  81. {
  82.    while(!K1)/*当松开K1开关时,跳出空循环,执行后面的程序*/
  83. {
  84. }
  85.    WE_G++;/*东西方向绿灯时间+1*/
  86.    if(WE_G==100)
  87.    WE_G=0;/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/
  88. }
  89. }
  90. /*返回*/
  91. if(K3==0)
  92. {
  93.   while(!K3)/*当松开K3开关时,跳出空循环,执行后面的程序*/
  94.   {
  95.   }
  96.   count=0;/*清零*/
  97.    k=0;/*南北方向通车,东西方向不通车*/
  98.    SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
  99.    light();/*调用交通灯函数*/
  100.    led();/*调用数码管函数*/
  101.    EA=1;/*CPU开放总中断*/
  102.     break;/*跳出*/
  103.    }
  104.    }
  105.   }
  106. }
  107. /*中断1处理程序*/
  108. void int1(void) interrupt2
  109. {
  110. P1=0xDB,P0=a[0];/*东西南北方向均红灯亮,P0口输出0*/
  111.    EA=0;/*CPU禁止响应一切中断*/
  112. TR0=!TR0;/*计数器停止工作*/
  113.    for(;;)/*无条件循环*/
  114. {
  115. /*数码管扫描程序*/
  116. P2=b[0];/*显示南北方向个位*/
  117. delay(5);/*延时*/
  118. P2=b[1];/*显示南北方向十位*/
  119. delay(5);/*延时*/
  120. P2=b[2];/*显示东西方向个位*/
  121. delay(5);/*延时*/
  122. P2=b[3];/*显示东西方向十位*/
  123. delay(5);/*延时*/
  124. /*返回*/
  125. if(K3==0)   /*P3^5=0*/
  126. {
  127. delay(10);/*延时,把抖动的时间抛掉*/
  128. if(K3==0)
  129. {
  130. while(!K3)/*当松开K3开关时,跳出空循环,执行后面的程序*/
  131. {
  132. }
  133. EA=1;/*CPU开放总中断*/
  134. TR0=!TR0;/*启动计数器*/
  135. break;/*跳出*/
  136.    }
  137.    }
  138.   }
  139. }
  140. /*键盘程序*/
  141. void key()
  142. {
  143. /*南北有车而东西无车*/
  144. if(K0==0)  /*K0=0*/
  145. {
  146. delay(10);/*延时,把抖动的时间抛掉*/
  147. if(K0==0)
  148. {
  149. while(!K0)/*当松开K0开关时,跳出循环,执行后面的程序*/
  150. {
  151. light();/*调用交通灯函数*/
  152. led();/*调用数码管函数*/
  153. }
  154. count=0;/*清零*/
  155. k=0;/*南北方向通车,东西方向不通车*/
  156. SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
  157. light();/*调用交通灯函数*/
  158. led();/*调用数码管函数*/
  159. }
  160. }
  161. /*南北无车而东西有车*/
  162. if(K1==0)  /*K1=0*/
  163. {
  164. delay(10);/*延时,把抖动的时间抛掉*/
  165. if(K1==0)
  166. {
  167. while(!K1)/*当松开K1开关时,跳出循环,执行后面的程序*/
  168. {
  169. light();/*调用交通灯函数*/
  170. led();/*调用数码管函数*/
  171. }
  172. count=0;/*清零*/
  173. k=2;/*南北方向不通车,东西方向通车*/
  174. SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
  175. light();/*调用交通灯函数*/
  176. led();/*调用数码管函数*/
  177. }
  178. }
  179. }
  180. /*定时函数*/
  181. void time 1(void) interrupt 1
  182. {
  183. TH0=0x3c;
  184. TL0=0xb0;/*计50000个数,用时50ms*/count++;
  185. /*自增运算*/
  186. if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/
  187. {
  188. SN--;/*自减运算*/
  189. WE--;/*自减运算*/
  190. count=0;/*清零*/
  191. if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
  192. {
  193. k++;/*自增运算*/
  194. if(k>3)/*当k>3时,执行程序*/
  195. k=0;/*清零*/
  196. switch(k)/*switch语句*/
  197. {
  198. case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
  199. case 1:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/
  200. case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
  201. case 3:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/
  202.    }
  203.    }
  204.   }
  205. }
  206. /*延时t毫秒*/
  207. void delay(uchar t)
  208. {
  209. uchari;
  210. for(t;t>0;t--)
  211. {
  212. for(i=2000;i>0;i--)
  213. {}
  214. }
  215. }
  216. /*交通灯函数*/
  217. void light()
  218. {
  219. P1=c[k];/*交通灯对应着k的值变化*/
  220. if(P1==c[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
  221. {
  222. TH1=(65536-50000)/256;
  223. TL1=(65536-50000)%256;/*延时50ms*/
  224. P1=0xDF;/*南北方向黄灯熄灭,东西方向亮红灯*/
  225. }
  226. else
  227. if(P1==c[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/
  228. {
  229. TH1=(65536-300000)/256;
  230. TL1=(65536-300000)%256;/*延时50ms*/
  231. P1=0xFB;/*南北方向亮红灯,东西方向黄灯熄灭*/
  232. }
  233. }
  234. /*数码管函数*/
  235. void led()
  236. {
  237. P2=b[0],P0=a[SN%10];/*显示南北方向个位*/
  238. delay(5);/*延时*/
  239. P2=b[1],P0=a[SN/10];/*显示南北方向十位*/
  240. delay(5);/*延时*/  
  241. P2=b[2],P0=a[WE%10];/*显示东西方向个位*/
  242. delay(5);/*延时*/
  243. P2=b[3],P0=a[WE/10];/*显示东西方向十位*/
  244. delay(5);/*延时*/
  245. }
  246. /*主函数*/
  247. void main(void)
  248. {
  249. init();/*调用程序初始化函数*/
  250. for(;;)/*无条件循环*/
  251. {
  252. key();/*调用键盘程序*/
  253. light();/*
  254. 调用交通灯函数*/

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

使用道具 举报

沙发
ID:201299 发表于 2017-6-7 08:52 | 只看该作者
学习了,为楼主点赞。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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