標題: 基礎80c51單片機交通信號燈控制程序與Proteus仿真+設計文檔 [打印本頁]

作者: 88886666    時間: 2019-1-15 13:24
標題: 基礎80c51單片機交通信號燈控制程序與Proteus仿真+設計文檔
單片機代碼如下,按鍵1按下觸發(fā)中斷,相當于總開關,可以控制南北信號燈,此外可以用串口發(fā)送16進制數(shù)據(jù),控制信號燈時間(只做了南北方向的,東西方向需要另做一個res接受位)

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


目錄
一、選題一理論部分              2
1.1 課題的要求與內容              2
1.1.1 課題內容: 十字路口交通燈系統(tǒng)設計              2
1.1.2 課題要求:              2
1.2  系統(tǒng)的方案設計              2
1.2.1 系統(tǒng)方案:              2
1.2.2系統(tǒng)的構成:              2
1.3系統(tǒng)的硬件設計              2
1.3.1 系統(tǒng)硬件的設計步驟              2
1.3.2 系統(tǒng)硬件電路連接效果              3
1.4  系統(tǒng)的軟件設計              4
1.4.1 系統(tǒng)的軟件設計步驟              4
二、選題一實踐部分              4
2.1 系統(tǒng)的硬件原理與說明              4
2.1.1 系統(tǒng)的硬件仿真效果圖              4
2.1.2 仿真圖說明:              5
2.2系統(tǒng)硬件調試的過程中出現(xiàn)的問題以及解決的措施              5
2.3系統(tǒng)軟件調試的過程中出現(xiàn)的問題以及解決的措施              6

一、(選題一)理論部分
1.1 課題的要求與內容
1.1.1 課題內容 十字路口交通燈系統(tǒng)設計
為了減少交通事故,確保交通順暢,十字路口必須安置信號燈,以一定的時間間隔輪流點亮和熄滅。系統(tǒng)要求利用單片機的定時器定時功能,令十字路口的紅黃綠燈交替點亮和熄滅,并且用LED數(shù)碼管顯示時間。
1.1.2 課題要求
(1)開機或復位后,信號燈全滅,南北和東西各有兩組信號燈,分別是直行和左轉彎,LED數(shù)碼管顯示2位:顯示秒。南北方向直行綠燈時間為20s,左轉綠燈時間為17s;東西方向直行綠燈時間為27s,左轉方向為22s。黃燈時間為3s。
(2)發(fā)揮部分
a.系統(tǒng)存儲兩套十字路口配時方案,可以通過按鍵來進行選擇;
b.利用串口調試助手或編寫上位機軟件,通過上位機來人工設定十字路口配時方案。
1.2  系統(tǒng)的方案設計
1.2.1 系統(tǒng)方案:
本次課程設計所采用的方案是用單片機控制十字路口交通燈。單片機具有結構簡單、編程方便、經(jīng)濟、易于連接等優(yōu)點,特別是其內部定時器計數(shù)器、中斷系統(tǒng)資源豐富可對交通燈進行精確的控制,有應用價值,可擴展功能多,靈活性比較強。
1.2.2系統(tǒng)的構成:
整個系統(tǒng)的構成以80C51單片機為核心,由I/O口擴展,LED數(shù)碼管顯示,緊急情況中斷電路還有復位電路等組成。
單片機作為整個硬件系統(tǒng)的核心,它既是協(xié)調整工作系統(tǒng)的控制器,又是數(shù)據(jù)處理器。它由單片機、時鐘電路、復位電路等組成。行車方向指示采用LED發(fā)光二極管,可有紅、綠兩種顏色指示放行與禁止,黃燈作為紅綠轉換的提示,形象直觀。
本系統(tǒng)為交通信號燈設計了兩種不同的配時方案,可以根據(jù)道路實時交通量的大小選擇最佳配時方案。同時本系統(tǒng)還配有串口調試助手,可以通過串口發(fā)送數(shù)據(jù)從而達到改變配時時間的效果。
1.3系統(tǒng)的硬件設計
本系統(tǒng)的硬件主要由以下幾部分組成:80C51單片機、電阻、LED數(shù)碼管、LED發(fā)光二極管、電容、電解電容、晶體振蕩器、開關、標準RS232端口。電路圖是在Proteus中來連接完成的。
1.3.1 系統(tǒng)硬件的設計步驟

                  
                      圖1    系統(tǒng)硬件設計流程圖

