導航:首頁 > 製冷設備 > 超聲波測距程序怎麼寫

超聲波測距程序怎麼寫

發布時間:2022-04-19 04:59:51

Ⅰ 51單片機超聲波測距代碼

1602液晶顯示 的超聲波模塊程序
介面程序里邊都有、、

#include
//#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit lcdrs=P2^3;
sbit lcden=P2^2;
sbit trig=P2^0; //超聲波發送
//sbit echo=P3^2; //超聲波接受
//P0____________DB0-DB7
uchar dis[]="Disp_HC-SR04";
uchar num[]="0123456789";
uint distance;

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}

void HC_init()
{
TMOD=0x09;
TR0=1;
TH0=0;TL0=0;
}

uint HC_jisuan()
{
uint dist,timer;
timer=TH0;
timer<<=8;
timer=timer|TL0;
dist=timer/53; //晶振11.0592MHz 距離cm=微秒us/58
return dist; //1個機器周期是12個時鍾周期 timer*12/(58*11.0592)=timer/53
}

void HC_run()
{
uint tempH=0x00,tempL=0x00;
TH0=0;TL0=0;
trig=0;
trig=1;
delay(1);
trig=0;
while((TH0-tempH!=0||TL0-tempL!=0)||(TH0==0&&TL0==0))
{
tempH=TH0;
tempL=TL0;
}
delay(1);
}

void lcd_write_com(uchar com) //LCD寫指令
{
lcdrs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}

void lcd_write_data(uchar date) //LCD寫數據
{
lcdrs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}

void lcd_init() //LCD初始化
{
lcden=0;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
}

void lcd_display(uchar temp)
{
uint i;

lcd_write_com(0x82);
for(i=0;i<12;i++)
{
lcd_write_data(dis[i]);
}

lcd_write_com(0x80+0x41);
lcd_write_data('D');
lcd_write_data('i');
lcd_write_data('s');
lcd_write_data('t');
lcd_write_data('a');
lcd_write_data('n');
lcd_write_data('c');
lcd_write_data('e');
lcd_write_data(':');
lcd_write_data(num[temp/100]);
lcd_write_data(num[temp/10%10]);
lcd_write_data(num[temp%10]);
lcd_write_data('c');
lcd_write_data('m');
}

void main()
{
lcd_init();
HC_init();
while(1)
{
HC_run();
distance=HC_jisuan();
lcd_display(distance);
delay(200);
}
}

Ⅱ 51單片機超聲波模塊測試程序怎樣寫

//晶振=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;
sfr P2M1 = 0X95;
sfr P2M0 = 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;} /*交換值
}
*/

Ⅲ 超聲波測距程序分析

程序我沒有仔細看,有些思路你考慮一下:
1、不知道你用的哪個型號的單片機,計數器所用的時鍾頻率是多少?5cm意味著約300uS的聲波傳輸時間,結合你的計數頻率和計數器的位數,看看300uS你的計數器有沒有溢出;
2、超過5cm的時候,用示波器探一下有沒有收到聲波信號,可能是你的放大倍數不夠,信號太弱導致信號沒有被識別;
3、仔細考慮一下你的收發探頭的安裝方式,有沒有可能接收到直射波,我覺得這種可能性要大一些;超聲測距,接收探頭必須只接收到反射波,否則測出來肯定不準確;
4、測試不準確,可以考慮進行多次測量,去掉一半的異常值(比如說測回來8個數,去掉2個最大的,再去掉2個最小的),然後取平均;這樣測出來的結果相對准確一些。
就是這些了,希望對你有幫助。

Ⅳ 用c51單片機如何實現超聲波測距控製程序(40khz)

//超聲波模塊程序
//Trig = P2^0
//Echo = P3^2
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//
void delay_20us()
{
uchar a ;
for(a=0;a<100;a++);
}

