當前位置:首頁 » 編程語言 » c語言單片機超聲波測距
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言單片機超聲波測距

發布時間: 2022-09-06 03:35:30

『壹』 51單片機 HC-SR04超聲波測距 我寫的c語言代碼,請問

1、HC-SR04使用方法:給觸發端子trig一個10us以上的高電平即可觸發,觸發後echo端子將接受到高電平,高電平的持續時間就是測距的往返時間。


2、常式:

#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/*位定義*/
sbitCHUFA=P0^1;//位定義超聲波觸發端(10us以上高電平觸發)
sbitJIESHOU=P0^3;//接收端(接受高電平)
sbitBEEP=P2^0;//蜂鳴器
sbitOUT0=P3^2;//外部中斷0
ucharJS_FLAG;//接收標志
uintCF_TIME,t0,t1,shu;
/*函數聲明*/
voidtimer0();
voidint0();
voiddisplay(uint);
main(){
CHUFA=0;//初始化拉低觸發端和接收端電平
JIESHOU=0;
JS_FLAG=0;
CF_TIME=15;//初始化觸發時間(大於10us)
TMOD=0x11;//定時器方式選擇
EA=1;//開總中斷
ET0=1;//開定時器0中斷
EX0=1;//開外部中斷0
IT0=0;//外部中斷選擇下降沿觸發
//JIESHOU=1;
while(1){
OUT0=JIESHOU;//外部中斷0被賦值為接收端信號,當出現下降沿是觸發外部中斷0
if(JS_FLAG==0){//如果沒有接收到高電平則觸發
CHUFA=1;
while(CF_TIME--);//10us以上高電平觸發感測器
}
if(JIESHOU==1){
TR0=1;//如果接收端收到高電平則啟動定時器
JS_FLAG=1;//並且標志位置1
BEEP=0;//蜂鳴器響
}
display(t1);//顯示測量時間(秒)
}
}
/*定時器0中斷程序*/
voidtimer0()interrupt1{
TH0=(65536-10000)/256;//裝初值10ms
TL0=(65536-10000)%256;
t0++;//每進入一次中斷t0加1
}
/*外部中斷0中斷程序*/
voidint0()interrupt0{
TR0=0;//一旦進入外部中斷0,說明接收端收到下降沿信號。關閉定時器0
JS_FLAG=0;//接收標志位置0
BEEP=1;//關閉蜂鳴器
t1=t0*10/1000;//測量時間為進入定時器中斷次數t0乘以每次時間10ms,除以1000化為秒為單位
t0=0;//t0清零
}
/*數碼管顯數函數*/
voiddisplay(uintshu){
//數碼管顯示函數
}

『貳』 51單片機超聲波測距離C語言程序出錯

你調用這個函數時,寫有參數嗎?

這個函數是沒有參數的

『叄』 基於單片機超聲波測距c語言程序求解釋

//上面這段什麼意思?
//上下面這段什麼意思? 沒有code為什麼也可以存16進制?
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

有code和沒有code的區別在於 dis_smg變數的存儲的存儲方式上
我記得有code的適合 dis_smg的數組元素不能改變的吧 記得不清楚了
你可以網路去

//下面是不是數碼管引腳和單片機引腳對應?
//數碼管位選定義
sbit smg_we1 = P3^4; //數碼管位選定義

答案: 是

『肆』 單片機超聲波雷達測距的C語言程序設計,具體要求看問題補充

你到網路文庫中找找,會找到很多的。你也可到淘寶網上找一下:「單片機超聲波測距模塊電子設計製作C程序」這是一款比較好的程序,附的資料比較多,有Protel格式原理圖、PCB圖,有源程序、設計論文報告、元件清單等,製作非常容易,只要按圖焊接好元件,基本不需要調試,最遠可測量到6.99米,報警距離還可調節。 這里還有製作調試好的實物,你找找看。

『伍』 幫忙做一個超音波測距儀程序,c語言和匯編語言都行

這里有一個超聲波測距程序,供參考:
#include<reg52.H>//器件配置文件
#include<intrins.h>
//感測器介面
sbitRX=P3^2;
sbitTX=P3^3;
//按鍵聲明
sbitS1=P1^4;
sbitS2=P1^5;
sbitS3=P1^6;
//蜂鳴器
sbitFeng=P2^0;

