超声波测距c语言程序(共4页).doc
精选优质文档-倾情为你奉上/超声波模块显示程序#include <reg52.h> #define uchar unsigned char #define uint unsigned int#define ulong unsigned longsbit Tx = P33; /产生脉冲引脚sbit Rx = P32; /回波引脚sbit fmq=P17;uchar code SEG710=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/数码管0-9uint distance4; /测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; /自定义寄存器bit succeed_flag; /测量成功标志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=SEG7bai_data; shi_data=SEG7shi_data&0x7f; ge_data =SEG7ge_data; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; /20us延时函数 void delay_20us() uchar bt ; for(bt=0;bt<22;bt+); /1ms基准延时程序void delay1ms(unsigned int i)unsigned char j; while(i-) for(j=0;j<115;j+) ; /产生1KHZ频率声音的函数void beep() fmq=0;delay1ms(500);fmq=1;delay1ms(500); / 主程序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 < 50);/等待测量的结果,周期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; /没有回波则清零 distancei=distance_data; /将测量结果的数据放入缓冲区 i+; if(i=3) distance_data=(distance0+distance1+distance2+distance3)/4; 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); if(b>0&&b<200) fmq=0; delay1ms(100); fmq=1; 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=bai;P2=0xdf;flag=0;break; 专心-专注-专业