//***************************************************************
//顯示數據轉換程序
void display(uint temp)
{
uchar ge,shi,;
=temp/100;
shi=(temp%100)/10;
ge=temp%10;

wela=1;
P0=0xf7;
wela=0;
la=1;
P0=table[];
la=0;
delay(1);
la=1;
P0=0x00; //關位碼
la=0;

wela=1;
P0=0xef;
wela=0;
la=1;
P0=table[shi];
la=0;
delay(1);
la=1;
P0=0x00; //關位碼
la=0;

la=1;
P0=table[ge];
la=0;
wela=1;
P0=0xdf;
wela=0;
delay(1);
la=1;
P0=0x00; //關位碼
la=0;

}
//***************************************************************
void main()
{
uint distance;
test =0;
Trig=0; //首先拉低脈沖輸入引腳
EA=1; //打開總中斷0
TMOD=0x10; //定時器1,16位工作方式
while(1)
{
EA=0; //關總中斷
Trig=1; //超聲波輸入端
delay_20us(); //延時20us
Trig=0; //產生一個20us的脈沖
while(Echo==0); //等待Echo回波引腳變高電平
succeed_flag=0; //清測量成功標志
EA=1;
EX0=1; //打開外部中斷0
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //計數溢出標志
TR1=1; //啟動定時器1
delay(20); //等待測量的結果
TR1=0; //關閉定時器1
EX0=0; //關閉外部中斷0
if(succeed_flag==1)
{
time=timeH*256+timeL;
distance=time*0.172; //厘米
display(distance);
}
if(succeed_flag==0)
{
distance=0; //沒有回波則清零
test = !test; //測試燈變化
}
}
}
//***************************************************************
//外部中斷0,用做判斷回波電平
void exter() interrupt 0 // 外部中斷0是0號
{
timeH =TH1; //取出定時器的值
timeL =TL1; //取出定時器的值
succeed_flag=1;//至成功測量的標志
EX0=0; //關閉外部中斷
}
//****************************************************************
//定時器1中斷,用做超聲波測距計時
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
}
轉http://blog.sina.com.cn/s/blog_4f8cdc9e0100g3e7.html
其實網上很多的,csdn 程序員都有的,在這里一般都得不到你要的東西,此程序僅供參考,具體的怎麼寫還得靠自己,網上的只能是借鑒,哪有一摸一樣的啊,關鍵是吸收後在自己寫。。。祝你好運,

Ⅳ 超聲波測距程序