1.3.2 系統(tǒng)硬件電路連接效果

                   圖2   硬件電路連接效果圖


1.4  系統(tǒng)的軟件設計
本系統(tǒng)的軟件設計部分全部在Keil uvision4中完成,采用的編程語言為Keil C51.
1.4.1 系統(tǒng)的軟件設計步驟


                      圖3  系統(tǒng)軟件設計流程圖

二、(選題一)實踐部分
2.1 系統(tǒng)的硬件原理與說明
   2.1.1 系統(tǒng)的硬件仿真效果

         
                圖4   硬件仿真效果圖


2.1.2 仿真圖說明:
當開關1按下時,交通信號燈首先執(zhí)行第一套配時方案,首先,南北方向的直行是綠燈,東西方向的直行和左轉均為紅燈,待南北方向的直行時間變?yōu)?時,黃燈閃爍3秒,然后南北方向的左轉變?yōu)榫G燈,東西方向的直行和左轉仍然全部為紅燈;待南北方向的左轉時間變?yōu)?時,黃燈仍然閃爍3秒,然后東西方向的直行變?yōu)榫G燈,以此類推,信號燈亮的順序和南北方向一致。配時方案2中信號燈亮的順序和配時方案一的順序一致,只是亮的時間不同。
本系統(tǒng)在設計的過程中還使用了串口調試助手,修改的是南北方向直行的時間的個位上的數(shù)值。
2.2系統(tǒng)硬件調試的過程中出現(xiàn)的問題以及解決的措施
問題:
信號燈點亮的順序不對。
串口不能正常使用。
措施:
重新計算信號燈的字模。
重新連接串口。
2.3系統(tǒng)軟件調試的過程中出現(xiàn)的問題以及解決的措施
問題:
接收不到串口發(fā)來的數(shù)據(jù)。
措施:
給定義的變量賦初值。

三、(選題一)結束語
通過本次課程設計,使我得到了一次用專業(yè)知識、專業(yè)技能分析和解決問題全面系統(tǒng)的鍛煉。使我在51單片機的基本原理、單片機應用系統(tǒng)開發(fā)過程,以及在常用編程設計思路技巧(特別是C語言)的掌握方面都能向前邁了堅實的一步。
首先,我感觸最深的當屬查閱大量的設計資料了。為了讓自己的設計更加完善,查閱這方面的設計資料是十分必要的,在資料中查看與自己的設計相似的只是,在此基礎上完善直至符合設計要求。
其次,在這次課程設計中,我們運用到了以前所學的專業(yè)知識,如:C語言、proteus制圖。編寫的程序與仿真電路圖配合使用,發(fā)現(xiàn)問題,解決問題,在解決問題的過程中,我受益頗多。
最后,要做好一個課程設計,就必須要有一個清晰的思路和一個完整的的軟件流程圖;在設計程序時,一次性就將整個程序設計好的概率很小,反復修改、不斷改進是程序設計的必經(jīng)之路,一個完美的代碼通常是要修改很多次的;要養(yǎng)成注釋程序的好習慣,一個程序的完美與否不僅僅是實現(xiàn)功能,而應該讓人一目了然地明白設計者的思路,這樣也為資料的保存和交流提供了方便;在設計過程中應該將每次遇到的問題記錄下來,并分析清楚,從中學到的知識也會讓我受益終身。


單片機源碼:
#include<reg51.h>
sbit LED1=P1^0;
sbit LED2=P1^1;
unsigned char code DIG_CODE[10]={0x6f/*9*/,0x7f/*8*/,0x07/*7*/,0x7d/*6*/,0x6d/*5*/,0x66/*4*/,0x4f/*3*/,0x5b/*2*/,0x06/*1*/,0x3f/*0*/};

