国产三级在线看完整版-内射白嫩大屁股在线播放91-欧美精品国产精品综合-国产精品视频网站一区-一二三四在线观看视频韩国-国产不卡国产不卡国产精品不卡-日本岛国一区二区三区四区-成年人免费在线看片网站-熟女少妇一区二区三区四区

儀器網(wǎng)(yiqi.com)歡迎您!

| 注冊2 登錄
網(wǎng)站首頁-資訊-話題-產(chǎn)品-評測-品牌庫-供應(yīng)商-展會-招標-采購-知識-技術(shù)-社區(qū)-資料-方案-產(chǎn)品庫-視頻

問答社區(qū)

求個51單片機超聲波測距(距離+報警)的c程序

Carman_888 2017-05-19 03:18:16 460  瀏覽
  • 求個51單片機超聲波測距(距離+報警)的c程序

參與評論

全部評論(1條)

  • 285008723 2017-05-19 15:20:44
    //晶振=8M //MCU=STC10F04XE //P0.0-P0.6共陽數(shù)碼管引腳 //Trig = P1^0 //Echo = P3^2 #include <reg52.h> //包括一個52標準內(nèi)核的頭文件 #define uchar unsigned char //定義一下方便使用 #define uint unsigned int #define ulong unsigned long //*********************************************** sfr CLK_DIV = 0x97; //為STC單片機定義,系統(tǒng)時鐘分頻 //為STC單片機的IO口設(shè)置地址定義 sfr P0M1 = 0X93; sfr P0M0 = 0X94; sfr P1M1 = 0X91; sfr P1M0 = 0X92; sfr P2M1 = 0X95; sfr P2M0 = 0X96; //*********************************************** sbit Trig = P1^0; //產(chǎn)生脈沖引腳 sbit Echo = P3^2; //回波引腳 sbit test = P1^1; //測SY引腳 uchar codeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數(shù)碼管0-9 uint distance[4]; //測距接收緩沖區(qū) uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定義寄存器 bit succeed_flag; //測量成功標志 //********函數(shù)聲明 void conversion(uint temp_data); void delay_20us(); //void pai_xu(); void main(void) // 主程序 { uint distance_data,a,b; uchar CONT_1; CLK_DIV=0X03; //系統(tǒng)時鐘為1/8晶振(pdf-45頁) P0M1 = 0; //將io口設(shè)置為推挽輸出 P1M1 = 0; P2M1 = 0; P0M0 = 0XFF; P1M0 = 0XFF; P2M0 = 0XFF; i=0; flag=0; test=0; Trig=0; //首先拉低脈沖輸入引腳 TMOD=0x11; //定時器0,定時器1,16位工作方式 TR0=1; //啟動定時器0 IT0=0; //由高電平變低電平,觸發(fā)外部中斷 ET0=1; //打開定時器0中斷 //ET1=1; //打開定時器1中斷 EX0=0; //關(guān)閉外部中斷 EA=1; //打開總中斷0 while(1) //程序循環(huán) { EA=0; Trig=1; delay_20us(); Trig=0; //產(chǎn)生一個20us的脈沖,在Trig引腳 while(Echo==0); //等待Echo回波引腳變高電平 succeed_flag=0; //清測量成功標志 EX0=1; //打開外部中斷 TH1=0; //定時器1清零 TL1=0; //定時器1清零 TF1=0; // TR1=1; //啟動定時器1 EA=1; while(TH1 < 30);//等待測量的結(jié)果,周期65.535毫秒(可用中斷實現(xiàn)) TR1=0; //關(guān)閉定時器1 EX0=0; //關(guān)閉外部中斷 if(succeed_flag==1) { distance_data=outcomeH; //測量結(jié)果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//與低8位合并成為16位結(jié)果數(shù)據(jù) distance_data*=12; //因為定時器默認為12分頻 distance_data/=58; //微秒的單位除以58等于厘米 } //為什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 if(succeed_flag==0) { distance_data=0; //沒有回波則清零 test= !test; //測試燈變化 } /// distance[i]=distance_data; //將測量結(jié)果的數(shù)據(jù)放入緩沖區(qū) /// i++; /// if(i==3) /// { /// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4; /// pai_xu(); /// distance_data=distance[1]; a=distance_data; if(b==a) CONT_1=0; if(b!=a) CONT_1++; if(CONT_1>=3) { CONT_1=0; b=a; conversion(b); } /// i=0; /// } } } //*************************************************************** //外部中斷0,用做判斷回波電平 INTO_() interrupt 0 // 外部中斷是0號 { outcomeH =TH1; //取出定時器的值 outcomeL =TL1; //取出定時器的值 succeed_flag=1; //至成功測量的標志 EX0=0; //關(guān)閉外部中斷 } //**************************************************************** //定時器0中斷,用做顯示 timer0() interrupt 1 // 定時器0中斷是1號 { TH0=0xfd; //寫入定時器0初始值 TL0=0x77; switch(flag) {case 0x00:P0=ge; P2=0xfd;flag++;break;
    case 0x01:P0=shi;P2=0xfe;flag++;break;
    case 0x02:P0=bai;P2=0xfb;flag=0;break;
    } } //***************************************************************** /* //定時器1中斷,用做超聲波測距計時 timer1() interrupt 3 // 定時器0中斷是1號 { TH1=0; TL1=0; } */ //****************************************************************** //顯示數(shù)據(jù)轉(zhuǎn)換程序 void conversion(uint temp_data) { uchar ge_data,shi_data,bai_data ; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余運算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余運算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; } //****************************************************************** void delay_20us() { ucharbt ; for(bt=0;bt<100;bt++); } /* void pai_xu() { uint t; if(distance[0]>distance[1]) {t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交換值 if(distance[0]>distance[2]) {t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交換值 if(distance[1]>distance[2]) {t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交換值 } */

    贊(1)

    回復(fù)(0)

    評論

