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

QQ登錄

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

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

51單片機(jī)十字路口交通燈仿真程序(有行人,交通繁忙探頭,功能很全)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
《單片機(jī)原理》期中考試
適用班級(jí):電子A1621,電子A1622
注意事項(xiàng):
    1. 課外開(kāi)放設(shè)計(jì),開(kāi)卷考核,可查閱任意資料。
    2. 單人考核,獨(dú)立完成,如有雷同,一律0分。
    3. 不允許對(duì)電路圖做任意形式修改。
    4. 提交以“電子A1622_01_陳**_期中測(cè)試”格式命名的項(xiàng)目文件夾。

這是我們學(xué)校單片機(jī)課程的期中考試自己寫(xiě)的程序,花了兩周時(shí)間,壓縮包里面包含了keil的源代碼和protuse電路仿真圖,可能也還有很多不完善的地方,望大家多多見(jiàn)諒。
電路如圖所示,設(shè)計(jì)程序?qū)崿F(xiàn)如下功能:
1. 能根據(jù)交通規(guī)律正確設(shè)置交通燈狀態(tài)及數(shù)碼管顯示內(nèi)容(60分)
2. 能手動(dòng)調(diào)節(jié)時(shí)間(30分)
3. 能根據(jù)交通狀況自動(dòng)延長(zhǎng)直行時(shí)間;(10分)

帶行人與繁忙檢測(cè)的單片機(jī)交通燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


注:通過(guò)鍵盤(pán)調(diào)節(jié)時(shí)間項(xiàng)目中,分為東西直行時(shí)間、東西左轉(zhuǎn)時(shí)間、南北直行時(shí)間、南北左轉(zhuǎn)時(shí)間4個(gè)項(xiàng)目,每個(gè)項(xiàng)目7.5分,小數(shù)點(diǎn)四舍五入。

東西向交通繁忙探頭,1正常,0繁忙
南北向交通繁忙探頭,1正常,0繁忙

1. 模式鍵用來(lái)選擇設(shè)定的時(shí)間,如東西直行時(shí)間、南北左轉(zhuǎn)時(shí)間等。
   時(shí)間加減鍵用于手動(dòng)調(diào)節(jié)直行時(shí)間,每按鍵一次加減5s。
2. 交通繁忙探頭用于探測(cè)道路交通狀況,如果當(dāng)前道路排隊(duì)較長(zhǎng),
   則繁忙探頭返回0,可臨時(shí)延長(zhǎng)當(dāng)前方向直行通道時(shí)間10s,一個(gè)
   紅綠燈周期最多延長(zhǎng)3次。本設(shè)計(jì)用邏輯狀態(tài)輸入端口模擬。



