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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機超聲波程序無法實現報警 求大佬看看哪里錯了?

[復制鏈接]
跳轉到指定樓層
樓主

#include<reg51.h>
#include<intrins.h>
#define uint  unsigned int
#define uchar unsigned char
#define NOP() {_nop_();_nop_();_nop_();_nop_();}

//------LCD引腳------
sbit lcd_rs=P2^0;
sbit lcd_en=P2^2;
sbit BUZZ=P3^7;

//------超聲波引腳-------
sbit TR=P3^2;              //觸發控制信號輸入
sbit ECHO=P3^3;            //回響信號輸出

uchar code table[]={" Distance Test:"};                //LCD第一行顯示
uchar temp_dis[]= {"    000.0 cm"};                    //LCD第二行
long int t,distance;
uchar cache[4]={0,0,0,0};

//--------延時-------
void delay(uint ms)
{
        uint t;
        while(ms--)
        for(t=0;t<30;t++);
}

void write_com(uchar com);//init_lcd()函數需要用到,所以先提前聲明

//************LCD1602初始化函數************************
void init_lcd()
{
        write_com(0x38);           //設置16*2顯示,5*7點陣,8位數據接口
        write_com(0x08);           //寫一個字符后地址指針加1
        write_com(0x01);           //顯示清零,數據指針清零
        write_com(0x06);           //寫一個字符后地址指針加1
        write_com(0x0c);           //關顯示,光標不顯示不閃爍
}

//************LCD1602寫指令函數************************
void write_com(uchar com)   //lcd1602寫指令:rs低電平,rw低電平,en從高電平變為低電平
{
        delay(5);
        lcd_rs = 0;                           // 選擇寫指令
        lcd_en = 0;                           // 將使能端置0
        P0 = com;                           // 將要寫的命令送到數據總線上
        delay(5);                           // 延時5ms,待數據穩定
        lcd_en = 1;                           // 由于初始化已將lcd_en置為0,使能端給一個高脈沖,
        delay(5);                           // 延時5ms,待數據穩定
        lcd_en = 0;                           // 將使能端置0以完成脈沖
}

//************LCD1602寫數據函數************************
void write_data(uchar date)//lcd1602寫數據:rs高電平,rw低電平,en從高電平變低電平
{
        delay(5);
        lcd_rs = 1;                           // 選擇寫數據
        lcd_en = 0;                           // 將使能端置0
        P0 = date;                           // 將要寫的數據送到數據總線上
        delay(5);                           // 延時5ms,待數據穩定
        lcd_en = 1;                           // 由于初始化已將lcd_en置為0,使能端給一個高脈沖,
        delay(5);                           // 延時5ms,待數據穩定
        lcd_en = 0;                           // 將使能端置0以完成脈沖
}

//************LCD1602顯示函數******************
void lcd1602_display(uchar *q,uchar *p)//*通過指針p和q分別指向兩個數組的第一個數,然后進行數組掃描顯示,一次性顯示兩行字符
{
        write_com(0x80);             // 現將數據指針定位到第一行第一個字處
        while(*q!='\0')
        {
                write_data(*q);
                q++;
                delay(1);      
        }
        write_com(0xc0);           // 現將數據指針定位到第二行第一個字處
        while(*p!='\0')
        {
                write_data(*p);
                p++;
                delay(1);      
        }
}
//************超聲波指令函數************************
void HC05_Init()                          //超聲波模塊初始化函數
{
        ECHO=1;                                 //觸發脈沖
        NOP();NOP();NOP();NOP();
        ECHO=0;
        distance=0.1725*t;                       //距離計算
}

void distance_convert(long int t)             //距離計算函數
{                 
        cache[0]=t/1000;
        cache[1]=t/100%10;
        cache[2]=t/10%10;
        cache[3]=t%10;
        temp_dis[4]=cache[0]+'0';
        temp_dis[5]=cache[1]+'0';
        temp_dis[6]=cache[2]+'0';
        temp_dis[8]=cache[3]+'0';
}                                 

//************主程序******************
void main()
{              
        init_lcd();
        delay(5);
        TMOD=0x09;                    //定時器T0工作方式1  GATE0=1
        EA=1;                        //開總中斷
        TR0=1;                        //啟動定時器
        EX0=1;                        //開外部中斷
        IT0=1;                        //設置為下降沿中斷方式
        while(1)
        {                                
                HC05_Init();
                distance_convert(distance);
                lcd1602_display(table,temp_dis);
                                if(distance<30)                         //報警
                                {
                                 BUZZ=0;
                                }
                                else
                                {
                                 BUZZ=1;
                                }                                
        }
}

//外部中斷0
void int0() interrupt 0
{
        t=(TH0*256+TL0);  //計算高電平持續的時間,上升沿到來時候開始計時,下降沿到來進入外部中斷,關閉計時器,停止計時
        TH0=0;
        TL0=0;
}

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

使用道具 舉報

沙發
ID:688692 發表于 2022-3-28 23:17 | 只看該作者
你這個數據300對應的才是30cm。所以if那里的30改成300
回復

使用道具 舉報

板凳
ID:1013861 發表于 2022-3-29 00:03 | 只看該作者
30改成300
回復

使用道具 舉報

地板
ID:985137 發表于 2022-3-30 14:27 | 只看該作者
cnos 發表于 2022-3-28 23:17
你這個數據300對應的才是30cm。所以if那里的30改成300

有一點不太明白,TR和EC口,你看程序跟仿真反著來,接別的口還不行      
回復

使用道具 舉報

5#
ID:1014303 發表于 2022-3-31 02:40 來自手機 | 只看該作者
你可以試試把兩個報警器分開,分別作用
回復

使用道具 舉報

6#
ID:161164 發表于 2022-3-31 16:24 | 只看該作者
2248373991 發表于 2022-3-30 14:27
有一點不太明白,TR和EC口,你看程序跟仿真反著來,接別的口還不行

因為你的程序定義IO口的時候弄反了
然后之后的代碼用著錯誤的IO名來寫

你這程序還用了外中斷來檢測EC口的下降沿
所以不能用其他口

你的程序有些錯誤
應該等待EC口的上升沿來到后才開始計時
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人激情视频网 | 亚洲成人精品一区二区 | 在线观看国产精品视频 | 刘亦菲国产毛片bd | 国产精品成人一区二区三区吃奶 | 欧美激情一区二区 | 国产午夜精品一区二区三区嫩草 | 福利久久| 欧美一a一片一级一片 | 久久美女视频 | 四虎精品在线 | 久久久精品网 | 亚洲欧美一区二区三区视频 | 国产一级免费视频 | 日韩欧美视频免费在线观看 | 久久中文视频 | 精品视频一区二区三区四区 | 曰批视频在线观看 | 福利av在线 | 国产精品久久久久久久久免费樱桃 | 精品国产乱码久久久久久果冻传媒 | 91精品久久久久久久久中文字幕 | 精品美女视频在免费观看 | 国产精品久久久久久久久久久久久 | 中文字幕不卡一区 | 精品福利一区二区三区 | 毛片久久久 | 日韩欧美在线视频 | 日韩一区二区三区在线观看 | 国产特级毛片aaaaaa | 国产精品日产欧美久久久久 | 日本超碰 | 国产精品久久久久久亚洲调教 | 久久久久国产精品一区二区 | 麻豆国产一区二区三区四区 | 日本三级网| 国产精品欧美一区二区三区不卡 | 日韩国产免费观看 | 国产精彩视频 | 欧美黄色一级毛片 | 日韩免费视频 |