熱門問答

求個51單片機超聲波測距(距離+報警)的c程序
求個51單片機超聲波測距(距離+報警)的c程序
2017-05-19 03:18:16 460 1
求51單片機超聲波測距代碼
 
2011-08-20 06:16:46 488 2
求US-100(模塊)超聲波測距的C語言程序,基于51單片機的,3Q哦~
求基于51單片機的US-100超聲波測距C語言程序。需要詳細點的具體設(shè)計程序,O(∩_∩)O~ US-100模塊參考資料:http://wenku.baidu.com/view/65e63e35a32d7375a41780ce.html 性能要求:實現(xiàn)2--150cm的測距,測得結(jié)果保留4位有效數(shù)字(取整數(shù)),單位:mm。 哪... 求基于51單片機的US-100超聲波測距C語言程序。需要詳細點的具體設(shè)計程序,O(∩_∩)O~ US-100模塊參考資料:http://wenku.baidu.com/view/65e63e35a32d7375a41780ce.html 性能要求:實現(xiàn)2--150cm的測距,測得結(jié)果保留4位有效數(shù)字(取整數(shù)),單位:mm。 哪位大神幫幫忙嘍,急?。。?!真心謝謝大神了~ 展開
2017-05-17 15:16:00 580 1
這個51單片機HC-SR04超聲波測距程序哪里錯了
//晶振11.0592MHz #include #define uchar unsigned char #define uint unsigned int sbit trig=P0^2; sbit echo=P3^3; float dis=0; uint irtime=0; void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); } void TI... //晶振11.0592MHz #include #define uchar unsigned char #define uint unsigned int sbit trig=P0^2; sbit echo=P3^3; float dis=0; uint irtime=0; void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); } void TIM1init(void)//定時器1初始化 { TMOD=0x22;//定時器1工作方式2,TH1是重裝值,TL1是初值 TH1=0xd2; //重載值 溢出一次約50us TL1=0xd2; //初始化值 ET1=1; //開中斷 } void EX1init(void) //外部中斷1初始化 { IT1 = 1; //指定外部中斷0下降沿觸發(fā),INT1 (P3.3) EA = 1; //開總中斷 } /*------------------------------------------------ 定時器1中斷處理 ------------------------------------------------*/ void tim1_isr (void) interrupt 3 { irtime++; //用于計數(shù)2個下降沿之間的時間 } /*------------------------------------------------ 外部中斷1中斷處理 ------------------------------------------------*/ void EX1_ISR (void) interrupt 2 //外部中斷1服務(wù)函數(shù) { dis=340*(irtime/2.0)*50/10000; irtime=0; TR1=0; EX1=0; } void test(void) { trig=1; delay_20us(); trig=0; EX1=1; while(!echo); TR1=1; } void main(void) { TIM1init(); EX1init(); while(1) { test(); display(dis); } } 主函數(shù)調(diào)用test,然后在數(shù)碼管上顯示(顯示函數(shù)略過),測試的時候,在數(shù)碼管上顯示的距離明顯不對,還各種不穩(wěn)定,有時就個位數(shù)上顯示一個1或2,不知道怎么回事 展開
2016-01-25 09:17:10 409 2
求一段匯編程序,利用51單片機控制3個超聲波傳感器測距的C語言程序
 
