久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1983|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线影视 | 亚洲一区二区三区四区五区午夜 | 成人av高清 | 91精品国产一区 | 国产中文字幕在线 | 成人欧美一区二区三区黑人孕妇 | 日本在线一二 | 久久久久亚洲精品 | 国产专区在线 | 亚洲日本欧美日韩高观看 | 日本不卡一区二区三区 | 天天干狠狠操 | 日韩一区二区三区在线播放 | 91精品国产91久久久久久丝袜 | 国产精品视频一区二区三区 | 羞视频在线观看 | 91精品国产自产精品男人的天堂 | 黄色片在线看 | 色爱综合| 一区二区三区免费 | 欧美成人精品在线观看 | 欧美成人一区二免费视频软件 | 欧美精品成人一区二区三区四区 | 中文字幕国产 | 2019天天干夜夜操 | 久久精品日 | 欧美久久久久久久久 | 国产精品久久久久久久久久久久 | 国产亚洲一区二区三区在线 | 国产精品国产成人国产三级 | 中文字幕一区二区三区四区五区 | 精品综合| www.一区二区 | 日韩欧美在线一区 | 99久久99| 午夜亚洲 | 91精品国产91久久久久久三级 | 亚洲成人一区二区 | 日本特黄a级高清免费大片 国产精品久久性 | 欧美一区二区三区在线看 | 国产伦精品一区二区三区在线 |