久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5230|回復: 4
打印 上一主題 下一主題
收起左側

求助!STC89C52用超聲波測距串口顯示,但是顯示亂碼是怎么回事?

[復制鏈接]
跳轉到指定樓層
樓主
現在在做畢業設計 想用超聲波檢測車位 現在檢測到的數據傳到串口全是亂碼怎么回事??


附上代碼:


/******************************************************************************/
/*  NAME : HC-SR04 超聲波模塊測距PC端串口顯示程序    */
/*  MCU:STC89C52                                     */
/*  晶振:11.0592MHz                                 */
/*  接線:  TRIG ---- P1.2                           */
/*          ECH0 ---- P1.1                           */
/*  串口波特率9600                                   */
/***********************************************************************************************************/          
#include <reg52.h>  
#include <intrins.h>
#include <stdio.h>



void InitIRQ(void);
void Conut(void);
void delayms(unsigned int ms);
void StartModule();       
typedef unsigned char u8;

#define uchar unsigned  char
#define uint  unsigned   int  


sbit TX  = P1^2; //產生脈沖引腳       
sbit RX  = P1^1; //回波引腳
sbit led = P2^0;

unsigned int  time=0;
float         Distance=0;//距離
bit           flag =0;   //中斷溢出標志
       
/********************************************************/
void main()
{
        InitIRQ();
        while(1)
  {
         StartModule();
         while(!RX);                //當超聲波模塊接收口輸出低電平則等待
         TR0=1;                //開啟計數
         while(RX);                        //當RX為1計數并等待
         TR0=0;                                  //關閉計數
   Conut();                          //讀取定時器的值,計算
         delayms(60);       
        }
}

/*********** 中斷寄存器設置初始化 ***********/
void InitIRQ(void)
{
        TMOD=0x20;  //T/C工作方式寄存器 0010 0001
                    //T0 :GATE=0; 定時模式; 工作方式1,16位T/C; 計數器溢出中斷,用于判定超出測距范圍
                    //T1 :GATE=0; 定時模式; 工作方式2,8位可自動重載T/C; 用于串口通信 波特率發生器
        SCON=0x50;  //串行口控制寄存器  0101 0000
                    //SM0 SM1:工作方式1;10位異步收發;波特率由定時器T1控制
                    //SM2: 多機通信控制位,方式0和方式1為非多機通信,設置0
                    //REN: 串行口接收允許位,允許串行口接收數據
                    //TB8:方式0和方式1中該位不用
                    //RB8: 方式0和方式1中該位不用
                    //TI: 發送中斷標志位。串行發送停止位時,由內部硬件置1,向CPU發中斷申請,必須由軟件清0
                     //RI: 接收中斷標志位。串行接收停止位時,由內部硬件置1,向CPU發中斷申請,必須由軟件清0
        TH0=0;      //T0初始化,,用于判斷測距溢出,最大65.536 ms
        TL0=0;        
        TH1=0xFD;   //T1初始化  設定波特率9600 (波特率計算參考文檔)
        TL1=0xFD;   
       
        ET0=1;      //T0中斷允許
        TR0=1;      //開啟定時器0
        TR1=1;      //開啟定時器1
        //ES=1;     //串口允許中斷
                    /*
                                                          可刪除,我的理解是:在系統正常運行情況下,串口發送完成則置位TI=1,
                                                          向CPU請求中斷,在我們軟件人為的直接設置TI=1的情況下可以直接向CPU
                                                          請求中斷了,已經跳過了“允許”那一步
                                                                并且最好刪除!
                                                                因為TI為中斷標志位如果程序使用了串口中斷,那么每次調用printf都
                                                                會進入中斷,因此在使用printf前要禁用中斷
                                                        */
        TI=1;       /*
                     發送中斷標志 ☆直接使用printf必須加此語句才能發送
               在KEILC中,printf在傳輸數據前需要確保前一個數據傳輸
                                                         結束,也就是TI=1,否則將處于等待狀態
                                                         因為printf函數會調用putchar函數,而putchar函數會判斷TI,
                                                         不為1則等待(相當于死機),為1則清0,發送完成后又自動置1
                                                         因此第一次運行printf時檢查TI=1則進行發送,發送完成后
                                                         發送中斷標志位TI又自動置1
                                                         */
  EA=1;       //開啟總中斷
}

/*********** 觸發超聲波模塊 ***********/
void  StartModule() //超聲波模塊Trig控制端給大于10us的高電平觸發模塊測距       
{
          TX=1;     
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          //_nop_();
          //_nop_();
          //_nop_();
          //_nop_();
          //_nop_();
          TX=0;
}