2017-07-25 22:41:03 341 1
51單片機超聲波測距模塊代碼
****************************************************************************************這是代碼原文 我想問一下主函數(shù)下的while循環(huán)里面 為什么等到echo回波回來了 才打開定時器1和外部中斷呢 這時候回波已經(jīng)回來了啊 不是測不出超聲波回波的時間了... ****************************************************************************************這是代碼原文 我想問一下主函數(shù)下的while循環(huán)里面 為什么等到echo回波回來了 才打開定時器1和外部中斷呢 這時候回波已經(jīng)回來了啊 不是測不出超聲波回波的時間了嗎還有就是 為什么在whlie循環(huán)前先打開了總中斷 然后進入whlie又立刻關(guān)閉 再重新打開 那diyi次打開不是很多余嗎 麻煩大神解答一下 展開
2018-06-26 20:47:55 563 1
求一段匯編程序,利用51單片機控制超聲波傳感器測距的程序。
 
2012-04-18 20:35:53 320 2
51單片機 HC-SR04超聲波測距 我寫的C語言代碼,請問
/* HC-SR04使用方法:給觸發(fā)端子trig一個10us以上的高電平即可觸發(fā),觸發(fā)后echo端子將接受到高電平,高電平的持續(xù)時間就是測距的往返時間。 下面是我寫的代碼:我想測試自己使用該模塊是否正確,于是就想實現(xiàn)如果echo端接受到了高電平,蜂鳴器BEEP就響。但... /* HC-SR04使用方法:給觸發(fā)端子trig一個10us以上的高電平即可觸發(fā),觸發(fā)后echo端子將接受到高電平,高電平的持續(xù)時間就是測距的往返時間。 下面是我寫的代碼:我想測試自己使用該模塊是否正確,于是就想實現(xiàn)如果echo端接受到了高電平,蜂鳴器BEEP就響。但是實際使用的時候發(fā)現(xiàn)并非預(yù)期結(jié)果,情高人幫忙看看下面的代碼有何問題。代碼不長,望大神賜教! */ #include #define uchar unsigned char #define uint unsigned int /*位定義*/ sbit CHUFA=P0^1; //位定義超聲波觸發(fā)端(10us以上高電平觸發(fā)) sbit JIESHOU=P0^3; //接收端(接受高電平) sbit BEEP=P2^0; //蜂鳴器 sbit OUT0=P3^2; //外部中斷0 uchar JS_FLAG; //接收標志 uint CF_TIME,t0,t1,shu; /*函數(shù)聲明*/ void timer0(); void int0(); void display(uint); main(){ CHUFA=0; //初始化拉低觸發(fā)端和接收端電平 JIESHOU=0; JS_FLAG=0; CF_TIME=15; //初始化觸發(fā)時間(大于10us) TMOD=0x11; //定時器方式選擇 EA=1; //開總中斷 ET0=1; //開定時器0中斷 EX0=1; //開外部中斷0 IT0=0; //外部中斷選擇下降沿觸發(fā) //JIESHOU=1; while(1){ OUT0=JIESHOU; //外部中斷0被賦值為接收端信號,當出現(xiàn)下降沿是觸發(fā)外部中斷0 if(JS_FLAG==0){ //如果沒有接收到高電平則觸發(fā) CHUFA=1; while(CF_TIME--); //10us以上高電平觸發(fā)傳感器 } if(JIESHOU==1){ TR0=1; //如果接收端收到高電平則啟動定時器 JS_FLAG=1; //并且標志位置1 BEEP=0; //蜂鳴器響 } display(t1); //顯示測量時間(秒) } } /*定時器0中斷程序*/ void timer0() interrupt 1{ TH0=(65536-10000)/256; //裝初值 10ms TL0=(65536-10000)%256; t0++; //每進入一次中斷t0加1 } /*外部中斷0中斷程序*/ void int0() interrupt 0{ TR0=0; //一旦進入外部中斷0,說明接收端收到下降沿信號。關(guān)閉定時器0 JS_FLAG=0; //接收標志位置0 BEEP=1; //關(guān)閉蜂鳴器 t1=t0*10/1000; //測量時間為 進入定時器中斷次數(shù)t0乘以每次時間10ms,除以1000化為秒為單位 t0=0; //t0清零 } /*數(shù)碼管顯數(shù)函數(shù)*/ void display(uint shu){ //數(shù)碼管顯示函數(shù) } 展開
2013-05-11 19:12:16 577 2
51單片機溫度控制系統(tǒng)的C語言程序
設(shè)計基于單片計算機的溫度控制器。用于控制電加熱爐的溫度。具體要求如下1.溫度連續(xù)可調(diào),范圍為30℃~150℃2.超調(diào)量σ%≤20%3.溫度誤差≤±0.5℃4.人-機對話方便5.控制算法采用PID或改... 設(shè)計基于單片計算機的溫度控制器。用于控制電加熱爐的溫度。具體要求如下 1. 溫度連續(xù)可調(diào),范圍為30℃~150℃ 2. 超調(diào)量σ%≤20% 3. 溫度誤差≤±0.5℃ 4. 人-機對話方便 5. 控制算法采用PID或改進的PID或其他算法 .請發(fā)至3166109374@qq.com 謝謝幫忙 具體見http://wenku.baidu.com/view/e0feacf0f121dd36a22d822c 展開
2015-06-07 00:06:30 504 3
51單片機超聲波測距用lcd顯示
51單片機超聲波測距用lcd顯示1602顯示屏
2018-11-24 01:55:06 380 0
求一份如圖 基于單片機超聲波倒車測距的程序
2016-08-01 00:14:58 662 1
求用51單片機與DS18B20測溫的C程序。完整的。
 