以下是用匯編語言編寫的超聲波測距控制源程序:採用AT89S51 12MHz晶振 顯示緩沖單元在40H~43H,使用內存44H、45H、46H用於計算距離
20H用於標志
VOUT EQU P1.0 ;脈沖輸出埠
*中斷入口程序*
ORG 0000H
LJMP START
ORG 0003H
LJMP PINT0
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
*主程序*
START: MOV SP, #4FH
MOV R0, #40H ;40~43H為顯示數據存放單元(40為最高位)
MOV R7,#0BH
CLEARDISP:MOV @R0, #00H
INC R0
DJNZ R7, CLEARDISP
MOV 20H, #00H
MOV TMOD, #21H ;T1為8位自動重裝模式,T0為16位定時器
MOV TH0, #00H ;65ms初值
MOV TL0, #00H ;40KHz初值
MOV TH1, #0F2H
MOV TL1, #0F2H
MOV P0, #0FFH
MOV P1, #0FFH
MOV P2, #0FFH
MOV P3, #0FFH
MOV R4, #04H ;超聲波脈沖個數控制(為賦值的一半)
SETB PX0
SETB ET0
STEB EA
CLR 00H
SETB TR0 ;開啟測距定時器
START1: LCALL DISPLAY
JNB 00H, START1 ;收到反射信號時標志位為1
CLR EA
LCALL WORK;計算距離子程序
SETB EA
CLR 00H
SETB TR0;重新開啟測距定時器
MOV R2, #64H ; 測量間隔控制(約4*100=400ms)
LOOP: LCALL DISPLAY
DJNZ R2, LOOP
SJMP START 1
*中斷程序*
;T0中斷,65ms中斷一次
INTT0: CLR EA
CLR TR0
MOV TH0, #00H
MOV TL0, #00H
SETB ET1
SETB EA
SETB TR0 ;啟動計時器T0,用以計算超聲波來回時間
SETB TR1 ;開啟發超聲波用定時器T1
OUT: RETI;T1中斷,發超聲波用
INTT1: CPL VOUT
DJNZ R4,RETIOUT
CLR TR1;超聲波發送完畢,關T1
CLR ET1
MOV R4,#04H
SETB EX0;開啟接收回波中斷
RETIOUT: RETI;外中斷0,收到回波時進入
PINT0: CLR TR0 ;關計數器
CLR TR1
CLR ET1
CLR EA
CLR EX0
MOV 44H, TL0;將計數值移入處理單元
MOV 45H, TH0
SETB 00H ;接收成功標志
RETI
*延時程序*
DL1MS: MOV R6, #14H
DL1: MOV R7, #19H
DL2: DJNZ R6, DL2
DJNZ R6, DL1
RET
*顯示程序*
;40H為最高位,43H為最低位,先掃描高位
DISPLAY: MOV R1, #40H;G
MOV R5,#0F7H;G
PLAY: MOV A, R5
MOV P0, #0FFH
MOV P2, A
MOV A, @R1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV P0, A
LCALL DLIMS
INC R1
MOV A, R5
JNB ACC.0, ENDOUT;G
RR A
MOV R5, A
AJMP PLAY
ENDOUT: MOV P2, #0FFH
MOV P0, #0FFH
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共陽數碼管 0 ,1, 2,3,4,5,6,7,8,9,不亮,A,
*距離計算程序(=計算值×17/1000cm) 近似
WORK: PUSH ACC
PUSH PSW
PUSH B
MOV PSW, #18H
MOV R3, 45H
MOV R2, 44H
MOV R1, #00D
MOV R0, #17D
LCALL MUL2BY2
MOV R3, #03H
MOV R2, #0E8H
LCALL DIV4BY2
LCALL DIV4BY2
MOV 40H, R4
MOV A, 40H
JNZ JJ0
MOV40H,#0AH ;最高位為0,不點亮
JJ0: MOV A R0
MOV R4, A
MOV A R1
MOV R5,A
MOV R3, #00D
MOV R2, #100D
LCALL DIV4BY2
MOV 41H, R4
MOV A, 41H
JNZ JJ1
MOV A, 40H ;此高位為0,先看最高位是否為不亮
SUBB A, #0AH
JNZ JJ1
MOV 41H, #0AH ; 最高位不亮,次高位也不亮
JJ1: MOV A, R0
MOV R4, A
MOV A, R1
MOV R5, A
MOV R3, #00D
MOV R2, #10D
LCALL DIV4BY2
MOV 42H, R4
MOV A 42H
JNZ JJ2
MOV A,41H ;次高位為0,先看次高位是否為不亮
SUBB A, #0AH
JNZ JJ2
MOV 42H, #0AH ;次高位不亮,次高位也不亮
JJ2: MOV 43H, R0
POP B
POP PSW
POP ACC
RET
*兩位元組無符號數乘法程序
MUL2BY2: CLR A
MOV R7, A
MOV R6, A
MOV R5, A
MOV R4, A
MOV 46H, #10H
MULLOOP1: CLR C
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R0
RLC A
MOV R0, A
MOV A, R1
RLC A
MOV R1, A
JNC MULLOOP2
MOV A, R4
ADD A, R2
MOV R4, A
MOV A, R5
ADDC A, R3
MOV R5, A
MOV A, R6
ADDC A, #00H
MOV R6, A
MOV A, R7
ADDC A, #00H
MOV R7, A
MULLOOP2: DJNZ 46H, MULLOOP1
RET
*四位元組/兩位元組無符號數除法程序*
DIV4BY2: MOV 46H, #20H
MOV R0, #00H
MOV R1, #00H
DIVLOOP1: MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R0
RLC A
MOV R0, A
MOV A, R1
RLC A
MOV R1, A
CLR C
MOV A, R0
SUBB A, R2
MOV B, A
MOV A, R1
SUBB A, R3
JC DIVLOOP2
MOV R0, B
MOV R1, A
DIVLOOP2: CPL C
DJNZ 46H, DIVLOOP1
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
RET
END

Ⅵ 請大俠幫忙編一下程 超聲波測距的

我做過和你一樣的電路的超聲波測距
下面是成功的代碼

#include <reg52.h> //包括一個52標准內核的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //產生脈沖引腳
sbit Rx = P3^2; //回波引腳
sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳
sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳
sbit E=P2^2; //使能信號位,將E位定義為P2.2引腳
sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳
unsigned char code string[ ]= {"CHAO SHENG BO"};
//unsigned char code string1[ ]={"QUICK STUDY MCU"};
unsigned char code digit[ ]={"0123456789"}; //定義字元數組顯示數字
//uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9
uint distance[4]; //測距接收緩沖區
uchar kk,ww,ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定義寄存器
bit succeed_flag; //測量成功標志
//********函數聲明
void conversion(uint temp_data);
void delay_20us();
void pai_xu();

