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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我用LCD串行的方式顯示,為什么HC-SR04超聲波的數(shù)值不更新。其他數(shù)據(jù)顯示正常

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:652483 發(fā)表于 2021-4-14 01:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
主函數(shù)
#include <reg52.h>
#include <intrins.h>
#include "LCD12864.h"
#include "timer1.h"
#include "ADC0832.h"
#include "DS18B20.h"
#include "eepom52.h"
#include "HC_SR04.h"
sbit beep = P2^0;
sbit setKey = P3^3;
sbit addKey = P3^4;
sbit subKey = P3^5;
int S;
float dataV[4]= {0};
unsigned char dataTH[8]={110,30, 99, 30, 8,2, 45, 15};

unsigned char lcd[8] = {0};

void alarm();

void delay(unsigned int i){
    while(i--);
}


float pre_ph_v, phv;
void setKeyDeal();
void addKeyDeal();
void subKeyDeal();

//³õʼ»¯eeprom
void init_eeprom(){
    unsigned char is_first_init =  byte_read(0x2020);
    if(is_first_init == 1){
        dataTH[0] = byte_read(0x2000);
        dataTH[1] = byte_read(0x2001);
        dataTH[2] = byte_read(0x2002);
        dataTH[3] = byte_read(0x2003);
        dataTH[4] = byte_read(0x2004);
        dataTH[5] = byte_read(0x2005);
        dataTH[6] = byte_read(0x2006);
        dataTH[7] = byte_read(0x2007);
    }else{
            SectorErase(0x2000);
            byte_write(0x2000, dataTH[0]);
            byte_write(0x2001, dataTH[1]);
            byte_write(0x2002, dataTH[2]);
            byte_write(0x2003, dataTH[3]);
            byte_write(0x2004, dataTH[4]);
            byte_write(0x2005, dataTH[5]);
            byte_write(0x2006, dataTH[6]);
            byte_write(0x2007, dataTH[7]);
            byte_write(0x2020, 1);   
    }
}

//¸üÐÂeeprom´æ´¢µÄÊý¾Ý
void update_eeprom(){
            SectorErase(0x2000);
            byte_write(0x2000, dataTH[0]);
            byte_write(0x2001, dataTH[1]);
            byte_write(0x2002, dataTH[2]);
            byte_write(0x2003, dataTH[3]);
            byte_write(0x2004, dataTH[4]);
            byte_write(0x2005, dataTH[5]);
            byte_write(0x2006, dataTH[6]);
            byte_write(0x2007, dataTH[7]);
            byte_write(0x2020, 1);   
}

void updateLCD(){
    dataV[0] = get_0832_AD_data(0); //PH
    dataV[1] = get_hc_sr04_distance();  //SW
    dataV[2] = get_0832_AD_data(1);  //ZD
    dataV[3] = Get18B20Temp();  //WD
   
    phv = -58.87*(dataV[0]*5.0/255.0) + 216.77;
    if(phv > 141 || phv < 0 ) { phv = pre_ph_v; }
    pre_ph_v = phv;
    lcd[0] = ((int)phv)%1000/100+48;
    lcd[1] = ((int)phv)%100/10 + 48;
    lcd[2] =  '.';
    lcd[3] = ((int)phv)%10 + 48;
    lcd[4] =  '\0';
    PutStr(0,1, lcd);
    dataV[0] = phv;

    dataV[2]  = dataV[2] /2.55;
    if(dataV[2] > 99) dataV[2] = 99;
    lcd[0] = ((int)dataV[2])%100/10 + 48;
    lcd[1] = ((int)dataV[2])%10 + 48;
    lcd[2] =  '\0';
    PutStr(1,1, lcd);
   
    //dataV[1]  = 10 - (dataV[1]-40) /19;
    //if(dataV[1] > 10) dataV[1] = 10;
    //if(dataV[1] < 0) dataV[1] = 0;
    lcd[0] = ((int)dataV[1])%100/10 + 48;
    lcd[1] = ((int)dataV[1])%10 + 48;
    lcd[2] =  '\0';
    PutStr(2,1, lcd);
   
    lcd[0] = ((int)dataV[3])%100/10 + 48;
    lcd[1] = ((int)dataV[3])%10 + 48;
    lcd[2] =  '\0';
    PutStr(3,1, lcd);

}

