天天看點

基于單片機的超聲測距(播報)系統設計(#0497)

功能描述

1、采用51/52單片機作為主要晶片;

2、采用1602液晶顯示:距離、溫度、報警值;

3、采用HCSR04超音波檢測距離(0-498cm);

4、采用18B20檢測溫度(0-99℃),并用于溫度補償;

5、按鍵設定距離報警門檻值,超出門檻值蜂鳴器報警;

6、采用JQ6500語音晶片,按鍵3控制語音播報實時距離(語音播報功能無法仿真)。

電路設計

采用Altium Designer作為電路設計工具。Altium Designer通過把原理圖設計、PCB繪制編輯、拓撲邏輯自動布線、信号完整性分析和設計輸出等技術的完美融合,為設計者提供了全新的設計解決方案,使設計者可以輕松進行設計,熟練使用這一軟體必将使電路設計的品質和效率大大提高。

基于單片機的超聲測距(播報)系統設計(#0497)

單片機管腳說明:

P0端口(P0.0-P0.7):P0口為一個8位漏極開路雙向I/O口,每個引腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程式資料存儲器,它可以被定義為資料/位址的第八位。在FIASH程式設計時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。

P1端口(P1.0-P1.7):P1口是一個内部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1後,被内部上拉為高電平,可用作輸入,P1口被外部下拉為低電平時,将輸出電流,這是由于内部上拉的緣故。在FLASH程式設計和校驗時,P1口作為第八位位址接收。

P2端口(P2.0-P2.7):P2口為一個内部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被内部上拉電阻拉高,且作為輸入。并是以作為輸入時,P2口的管腳被外部拉低,将輸出電流。這是由于内部上拉的緣故。P2口,用于外部程式存儲器或16位位址外部資料存儲器進行存取時,P2口輸出位址的高八位。在給出位址“1”時,它利用内部上拉優勢,當對外部八位位址資料存儲器進行讀寫時,P2口輸出其特殊功能寄存器的内容。P2口在FLASH程式設計和校驗時接收高八位位址信号和控制信号。

P3端口(P3.0-P3.7):P3口管腳是一個帶有内部上拉電阻的8位的雙向I/O端口,可接收輸出4個TTL門電流。當P3口寫入“1”後,它們被内部上拉為高電平,并用作輸入。作為輸入端時,由于外部下拉為低電平,P3口将輸出電流(ILL)。P3口同時為閃爍程式設計和程式設計校驗接收一些控制信号。

仿真設計

主程式設計

void main()
{
  UART_init();
  Init_ultrasonic_wave();
  //螢幕初始化
  Init1602();
  //溫度初始化
  tmpchange(); 
  t_=tmp();
  tmpchange();
  t_=tmp();
  tmpchange();
  t_=tmp();

  //循環顯示
  while(1)
  {
    Key();
    if(yuyin_flag==1)
    {
       yuyin_flag=0;

       ONE4[4]=L_/100;
       ONE5[4]=L_/10%10;
       ONE6[4]=L_%10;
       if(ONE4[4]==0)ONE4[4]=0x0A;
       if(ONE5[4]==0)ONE5[4]=0x0A;
       if(ONE6[4]==0)ONE6[4]=0x0A;
      
       UART_send_string(ONE1,6);
       delayms(1);
       UART_send_string(ONE4,6);
       delayms(1);
       UART_send_string(ONE3,6);
       delayms(1);
       UART_send_string(ONE5,6);
       delayms(1);
       UART_send_string(ONE6,6);
       delayms(1);
       UART_send_string(ONE2,6);
       delayms(1);
    }
    //正常顯示
    if(mode==0)
    {
      StartModule();//啟動超音波
      while(!RX);   //當RX為零時等待
      TR0=1;      //開啟計數
      while(RX);    //當RX為1計數并等待
      TR0=0;      //關閉計數
  
      delayms(20);  //20MS
      tmpchange();  //溫度轉換
      t_=tmp();     //度溫度
      Conut(t_/10); //計算距離
      if(L_>Max||L_<Min)
      {
        Feng_Start();
      }
      else
      {
        if(FW!=1)
        Feng_Stop();
      }
      Display_1602(t_/10,L_);
    }      

源檔案擷取

繼續閱讀