2016-05-21 11:08:36 439 1
求一個正確的基于51單片機的函數(shù)信號發(fā)生器的C程序
要自己調(diào)試成功的,不要在網(wǎng)上找的,波形產(chǎn)生是用DAC0832,頻率顯示用數(shù)碼管也行,LCD1602也行,多謝大神幫忙,小弟不勝感激... 要自己調(diào)試成功的,不要在網(wǎng)上找的,波形產(chǎn)生是用DAC0832,頻率顯示用數(shù)碼管也行,LCD1602也行,多謝大神幫忙,小弟不勝感激 展開
2014-05-13 10:50:43 517 3
51單片機 超聲波測距 控制直流電機正反轉(zhuǎn)
通過超聲波傳感器測距,當距離大于設(shè)定值A(chǔ)時,直流電機反轉(zhuǎn);當距離等于設(shè)定值A(chǔ)時,直流電機停止;當距離小于設(shè)定值A(chǔ)時,直流電機正轉(zhuǎn)。具體要求:1)設(shè)定值A(chǔ)能夠通過鍵盤設(shè)定;2)電機所處的各個狀態(tài)(正轉(zhuǎn)、反轉(zhuǎn)和停止)及超聲波傳感器檢測的距離值能夠在液... 通過超聲波傳感器測距,當距離大于設(shè)定值A(chǔ)時,直流電機反轉(zhuǎn);當距離等于設(shè)定值A(chǔ)時,直流電機停止;當距離小于設(shè)定值A(chǔ)時,直流電機正轉(zhuǎn)。具體要求:1)設(shè)定值A(chǔ)能夠通過鍵盤設(shè)定;2)電機所處的各個狀態(tài)(正轉(zhuǎn)、反轉(zhuǎn)和停止)及超聲波傳感器檢測的距離值能夠在液晶上實時顯示。 展開
2015-07-12 14:27:24 787 1
做一個51單片機超聲波測距需要哪些器材
 