void updateTH(){
    lcd[0] = ((int)dataTH[0])%1000/100+48;
    lcd[1] = ((int)dataTH[0])%100/10 + 48;
    lcd[2] =  '\0';
    PutStr(0,4, lcd);
   
  lcd[0] = ((int)dataTH[1])%1000/100+48;
    lcd[1] = ((int)dataTH[1])%100/10 + 48;
    lcd[2] =  '\0';
    PutStr(0,7, lcd);
   
    lcd[0] = ((int)dataTH[2])%100/10+48;
    lcd[1] = ((int)dataTH[2])%10 + 48;
    lcd[2] =  '\0';
    PutStr(1,4, lcd);

    lcd[0] = ((int)dataTH[3])%100/10+48;
    lcd[1] = ((int)dataTH[3])%10 + 48;
    lcd[2] =  '\0';
    PutStr(1,7, lcd);

    lcd[0] = ((int)dataTH[4])%100/10+48;
    lcd[1] = ((int)dataTH[4])%10 + 48;
    lcd[2] =  '\0';
    PutStr(2,4, lcd);

    lcd[0] = ((int)dataTH[5])%100/10+48;
    lcd[1] = ((int)dataTH[5])%10 + 48;
    lcd[2] =  '\0';
    PutStr(2,7, lcd);

    lcd[0] = ((int)dataTH[6])%100/10+48;
    lcd[1] = ((int)dataTH[6])%10 + 48;
    lcd[2] =  '\0';
    PutStr(3,4, lcd);

    lcd[0] = ((int)dataTH[7])%100/10+48;
    lcd[1] = ((int)dataTH[7])%10 + 48;
    lcd[2] =  '\0';
    PutStr(3,7, lcd);
}


void timer1(){
    updateLCD();
    updateTH();
    alarm();
}

void main(){
   
    init_hc_sr04();
    DS18B20Init();
    LcmInit();           //LCD12864³õʼ»¯                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
    LcmClearTXT();       //LCD12864ÇåÆÁ        
    init_eeprom();
    timer1_start(1000, timer1);
   
    PutStr(0,0, "PH     H     L  ");  
    PutStr(1,0, "ZD     H     L  ");  
    PutStr(2,0, "SW     H     L  ");  
    PutStr(3,0, "WD     H     L  ");  
   
    while(1){
        setKeyDeal();
        addKeyDeal();
        subKeyDeal();
    }
}



void alarm(){//±¨¾¯
    if( (int)dataV[0] > dataTH[0] || (int)dataV[0] < dataTH[1] || \
            (int)dataV[2] > dataTH[2] || (int)dataV[2] < dataTH[3] ||  \
            (int)dataV[1] > dataTH[4] || (int)dataV[1] < dataTH[5] ||  \
            (int)dataV[3] > dataTH[6] || (int)dataV[3] < dataTH[7]   \
    ){
        //beep=0;
    }else{
        beep=1;
    }
}


char flagSet = 0;

void setDeal(){
    switch(flagSet){
        case 0: PutStr(3,6, " "); break;
        case 1: PutStr(0,3, "*"); break;
        case 2: PutStr(0,6, "*"); PutStr(0,3, " "); break;
        case 3: PutStr(1,3, "*"); PutStr(0,6, " "); break;
        case 4: PutStr(1,6, "*"); PutStr(1,3, " "); break;
        case 5: PutStr(2,3, "*"); PutStr(1,6, " "); break;
        case 6: PutStr(2,6, "*"); PutStr(2,3, " "); break;
        case 7: PutStr(3,3, "*"); PutStr(2,6, " "); break;
        case 8: PutStr(3,6, "*"); PutStr(3,3, " "); break;
    }
}

void setKeyDeal(){
    setKey = 1;
    if(setKey == 0){
        delay(1000);
        if(setKey == 0){
            flagSet++;
            if(flagSet > 8){ flagSet = 0; }
            setDeal();
            while(setKey == 0);
        }
    }
}