/*****************************************************
函數功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:判斷液晶模塊的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
result=BF; //將忙碌標志電平賦給result
E=0; //將E恢復低電平
return result;
}
/*****************************************************
函數功能:將模式設置指令或顯示地址寫入液晶模塊
入口參數:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
_nop_();
_nop_(); //空操作兩個機器周期,給硬體反應時間
P0=dictate; //將數據送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:指定字元顯示的實際地址
入口參數:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
}
/*****************************************************
函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊
入口參數:y(為字元常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS為高電平,RW為低電平時,可以寫入數據
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
P0=y; //將數據送入P0口,即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:對LCD的顯示模式進行初始化設置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延時15ms,首次寫指令時應給LCD一段較長的反應時間
WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據介面
delay(5); //延時5ms ,給硬體一點反應時間
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38); //連續三次,確保初始化成功
delay(5);
WriteInstruction(0x0c); //顯示模式設置:顯示開,無游標,游標不閃爍
delay(5);
WriteInstruction(0x06); //顯示模式設置:游標右移,字元不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除
delay(5);
}

void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
uchar k; //定義變數i指向字元串數組元素
LcdInitiate(); //調用LCD初始化函數
delay(10); //延時10ms,給硬體一點反應時間
WriteAddress(0x01); // 從第1行第3列開始顯示
k = 0; //指向字元數組的第1個元素
while(string[k] != '\0')
{
WriteData(string[k]);
k++; //指向下字元數組一個元素
}
i=0;

flag=0;
Tx=0; //首先拉低脈沖輸入引腳
TMOD=0x10; //定時器0,定時器1,16位工作方式
// TR0=1; //啟動定時器0
IT0=0; //由高電平變低電平,觸發外部中斷
//ET0=1; //打開定時器0中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0

while(1) //程序循環
{
WriteAddress(0x41); // 從第2行第6列開始顯示
WriteData('J'); //將萬位數字的字元常量寫入LCD
WriteData('U'); //將萬位數字的字元常量寫入LCD
WriteData('L'); //將萬位數字的字元常量寫入LCD
WriteData('I'); //將萬位數字的字元常量寫入LCD
WriteData(':'); //將萬位數字的字元常量寫入LCD
WriteData(digit[ww]); //將萬位數字的字元常量寫入LCD
WriteData(digit[kk]); //將萬位數字的字元常量寫入LCD
WriteData(digit[]); //將萬位數字的字元常量寫入LCD
WriteData(digit[shi]); //將千位數字的字元常量寫入LCD
WriteData('.'); //將萬位數字的字元常量寫入LCD
WriteData(digit[ge]); //將百位數字的字元常量寫入LCD
WriteData(' '); //將百位數字的字元常量寫入LCD
WriteData('C'); //將萬位數字的字元常量寫入LCD
WriteData('M'); //將萬位數字的字元常量寫入LCD
EA=0;
Tx=1;
delay_20us();
Tx=0; //產生一個20us的脈沖,在Tx引腳
while(Rx==0); //等待Rx回波引腳變高電平
succeed_flag=0; //清測量成功標志
EX0=1; //打開外部中斷
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //
TR1=1; //啟動定時器1
EA=1;

while(TH1 < 250);//等待測量的結果,周期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; //沒有回波則清零

}

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;

}

//顯示數據轉換程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data,k_data,w_data ;
w_data=temp_data/10000 ;
temp_data=temp_data%10000; //取余運算
k_data=temp_data/1000 ;
temp_data=temp_data%1000; //取余運算
_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]&0x7f;
//ge_data =SEG7[ge_data];

EA=0;
kk=k_data;
ww=w_data;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************

void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;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;}
}

Ⅶ HC-SR04超聲波測距 程序怎麼寫啊!! 輸出代碼 和輸入定時器計數高電平時間代碼~ MSP430F149單片機

給你個at89c51的程序,自己稍微改一下就可以了。這個是用數碼管顯示的。
#include <REG52.h>
#include<stdio.h>

#define uchar unsigned char
#define uint unsigned int
extern char *itoa(int i);

uint code SEG7[16]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,
0x30,0x25,0xa9,0x26,0xa1,0xb1};//0 1 2 3 4 5 6 7 8 9 A-E

uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //數碼管顯示位置

uchar dis[4];
sbit trig=P1^0;
sbit echo=P1^1;

void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}

void display(uint dis)
{
P0=SEG7[dis%10];
P2=ACT[3];
delay(1);

P0=SEG7[(dis/10)%10];
P2=ACT[2];
delay(1);

P0=SEG7[(dis/100)%10];
P2=ACT[1];
delay(1);

P0=SEG7[dis/1000];
P2=ACT[0];
delay(1);
}

void display2(uint Hi,uint Low)
{
P0=SEG7[Hi%10];
P2=ACT[3];
delay(1);

P0=SEG7[(Hi/10)%10];
P2=ACT[2];
delay(1);

P0=SEG7[(Hi/100)%10];
P2=ACT[1];
delay(1);

/* P0=SEG7[Hi/1000];
P2=ACT[0];
delay(1);
*/
//Low
P0=SEG7[Low%10];
P2=ACT[7];
delay(1);

P0=SEG7[(Low/10)%10];
P2=ACT[6];
delay(1);

P0=SEG7[(Low/100)%10];
P2=ACT[5];
delay(1);

/* P0=SEG7[Low/1000];
P2=ACT[4];
delay(1); */
}