sbitW1=P1^0;
sbitW2=P1^1;
sbitW3=P1^2;
sbitW4=P1^3;
//變數聲明
unsignedinttime=0;
unsignedinttimer=0;
unsignedcharposit=0;
unsignedlongS=0;
unsignedlongBJS=50;//報警距離80CM
//模式0正常模式1調整
charMode=0;
bitflag=0;
bitflag_KEY=0;
unsignedcharconstdiscode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff/*-*/}; //數碼管顯示碼0123456789-和不顯示
//unsignedcharconstpositon[4]={0xfd,0xfb,0xf7,0xfe}; //位選
unsignedchardisbuff[4] ={0,0,0,0}; //數組用於存放距離信息
unsignedchardisbuff_BJ[4] ={0,0,0,0};//報警信息
voidDisplay();
//延時20ms(不精確)
voiddelay(void)
{
unsignedchara,b,c;
for(c=2;c>0;c--)
for(b=38;b>0;b--)
for(a=60;a>0;a--);
}

//按鍵掃描
voidKey_()
{
if(flag_KEY==0)
{
if(Mode!=0)
{
//+
if(S1==0)
{
delay(); //延時去抖
if(S1==0)
{
BJS++; //報警值加
flag_KEY=1;
if(BJS>=151)//最大151
{
BJS=0;
}
// while(S1==0)
// Display();
}

}
//-
if(S2==0)
{
delay();
if(S2==0)
{
BJS--; //報警值減
flag_KEY=1;
if(BJS<=1) //最小1
{
BJS=150;
}
// while(S2==0)
// Display();
}

}
}
//功能
if(S3==0) //設置鍵
{
delay();
if(S3==0)
{
Mode++; //模式加
flag_KEY=1;
if(Mode>=2) //加到2時清零
{
Mode=0;
}
// while(S3==0)
// Display();
}
}
}
if((P1&0x70)==0x70)
{
flag_KEY=0;
}
}
/**********************************************************************************************************/
//掃描數碼管
voidDisplay(void)
{
//正常顯示
if(Mode==0)
{
P0=0x00;//關閉顯示
if(posit==1)//數碼管的小數點
{
P0=(discode[disbuff[posit]])|0x80;//按位或,最高位變為1,顯示小數點
}
elseif(posit==0)
{
P0=~discode[11];
}
else
{
P0=discode[disbuff[posit]];
}
switch(posit)
{
case0:W1=0;W2=1;W3=1;W4=1;break;
case1:W1=1;W2=0;W3=1;W4=1;break;
case2:W1=1;W2=1;W3=0;W4=1;break;
case3:W1=1;W2=1;W3=1;W4=0;break;
}
posit++;
if(posit>3) //每進一次顯示函數,變數加1
posit=0; //加到3時清零
}
//報警顯示
else
{
P0=0x00;
if(posit==1)//數碼管的小數點
{
P0=(discode[disbuff_BJ[posit]])|0x80;
}
elseif(posit==0)
{
P0=0x76; //顯示字母
}
else
{
P0=discode[disbuff_BJ[posit]];
}
switch(posit)
{
case0:W1=0;W2=1;W3=1;W4=1;break;
case1:W1=1;W2=0;W3=1;W4=1;break;
case2:W1=1;W2=1;W3=0;W4=1;break;
case3:W1=1;W2=1;W3=1;W4=0;break;
}
posit++;
if(posit>3)
posit=0;
}
}
/**********************************************************************************************************/
//計算
voidConut(void)
{
time=TH0*256+TL0; //讀出T0的計時數值
TH0=0;
TL0=0; //清空計時器
S=(time*1.7)/100;//算出來是CM
//聲音的速度是340m/s,時間的單位是us,計算到秒需要將時間數據/1000000,
//長度=速度*時間,340*time/1000000,長度數據單位是m轉換成cm需要乘以100得到340*time/10000,
//小數點都向左移兩位得到3.4*time/100,因為超聲波是往返了,所以再除以2,得到距離數據(time*1.7)/100
if(Mode==0) //非設置狀態時
{
if((S>=700)||flag==1)//超出測量范圍顯示「-」
{
Feng=0; //蜂鳴器報警
flag=0;
disbuff[1]=10; //「-」
disbuff[2]=10; //「-」
disbuff[3]=10; //「-」
}
else
{
//距離小於報警距
if(S<=BJS)
{
Feng=0; //報警
}
else//大於
{
Feng=1; //關閉報警
}
disbuff[1]=S%1000/100; //將距離數據拆成單個位賦值
disbuff[2]=S%1000%100/10;
disbuff[3]=S%1000%10%10;
}
}
else
{
Feng=1;
disbuff_BJ[1]=BJS%1000/100;
disbuff_BJ[2]=BJS%1000%100/10;
disbuff_BJ[3]=BJS%1000%10%10;
}
}
/**********************************************************************************************************/
//定時器0
voidzd0()interrupt1 //T0中斷用來計數器溢出,超過測距范圍
{
flag=1; //中斷溢出標志
}
/**********************************************************************************************************/
//定時器1
voidzd3()interrupt3 //T1中斷用來掃描數碼管和計800MS啟動模塊
{
TH1=0xf8;
TL1=0x30; //定時2ms
Key_(); //掃描按鍵
Display(); //掃描顯示
timer++; //變數加
if(timer>=400) //400次就是800ms
{
timer=0;
TX=1; //800MS啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
/**********************************************************************************************************/
//主函數
voidmain(void)
{
TMOD=0x11; //設T0為方式1
TH0=0;
TL0=0;
TH1=0xf8; //2MS定時
TL1=0x30;
ET0=1; //允許T0中斷
ET1=1; //允許T1中斷
TR1=1; //開啟定時器
EA=1; //開啟總中斷
while(1)
{
while(!RX); //當上次接收完波後,RX引腳是低電平,取反就是1,此while成立,反復判斷RX狀態。當RX沒有接收到返回波時是高電平,取反就是0,此while不成立,跳出
TR0=1; //開啟計數
while(RX); //當RX沒有接收到返回波,此while成立,程序停在這里一直判斷RX狀態。當RX接收到返回波,RX引腳變為低電平,此while不成立,跳出
TR0=0; //停止計數
Conut(); //計算
}
}

『陸』 求一段匯編程序,利用51單片機控制3個超聲波感測器測距的C語言程序

超聲波測距要有具體的感測器相關參數才可以做出來,這與要發出多大頻率的脈沖有關。
你求一段匯編語言,卻要一個測距的C語言程序?呵呵,不知你到底要什麼?

『柒』 求一個51 超聲波測距 C語言的完整程序,高分求


//晶振=8M
//MCU=STC10F04XE
//P0.0-P0.6共陽數碼管引腳
//Trig = P1^0
//Echo = P3^2
#include <reg52.h> //包括一個52標准內核的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
//***********************************************
sfr CLK_DIV = 0x97; //為STC單片機定義,系統時鍾分頻
//為STC單片機的IO口設置地址定義
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfrP2M1 = 0X95;
sfrP2M0 = 0X96;
//***********************************************
sbit Trig = P1^0; //產生脈沖引腳
sbit Echo = P3^2; //回波引腳
sbit test = P1^1; //測試用引腳

uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9
uint distance[4]; //測距接收緩沖區
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定義寄存器
bit succeed_flag; //測量成功標志
//********函數聲明
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; //系統時鍾為1/8晶振(pdf-45頁)
P0M1 = 0; //將io口設置為推挽輸出
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; //由高電平變低電平,觸發外部中斷
ET0=1; //打開定時器0中斷
//ET1=1; //打開定時器1中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0


while(1) //程序循環
{
EA=0;
Trig=1;
delay_20us();
Trig=0; //產生一個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);//等待測量的結果,周期65.535毫秒(可用中斷實現)
TR1=0; //關閉定時器1
EX0=0; //關閉外部中斷

if(succeed_flag==1)
{
distance_data=outcomeH; //測量結果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//與低8位合並成為16位結果數據
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; //將測量結果的數據放入緩沖區
/// 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; //關閉外部中斷
}
//****************************************************************
//定時器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=;P2=0xfb;flag=0;break;
}
}
//*****************************************************************
/*
//定時器1中斷,用做超聲波測距計時
timer1() interrupt 3 // 定時器0中斷是1號
{
TH1=0;
TL1=0;
}
*/
//******************************************************************
//顯示數據轉換程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余運算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余運算
ge_data=temp_data;

_data=SEG7[_data];
shi_data=SEG7[shi_data];
ge_data =SEG7[ge_data];

EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************
void delay_20us()
{ uchar bt ;
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;} /*交換值
}
*/

這是個用過的程序,引腳和參數你自己調一下吧,附件里有1602顯示的內容,希望對你有用。

『捌』 c語言單片機超聲波測距可以不使用定時器和外部中斷口嗎

不可以啊,你可以一直不斷的發送超聲波,然後通過查詢接收到,但是你用查詢操作至少要好幾個時鍾周期才能查詢一次,你不可能保證查詢到的一瞬間正好是超聲波返回的時間,誤差很大,定時器是必須要用的,用來計算超聲波從發出到接收的時間。

『玖』 誰能給我一段用單片機C語言超聲波測距的程序,是讓單片機輸出一個40KHZ的方波脈沖 AT89S52,接發P1.0(1)

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCM_Data P0
#define Busy 0x80
sbit RemPin = P3^2;
sbit TxPin = P3^4;
uint length = 0;
uchar flag = 0;

sbit Ceshi1 = P1^2;
sbit Ceshi2 = P1^3;
sbit Ceshi3 = P1^4;
sbit Ceshi4 = P1^5;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;

sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;

void DelayMs(uint Ms)
{
uint i,TempCyc;
for(i=0;i<Ms;i++)
{
TempCyc = 250;
while(TempCyc--);
}
}

void delay25us_40KHz(unsigned char us)
{
while(us--)
{
TxPin = 0;
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();
TxPin = 1;
_nop_();_nop_();
_nop_();_nop_();
}
TxPin = 1;
}

void init0int() interrupt 0
{
uint timer_us = 0;
TR0=0;
timer_us = TH0*256+TL0;
if(timer_us>190)timer_us=timer_us-180;

length = ((unsigned long)(340)*timer_us)/2000;
flag = 0;
EA = 0;
}
/*===========================================================================
超出測量時間
=============================================================================*/
void timer0int (void) interrupt 1
{
TR0=0;
length = 0;
flag = 1;
EA = 0;
}

/*===========================================================================
主程序
=============================================================================*/
void main(void)
{
EX0 = 1; //允許總中斷中斷,使能 INT0 外部中斷
ET0 = 1; //接受timer0中斷
TMOD=0x11; //設定T0為16位時器,設定T1為16位時器
Ceshi1=0;Ceshi2=0;
P2=0x00;
while(1)
{
if(length>3800) {Ceshi4=0;Ceshi3=0;Ceshi2=0;Ceshi1=0 ;}
if((length<=3800)&&(length>3000)) {Ceshi4=0;Ceshi3=0;Ceshi2=0;Ceshi1=1 ;}
if((length<=3000)&&(length>2000)) {Ceshi4=0;Ceshi3=0;Ceshi2=1;Ceshi1=0 ;}
if((length<=2000)&&(length>1000)) {Ceshi4=0;Ceshi3=0;Ceshi2=1;Ceshi1=1 ;}
if((length<=1000)&&(length>0)) {Ceshi4=0;Ceshi3=1;Ceshi2=0;Ceshi1=0 ;}
if(length==0){Ceshi1=0;Ceshi2=0;Ceshi4=0;Ceshi3=0;}
TH0=0x00;
TL0=0x00;
TR0=1; //啟動定時器0
EA = 1; //允許所有中斷
delay25us_40KHz(15); //發出脈沖信號
DelayMs(200);
if(P1_0==1) P2_0=1;
if(P1_1==1) P2_1=1;
if(P1_0==0) P2_0=0;
if(P1_1==0) P2_1=0;
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==0&&Ceshi1==0) {P2_5=0;P2_4=0;P2_3=0;P2_2=0;}
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==0&&Ceshi1==1) {P2_5=0;P2_4=0;P2_3=0;P2_2=1;}
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==1&&Ceshi1==0) {P2_5=0;P2_4=0;P2_3=1;P2_2=0;}
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==1&&Ceshi1==1) {P2_5=0;P2_4=0;P2_3=1;P2_2=1;}
if(Ceshi4==0&&Ceshi3==1&&Ceshi2==0&&Ceshi1==0) {P2_5=0;P2_4=1;P2_3=0;P2_2=0;}

}
}

//length就是測量的長度。。。。之前寫的程序,你看一下,有什麼問題再問我。

『拾』 求US-100(模塊)超聲波測距的C語言程序,基於51單片機的,3Q哦~

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
sbit tr=P1^0;
sbit ec=P1^1;
uint distance,time,tl,th;
void delay_20us(void )
{
uchar a ;
for(a=0;a<100;a++);
}
void delay(uint a )
{
while(a--);
}
void display(void )
{
P2=0xff;
P2=0xfe;
P0=smg[distance/100];
delay(200);
P2=0xff;
P2=0xfd;
P0=smg[distance%100/10];
delay(200);
P2=0xff;
P2=0xfb;
P0=smg[distance%10];
delay(200);
}
void main(void )
{
uchar i;
TMOD=0X10;
while(1)
{
tr=1; //超聲波輸入端
delay_20us(); //延時20us
tr=0; //產生一個20us的脈沖
while(ec==0); //等待Echo回波引腳變高電平
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //計數溢出標志
TR1=1; //啟動定時器1
while(ec==1);
th=TH1;
tl=TL1;
TL1=0;
TH1=0;
TR1=0; //關閉定時器1
time=th*256+tl;
distance=time*0.017; //厘米 */
display();

}
}
不懂M我