void addKeyDeal(){
    addKey = 1;
    if(addKey == 0 && flagSet > 0){
        delay(1000);
        if(addKey == 0){
            
            switch(flagSet){
                case 1: if(dataTH[0] < 141)        dataTH[0]+=10;  break;
                case 2: if(dataTH[1] < dataTH[0]) dataTH[1]+=10;  break;
                case 3: if(dataTH[2] < 99)        dataTH[2]++;  break;
                case 4: if(dataTH[3] < dataTH[2]) dataTH[3]++;  break;
                case 5: if(dataTH[4] < 10)        dataTH[4]++;  break;
                case 6: if(dataTH[5] < dataTH[4]) dataTH[5]++;  break;
                case 7: if(dataTH[6] < 99)        dataTH[6]++;  break;
                case 8: if(dataTH[7] < dataTH[6]) dataTH[7]++;  break;
            }
            updateTH();
            update_eeprom();
            while(addKey == 0);
        }
    }
}

void subKeyDeal(){
    subKey = 1;
    if(subKey == 0 && flagSet > 0){
        delay(1000);
        if(subKey == 0){
            
            switch(flagSet){
                case 1: if(dataTH[0] > dataTH[1]+10)        dataTH[0]-=10;  break;
                case 2: if(dataTH[1] > 10) dataTH[1]-=10;  break;
                case 3: if(dataTH[2] > dataTH[3])        dataTH[2]--;  break;
                case 4: if(dataTH[3] > 0) dataTH[3]--;  break;
                case 5: if(dataTH[4] > dataTH[5])        dataTH[4]--;  break;
                case 6: if(dataTH[5] > 0) dataTH[5]--;  break;
                case 7: if(dataTH[6] > dataTH[7])        dataTH[6]--;  break;
                case 8: if(dataTH[7] > 0) dataTH[7]--;  break;
            }
            updateTH();
            update_eeprom();
            while(subKey == 0);
        }
    }
}
超聲波函數(shù)
#include "HC_SR04.h"

unsigned char FLAG_OVERFLOW = 0;   //³¬Éù²¨Ê±¼ä¹ý³¤Òç³ö±êÖ¾

//10us
void delay10us(unsigned int i)
{
    while(i--);
}

void init_hc_sr04()
{
    TRIG = 0;
   
    TMOD &= 0xf0;
    TMOD |= 0x01;
    TH0 = 0x3c;
    TL0 = 0xb0;
    TF0 = 0;
    ET0 = 1;
    PT0 = 1;
    EA = 1;
}

void timer0() interrupt 1
{
    FLAG_OVERFLOW=1;
}

int get_hc_sr04_distance(void){
        unsigned int distance;
        
    TH0 = 0x3c;
    TL0 = 0xb0;
        TR0 = 0;
            
        FLAG_OVERFLOW = 0;     
        TRIG = 1;   
        delay10us(2);
        TRIG = 0;
        TR0 = 1;
   
        while(!ECHO && FLAG_OVERFLOW == 0);
    TH0 = 0x3c;
    TL0 = 0xb0;
        TR0 = 1;  
   
        while(ECHO && FLAG_OVERFLOW == 0);  
        TR0 = 0;  

    distance = TH0 << 8 | TL0;  

    distance = (distance-15536)/58;

    if(FLAG_OVERFLOW == 1){
       FLAG_OVERFLOW = 0;
             distance = 999;
    }
        
        return (distance);
}








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

使用道具 舉報

沙發(fā)
ID:332214 發(fā)表于 2021-4-14 10:03 | 只看該作者
delay10us(2);
TRIG = 0;
TR0 = 1; //這個定時器0 沒必要打開
while(!ECHO && FLAG_OVERFLOW == 0);  //&& FLAG_OVERFLOW == 0 這個標(biāo)志位也沒必要
這樣改試試,想更精確點把ECHO腳接外部中斷來開啟定時器時間計數(shù)。
回復(fù)

使用道具 舉報

