找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2023|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

剛接觸單片機(jī)新手想請(qǐng)教大神們?nèi)绾涡薷倪@個(gè)交通燈程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:864486 發(fā)表于 2020-12-21 20:38 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
666黑幣
之前都是自己看書(shū)學(xué)的單片機(jī),今天我第一次接觸真正的實(shí)體,不是很熟悉板子,就是下面那個(gè)自己找了一個(gè)覺(jué)得還不錯(cuò)的交通燈程序研究,發(fā)現(xiàn)有幾個(gè)地方還是不太清楚,下面是程序源碼

想問(wèn)一下如何在以下條件下修改一下源碼
以前見(jiàn)過(guò)其他型號(hào)的試驗(yàn)臺(tái),上面那個(gè)確實(shí)不太熟悉,最好也能分享一下連接思路,謝謝各位大神了,如有冒犯,還請(qǐng)諒解。

單片機(jī)源程序如下:
  1. #include
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define OFF 0 //定義燈泡開(kāi)關(guān)
  5. #define ON 1
  6. sbit ew_zx_red = P1^0;   //東西直行紅黃綠
  7. sbit ew_zx_yellow = P1^1;
  8. sbit ew_zx_green = P1^2;
  9. sbit ew_zz_red = P1^3;   //東西左轉(zhuǎn)紅黃綠
  10. sbit ew_zz_yellow = P1^4;
  11. sbit ew_zz_green = P1^5;
  12. sbit sn_zx_red = P2^0;   //南北直行紅黃綠
  13. sbit sn_zx_yellow = P2^1;
  14. sbit sn_zx_green = P2^2;
  15. sbit sn_zz_red = P2^3;   //南北左轉(zhuǎn)紅黃綠
  16. sbit sn_zz_yellow = P2^4;
  17. sbit sn_zz_green = P2^5;
  18. sbit seg_1 = P1^6;  //東西數(shù)碼管位選開(kāi)關(guān)
  19. sbit seg_2 = P1^7;
  20. sbit seg_3 = P2^6;  //南北數(shù)碼管位選開(kāi)關(guān)
  21. sbit seg_4 = P2^7;
  22. int time = 0; //計(jì)時(shí)器
  23. int count = 0;
  24. unsigned char SEG_CA[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
  25. unsigned char SEG_CC[10] = {0x3f, 0x06, 0x5b, 0x1f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  26. void delay()
  27. {
  28. int i;
  29. for(i = 0; i < 10; i++);
  30. }
  31. void display_ew(unsigned int num)  //東西數(shù)字顯示
  32. {
  33.    P0 = SEG_CA[num/10];   //點(diǎn)亮數(shù)字高位
  34.     seg_1 = ON;
  35. delay();
  36.     seg_1 = OFF;
  37.     P0 = SEG_CA[num%10];   //點(diǎn)亮數(shù)字低位
  38. seg_2 = ON;
  39. delay();
  40.     seg_2 = OFF;
  41. }
  42. void display_sn(unsigned int num)  //南北數(shù)字顯示
  43. {
  44.    P0 = SEG_CA[num/10];  //點(diǎn)亮數(shù)字高位
  45.     seg_3 = ON;
  46. delay();
  47.     seg_3 = OFF;
  48.     P0 = SEG_CA[num%10];  //點(diǎn)亮數(shù)字低位
  49. seg_4 = ON;
  50. delay();
  51.     seg_4 = OFF;
  52. }
  53. void display_ew_shan(unsigned int num)  //東西3s 倒計(jì)時(shí)閃爍顯示
  54. {
  55. if(count < 2000)
  56. display_ew(num);
  57. else
  58. {
  59. seg_1 = OFF;
  60. seg_2 = OFF;
  61. }
  62. }
  63. void display_sn_shan(unsigned int num)  //南北3s倒計(jì)時(shí)閃爍顯示
  64. {
  65. if(count < 2000)
  66. display_sn(num);
  67. else
  68. {
  69. seg_3 = OFF;
  70. seg_4 = OFF;
  71. }
  72. }
  73. void init()
  74. {
  75. P0 = 0x00;
  76. P1 = 0x00;
  77. P2 = 0x00;
  78. EA = 0; //關(guān)總中斷
  79. ET0 = 1; //開(kāi)定時(shí)器0中斷
  80. TMOD = 0x02; //定時(shí)器0工作方式2
  81. TL0 = 6; //定時(shí)250us
  82. TH0 = 6;
  83. EA = 1;   //開(kāi)總中斷
  84. TR0 = 1;  //開(kāi)始定時(shí)
  85. }
  86. void main()
  87. {
  88.     init();
  89.     while(1)
  90.     {
  91. /*************************************************************
  92. 開(kāi)始東西直行綠燈亮,東西左轉(zhuǎn)紅燈亮27s,顯示綠燈倒計(jì)時(shí)30s
  93. 南北直行、左轉(zhuǎn)紅燈亮50s,顯示紅燈倒計(jì)時(shí)50s
  94. *************************************************************/
  95.   while(time%100 < 27)
  96.   {
  97.   ew_zx_green = ON;  //東西直行綠燈亮,顯示27s
  98.   ew_zx_yellow = OFF;
  99.   ew_zx_red = OFF;
  100.   display_ew(30 - time);
  101.   ew_zz_red = ON;  //東西左轉(zhuǎn)紅燈亮
  102.   ew_zz_green = OFF;
  103.   ew_zz_yellow = OFF;
  104.   sn_zx_red = ON;  //南北直行紅燈亮,顯示時(shí)間50s
  105.   sn_zx_yellow = OFF;
  106.   sn_zx_green = OFF;
  107.   display_sn(50 - time);
  108.   sn_zz_red = ON;  //南北左轉(zhuǎn)紅燈亮,顯示時(shí)間50s
  109.   sn_zz_yellow = OFF;
  110.   sn_zx_green = OFF;
  111.   }
  112. /*************************************************************
  113. 東西直行黃燈亮3s, 倒計(jì)時(shí)開(kāi)始閃爍
  114. 東西左轉(zhuǎn),南北方向不變
  115. *************************************************************/
  116.   while(time%100 >= 27 && time%100 < 30)
  117.   {
  118.   ew_zx_yellow = ON;  //東西直行黃燈亮 ,顯示時(shí)間3s
  119.   ew_zx_red = OFF;
  120.   ew_zx_green = OFF;
  121.   display_ew_shan(30 - time);
  122.   display_sn(50 - time);
  123.   }
  124. /*************************************************************
  125. 東西左轉(zhuǎn)綠燈亮17s,直行紅燈亮 ,顯示綠燈倒計(jì)時(shí)20s
  126. 南北方向不變
  127. *************************************************************/
  128.   while(time%100 >= 30 && time%100 < 47)
  129.   {
  130.   ew_zz_green = ON; //東西左轉(zhuǎn)綠燈亮,顯示時(shí)間17s
  131.   ew_zz_red = OFF;
  132.   ew_zz_yellow = OFF;
  133.   display_ew(50-time);
  134.   ew_zx_red = ON;  //東西直行紅燈亮
  135.   ew_zx_yellow =OFF;
  136.   ew_zx_green = OFF;
  137.   display_sn(50-time);  //南北繼續(xù)顯示倒計(jì)時(shí)
  138.   }
  139. /*************************************************************
  140. 東西左轉(zhuǎn)黃燈亮3s, 倒計(jì)時(shí)開(kāi)始閃爍 3s
  141. 東西直行,南北方向不變
  142. *************************************************************/
  143.   while(time%100 >= 47 && time%100 < 50)
  144.   {
  145.   ew_zz_yellow = ON; //東西左轉(zhuǎn)黃燈亮,顯示時(shí)間3s
  146.   ew_zz_red = OFF;
  147.   ew_zz_green = OFF;
  148.   display_ew_shan(50-time);
  149.   display_sn(50-time);  //南北繼續(xù)顯示倒計(jì)時(shí)
  150.   }
  151. /*************************************************************
  152. 東西左轉(zhuǎn)紅燈亮50s,直行不變,顯示倒計(jì)時(shí)50s
  153. 南北直行綠燈亮27,左轉(zhuǎn)不變,顯示綠燈倒計(jì)時(shí)30s
  154. *************************************************************/
  155.   while(time%100 >=50 && time%100 < 77)
  156.   {
  157. sn_zx_green = ON; //南北直行綠燈亮,顯示時(shí)間27s
  158. sn_zx_yellow = OFF;
  159. sn_zx_red = OFF;
  160. display_sn(80 - time);
  161. ew_zz_red = ON;   //東西左轉(zhuǎn)紅燈亮,顯示時(shí)間50s
  162. ew_zz_yellow = OFF;
  163. ew_zz_green = OFF;
  164. display_ew(100 - time);
  165. }
  166. /*************************************************************
  167. 南北直行黃燈亮3s,左轉(zhuǎn)不變,顯示黃燈閃爍倒計(jì)時(shí)3s
  168. 東西不變
  169. *************************************************************/
  170. while(time%100 >= 77 && time%100 < 80)
  171. {
  172. sn_zx_yellow = ON; //南北直行黃燈亮,顯示時(shí)間3s
  173. sn_zx_red = OFF;
  174. sn_zx_green = OFF;
  175. display_sn_shan(80 - time);

  176. display_ew(100 - time);
  177. }
  178. /*************************************************************
  179. 南北左轉(zhuǎn)綠燈亮17s,直行不變,顯示綠燈倒計(jì)時(shí)20s
  180. 東西不變
  181. *************************************************************/
  182. while(time%100 >=80 && time%100 <97)
  183. {
  184. sn_zz_green = ON;  //南北左轉(zhuǎn)綠燈亮, 顯示17s
  185. sn_zz_red = OFF;
  186. sn_zz_yellow = OFF;
  187. display_sn(100-time);
  188. sn_zx_red = ON; //南北直行紅燈亮
  189. sn_zx_yellow = OFF;
  190. sn_zx_green = OFF;
  191. display_ew(100 - time); //東西繼續(xù)倒計(jì)時(shí)
  192. }
  193. /*************************************************************
  194. 南北左轉(zhuǎn)黃燈亮17s,直行不變,顯示黃燈閃爍倒計(jì)時(shí)3s
  195. 東西不變
  196. *************************************************************/
  197. while(time%100 >= 97 && time<=100)
  198. {
  199. sn_zz_yellow = ON; //南北左轉(zhuǎn)黃燈亮, 顯示時(shí)間3s
  200. sn_zz_red = OFF;
  201. sn_zz_green = OFF;
  202. display_sn_shan(100 - time);
  203. display_ew(100 - time); //東西繼續(xù)倒計(jì)時(shí)
  204. }
  205.    }
  206. }
  207. void timer0() interrupt 1
  208. {
  209. count++;
  210. if(count == 4000)
  211. {
  212. time++;
  213. count = 0;
  214. }
  215. if(time > 100)
  216. time = 0;
  217. }
復(fù)制代碼

D][(4JJLS5KLG07IT3GSI)E.png (58.52 KB, 下載次數(shù): 103)

D][(4JJLS5KLG07IT3GSI)E.png

01E1CF23FEECDA8A0A7394BBCA88D165.jpg (300.27 KB, 下載次數(shù): 136)

01E1CF23FEECDA8A0A7394BBCA88D165.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表