單片機(jī)源程序如下:

  1. #include <REGX51.H>
  2. #define uchar   unsigned char

  3. sbit NSgreen = P3^1; //南北人行道綠燈
  4. sbit WEgreen = P3^0; //東西人行道綠燈
  5. sbit Add_Button = P3^5;//加時(shí)間按鍵
  6. sbit Sub_Button = P3^4;//減時(shí)間按鍵
  7. sbit Reduces_Button = P3^3;//模式選擇按鍵
  8. sbit Y1 = P3^2;
  9. sbit WEbuy_Button = P3^6 ;
  10. sbit NSbuy_Button = P3^7 ;
  11. uchar qiehuan=0;                  
  12. uchar  red = 33,yellow = 3,green_strant = 30,green_left = 30;
  13. uchar Mode = 0;
  14. uchar KeyDown=0;
  15. uchar DisplayTab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79};  // 0 1 2 3 4 5 6 7 8 9 E

  16. uchar led[8];


  17. uchar Display_Number[] = {0x82,0x84,0x28,0x48,0x81,0x84,0x18,0x48}; //路口紅綠燈狀態(tài)


  18. //延時(shí)
  19. void Delay_ms(unsigned int Cnt )
  20. {
  21. unsigned int t;
  22. while (Cnt--)
  23. {                                                         
  24.   t=100;
  25.   while(t--);
  26. }
  27. }


  28. //動(dòng)態(tài)顯示
  29. void Dynamic_display()
  30. {
  31.         uchar i = 0;
  32.         for(i = 0; i < 8; i++)
  33.         {
  34.                 P0 = DisplayTab[ led[i] ];
  35.             P2 = ~(0x01<<i);
  36.                 Delay_ms(1);
  37.                 P0 = 0x00;
  38.     }
  39. }


  40. /***************中斷程序***********************************/

  41. /*******外部中斷0**********/
  42. void function_isr(void) interrupt 0
  43. {
  44.           EX0=0;  //關(guān)中斷
  45.          qiehuan++;
  46.          if(qiehuan == 5)  Mode=0;               
  47.          EX0=1; //開(kāi)中斷
  48.    
  49. }
  50. //狀態(tài)1
  51. void luzhi1()
  52. {
  53.      led[4] = green_strant % 10;
  54.      led[5] = green_strant / 10;
  55.          led[6]        = 1;
  56.          led[7] = 10;
  57. if(WEbuy_Button == 0)  //時(shí)間加
  58.        {
  59.             green_strant += 10;   
  60.        }
  61. }
  62. //狀態(tài)2
  63. void luzhi2()
  64. {
  65.      led[4] = green_strant % 10;
  66.      led[5] = green_strant / 10;
  67.          led[6]        = 3;
  68.          led[7] = 5;
  69.          if(NSbuy_Button == 0)  //時(shí)間加
  70.        {
  71.             green_strant += 10;
  72.                         
  73.        }
  74. }
  75. /******外部中斷2********/
  76. void function_lib(void) interrupt 2
  77. {
  78.         Mode++;
  79.         if(Mode == 5)  Mode=0;
  80.         KeyDown=1;


  81. }


  82. //模式1
  83. void function1()
  84. {        
  85.      led[4] = green_strant % 10;
  86.      led[5] = green_strant / 10;
  87.          led[6]        = 1;
  88.          led[7] = 10;
  89.          if(Add_Button == 0)  //時(shí)間加
  90.        {
  91.             green_strant += 5;
  92.             green_left        += 5;
  93.             red += 5;     
  94.        }
  95.      if(Sub_Button == 0) //時(shí)間減
  96.        {
  97.             green_strant -= 5;
  98.                         green_left        -= 5;
  99.             red -= 5;                    
  100.            }
  101.             
  102. }

  103. //模式2
  104. void function2()
  105. {
  106.      led[4] = green_left % 10;
  107.      led[5] = green_left / 10;
  108.          led[6]        = 2;
  109.          led[7] = 10;
  110.          if(Add_Button == 0)  //時(shí)間加
  111.        {
  112.             green_strant += 5;
  113.                         green_left += 5;
  114.             red += 5;
  115.                              
  116.        }
  117.      if(Sub_Button == 0) //時(shí)間減
  118.        {
  119.             green_strant -= 5;
  120.                          green_left -= 5;
  121.             red -= 5;                    
  122.            }   
  123.          
  124. }

  125. //模式3
  126. void function3()
  127. {
  128.      led[4] = green_strant % 10;
  129.      led[5] = green_strant / 10;
  130.          led[6]        = 3;
  131.          led[7] = 5;
  132.          if(Add_Button == 0)  //時(shí)間加
  133.        {
  134.             green_strant += 5;
  135.                         green_left += 5;
  136.             red += 5;     
  137.        }
  138.      if(Sub_Button == 0) //時(shí)間減
  139.        {
  140.             green_strant -= 5;
  141.                         green_left -= 5;
  142.             red -= 5;                    
  143.            }
  144. }

  145. //模式4
  146. void function4()
  147. {
  148.      led[4] = green_left % 10;
  149.      led[5] = green_left / 10;
  150.          led[6]        = 4;
  151.          led[7] = 5;
  152.          if(Add_Button == 0)  //時(shí)間加
  153.        {
  154.             green_strant += 5;
  155.                         green_left += 5;
  156.             red += 5;     
  157.        }
  158.      if(Sub_Button == 0) //時(shí)間減
  159.        {
  160.             green_strant -= 5;
  161.                     green_left += 5;
  162.             red -= 5;                    
  163.            }
  164. }





  165. /*************計(jì)時(shí)程序*************/
  166. void count_down()
  167. {
  168.   uchar time = 0;
  169.   uchar Temp,state;
  170.   uchar Red,Yellow,Greens,Greenl;
  171.   Red = red;
  172.   Yellow = yellow;
  173.   Greens = green_strant;
  174.   Greenl = green_left;
  175.   
  176.   while(1)
  177.   {        
  178.      if(time < green_strant )
  179.          {
  180.            led[0] = Red % 10;
  181.            led[1] = Red        / 10;
  182.            led[2] =        Greens % 10;
  183.            led[3] = Greens / 10;

  184.            state=0;
  185.            WEgreen = 1;
  186.            NSgreen = 0;
  187.            Red--;
  188.            Greens--;

  189.          }

  190.          if(time >= green_strant  & time < (green_strant +yellow ))
  191.          {
  192.            led[0]=Red % 10;
  193.            led[1]=Red / 10;
  194.            led[2]=Yellow % 10;
  195.            led[3]=Yellow / 10;

  196.            state=1;
  197.        WEgreen = 1;
  198.            NSgreen = 0;
  199.            Red--;
  200.            Yellow--;
  201.            Greens=green_strant;  //給直行綠燈恢復(fù)初值

  202.          }

  203.          if(time >= (green_strant +yellow ) & time < (green_strant +yellow+green_strant ) )
  204.          {
  205.            if(time == (green_strant +yellow ))
  206.            {
  207.              Red = red;          //給紅燈賦值
  208.            }
  209.            led[0]= Greens % 10;
  210.            led[1]= Greens / 10;
  211.            led[2]= Red % 10;
  212.            led[3]= Red / 10;

  213.            state=2;
  214.            WEgreen = 0;
  215.            NSgreen = 1;
  216.            Red--;
  217.            Greens--;
  218.            Yellow=yellow;   //給黃燈恢復(fù)初值
  219.          }

  220.          if(time >= (green_strant +yellow+green_strant ) & time < (green_strant +yellow+green_strant+yellow ) )
  221.          {
  222.            led[0]= Yellow % 10;
  223.            led[1]= Yellow / 10;
  224.            led[2]= Red % 10;
  225.            led[3]= Red / 10;
  226.            
  227.            state=3;
  228.            WEgreen = 0;
  229.            NSgreen = 1;
  230.            Greens=green_strant;  //給直行綠燈恢復(fù)初值
  231.            Yellow--;
  232.            Red--;
  233.          
  234.          }

  235.          if(time >= (green_strant +yellow+green_strant+yellow ) & time < (green_strant +yellow+green_strant+yellow+green_left ) )
  236.           {
  237.            if(time == (green_strant +yellow+green_strant+yellow ) )
  238.            {
  239.             Red = red;                //給紅燈賦值
  240.            }
  241.            led[0] = Red % 10;
  242.            led[1] = Red / 10;
  243.            led[2]= Greenl % 10;
  244.            led[3]= Greenl / 10;

  245.            state=4;  
  246.            WEgreen = 1;
  247.            NSgreen = 0;
  248.            Greenl--;
  249.            Red--;
  250.            Yellow = yellow;  //給黃燈賦初值
  251.           }

  252.           if(time >= (green_strant +yellow+green_strant+yellow+green_left )  & time < (green_strant +yellow+green_strant+yellow+green_left+yellow ) )
  253.           {
  254.            led[0] = Red % 10;
  255.            led[1] = Red / 10;
  256.            led[2] = Yellow % 10;
  257.            led[3] = Yellow / 10;
  258.            
  259.            state=5;
  260.            WEgreen = 1;
  261.            NSgreen = 0;
  262.            Yellow--;
  263.            Red--;
  264.            Greenl = green_left;  //給左轉(zhuǎn)綠燈賦初值
  265.           }

  266.          if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow ) & time < (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left) )
  267.           {
  268.            if(time == (green_strant +yellow+green_strant+yellow+green_left+yellow ) )
  269.            {
  270.              Red = red;                   //給紅燈賦值
  271.            }
  272.            led[0] = Greenl % 10;
  273.            led[1] = Greenl / 10;
  274.            led[2] = Red % 10;
  275.            led[3] = Red / 10;
  276.            
  277.            state=6;
  278.            WEgreen = 0;
  279.            NSgreen = 1;
  280.            Yellow = yellow;  //給黃燈賦初值
  281.            Greenl--;
  282.            Red--;
  283.           }

  284.           if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left) & time < (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left+yellow) )
  285.          {
  286.            led[0]= Yellow % 10;
  287.            led[1]= Yellow / 10;
  288.            led[2]= Red % 10;
  289.            led[3]= Red / 10;

  290.            state=7;
  291.            WEgreen = 0;
  292.            NSgreen = 1;
  293.            Greenl = green_left;  //給左轉(zhuǎn)綠燈賦初值
  294.            Yellow--;
  295.            Red--;
  296.          }

  297.          if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left+yellow))
  298.          {
  299.            Yellow = yellow;  //給黃燈賦初值
  300.            break;
  301.          }

  302.          time++;


  303.          Y1= 1 ;
  304.          Reduces_Button = 1;
  305. ……………………

  306. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼



所有資料51hei提供下載:
51單片機(jī)交通燈程序_期中測(cè)試.zip (307.52 KB, 下載次數(shù): 260)

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2018-6-14 03:30 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:138707 發(fā)表于 2018-6-14 11:46 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

地板
ID:463831 發(fā)表于 2019-1-7 15:36 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

5#
ID:3802 發(fā)表于 2019-1-8 13:42 | 只看該作者
學(xué)習(xí)中了
回復(fù)

使用道具 舉報(bào)

6#
ID:560537 發(fā)表于 2019-6-12 08:32 | 只看該作者
我來(lái)瞅瞅
回復(fù)

使用道具 舉報(bào)

7#
ID:561435 發(fā)表于 2019-6-13 14:30 來(lái)自手機(jī) | 只看該作者
好資料,51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

8#
ID:360525 發(fā)表于 2019-6-27 13:10 | 只看該作者
那個(gè)黃色的小人是怎么畫(huà)的啊
回復(fù)

使用道具 舉報(bào)

9#
ID:577476 發(fā)表于 2020-1-7 10:53 | 只看該作者

好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

10#
ID:711846 發(fā)表于 2020-6-8 09:24 | 只看該作者
好文章,可以學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

11#
ID:773174 發(fā)表于 2020-6-9 12:37 | 只看該作者
請(qǐng)問(wèn)為什么我調(diào)整模式按鈕沒(méi)有變化呢
回復(fù)

使用道具 舉報(bào)

12#
ID:774354 發(fā)表于 2020-6-9 20:43 | 只看該作者
謝謝分享,我的作業(yè)有救了
回復(fù)

使用道具 舉報(bào)

13#
ID:777864 發(fā)表于 2020-6-13 11:23 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

14#
ID:779160 發(fā)表于 2020-6-14 17:31 | 只看該作者
牛啊,太強(qiáng)了
回復(fù)

使用道具 舉報(bào)

15#
ID:779160 發(fā)表于 2020-6-14 17:31 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

16#
ID:796873 發(fā)表于 2020-7-3 23:18 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

17#
ID:1140081 發(fā)表于 2024-12-19 09:40 | 只看該作者

好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

18#
ID:402677 發(fā)表于 2024-12-22 10:52 | 只看該作者
很好的單片機(jī)學(xué)習(xí)資料,謝謝樓主提供分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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