unsigned int time;              
unsigned int LedNumVal[2];     
unsigned int button;
static unsigned char rec;
static unsigned char recs;
static unsigned char recg;

void Delay (unsigned int a )
{  
   unsigned char i=1;
   unsigned int time=0;
   if(time==a)
      {i++;
   }
}
void Display_show( int a , int b )  
{  
    int i=1;
    int j;
    int k;
    LedNumVal[0] = (9 - b) * 1000;
    LedNumVal[1] = (9 - a) * 1000;
     while(i==1)
    {   
       LED2=0;
       P0=DIG_CODE[LedNumVal[0] / 1000];   
       Delay(5);
        if(LedNumVal[0] > 10000)            //
  {
   LedNumVal[1] = LedNumVal[1] + 1000;   //
   LedNumVal[0] = 0;           //b=9
  }
        j = 10;      
  while(j--);
  P0 = 0x00;
  LED2 = 1;
        LED1=0;
        P0=DIG_CODE[LedNumVal[1] / 1000];
        Delay(5);
        if(LedNumVal[1] == 9000)   //
     {
   if(LedNumVal[0] > 9500)    //
   {
    i++;        //??b<0
   }
  }     
        k = 10;    //
  while(k--);
  P0 = 0x00;//
  LED1 = 1;
       }
}

void main(void)
{
    TMOD = 0x21;     //
    TH0 = 0xFE;   //
    TL0 = 0x0C ;   //
TH1=TL1=0xf4;    //
TR1=1;       /
ES=1;            //
PS=1;           //
PT0=0;          /
PCON=0;         //
SCON=0x50;     
    IT0=1;         //      
    EA = 1;        //        
    ET0=1;        //?
    TR0= 1;        /  
EX0=1;        /
    EX1=1;
rec=0;  //receive初值
while(1)
{   
        if(button==1)
  {
     if((button==1)&&(rec==0)) P2=0X7E; Display_show(1,2); //南北方向12s
     if((button==1)&&(rec!=0)) P2=0x7e; Display_show(recs,recg);
  P2=0X7D;
  Display_show(0,3);
       //??????3s
  P2=0X7B;
  Display_show(0,7);
       //7s
  P2=0X7D;
  Display_show(0,3);
       //3s
  P2=0XE7;
  Display_show(0,7);
       //7s
  P2=0XD7;
  Display_show(0,3);
       //3s
  P2=0XB7;
  Display_show(0,7);
       //7s
  P2=0XD7;;
  Display_show(0,3);
            //3s
  }

  if(button==2)
  {

        P2=0X7E;  
  Display_show(2,8);
       //28s
  P2=0X7D;
  Display_show(0,3);
       //3s
  P2=0X7B;
  Display_show(1,2);
       //12s
  P2=0X7D;
  Display_show(0,3);
       //3s
  P2=0XE7;
  Display_show(2,3);
       //23s
  P2=0XD7;
  Display_show(0,3);
       //3s
  P2=0XB7;
  Display_show(1,0);
       //10s
  P2=0XD7;;
  Display_show(0,3);
             //3s
  }

}   
}
void T0zd(void) interrupt 1         //T0 (1ms)     
{
  TH0 = 0xFE;
  TL0 = 0x0C ;
   LedNumVal[0]++;
  time++;  
}
void  int0(void) interrupt 0  using 0
{
      EX0=0;
      button = 1;
      EX0=1;
}
void  int1(void) interrupt 2  using 0
{
      EX1=0;
      button = 2;
      EX1=1;
}
void receiver() interrupt 4
{
   if(RI==1)
    {
      RI=0;
      rec=SBUF;  
      SBUF=rec;
      while(TI==0);
       TI=0;         
       recg=rec%16; //個位
    recs=rec/16*10;  //十位
    }
}



全部資料51hei下載地址:
交通信號燈.zip (8.04 MB, 下載次數(shù): 113)


作者: linuxcso    時間: 2019-3-6 17:21
非常完整的設計,樓主辛苦了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1