2017-02-28 00:10:01 438 1
求一份verilog的超聲波測距程序
基本要求: 1) 測量距離不低于0.5m,測量精度優(yōu)于0.1m。 2) 數(shù)字顯示測量結(jié)果,并能動態(tài)更新,更新周期約為0.5s。 拓展要求: 1) 測量距離大于1m,測量精度優(yōu)于0.05m,顯示精度為0.01m,顯示要求同上。 2) 數(shù)字顯示測量結(jié)果的更新周期可調(diào),顯示... 基本要求: 1) 測量距離不低于0.5m,測量精度優(yōu)于0.1m。 2) 數(shù)字顯示測量結(jié)果,并能動態(tài)更新,更新周期約為0.5s。 拓展要求: 1) 測量距離大于1m,測量精度優(yōu)于0.05m,顯示精度為0.01m,顯示要求同上。 2) 數(shù)字顯示測量結(jié)果的更新周期可調(diào),顯示穩(wěn)定。當距離小于0.5m時,通過蜂鳴器給出間歇式的“滴-滴”聲響告警;當距離小于0.3m時,告警聲響變得更加急促。 3) 其它功能(如使用多個超聲波傳感器實現(xiàn)汽車倒車雷達的功能)。 拓展要求可要可不要,求做過的大佬給份程序謝謝。 展開
2018-07-02 06:15:24 307 1
基于51單片機,ADC0804,光敏電阻,濕度傳感器,求程序?。。?!
我用的51單片機,采集光強度和空氣濕度,利用了兩個ADC0804進行轉(zhuǎn)換(光敏電阻和電阻式濕度傳感器),但是沒有相應(yīng)程序,哪位大哥能幫忙弄一個程序啊?如果是可行的程序,我賬號里剩下... 我用的51單片機,采集光強度和空氣濕度,利用了兩個ADC0804進行轉(zhuǎn)換(光敏電阻和電阻式濕度傳感器),但是沒有相應(yīng)程序,哪位大哥能幫忙弄一個程序啊?如果是可行的程序,我賬號里剩下的分全給你,雖然不多... 展開
2011-06-01 01:20:26 341 4
求一個51單片機控制的溫度計顯示程序
stc98c51控制2個4位數(shù)碼管,溫度傳感器為DS18B20。數(shù)碼管的a,b,c,d,e,f,g,dp端接在P0口... stc98c51控制2個4位數(shù)碼管,溫度傳感器為DS18B20。數(shù)碼管的a,b,c,d,e,f,g,dp端接在P0口 展開
2012-05-03 04:58:40 448 2
想學下51單片機的超聲波測距,有幾個疑問。
想學下51單片機的超聲波測距,有幾個疑問。 在百度上看到的超聲波模塊工作原理:單片機供給超聲波信號端Trig一個Z少10us長的高電平信號,模塊自動發(fā)射8個40khz的方波,自動檢測到信號是否返回,有信號返回,Echo端輸出一個高電平,高電平持續(xù)的實踐就是超... 想學下51單片機的超聲波測距,有幾個疑問。 在百度上看到的超聲波模塊工作原理:單片機供給超聲波信號端Trig一個Z少10us長的高電平信號,模塊自動發(fā)射8個40khz的方波,自動檢測到信號是否返回,有信號返回,Echo端輸出一個高電平,高電平持續(xù)的實踐就是超聲波從發(fā)射到返回的時間。 我的理解是給Trig一個10微秒以上高電平信號,模塊會發(fā)射超聲波,這個時候Echo應(yīng)該是低電平,等有聲波信號返回時Echo會變高電平,聲波從發(fā)射到返回用了多長時間,Echo的高電平就持續(xù)多長時間。不知道理解的對不對? 這里有個疑問,百度了一下發(fā)現(xiàn)都是檢測Echo收到返回聲波后高電平持續(xù)時間來計算距離,為什么不檢測從模塊發(fā)射聲波到Echo收到返回聲波的時間呢?這樣不是可以節(jié)約一半的時間嗎? 還有一個問題,我在學習板上試了一下程序,給Trig一個20微秒的高電平信號,然后等待Echo變高電平開啟定時器,但直到定時器溢出Echo一直都是高電平,超聲波模塊離墻面只有80厘米左右,模塊換了2個都是這樣。 第三個問題,百度上說計算測量距離等于定時器記錄的時間乘以340除以2,但定時器記錄的時間單位不是納秒嗎?還要除以一百萬才能乘以340吧?這樣得到的距離單位是米。 求教各位答疑解惑。 展開
2018-01-19 02:56:05 446 2
基于89C52單片機的HC-SR04超聲波測距系統(tǒng)程序
 
2018-12-09 01:37:42 379 0

4月突出貢獻榜

推薦主頁

最新話題