板凳
ID:332214 發(fā)表于 2021-4-14 10:09 | 只看該作者
每個人的編程習(xí)慣不同,提個小意見,個人覺得,參數(shù)設(shè)置可以放在定時器里,數(shù)據(jù)更新放在主函數(shù)里,這樣參數(shù)設(shè)置的時候并不需要考慮數(shù)據(jù)更新,但是如果反過來,會出現(xiàn)一種情況,就是參數(shù)在設(shè)置時,進入到定時器里進行數(shù)據(jù)更新。
回復(fù)

使用道具 舉報

地板
ID:652483 發(fā)表于 2021-4-14 10:16 | 只看該作者
不行啊,為什么一按按鍵顯示屏就滅,顯示屏是串行方式,
超聲波數(shù)值是更新了,但是要顯示屏滅了之后才更新
void updateLCD(){
    dataV[0] = get_0832_AD_data(0); //PH
    dataV[1] = get_hc_sr04_distance();  //SW---------是不是這里有什么問題
    dataV[2] = get_0832_AD_data(1);  //ZD
    dataV[3] = Get18B20Temp();  //WD
回復(fù)

使用道具 舉報

5#
ID:332214 發(fā)表于 2021-4-14 10:27 | 只看該作者
最好辦法是,key按鈕里面不做顯示屏數(shù)據(jù)更新,只做參數(shù)設(shè)置,顯示屏更新接口應(yīng)該只放在一個函數(shù)里完成。這就是我上面提的小意見。你那邊好好考慮一下,中斷函數(shù)經(jīng)量少占用執(zhí)行周期。比較你這邊的功能上,對時間的要求并不嚴(yán)格。
回復(fù)

使用道具 舉報

6#
ID:390416 發(fā)表于 2021-4-14 10:38 | 只看該作者
那就用一個持續(xù)增加的變量 代替超聲波,看看能不能正常變化顯示
回復(fù)

使用道具 舉報

7#
ID:652483 發(fā)表于 2021-4-14 10:43 | 只看該作者
啊哈哈123 發(fā)表于 2021-4-14 10:27
最好辦法是,key按鈕里面不做顯示屏數(shù)據(jù)更新,只做參數(shù)設(shè)置,顯示屏更新接口應(yīng)該只放在一個函數(shù)里完成。這 ...

key不參與更新,主要是超聲波的問題,其他顯示正常,加入超聲波就有問題了
回復(fù)

使用道具 舉報

8#
ID:332214 發(fā)表于 2021-4-14 10:51 | 只看該作者
你這邊問題主函數(shù)在調(diào)用  PutStr();這個屏幕更新函數(shù),定時器1也在調(diào)用。為啥你那邊把超聲波獲取函數(shù)注釋就正常,那是因為你那邊用定時器0來等待超聲波回傳信息的計時,所以在單片機指令執(zhí)行周期上,就會顯的占用周期,屏幕會黑屏。你可以把,主函數(shù)調(diào)用程序里,所有用到  PutStr();這個函數(shù)注釋,超聲波正常執(zhí)行。你在看看你按 按鈕是不是黑屏。
回復(fù)

使用道具 舉報

9#
ID:652483 發(fā)表于 2021-4-14 11:14 | 只看該作者
啊哈哈123 發(fā)表于 2021-4-14 10:51
你這邊問題主函數(shù)在調(diào)用  PutStr();這個屏幕更新函數(shù),定時器1也在調(diào)用。為啥你那邊把超聲波獲取函數(shù)注釋就 ...

我改了一下就是先顯示前兩行再測量超聲波,然后前兩行才顯示一下就被超聲波給中斷了
回復(fù)

使用道具 舉報

10#
ID:652483 發(fā)表于 2021-4-14 11:16 | 只看該作者
啊哈哈123 發(fā)表于 2021-4-14 10:51
你這邊問題主函數(shù)在調(diào)用  PutStr();這個屏幕更新函數(shù),定時器1也在調(diào)用。為啥你那邊把超聲波獲取函數(shù)注釋就 ...

那超聲波不用定時器可以嗎,沒用過超聲波
回復(fù)

使用道具 舉報

11#
ID:332214 發(fā)表于 2021-4-14 11:27 | 只看該作者
這看你對超聲波的精確要求了,不用定時器也行,但是在超聲波測距的時候等待時間計算的時候,最好不要有中斷打斷計時時間。不然測距是很不準(zhǔn)的。
你這邊現(xiàn)有的程序,就是把邏輯改改,還可以用的。如果對超聲波測距 距離稍微精確點,最好多讀幾遍,求平均。
回復(fù)

使用道具 舉報

12#
ID:652483 發(fā)表于 2021-4-14 11:29 | 只看該作者
人人學(xué)會單片機 發(fā)表于 2021-4-14 10:38
那就用一個持續(xù)增加的變量 代替超聲波,看看能不能正常變化顯示

可以,可就是超聲波的測量方法跟to沖突了
回復(fù)

使用道具 舉報

13#
ID:652483 發(fā)表于 2021-4-14 11:49 | 只看該作者
啊哈哈123 發(fā)表于 2021-4-14 11:27
這看你對超聲波的精確要求了,不用定時器也行,但是在超聲波測距的時候等待時間計算的時候,最好不要有中斷 ...

int get_hc_sr04_distance(void){
                unsigned int distance;
               
    TH0 = 0x3c;
    TL0 = 0xb0;
                TR0 = 0;
                       
                //FLAG_OVERFLOW = 0;     
                Trig = 1;   
                delay10us(2);
                Trig = 0;
                TR0 = 1;
   
                while(!Echo);
    TH0 = 0x3c;
    TL0 = 0xb0;
                TR0 = 1;  
   
                while(Echo);  
                TR0 = 0;  

    distance = TH0 << 8 | TL0;  

    distance = (distance-15536)/58;

                return (distance);
}
這就是測量的函數(shù),具體要怎么改呢
回復(fù)

使用道具 舉報

14#
ID:332214 發(fā)表于 2021-4-14 13:27 | 只看該作者
超聲波原理,就是發(fā)射極發(fā)送脈沖信號一段時間,接收極接收信號,當(dāng)接收到信號的時候,數(shù)據(jù)腳是高電平,計錄高電平的時間,然后根據(jù)聲在空氣傳播速度,計算出距離。這個就是基本思想(聲在空氣傳播速度 受溫濕度影響)。你這邊改不用定時器計時,就把定時器的記錄時間改成自己寫的時間記錄。我覺得你現(xiàn)在沒必要改成不用定時器,你現(xiàn)在的問題,就是確定好中斷與刷屏?xí)r間的關(guān)系,前面已經(jīng)建議你這邊把刷屏接口放在同一個函數(shù),放在同一個順序邏輯上。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品亚洲一区二区三区 | 久久久久久国 | 中文字幕av中文字幕 | 一区二区三区免费 | 91视频在线网站 | 国产免费一区二区三区免费视频 | 久久久久久国产精品免费免费狐狸 | 日韩欧美三级电影 | 精品久久久久久久人人人人传媒 | 情侣酒店偷拍一区二区在线播放 | 久久777 | 国产91亚洲精品一区二区三区 | 成人在线视频免费看 | 狠狠干网站 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 亚洲精品一区中文字幕乱码 | 97国产精品视频人人做人人爱 | 天天综合久久网 | 国产精品久久性 | 国产一区二区电影 | 国产精品色婷婷久久58 | 国产日韩欧美一区二区 | 免费国产视频 | 国产亚洲一区二区三区 | 中文字幕不卡在线观看 | 精品一区二区三区四区外站 | 天天操天天干天天爽 | 日日摸日日碰夜夜爽2015电影 | 成人性生交大免费 | 国产成人精品久久久 | 国产精品久久久久久婷婷天堂 | 伊人二区 | 瑟瑟激情| 97精品一区二区 | 亚洲欧美日韩久久久 | 国产九九精品视频 | 国产午夜一级 | 精品国产一区二区在线 | 超碰人人插 | 九九成人 | 国产精品美女久久久久aⅴ国产馆 |