void delay10us()
{
uchar i;
for(i=11;i>0;i--);
}

void init()
{
TMOD=0x21;//模式1
TH1=0xf3;//4800bps fosc=12M
TL1=0xf3;
TR0=0;
trig=0;
echo=0;
TH0=0;
TL0=0;
TCON=0x00;
SCON=0x50;//SM0=0 SM1=1 SM2=0 REN=1 TB8=0 R8=0 TI=0 RI=0
PCON=0x80;//SMOD=1
TR1=1;
ES=1;
EA=1;
}

uint getDistance()
{
uint i=29412;//5m來回需要的時間(us) (5*2/340)*1000000
TR0=0;
TH0=0;
TL0=0;
//接收信號端置0
echo=0;
//開始觸發
trig=1;
//延時10微秒
delay10us();
//停止觸發
trig=0;
//沒有信號返回並且在5米障礙物信號返回需要的時間前則等待 (無信號即時返回,防止死循環,阻礙其它程序的執行)
while(!echo&&i>0)
{
i--;
}

if(i>0)//小於5米,說明有信號返回
{
TR0=1;//開始計時
while(echo); //持續高電平則計時,轉為低電平則退出
TR0=0;//停止計時
return (uint)((TH0*256+TL0)*0.170); //單位:mm //340000/1000000/2=0.17 mm/us
}
//display2(TH0,TL0);
return 0; //大於5米則返回0
}

void SendChar(uchar ch)
{
SBUF=ch;
while(!TI);
TI=0;
}
void SendCmd(uchar *cmd,uchar sz)
{
uchar i=0;
SendChar('$');
for(i=0;i<sz;i++)
{
SendChar(*(cmd+i));
}
SendChar('@');
}

void main()
{
uint distance=0;
init();
while(1)
{
//測距
distance=getDistance();
//sprintf(dis,"%4d",distance);
//SendCmd(dis,4);
display(distance);
/* if(TF0)
{
TF0=0;
TH0=0;
TL0=0;
} */
}
}

void serial_serve(void) interrupt 4
{

}

Ⅷ 超聲波測距模塊的單片機程序怎麼寫

先做硬體,看到信號後再考慮單片機程序怎麼寫。

Ⅸ 51單片機控制的超聲波測距儀程序

希望對你有幫助
//超聲波模塊顯示程序
#include <reg52.h> //包括一個52標准內核的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //產生脈沖引腳
sbit Rx = P3^2; //回波引腳
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;
i=0;
flag=0;
Tx=0; //首先拉低脈沖輸入引腳
TMOD=0x11; //定時器0,定時器1,16位工作方式
TR0=1; //啟動定時器0
IT0=0; //由高電平變低電平,觸發外部中斷
ET0=1; //打開定時器0中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0

while(1) //程序循環
{
EA=0;
Tx=1;
delay_20us();
Tx=0; //產生一個20us的脈沖,在Tx引腳
while(Rx==0); //等待Rx回波引腳變高電平
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; //沒有回波則清零

}

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=0x7f;flag++;break;
case 0x01:P0=shi;P2=0xbf;flag++;break;
case 0x02:P0=;P2=0xdf;flag=0;break;
}
}

//顯示數據轉換程序
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]&0x7f;
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<60;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;}
}

閱讀全文

與超聲波測距程序怎麼寫相關的資料

熱點內容
通訊設備概念股票有哪些 瀏覽:266
中山市嘉豪五金製品廠 瀏覽:493
東莞鳳崗精工五金製品廠 瀏覽:620
改儀表盤顏色找什麼店改 瀏覽:96
綜合極端實驗裝置 瀏覽:191
昆明空調與製冷培訓班要收多少錢 瀏覽:235
思域十代儀表盤怎麼變紅 瀏覽:594
寶駿自動化設備有限公司怎麼樣 瀏覽:898
電腦錄音設備被禁用怎麼辦 瀏覽:298
玻璃儀器為什麼不能烘乾 瀏覽:129
空氣能加熱時儀表顯示什麼圖案 瀏覽:405
海鑫五金製品有限公司6 瀏覽:875
一般納稅人設備安裝費怎麼開票 瀏覽:405
為什麼要進行設備注冊 瀏覽:71
氫氣還原氧化銅實驗怎麼檢查裝置氣密性 瀏覽:917
視覺儀器檢查625什麼意思 瀏覽:436
鑽機軸承溫度過高有什麼危害 瀏覽:464
乙醇的氧化反應實驗裝置圖 瀏覽:302
6205zz軸承是什麼級別 瀏覽:551
浙江永康東牌電動工具 瀏覽:924