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

QQ登錄

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

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

C51仿真實(shí)現(xiàn)交通燈+單片機(jī)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:404722 發(fā)表于 2018-11-11 16:58 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
觀察十字路口紅綠燈工作流程,設(shè)計(jì)交通燈。
1、初始時(shí):南北向、東西向直行左轉(zhuǎn)均為紅燈
2、南北向直行:
①南北向直行綠燈亮,延時(shí)若干秒
②啟動(dòng)南北向左轉(zhuǎn)數(shù)碼管顯示:倒計(jì)時(shí)6秒;同時(shí)南北向直行綠燈閃爍3下,滅亮滅亮滅亮共3秒,然后南北向直行綠燈滅,南北向直行黃燈亮,延時(shí)3秒
③南北向左轉(zhuǎn)數(shù)碼管倒計(jì)時(shí)顯示結(jié)束,關(guān)閉;同時(shí)南北向直行黃燈滅,南北向直行紅燈亮
3、南北向左轉(zhuǎn):
①南北向左轉(zhuǎn)綠燈亮,延時(shí)若干秒
②啟動(dòng)?xùn)|西向直行數(shù)碼管顯示:倒計(jì)時(shí)6秒;同時(shí)南北向左轉(zhuǎn)綠燈閃爍3下,滅亮滅亮滅亮共3秒,然后南北向左轉(zhuǎn)綠燈滅,南北向左轉(zhuǎn)黃燈亮,延時(shí)3秒
③東西向直行數(shù)碼管倒計(jì)時(shí)顯示結(jié)束,關(guān)閉;同時(shí)南北向左轉(zhuǎn)黃燈滅,南北向左轉(zhuǎn)紅燈亮
4、東西向直行:
①東西向直行綠燈亮,延時(shí)若干秒
②啟動(dòng)?xùn)|西向左轉(zhuǎn)數(shù)碼管顯示:倒計(jì)時(shí)6秒;同時(shí)東西向直行綠燈閃爍3下,滅亮滅亮滅亮共3秒,然后東西向直行綠燈滅,東西向直行黃燈亮,延時(shí)3秒
③東西向左轉(zhuǎn)數(shù)碼管倒計(jì)時(shí)顯示結(jié)束,關(guān)閉;同時(shí)東西向直行黃燈滅,東西向直行紅燈亮
5、東西向左轉(zhuǎn):
①東西向左轉(zhuǎn)綠燈亮,延時(shí)若干秒
②啟動(dòng)南北向直行數(shù)碼管顯示:倒計(jì)時(shí)6秒;同時(shí)東西向左轉(zhuǎn)綠燈閃爍3下,滅亮滅亮滅亮共3秒,然后東西向左轉(zhuǎn)綠燈滅,東西向左轉(zhuǎn)黃燈亮,延時(shí)3秒
③南北向直行數(shù)碼管倒計(jì)時(shí)顯示結(jié)束,關(guān)閉;同時(shí)東西向左轉(zhuǎn)黃燈滅,東西向左轉(zhuǎn)紅燈亮