/*********** 定時器T0計數 ***********/
void Conut(void)
{
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         Distance = (time*1.87)/100;  //CM  (見代碼最后注釋)
         if(flag==1)                    //超出測量
         {
          flag=0;
          printf("%f",Distance);
         }
         if(Distance<20){
                 led = 0;
         }else{
                 led = 1;
         }
          //printf("Distance = %f CM\n",Distance);
}
/********************************************************/
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
/*********** 定時器T0中斷服務函數 ***********/
void Timer0IRQ() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
{
    flag=1;       
}
void Usart() interrupt 4                  //T0中斷用來計數器溢出,超過測距范圍
  {
            
                u8 receiveData;
       
                receiveData=SBUF;        //出去接收到的數據
                RI = 0;                //清除接收中斷標志位
                SBUF=receiveData;        //將接收到的數據放入到發送寄存器
                while(!TI);                         //等待發送數據完成
                TI=0;                                                         //中斷溢出標志
  }


//紅色這塊我加與不加都是亂碼

/*12分頻:就是f/12,假設(接晶振12MHz)輸入信號頻率12MHz,12分頻后,則輸出1MHz
        *時鐘周期周期變為原來的12倍, T=1/1MHz=1us
        *即單片機內部的加1計數器在加1這個過程中 ,寄存器要完成這個動作,是一個機器周期
        *時鐘周期為1/12MHz=1/12us
        *機器周期=12個時鐘周期=1us,也就是計數器每加1需要的時間問1us
        *單片機中的部件都是在晶振12分頻后的一個機器周期在跑
        *時鐘周期 = 晶振頻率的倒數,即1/fosc
        *機器周期 = 12 * 時鐘周期 = 12/fosc
        ------------------------------------------------------
        |距離計算公式
        |2S(m) = t(s) * 344(m/s)
        |S(m)  = t(s) * 172(m/s)
        |S(cm) = t(us) * 0.0172(cm/us)
        |      = t(us) * 1/58
        |t在晶振位12MHz時等于計數值(機器周期1us),但晶振為11.0592MHz時
        |t(us) = 計數 * (12/11.0592) * (1/58)
        |      = 計數 * 0.0187
        |      = (計數 * 1.87)/100
        ------------------------------------------------------
        */

QQ圖片20181213083128.png (53.47 KB, 下載次數: 67)

16進制顯示

16進制顯示

QQ圖片20181213083146.png (51.4 KB, 下載次數: 71)

字符顯示亂碼

字符顯示亂碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:445357 發表于 2018-12-13 08:36 | 只看該作者
波特率也設置對的啊
回復

使用道具 舉報

板凳
ID:277550 發表于 2018-12-13 11:06 | 只看該作者


晶振是否和代碼的對應的。
回復

使用道具 舉報

地板
ID:445357 發表于 2018-12-14 10:11 | 只看該作者
devcang 發表于 2018-12-13 11:06
晶振是否和代碼的對應的。

我換了塊板子燒寫一樣的代碼就OK了,可能是板子的問題
回復

使用道具 舉報

5#
ID:437026 發表于 2018-12-14 11:53 來自手機 | 只看該作者
顯示亂碼如果顯示器沒問題,說明你程序錯了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 夜久久| 国产精品久久久久久久久免费 | 欧美成人激情 | 毛片网站在线观看 | 亚洲精品一区二区在线观看 | 久久国产精品一区二区三区 | 国产伦精品 | 一区二区三区中文字幕 | 一区二区三区在线 | 亚洲综合婷婷 | 精品国产欧美 | 亚洲黄色网址视频 | 亚洲少妇综合网 | 国产欧美三区 | 精品免费国产一区二区三区四区 | 国产免费看 | 亚洲成人精选 | 免费av毛片| 国产精品亚洲成在人线 | 欧美在线资源 | 久久亚洲一区 | 欧美 日韩 中文 | 国产美女精品 | 国产精品日韩一区二区 | 99视频在线免费观看 | 国产乱精品一区二区三区 | 日韩国产在线观看 | 国产精品久久久久9999鸭 | 成人小视频在线观看 | 亚洲精品在线免费 | 久久99精品久久久水蜜桃 | 午夜丰满少妇一级毛片 | 美女逼网站 | 欧美日韩亚洲国产 | 91在线视频在线观看 | 国产精品视频综合 | 麻豆视频国产在线观看 | 日本国产一区二区 | 精品一二区 | 农村妇女毛片精品久久久 | 久久久久国产一区二区三区 |