電路原理圖如下:


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit LX0=P3^0;
  6. sbit LX1=P3^1;
  7. bit bp=0;
  8. uchar m,n,k;
  9. uchar time1[]={20,120};//數(shù)碼管第一狀態(tài)5s,第二狀態(tài)6s
  10. uchar time2[]={100,10,60};//交通燈第一狀態(tài)5s,第二狀態(tài)3s,第三狀態(tài)3s
  11. uint index1=1;
  12. uint index2=0;
  13. uchar tt[]={0x20,0x04};
  14. uint t=0;
  15. uint flag=0;
  16. uchar code table[]={
  17. 0x3f,0x06,0x5b,0x4f,
  18. 0x66,0x6d,0x7d,0x07,
  19. 0x7f,0x6f,0x77,0x7c,
  20. 0x39,0x5e,0x79,0x71,
  21. 0x00
  22. };
  23. uchar P2_0=0x01;//(P2.0~P2.3)選擇數(shù)碼管
  24. uchar P1_01=0x21;
  25. uchar P1_02=0x09;
  26. int number=6;
  27. void showNumber()
  28. {
  29.         if(index1==0)
  30.         {
  31.                 P2=P2_0;        
  32.                 P0=~table[number];
  33.                 if(number==0)
  34.                 {
  35.                         P2=0x00;
  36.                         P2_0<<=1;
  37.                         if(P2_0==0x10)
  38.                                 P2_0=0x01;
  39.                         number=6;
  40.                         index1=1;
  41.                 }
  42.         }
  43. }
  44. void openLight()
  45. {
  46.         switch(index2)
  47.         {
  48.                 case 0:
  49.                 if(m==time2[index2])
  50.                 {
  51.                         m=0;
  52.                         index2=1;        
  53.                 }        
  54.                 break;
  55.                 case 1:
  56.                 if(m==time2[index2])
  57.                 {
  58.                         m=0;
  59.                         k++;
  60.                         if(bp==0)
  61.                                 P1_01=P1_01^tt[t];
  62.                         else
  63.                                 P1_02=P1_02^tt[t];
  64.                         if(k==8)
  65.                         {
  66.                                 k=0;
  67.                                 t=(t+1)%2;
  68.                                 index2=2;
  69.                                 if(bp==0)
  70.                                 {
  71.                                         if(t==1)
  72.                                                 P1_01=0x11;
  73.                                         else
  74.                                                 P1_01=0x0A;
  75.                                 }
  76.                                 else
  77.                                 {
  78.                                         if(t==1)
  79.                                                 P1_02=0x11;
  80.                                         else
  81.                                                 P1_02=0x0A;
  82.                                 }
  83.                                 
  84.                         }
  85.                 }
  86.                 break;
  87.                 case 2:
  88.                 if(m==time2[index2])
  89.                 {
  90.                         flag++;
  91.                         if(bp==0)
  92.                         {
  93.                                 if(flag!=2)
  94.                                         P1_01=0x0C;
  95.                                 else
  96.                                 {
  97.                                         flag=0;
  98.                                         P1_01=0x09;
  99.                                         P1_02=0x21;
  100.                                         bp=~bp;
  101.                                 }
  102.                         }
  103.                         else
  104.                         {
  105.                                 if(flag!=2)
  106.                                         P1_02=0x0C;
  107.                                 else
  108.                                 {
  109.                                         flag=0;
  110.                                         P1_02=0x09;
  111.                                         P1_01=0x21;
  112.                                         bp=~bp;
  113.                                 }
  114.                         }
  115.                         index2=0;
  116.                         m=0;
  117.                 }
  118.                 break;
  119.         }
  120.         P1=0x00;
  121.         LX0=1;
  122.         P1=P1_01;
  123.         LX0=0;

  124.         P1=0x00;
  125.         LX1=1;
  126.         P1=P1_02;
  127.         LX1=0;
  128. }
  129. void main()
  130. {
  131.         P1=0x00;
  132.         EA=1;//打開(kāi)全局中斷允許
  133.         TMOD=0x11;//設(shè)置定時(shí)器工作方式
  134.         TH0=15535/256;//計(jì)時(shí)50ms
  135.         TL0=15535%256;
  136.         TH1=15535/256;
  137.         TL1=15535%256;
  138.         ET0=1;//打開(kāi)計(jì)時(shí)器中斷允許
  139.         ET1=1;
  140.         TR0=1;//啟動(dòng)定時(shí)器
  141.         TR1=1;
  142.         while(1)
  143.         {        //openLight();
  144.                 showNumber();
  145.         }
  146. }
  147. void ET_T0() interrupt 1
  148. {
  149.         TH0=15535/256;
  150.         TL0=15535%256;
  151.         m++;
  152.         openLight();
  153. }
  154. void ET_T1() interrupt 3
  155. {
  156.         TH1=15535/256;
  157.         TL1=15535%256;
  158.         n++;
  159.         switch(index1)
  160.         {
  161.                 case 0:
  162.                 if(n==time1[index1])
  163.                 {
  164.                         number=(number-1)%6;
  165.                         n=0;        
  166.                 }        
  167.                 break;
  168.                 case 1:
  169.                 if(n==time1[index1])
  170.                 {
  171.                         index1=0;
  172.                         n=0;
  173.                 }
  174.                 break;
  175.         }
  176. }
復(fù)制代碼

所有資料51hei提供下載:
交通燈.zip (25.37 KB, 下載次數(shù): 84)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:526182 發(fā)表于 2019-5-25 22:51 | 只看該作者
樓主可以抽空注釋一下代碼的作用嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:404722 發(fā)表于 2019-8-5 18:02 | 只看該作者
nouman 發(fā)表于 2019-5-25 22:51
樓主可以抽空注釋一下代碼的作用嗎?

比較忙,不喜歡注釋
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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