超声波物体定位c语言程序

合集下载

9超声波测距程序超声波发射程序.c]

9超声波测距程序超声波发射程序.c]

1.#include<REG52.H>2.#include<INTRINS.H>3.#define uchar unsigned char4.#define uint unsigned int5.#define ulong unsigned long6.7.uint c;8.ulong l,time;9.char i=1,j=1,k=80;10.char t,tp=10,ts,tg,lb,ls,lg,lsf,fh,cb,cs,cg;11.sbit RW=P2^1;12.sbit RS=P2^0;13.sbit E=P2^2;14.sbit rece=P3^3;15.sbit tup=P1^1;16.sbit tdown=P1^0;17.sbit aj=P1^2;18.sbit reset=P1^3;19.20.sbit sg=P3^7;21.sbit DQ=P3^5;22.sbit ctl=P3^5;23.24.25.void delay(uint i)26.{while(i--);27. }28.29.//************液晶显示***************//30.31.void writercom(uchar q)32.{E=1;33. RS=0;34. RW=0;35. P0=q;36. E=0;37. delay(20);38. }39.40.void writerdata(uchar o)41.{42. E=1;43. RS=1;44. RW=0;45. P0=o;46. E=0;47. delay(20);48. }49.50.void writer_d(uchar *u)51.{while(*u)52. writerdata(*u++);53. }54.55.void xsinit(void)56.{writercom(0x01);57. writercom(0x38);//使用8位数据,显示两行,使用5*7的字型//58. writercom(0x0c);//显示设置,不显示光标,字符不显闪琐//59. writercom(0x06);//光标从左往右移,内容不移//60.61. }62.63.pdisplay()64.{writercom(0x80);65. writer_d("Press any key ");66. writercom(0xba);67. writer_d(" to continue...");68. delay(2000);69.70.}71.72.bdisplay()73.{writercom(0x80);74. writer_d("Ultrasonic ");75. writercom(0xba);76. writer_d(" range finder");77. delay(60000);78. }79.80.ipdisplay()81.{writercom(0x80);82. writer_d(" Please input ");83. writercom(0xba);84. writer_d("T(");85. writerdata(0xdf);86. writer_d("C) with K1,K2.");87. delay(2000);88. }90.91.92.//*************超声波测距*************************//93.94.void csbinit() //初始化程序,计数/定时器状态 //95.{TMOD=0x12; //定时器1工作在定时方式1,定时器0工作在定时方式2//96. IE=0x84; //中断设置//97. TH0=244;98. TL0=244;99. }100.101.void sen() //超声波发射程序//102.{uchar times=0;103. TR0=1;104. TR1=1; //开定时器//105.while(1)106. {while(TF0==0);107. sg=~sg;108. times++; //翻转20次,发送10个脉冲信号的超声波//109. TF0=0;110.if(times==20)break;}111. times=0;112.}113.114.csbdata()115.{lb=l/1000000;116. ls=l%1000000/100000;117. lg=l%1000000%100000/10000;118. lsf=l%1000000%100000%10000/1000;119.if(lsf>=5)120. lg=lg+1;121.}122.123.rec()interrupt 2 using 2//接收中断程序//124.{TR1=0;//关计数器//125. ctl=0;126. time=TH1*256+TL1; //算出t的值,t的单位为us//127. l=time*c/2;128. TH1=0;129. TL1=0;130. }131.132.display1()134.while(k--)135. {ipdisplay();136.if(tup==0||tdown==0||reset==0||aj==0){i=0;break;} 137. }138. k=60;139.while(k--)140. {pdisplay();141.if(tup==0||tdown==0||reset==0||aj==0){i=0;break;} 142. }143. k=60;144. }145.measure()146.{csbdata();147.while(1)148. {if(aj==1)break;}149. ctl=0;150. sen();151. delay(200);152. ctl=1;153. }154.155.156.display2()157.{writercom(0x80);158. writer_d("T:");159. writerdata(fh);160. writerdata(ts+0x30);161. writerdata(tg+0x30);162. writerdata(0xdf);163. writer_d("C ");164. writer_d("c=");165. writerdata(cb+0x30);166. writerdata(cs+0x30);167. writerdata(cg+0x30);168. writer_d("m/s");169.while(i)170. {while(k--)171. {writercom(0xba);172. writer_d("Press K3 measure");173.if(aj==0){i=0;break;}174. delay(2000);}175. k=20;176.while(k--)178. writer_d(" ");179.if(aj==0){i=0;break;}180. delay(2000);}181. k=20;182. }183. i=1;184. measure();185. delay(2000);186. csbdata();187. writercom(0x80);188.if(l<=360000)writer_d("too near! "); 189.else if(TH1>=93)writer_d("too long! "); 190.else {csbdata();191. writer_d("L=");192. writerdata(lb+0x30);193. writerdata('.');194. writerdata(ls+0x30);195. writerdata(lg+0x30);196. writer_d("m ");197. writer_d("T:");198. writerdata(fh);199. writerdata(ts+0x30);200. writerdata(tg+0x30);201. writerdata(0xdf);202. writer_d("C ");203. }204.while(i)205.{writercom(0xba);206. writer_d("Press K4 again..");207.if(tup==0&&tdown==0){j=0;break;}208.if(reset==0){i=0;break;}209.210. }211.}212.//***************温度输入程序**************// 213.iptemp()214.{while(1)215. {if(t<0){fh=0x2d;t=~t+1;}216.else{fh=0x20;}217. ts=t/10;218. tg=t%10;219. writercom(0x80);220. writer_d(" T:");222. writerdata(ts+0x30);223. writerdata(tg+0x30);224. writerdata(0xdf);225. writer_d("C ");226.if(tup==0){tp++;if(tp>=99)tp=99;}227. delay(7000);228.if(tdown==0){tp--;if(tp<=(-30))tp=(-30);} 229. t=tp;230. delay(7000);231. writercom(0xba);232. writer_d("Press K4 finish ");233.if(reset==0)break;234. }235.}236.//********声速处理程序************************// 237.sscl()238.{c=340;239.240. cb=c/100;241. cs=c%100/10;242. cg=c%100%10;243. }244.245.//***************主程序***************//246.main()247.{while(1)248.{xsinit();249. csbinit();250. bdisplay();251. bdisplay();252. bdisplay();253. bdisplay();254. bdisplay();255. ipdisplay();256. ipdisplay();257.while(i)258. {display1();259. }260. i=1;261. delay(20000);262. iptemp(); //调温度输入函数//263. sscl();264. delay(20000);265.while(j) 266.{display2(); 267. i=1;268.269.}270.j=1;271.delay(60000); 272.}273.}。

超声波 c语言

超声波  c语言

#include<reg51.h>#include<intrins.h>/***************************数码管为共阴数码管***************************/sbit s0=P2^7;//个位选通sbit s1=P2^6;//十位选通sbit s2=P2^5;//百位选通sbit s3=P2^4;//千位选通sbit dp=P0^7;//小数点sbit in=P3^2;//外部中断1,接CX20106的7脚sbit csb=P3^3;//40KHz方波输出脚#define seg P0 //数码管的数据口为P1口#define uchar unsigned char#define uint unsigned int#define nop _nop_()/****************************/void init(void);//初始化void delay_nms(uint n);//延时nmsvoid delay100us();//延时100usvoid display(uint dat);//4位数码管显示函数,只用了3位void tran(void);//超声波测量函数/***************************/uint dis,H=100,L=20;uchar flag=0,high_time,low_time,m=0;uchar leddata[]={0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"0x76, //"H"0x38, //"L"0x37, //"n"0x3E, //"u"0x73, //"P"0x5C, //"o"0x40, //"-"0x00, //熄灭0x00 //自定义};void delay100us(){uchar i;for(i=0;i<50;i++);}/********************************** 函数名称:主函数修改日期:入口参数:无返回值: 无**********************************/ void main(void){init();while(1) //循环测量并显示{tran();//发送超声波信号测距display(dis);//显示距离}}/********************************** 函数名称:初始化函数修改日期:入口参数:无返回值: 无**********************************/ void init(void){TMOD=0x01;//定时器0方式1用于计时TH0=0;TL0=0; /* 设定T0的工作模式为2*/EA=1;IT0=1;//下降沿有效,左传感器}/********************************** 函数名称:延时函数修改日期:入口参数:n返回值: 无**********************************/ void delay_nms(uint n){uchar i;while(n--){for(i=123;i>0;i--);}}/********************************** 函数名称:显示函数修改日期:入口参数:data返回值: 无**********************************/ void display(uint dat){uchar i,j,k;//分别为百十个位的缓存i=dat/100;//百位j=dat%100/10;//十位k=dat%100%10;//个位s3=1;s2=0;s1=1;s0=1;seg=~leddata[i];dp=0;delay_nms(2);dp=1;s2=1;s3=1;s2=1;s1=0;s0=1;seg=~leddata[j];delay_nms(2);s1=1;s3=1;s2=1;s1=1;s0=0;seg=~leddata[k];delay_nms(2);s0=1;}函数名称:超声波测量函数修改日期:入口参数:无返回值: 无**********************************/ void tran(void){uchar i;float temp;TH0=0;TL0=0;//清定时0TR0=1;//开定时0for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;delay_nms(1);EX0=1;//开中断if(flag==1) //中断标志位置1,说明有回波{ //以下为路程计算temp=high_time*256+low_time;temp=(temp/1000)/2;temp*=340;temp=temp/10;dis=(unsigned int)temp;flag=0;}}/********************************** 函数名称:中断函数修改日期:入口参数:无返回值: 无void TT() interrupt 0{uint tmp;TR0=0;//关定时器0ET0=0;//关外部中断flag=1; //置位标志位tmp=TH0*256+TL0; //读取定时器的值if((tmp>0)&&(tmp<60000))//判断是否超出范围,此设置的范围为0到10米,实际不能达到10米{high_time=TH0;//把计时值放入缓冲low_time=TL0;}else //超出范围则重新测量{high_time=0;low_time=0;}}。

C语言超声波测距程序 亲测可运行! 附代码数据

C语言超声波测距程序 亲测可运行!  附代码数据

#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^0; //1602的数据/指令选择控制线sbit rw=P2^1; //1602的读写控制线sbit en=P2^2; //1602的使能控制线sbit trig=P2^5; //超声波测距模块Trigsbit echo=P3^2; //超声波测距模块Echobit flag1; //触发信号标志位//uchar count; //中断累加变量long int distance; //测量所得距离unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字/*------------------------------------------------延时函数------------------------------------------------*/void delay(uint n){uint x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}/*------------------------------------------------延时函数------------------------------------------------*/void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}/*------------------------------------------------1602写命令函数------------------------------------------------*/void lcd_wcom(uchar com){rs=0; //选择指令寄存器rw=0; //选择写P0=com; //把命令字送入P0delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要en=0;}/*------------------------------------------------1602写数据函数------------------------------------------------*/void lcd_wdat(uchar dat){rs=1; //选择数据寄存器rw=0; //选择写P0=dat; //把要显示的数据送入P0delay(5); //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。

超声波C语言程序

超声波C语言程序
函数名:Send_Bao()
功能:从串口发送一个数据包
入口参数:指向要发送的数据包地址
************************************************************************/
void Send_Bao( char *Data)
{
char j=0;
超声波测距C程序
#include<reg51.h>
#include"MAX485.h"
#define uint unsigned int
#define uchar unsigned char
long int time,l; /*时间*/
bit CLflag; /*测量标志*/
sbit Trig=P2^0; /*发射*/
{
/*外部中断0,用于检测接收信号*/
TR0=0; /*关闭定时器0 */
EX0=0; /*关中断*/
time=TL0;
time+=TH0*256;
l=time*ss;
l=l/2;
CLflag=1;
}
/********************主程序*************************/
TMOD=TMOD|0x20; //定时器T1工作在模式2,即八位自动重装模式
TH1=0xFD;
TL1=0xFD; //波特率为9600,在11.0592M的时钟下
TR1=1*********************************************************************
for(i=0;i<j;)
i++;

超声波测距C语言源程序代码

超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//***********************************************************************************///具有模式选择.*include<reg52.h>*define UC unsigned char*define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit G* = P3^1;//K7 //P3^3口(K2)为修改键,sbit S* = P3^6;//K6 //P3^2(K3)为测量键.sbit B* = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进展模式切换(K1、K4键)void *ia*ian(); //修改函数,用来修改下限void shang*ian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI ma*[3]={3,0,0}; //MIN,MA* 用来存储最大和最小值void MIN*ianshi(UI); //最小围和最大围的显示void MA**ianshi(UI);UC code CharacterCode[10] = {0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f};//数码管数字字符(P2口)/********************************主函数*********************************************/ void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MIN*ianshi(40); //1.50169000sMA**ianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MA*, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0*00; //防止最后显示的那个数码管一直亮MA* = ma*[0]*100 + ma*[1]*10 + ma*[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进展测量{while(1) /*先进展模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //完毕测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0*00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MA*){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示完毕}}/***********************************************************************************/ void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0*00;//定时器的初值,定时器的定时为65536us,TL0 = 0*00;}/***********************************************************************************/ void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){*ia*ian();while(QD==0);shang*ian();}/**********************************************************************************/ void MIN*ianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0*00;delay(55500);}void MA**ianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(500);}P2 =~ 0*00;delay(55500);}/***********************************************************************************/ void delay(UI T) //延时程序{while(T--);}/***********************************************************************************/ void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;P*1 = 0;PT0 = 1;P*0 = 0;IT1 = 1; //外部中断0为跳变沿触发E*1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发E*0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0*01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0*00;//定时器的初值,定时器的定时为50us.TL0 = 0*00;/*1号定时器不用,所以没有TH1,TL1*/}/***********************************************************************************/ void *ia*ian() //修改下限{while(1){if(B*==0)//百位{P2=~0*00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(S*==0)//十位{P2=~0*00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(G*==0)//个位{P2=~0*00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0*ff;break;}}}void shang*ian() //修改上限{while(1){if(B*==0)//百位{P2=~0*00;ma*[0]++;if(ma*[0]==10)ma*[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(100);if(S*==0)//十位{P2=~0*00;ma*[1]++;if(ma*[1]==10)ma*[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(100);if(G*==0)//个位{P2=~0*00;ma*[2]++;if(ma*[2]==10)ma*[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0*ff;while(QD == 0);break;}}}/************************************************************************************/。

超声波测距仪C语言程序.txt

超声波测距仪C语言程序.txt
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
{
csbcj();
if(s>sj3)
void scanLED(); //显示函数
void timeToBuffer(); //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
}
}
}
void k1cl()
{
sj1=sj1+5;
if(sj1>100)
sj1=30;
s=sj1;
}
void k2cl()
{
sj2=sj2+5;
if(sj2>500)
sj2=40;
s=sj2;
}
void k3cl()
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;
void csbcj();
void delay(j); //延时函数
if((P3&0x10)==0) //判断3位是否显示完
key=0;
digit>>=1; //循环右移1位
}
}
void timeToBuffer() //转换段码功能模块
}
void delay(i)
{
while(--i);
}
void timer1int (void) interrupt 3 using 2
{
TH1=0x9E;

超声波测距程序c

超声波测距程序c

#include<reg51.h>#include<intrins.h> //包含_nop_()函数定义的头文件#include<1602.h>#define uchar unsigned char#define uint unsigned intfloat time;int s,total=0,i;float v;bit flag=0; //定义标志位/****************位定义***************************/sbit Trig =P1^0; //超声波信号发生引脚sbit Echo=P1^1; //超声波信号接收引脚sbit feng=P2^4; //蜂鸣器引脚/***************显示******************************/uchar code num[]={"0123456789.merror"};uchar code JL[]={"distance:"}; //显示距离uchar disbuff[]={0,0,0,0};//缓存区间/*****************************************************函数功能:延时1ms注:不同单片机不同晶振需要对此函数进行修改***************************************************/void Lcd_delay1ms(){unsigned char i,j;for(i=0;i<90;i++)for(j=0;j<1;j++);}/***************************************************** 函数功能:延时若干毫秒入口参数:n***************************************************/void Lcd_delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)Lcd_delay1ms();}函数功能:判断液晶模块的忙碌状态返回值:result。

51单片机超声波模块的C语言程序

51单片机超声波模块的C语言程序

51单⽚机超声波模块的C语⾔程序//超声波模块程序//超声波模块程序//Trig = P2^0//Echo = P3^2#include#define uchar unsigned char#define uint unsigned intint time;int succeed_flag;uchar timeL;uchar timeH;sbit Trig=P1^0;sbit Echo=P3^2;uchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f};uchar code table1[]={0,1,2,3,4,5,6,7};//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,bai;bai=temp/100;shi=(temp%100)/10;ge=temp%10;P2=table1[2];P0=table[ge];delay(1);P2=table1[1];P0=table[shi];delay(1);P2=table1[0];P0=table[bai];delay(1);}//************************************************************ ***void main(){uint distance;// test =0;Trig=0; //⾸先拉低脉冲输⼊引脚EA=1; //打开总中断0TMOD=0x10; //定时器1,16位⼯作⽅式while(1){EA=0; //关总中断Trig=1; //超声波输⼊端delay_20us(); //延时20usTrig=0; //产⽣⼀个20us的脉冲while(Echo==0); //等待Echo回波引脚变⾼电平 succeed_flag=0; //清测量成功标志EA=1;EX0=1; //打开外部中断0TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //计数溢出标志TR1=1; //启动定时器1delay(20); //等待测量的结果TR1=0; //关闭定时器1EX0=0; //关闭外部中断0if(succeed_flag==1){time=timeH*256+timeL;distance=time*0.0172; //厘⽶}if(succeed_flag==0){distance=0; //没有回波则清零// test = !test; //测试灯变化}display(distance);}}//************************************************************ *** //外部中断0,⽤做判断回波电平void exter() interrupt 0 // 外部中断0是0号{EX0=0; //关闭外部中断timeH =TH1; //取出定时器的值timeL =TL1; //取出定时器的值succeed_flag=1;//⾄成功测量的标志}//************************************************************ **** //定时器1中断,⽤做超声波测距计时void timer1() interrupt 3 //{TH1=0;TL1=0;}1602液晶显⽰的超声波模块程序接⼝程序⾥边都有、、#include//#include#define uchar unsigned char#define uint unsigned intsbit lcdrs=P2^3;sbit lcden=P2^2;sbit trig=P2^0; //超声波发送//sbit echo=P3^2; //超声波接受//P0____________DB0-DB7uchar 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/58return dist; //1个机器周期是12个时钟周期 timer*12/(58*11.0592)=timer/53 }void HC_run(){uint tempH=0x00,tempL=0x00;TH0=0;TL0=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) {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);}}。

具有实时语音播报功能的超声波测距仪(C程序)

具有实时语音播报功能的超声波测距仪(C程序)
value ++;
if(value > 10)//3秒钟自动播放一次
{
value = 0;
if(distance == 888)
{
Send_threelines(0x0d);//语音播放已超出量程
}
else
{
Send_threelines(yujing[2]);//语音播放
Send_threelines(0x0b);
include调用单片机头文件defineucharunsignedchar无符号字符型宏定义变量范围0255defineuintunsignedint无符号整型宏定义变量范围065535include数码管段选定义ucharcodesmgdu0xc00xf90xa40xb00x990x920x820xf80x800x900x880x830xc60xa10x860x8e0xff
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/***********************数码显示函数*****************************/
void display()
{
static uchar i;
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
sbit smg_we1 = P3^4;//数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
sbit c_send = P3^2;//超声波发射

超声波程序

超声波程序

本人收藏的的一些超声波程序,希望对大家有用(还有原理图,需要的话去我空间去):程序一:#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define count 4uchar data IRcode[4]; // 定义一个4 字节的数组用来存储代码uchar table[4]; uchar enled[4]={0x1f,0x2f,0x4f,0x8f};uchar CodeTemp,temp,tt; // 编码字节缓存变量uchari,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2;// 延时用的循环变量uint distance,distance1,time; // sbit IRsig nal=P3T; //HS0038 sbit come=P3A3;sbit d=P1A1;// 发送码sbit BZ=P1A0;sbit s=P3A7;//38ksbit ss=P3A6;//38kuchar m;// 开关控制//sbit n=P2;// 电机反转code距离,time接收头OUT端直接连P3.2(INT0) unsignedseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28}; 显示段码char ///**************************** void timer0() interrupt 1{TH0=(65536-count)/256; TL0=(65536-count)%256; s=~s;// 产生38K信号ss=~ss;//tt++;// 发送超声波个数}/**************************** ************************/ void Delay0_9ms(void) 定时器0 中断************************/ 延时0.9ms 子程序{uchar j,k;for(j=18;j>0;j--)for(k=20;k>0;k--); }/*************************** void Delay1ms(void){uchar i,j;for(i=2;i>0;i--)for(j=230;j>0;j--);}/*************************** void Delay4_5ms(void) {uchar i,j;for(i=10;i>0;i--)for(j=225;j>0;j--);}/**************************** ************************/ 延日寸1ms 了稈,序**********************/延时 4.5ms 子程序*********************程序void Delay(void){uchar i,j,k;for(i=100;i>0;i--)for(j=100;j>0;j--)for(k=3;k>0;k--);}/****************************************************/程序// 延时程序void ledDelay(unsigned int tc){ unsigned int i,j; for(i=0;i<10;i++) for(j=0;j<tc;j++);}/************************************************ ****************/// 定寸器1 中断, 用做超声波测距无回波void timer1() interrupt 3{ TR1=0; ET1=0;EX1=0;TH1=0;TL1=0;date=0;for(i=0;i<120;i++) {P2=enled[i%4]&m;//P2 口高四位控制数码管,低位陪分控制继电器 P0=seg7code[table[i%4]]; // 取出千位数,查表,输出。

超声波测距12864显示程序带语音播报

超声波测距12864显示程序带语音播报
#include <AT89X52.H>
#include <string.h>
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2 //数据口
sbit RS=P3^7;
flag=0;
time=0;
P16=1;
}
if((flag==1)&&(time>=200)&&(time<=500)){
Dis_string(1,0,"距离");
Dis_string(1,7,"米");
display(time,4);
Dis_string(2,2,string2);
}
void main()
{
flag=0;
P0=0XFF;
P14=0;
P15=0;
P16=0;
LcdInit(); //液晶初始化
Clear_txt();//清除液晶上的的文本
Dis_string(0,2,"欢迎使用");
Dis_string(2,0,"超声波测距离系统");
void DelayMs(uint z)
{
uint x,y;
for(x=z;x!=0;x--)
for(y=255;y!=0;y--);
}
//延时函数
void delay(unsigned int MS)
{

超声波三维测距程序.doc资料

超声波三维测距程序.doc资料

//采用的芯片为STC15系列#include"reg51.h"#include "math.h"sfr INT_CLKO=0x8F;//外部中断与时钟输出控制寄存器sfr P_SW1= 0xA2; //外设功能切换寄存器1sfr AUXR = 0x8e; //辅助寄存器sfr T2H = 0xd6; //定时器2高8位sfr T2L = 0xd7; //定时器2低8位#define CCP_S0 0x10 //P_SW1.4#define CCP_S1 0x20 //P_SW1.5#define S1_S0 0x40 //P_SW1.6#define S1_S1 0x80 //P_SW1.7sfr CCON=0xD8; //PCA控制寄存器sbit CCF0=CCON^0; //PCA模块0中断标志sbit CCF1=CCON^1; //PCA模块1中断标志sbit CR=CCON^6; //PCA定时器运行控制位sbit CF=CCON^7; //PCA定时器溢出标志sfr CMOD=0xD9; //PCA模式寄存器sfr CL=0xE9; //PCA定时器低字节sfr CH=0xF9; //PCA定时器高字节sfr CCAPM0=0xDA; //PCA模块0模式寄存器sfr CCAP0L=0xEA; //PCA模块0捕获寄存器LOWsfr CCAP0H=0xFA; //PCA模块0捕获寄存器HIGHsfr CCAPM1=0xDB; //PCA模块1模式寄存器sfr CCAP1L=0xEB; //PCA模块1捕获寄存器LOWsfr CCAP1H=0xFB; //PCA模块1捕获寄存器HIGHsfr CCAPM2=0xDC; //PCA模块2模式寄存器sfr CCAP2L=0xEC; //PCA模块2捕获寄存器LOWsfr CCAP2H=0xFC; //PCA模块2捕获寄存器HIGHsfr PCA_PWM0=0xf2; //PCA模块0的PWM寄存器sfr PCA_PWM1=0xf3; //PCA模块1的PWM寄存器sfr PCA_PWM2=0xf4; //PCA模块2的PWM寄存器#define FOSC 11059200L //系统频率#define BAUD 115200 //串口波特率#define T0MS 65536-18000//定时18000us#define uchar unsigned char#define uint unsigned int#define X 20 //超声波传感器1到原点距离#define Y 20 //超声波传感器3到原点距离uint L1 = 0; //超声波传感器1到物体距离uint L2 = 0; //超声波传感器2到物体距离uint L3 = 0; //超声波传感器3到物体距离uint x = 0; //坐标变量(用于串口显示)uint y = 0;uint z = 0;sbit CSB_T1 = P0^0; //超声波1发送控制端口(控制光耦继电器)sbit CSB_R1 = P0^1; //超声波1接收控制端口(控制三极管)sbit CSB_T2 = P0^2; //超声波2发送控制端口(控制光耦继电器)sbit CSB_R2 = P0^3; //超声波2接收控制端口(控制三极管)sbit CSB_T3 = P0^4; //超声波3发送控制端口(控制光耦继电器)sbit CSB_R3 = P0^5; //超声波3接收控制端口(控制三极管)sbit LED = P1^2;uint count = 0; //定义计数变量uint distance = 0; //定义距离变量uchar *p; //定义指针(用于串口发送数据)uchar count1[16]; //定义数组,存放距离bit flag = 0; //定义标志位void Send_data(uchar *b);/****************************延时函数**************************//*函数原型:void delay(void)/*函数功能:延时/*输入参数:无/*输出参数:无/**********************************************************************/ void delay_us(uchar i){unsigned int j;for(;i>0;i--)for(j = 6;j>0;j--){;}}void delay_ms(uchar i){unsigned int j;for(;i>0;i--)for(j = 847;j>0;j--){;}}/****************************count1cle初始化函数**************************/ /*函数原型:void count1cle(void)/*函数功能:count1cle初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void count1cle(){uchar i;for(i = 0;i<16;i++){count1[i] = 0;}}/****************************PWM0初始化函数**************************//*函数原型:void PCA_Init(void)/*函数功能:PWM初始化/*输入参数:无/*输出参数:无/**********************************************************************/void PCA0_Init(){ACC=P_SW1;ACC&=~(CCP_S0|CCP_S1);//CCP_S0=0 CCP_S1=0P_SW1=ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)CMOD=0x08; //选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHzCCAPM0=0x42; //CCAPM0是PCA0模块的寄存器0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P1^3 PCA_PWM0=0x00; //把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0CL=0; //比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装CH=0;CCAP0H=0x80; // 占空比控制CCAP0L=0x80;CCON=0; //PCA控制寄存器,设置为0CR=0; //PCA计数开关为关,停止产生pwm波}/****************************PWM0初始化函数**************************//*函数原型:void PCA_Init(void)/*函数功能:PWM初始化/*输入参数:无/*输出参数:无/**********************************************************************/void PCA1_Init(){ACC=P_SW1;ACC&= ~(CCP_S0|CCP_S1);//CCP_S0=0 CCP_S1=0P_SW1=ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)CMOD=0x08; //选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHzCCAPM1=0x42; //CCAPM0是PCA0模块的寄存器0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P1^3 PCA_PWM1=0x00; //把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0CL=0; //比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装CH=0;CCAP1H=0x80; // 占空比控制CCAP1L=0x80;CCON=0; //PCA控制寄存器,设置为0CR=0; //PCA计数开关为关,停止产生pwm波}/****************************PWM0初始化函数**************************//*函数原型:void PCA_Init(void)/*函数功能:PWM初始化/*输入参数:无/*输出参数:无/**********************************************************************/void PCA2_Init(){ACC=P_SW1;ACC&=~(CCP_S0|CCP_S1);//CCP_S0=0 CCP_S1=0P_SW1=ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)CMOD=0x08; //选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHzCCAPM2=0x42; //CCAPM0是PCA0模块的寄存器0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P1^3 PCA_PWM2=0x00; //把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0CL=0; //比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装CH=0;CCAP2H=0x80; // 占空比控制CCAP2L=0x80;CCON=0; //PCA控制寄存器,设置为0CR=0; //PCA计数开关为关,停止产生pwm波}/****************************INT0初始化函数**************************//*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/**********************************************************************/void INT0_Init(){INT1 = 1;IT0 = 1;//设置INT0为下降沿触发EX0 = 0;//不允许INT0中断EA = 1;//打开总中断}/****************************INT0中断函数**************************//*函数原型:void INT0(void)/*函数功能:INT0中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void EXINT0() interrupt 0{count = TH0;count = count<<8;count = count+TL0-47536;//记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; //关T0中断// EX0 = 0;//不允许INT0中断}/****************************INT0初始化函数**************************/ /*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void INT1_Init(){INT1 = 1;IT1 = 1;//设置INT0为下降沿触发EX1 = 0;//不允许INT0中断EA = 1;//打开总中断}/****************************INT1中断函数**************************//*函数原型:void INT1(void)/*函数功能:INT1中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void EXINT1() interrupt 2{count = TH0;count = count<<8;count = count+TL0-47536;//记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; //关T0中断// EX1 = 0;//不允许INT0中断}/****************************INT0初始化函数**************************//*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void INT2_Init(){INT_CLKO&=0xEF;//(EX2 = 1)使能INT2中断EA = 1;//打开总中断}/****************************INT2中断函数**************************//*函数原型:void INT2(void)/*函数功能:INT2中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void EXIT2() interrupt 10{count = TH0;count = count<<8;count = count+TL0-47536;//记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; //关T0中断// INT_CLKO&=0xEF;//(EX2 = 1)使能INT2中断}/****************************Timer0初始化函数**************************//*函数原型:void Timer0_Init(void)/*函数功能:Timer0初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void Timer0_Init(){// AUXR = 0x80; //timer0 work in 1T mode (没有这句,默认为传统51的定时) TMOD=0x01; //设置T0定时器的mode为模式1,处于计数模式TH0=T0MS>>8; //装入计数初值TL0=T0MS;EA = 1; //开中断使能ET0 = 1; //允许溢出TR0 = 0; //关T0中断}/****************************Timer0中断函数**************************/ /*函数原型:void Timer0(void)/*函数功能:Timer0中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void Timer0() interrupt 1{TL0 = T0MS; //初始化Time0的低八位TH0 = T0MS >> 8; //初始化Time0的高八位flag = 1; //标志位置位count = 32;TR0 = 0; //关T0中断}/***************************串口初始化函数*****************************/ /*函数原型:void Serial_Init(void)/*函数功能:串口初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void Serial_Init()//串口初始化函数{ACC = P_SW1;ACC&=~(S1_S0|S1_S1); //S1_S0=0 S1_S1=0P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)SCON = 0x40; //8位可变波特率T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值T2H = (65536 - (FOSC/4/BAUD))>>8;AUXR = 0x14; //T2为1T模式, 并启动定时器2AUXR |= 0x01; //选择定时器2为串口1的波特率发生器// ES = 1; //使能串口1中断// EA = 1; //开启全局中断}/****************************串口中断处理函数**************************/ /*函数原型:void Serial_Int(void)/*函数功能:串口中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ //void Serial_Int() interrupt 4//{// ES = 0; //关串口中断,防止中断嵌套// if(TI) //如果是发送中断,则不做任何处理// {// TI = 0; //清除发送中断标志位// }// ES = 1; //开启串口中断//}/****************************发送数据函数***********************//*函数原型:void Send_data(unsigned char *b)/*函数功能:发送数据/*输入参数:unsigned char *b/*输出参数:无/**********************************************************************/ void Send_data(uchar *b){// ES = 0; //关串口中断for (b; *b!='\0';b++){SBUF = *b;while(TI!=1); //等待发送完成TI = 0; //清除发送中断标志位}// ES = 1; //开串口中断}/****************************距离测量函数***********************//*函数原型:void Distance(void)/*函数功能:计算物体距离/*输入参数:无/*输出参数:无/**********************************************************************/ void Distance_(){distance = (count/1000.0)*17;// distance = count;}void Coordinate(){x = (L2*L2-L1*L1+X*X)/(2.0*X);y = (L2*L2-L3*L3+Y*Y)/(2.0*Y);z = L1*L1+L3*L3-L2*L2-(x-X)*(x-X)-(y-Y)*(y-Y);z = sqrt(z);}/****************************主函数***********************//*函数原型:void main(void)/*函数功能:/*输入参数:无/*输出参数:无/**********************************************************************/ void main(){uchar circulation = 1;PCA0_Init();//PWM初始化PCA1_Init();//PWM初始化PCA2_Init();//PWM初始化INT0_Init();//INT0初始化INT1_Init();//INT0初始化INT2_Init();//INT0初始化Timer0_Init();//Timer0初始化Serial_Init();//串口初始化函数CSB_T1 = 0; //关闭超声波1发送控制端口CSB_R1 = 0; //关闭超声波1接收控制端口CSB_T2 = 0; //关闭超声波2发送控制端口CSB_R2 = 0; //关闭超声波2接收控制端口CSB_T3 = 0; //关闭超声波3发送控制端口CSB_R3 = 0; //关闭超声波3接收控制端口while(1){switch(circulation){//超声波2发,超声波1收,作为AP的距离case 1:{CSB_T2 = 1; //打开超声波2发送控制端口CSB_R1 = 1; //打开超声波1接收控制端口EX0 = 1; //允许外部中断0CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(20); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波// delay_ms(58);}break;//超声波2发,超声波3收,作为CP的距离case 2:{CSB_T2 = 1; //打开超声波2发送控制端口CSB_R3 = 1; //打开超声波3接收控制端口INT_CLKO|=0x10;//(EX2 = 1)使能INT2中断CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0 CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0 CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(20); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波}break;//超声波1发,超声波3收,作为BP的距离case 3:{CSB_T1 = 1; //打开超声波2发送控制端口CSB_R3 = 1; //超声波3接收控制端口INT_CLKO|=0x10;//(EX2 = 1)使能INT2中断CCAP1L=CCAP1H=0x00; // PWM0占空比控制为0 CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0 CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(18); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波}break;//超声波1发,超声波1收,作为AP的距离case 5:{CSB_T1 = 1; //打开超声波1发送控制端口CCAP1L=CCAP1H=0x00; // PWM0占空比控制为0 CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0 CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(20); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波EX0 = 1; //允许外部中断0CSB_R1 = 1; //打开超声波1接收控制端口}break;//超声波2发,超声波2收,作为BP的距离case 6:{CSB_T2 = 1; //打开超声波2发送控制端口CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(18); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波EX1 = 1; //允许外部中断0CSB_R2 = 1; //打开超声波3接收控制端口}break;//超声波3发,超声波3收,作为BP的距离case 7:{CSB_T3 = 1; //打开超声波2发送控制端口CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0CCAP1L=CCAP1H=0x00; // PWM2占空比控制为0CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(18); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波INT_CLKO|=0x10;//(EX2 = 1)使能INT2中断CSB_R3 = 0; //关闭超声波3接收控制端口}break;}while(~flag); //等待接受超声波信号if(flag){if(count==32) //根据count情况计算距离,count = 0表示没有接收到返回信号,返回300给主机distance = 500; //没有测到距离,返回一个值给上位机elseDistance_();// if((circulation==1)||(circulation==5))// {// L1 = distance;// if(circulation==1)// {// if((L1!=500)&&(L1>12))// circulation = 4;// }// if(circulation==5)// {// if(L1<=12)// circulation = 0;// }// }// else if((circulation==2)||(circulation==7))// L3 = distance;// else if((circulation==3)||(circulation==6))// {// L2 = distance;// if((x==500)&&(y==500)&&(z==500)) //在有效范围内没有检测到物体,返还“未检测到物体!”// Send_data("未检测到物体!"); //将距离返还给上位机// else// {// Coordinate();// count1[0] = 'P'; //字符“P”// count1[1] = '('; //字符“(”// count1[2] = x/100+'0'; // 数据百位// count1[3] = x%100/10+'0'; // 数据十位// count1[4] = x%10+'0'; // 数据个位// count1[5] = ','; //字符“,”// count1[6] = y/100+'0'; // 数据百位// count1[7] = y%100/10+'0'; // 数据十位// count1[8] = y%10+'0'; // 数据个位// count1[9] = ','; //字符“,”// count1[10] = z/100+'0'; // 数据百位// count1[11] = z%100/10+'0'; // 数据十位// count1[12] = z%10+'0'; // 数据个位// count1[13] = ')'; //字符“)”// count1[14] = ' '; //字符“)”// count1[15] = '\0'; //字符“)”// p = count1;// Send_data(p); //将距离返还给上位机// }// }count1[0] = distance%1000/100+'0'; // 数据百位count1[1] = distance%100/10+'0'; // 数据十位count1[2] = distance%10+'0'; // 数据个位count1[3] = 'c'; //字符“c”count1[4] = 'm'; //字符“m”count1[5] = '\n'; //空格count1[6] = '\n'; //空格count1[7] = '\0'; //结束标准p = count1;Send_data(p); //将距离返还给上位机delay_ms(10); //延时,等待数据发送完成TH0=T0MS>>8; //装入计数初值TL0=T0MS;count1cle(); //存储数组清零count = 0; //count清零flag = 0; //标志位清零CSB_T1 = 0; //关闭超声波1发送控制端口CSB_R1 = 0; //关闭超声波1接收控制端口CSB_T2 = 0; //关闭超声波2发送控制端口CSB_R2 = 0; //关闭超声波2接收控制端口CSB_T3 = 0; //关闭超声波3发送控制端口CSB_R3 = 0; //关闭超声波3接收// circulation += 1;// if(circulation==4)// circulation = 1;// if(circulation==8)// circulation = 5;}}}。

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)#include<reg52.h> //头文件#include<intrins.h>// _nop_() 函数延时1US用#include <stdio.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#define nop _nop_()sbit csb=P1^0;//超声波发送端口为P1.0sbit bai=P2^2;//数码管百位sbit shi=P2^1;//数码管十位sbit ge=P2^0;//数码管个位uchar flag;//超声波接收标志float juli1;//距离变量,用来数码管显示用int juli;uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0到9的代码int xianshi[3];void delayshow(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void ledshow(void){xianshi[0]=juli/100;xianshi[1]=((juli%100)/10);xianshi[2]=juli%10;bai=0;P0=table[xianshi[0]];delayshow(2);bai=1;delayshow(2);shi=0;P0=table[xianshi[1]];delayshow(2);shi=1;delayshow(2);ge=0;P0=table[xianshi[2]];delayshow(2);ge=1;delayshow(2);}/***************n个ms函数*******************/ void delay_nms(uint ms) //delay ms 函数{uchar i;while(ms--){for(i=0;i<123;i++);}}/************************************************ 延时100us函数***********************************************/ void delay100us(){uchar j;for(j=50;j>0;j--);}/********************************************** 发送超声波函数,实测为38KHz信号,4个这样的方波***********************************************/ void tran(){uchar i;for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;//关超声波发送ET0=1;EA=1;delay100us();//延时100us左右后再开中断,避免直接回来的回波//理论上可以测量的最小距离为:0.0001×344=0.0344M=3.44CMEX0=1;//打开外部中断1TR0=1;//开定时0}void main(){uchar i;delay_nms(10);//等待单片机复位TMOD=0x11;//定时器0方式1用于计时TL0=0;TH0=0;IT0=0;//中断0下降沿有效EA=1;while(1){tran();//发送超声波while(flag==0);//等待接收if(flag==1){juli1*=17.2;//计算距离,因为时间是来回的时间,声速为344M/S 除以2就为172juli1=juli1/1000;juli=(int)(juli1);flag=0;for(i=0;i<50;i++)ledshow();juli=0;}else{juli=0;//超出距离显示000for(i=0;i<10;i++)ledshow();flag=0;}}}/*超声接收程序(外中断0)*/void cs_r() interrupt 0{EX0 = 0;//关闭外部中断0,也就是超声波接收中断TR0 = 0;//关闭定时器0EA=0;juli1=TH0*256+TL0-100;//减去开始延时的100usTL0=0;//清定时0TH0=0;flag= 1;//成功接收标志置1}/*超时清除程序(定时器中断T0)*/void overtime() interrupt 1{EA=0;TL0=0;//清定时0TH0=0;EX0 = 0;//关闭定时器0的中断TR0 = 0;//关闭定时器0ET0 = 0;//关闭定时器0的中断flag= 2;//接收标志置2}。

超声波测距_C程序

超声波测距_C程序

超声波测距 C程序本探头是自带晶振的那种,只需发出一个脉冲,探头发出方波,等待回波并计时,液晶显示。

能避免超出测量距离的死等待,请大家完善。

//超声波模块程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intunsigned int time;unsigned int S,s_false;unsigned long num1;bit flag ;sbit Trig =P3^6;//定义引脚sbit Echo=P3^7;sbit lcdrs=P2^0;//命令数据sbit lcdrw=P2^1;//读写sbit lcde=P2^2;//能sbit led=P3^5;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 write_com(unsigned char com) {lcdrs=0;P0=com;delay(5);lcde=1;delay(5);lcde=0;}void write_data(unsigned char zifu) {lcdrs=1;P0=zifu;delay(5);lcde=1;delay(5);lcde=0;}void write_temp(uint t_emp){uchar qian,bai,shi,ge;qian=t_emp/1000;bai=(t_emp%1000)/100;shi=(t_emp%100)/10;ge=t_emp%10;write_com(0x80);write_data(0x30+qian);delay(1);write_data(0x30+bai);delay(1);write_data(0x30+shi);delay(1);write_data(0x30+ge); delay(1);delay(100);}/********************************************************/void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围 {flag=0; //中断溢出标志,失败TH0=0;TL0=0;TR0=0; //关闭计数}/********************************************************/void T1_timer() interrupt 3 //中断{TH1=(65536-50000)/256;TL1=(65536-50000)%256;num1++;if (num1==20){num1=0;led=~led;}}void StartModule() //启动模块{Trig=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Trig=0;}/********************************************************/void Count(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif(((S<8)||(S>=600))||flag==0) //超出测量范围显示“-”失败 {// flag=1;s_false=1000;write_com(0x80);write_data('e');delay(5);write_data('r');delay(5);write_data('r');delay(5);write_data('o');delay(5);write_data('r');delay(5);// write_temp(s_false);else{write_temp(S);}}/********************************************************//********************************************************/void init(){lcde=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);lcdrw=0;}//*************************************************************** void main(){// unsigned char TempCyc;delay(500); //启动等待,等LCM讲入工作状态lcdrw=0;init(); //LCM初始化delay(500); //延时片刻(可不要)while(1){TMOD=0x11; //设T0为方式1,GATE=1;TH0=0;TL0=0;ET0=1; //允许T0中断ET1=1;TR1=1;EA=1; //开启总中断Trig=0;Echo=0;while(1){StartModule();flag=1;// while(!Echo); //当echo为零时等待while((!Echo)&&flag); //当echo为零时等待,中断flag跳出等待 TR0=1; //开启计数while(Echo&&flag); //当echo为1计数并等待TR0=0; //关闭计数Count(); //计算delay(120); //80MS}}}。

程序-基于单片机的超声波测距系统设计与实现

程序-基于单片机的超声波测距系统设计与实现

//宏定义#define uchar unsigned char#define uint unsigned int#define ULint unsigned long int//温度零上与零下的标志位char flag=0;//超声波char flags=0;//超声波距离char flag1s=0;//计算定时间uint time=0;//计算距离ULint L_=0;//温度uint t_=0;//显示模式0正常1最大值调整2最小值调整uchar mode=0;uint Max=490;uint Min=30;//按键标志uchar k=0;//数值有误uchar FW=0;//头函数#include <reg52.h>#include <intrins.h>#include "BJ_Key.h" //报警按键#include "display.h" //显示头函数#include "ultrasonic_wave.h"//超声波头函数#include "DS18B20.h" //温度传感器头函数//函数声明//功能键按下if(K1==0){void delayms(uint ms);//主函数void main(){Init_ultrasonic_wave();//屏幕初始化Init1602();//温度初始化tmpchange();t_=tmp();tmpchange();t_=tmp();tmpchange();t_=tmp();//循环显示while(1){Key();//正常显示if(mode==0){StartModule();//启动超声波while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数delayms(20); //20MStmpchange(); //温度转换t_=tmp(); //度温度Conut(t_/10); //计算距离if(L_>Max||L_<Min){Feng_Start();}else{if(FW!=1)Feng_Stop();}Display_1602(t_/10,L_);}//调整显示else if(mode!=0){//最大最小值Init_MaxMin();while(mode!=0){Key();if(k==1&&mode==1){Init_MaxMin();write_com(0x8d);//设置位置}else if(k==1&&mode==2){Init_MaxMin();write_com(0x8d+0x40);//设置位置}k=0;}//界面初始化Init1602();}}}void delayms(uint ms){uchar i=100,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}//T0中断用来计数器溢出,超过测距范围void CJ_T0() interrupt 1{flags=1; //中断溢出标志}//管脚声明sbit Feng=P1^0;sbit K1=P1^1;sbit K2=P1^2;sbit K3=P1^3;//蜂鸣打开void Feng_Start(){Feng=0;}//蜂鸣关闭void Feng_Stop(){Feng=1;}//等待void delay_key(){uchar i,j;for(i=0;i<200;i++)for(j=0;j<200;j++);}//按键检测void Key(){Feng_Start();//蜂鸣器开delay_key(); //消抖while(K1==0);//等待松手Feng_Stop(); //蜂鸣器关闭mode++; //模式++if(mode==3) //达到最大限度归为mode=0;k=1; //按键标志位}//+键else if(K2==0){Feng_Start();//蜂鸣器开delay_key(); //消抖while(K2==0);//等待松手Feng_Stop(); //蜂鸣器关闭//最大值调整if(mode==1) //在最大值调整下{Max++; //调整最大值if(Max==201)//到达201归为200{Max=200;}}//最小值else if(mode==2)//最小模式下调整{Min++; //调整最小值if(Min>Max) //最小值不能大于最大值{Min=Max;}}k=1;}//-键else if(K3==0){Feng_Start();delay_key();while(K3==0);Feng_Stop();//最大值调整if(mode==1){Max--;if(Max<Min){Max=Min;}}//最小值else if(mode==2){Min--;if(Min==0xff){Min=0;}}k=1;}}//超声波管脚定义sbit RX=P2^1;sbit TX=P2^0;//超声波初始化void Init_ultrasonic_wave(){TX=0; //关闭发射TMOD=0x01; //设T0为方式1,GATE=1;TH0=0;TL0=0;ET0=1; //允许T0中断EA=1; //开启总中断}//启动超声波void StartModule() //启动模块{TX=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}//计算不同温度下的速度void JS_(uchar WD){//大于-30if(WD>=30&&flag==1){L_=(time*3.13)/200; //算出来是CM; }//大于-20<-30else if(WD>=20&&WD<30&&flag==1){L_=(time*3.19)/200; //算出来是CM; }//大于-10<-20else if(WD>=10&&WD<20&&flag==1){L_=(time*3.25)/200; //算出来是CM; }//大于0<-10else if(WD>=0&&WD<10&&flag==1){L_=(time*3.23)/200; //算出来是CM; }//大于0<10else if(WD<=10&&WD>0&&flag==0){L_=(time*3.38)/200; //算出来是CM; }//大于10<20else if(WD<=20&&WD>10&&flag==0){L_=(time*3.34)/200; //算出来是CM; }//大于20<30else if(WD<=30&&WD>20&&flag==0){L_=(time*3.49)/200; //算出来是CM;}//大于30else if(WD>30&&flag==0){L_=(time*3.86)/200; //算出来是CM;}}//距离计算SD为当时的超声速度void Conut(uchar WD){time=TH0*256+TL0;TH0=0;TL0=0;JS_(WD);//距离大于200或者超时if(L_>500||flags==1){flags=0;//无效显示flag1s=0;L_=0;FW=1;Feng_Start();}//距离小于100else if(L_<=500){flag1s=1;FW=1;Feng_Stop();}}//LCD管脚声明sbit LCDRS = P2^7;sbit LCDEN= P2^6;//初始画时显示的内容uchar code Init1[]="Temperature: C"; uchar code Init2[]="Distance: 000CM";//初始画时显示的内容uchar code Init3[]=" Max------ CM"; uchar code Init4[]=" Min------ CM";//LCD延时void LCDdelay(uint z){uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}//写命令void write_com(uchar com){LCDRS=0;P0=com;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0;}//写数据void write_data(uchar date){LCDRS=1;P0=date;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0;}//1602初始化void Init1602(){uchar i=0;write_com(0x38);//屏幕初始化write_com(0x0C);//打开显示无光标无光标闪烁write_com(0x06);//当读或写一个字符是指针后一一位write_com(0x01);//清屏write_com(0x80);//设置位置for(i=0;i<14;i++){write_data(Init1[i]);}write_data(0xdf);write_data(Init1[14]);write_com(0x80+0x40);//设置位置for(i=0;i<16;i++){write_data(Init2[i]);}}//温度距离显示void Display_1602(uchar W,uint L) {//温度值显示write_com(0x80+12);write_data('0'+W/10);write_data('0'+W%10);//长度值显示if(flag1s==1){write_com(0x80+0x40+0x0a);write_data(' ');write_data('0'+L/100);write_data('0'+L/10%10);write_data('0'+L%10);}else if(flag1s==0){write_com(0x80+0x40+0x0a);write_data('-');write_data('-');write_data('-');write_data('-');}}//1602初始化最大化最小化调整界面void Init_MaxMin(){uchar i=0;write_com(0x38);//屏幕初始化write_com(0x0f);//打开显示无光标无光标闪烁write_com(0x06);//当读或写一个字符是指针后一一位write_com(0x01);//清屏write_com(0x80);//设置位置for(i=0;i<16;i++){write_data(Init3[i]);}write_com(0x80+0x40);//设置位置for(i=0;i<16;i++)write_data(Init4[i]);}write_com(0x8b);//设置位置write_data('0'+Max/100);write_data('0'+Max/10%10);write_data('0'+Max%10);write_com(0x80+0x40+0x0b);//设置位置write_data('0'+Min/100);write_data('0'+Min/10%10);write_data('0'+Min%10);write_com(0x8d);//设置位置}#define uchar unsigned char#define uint unsigned int//define interface 定义DS18B20 接口sbit DS=P1^4;//variable of temperatureuint temp=0;//延时子函数//sign of the result positive orvoid delay(uint count)uint i;while(count){i=200;while(i>0)i--;count--;}}//发送初始化及复位信号void dsreset(void){//DS18B20 初始化uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}//read a bit 读一位bit tmpreadbit(void){uint i;bit dat;//i++ for delay 小延时一下DS=0;i++;DS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}//read a byte date 读一个字节uchar tmpread(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();//读出的数据最低位在最前面,这样刚好//一个字节在dat 里dat=(j<<7)|(dat>>1);}//将一个字节数据返回return(dat);}//write a byte to ds18b20//写一个字节到DS18B20 里void tmpwritebyte(uchar dat){uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //write 1 写1 部分{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //write 0 写0 部分i=8;while(i>0)i--;DS=1;i++;i++;}}}//DS18B20 begin change 发送温度转换命令void tmpchange(void){dsreset(); //初始化DS18B20delay(1); //延时tmpwritebyte(0xcc); //跳过序列号命令tmpwritebyte(0x44); //发送温度转换命令}//get the temperature 获得温度uint tmp(){float tt=0;uchar a=0,b=0;dsreset();delay(1);//发送读取数据命令tmpwritebyte(0xcc);tmpwritebyte(0xbe);//连续读两个字节数据a=tmpread();b=tmpread();//two byte compose a int variable//两字节合成一个整型变量。

超声波测距程序

超声波测距程序

//把1602液晶屏加进去就好#include"reg52.h"#include"intrins.h"#include"lcd1602.h"sbit trig=P1^0; //发射sbit echo=P3^2; //接收sbit led=P1^3; //测试灯unsigned int success_flag,time;unsigned int distance;void init();void delay1ms(unsigned int z);void start();////////////////////////////主函数void main(){ unsigned int num,i;init();init_1602();trig=0;while(1){TH0=0;TL0=0;success_flag=0;num=0;start();while(echo==0);TR0=1; //打开定时器for(i=0;i<100;i++) //延时打开int0,防止意外触发{_nop_();}EX0=1; // 打开int0while(success_flag==0&&num<=1000) //防止死循环{num++;}if(success_flag==1){distance=time/58;//((unsigned long)(time*17))/1000; //为啥后者就是错的呢}lcd1602();}}////////////////////////////void init(){TMOD=0X01;TH0=0;TL0=0;ET0=1;TR0=0;EX0=0;IT0=1; //下降沿触发EA=1;}void start(){trig=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();trig=0;}//////////////////////////////////////////////////////////void delay1ms(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void int0() interrupt 0{TR0=0; //关定时器EX0=0; //关int0success_flag=1;time=TH0*256+TL0;}void t0() interrupt 1{TH0=0;TL0=0;}#include"reg52.h"#include"lcd1602.h"extern unsigned int distance;extern delay1ms(unsigned int z);sbit rw=P2^5;sbit rs=P2^6;sbit en=P2^7;unsigned char code table[]={'d','i','s','t','a','n','c','e',':','.','M'};void write(unsigned char date,unsigned char k){rs=k;P0=date;delay1ms(5);en=1;delay1ms(5);en=0;}void init_1602(){en=0;rw=0;write(0x38,0);write(0x0f,0);write(0x06,0);write(0x01,0);}void lcd1602(){unsigned int i,bai,shi,ge;bai=distance/100;shi=(distance/10)%10;ge=distance%10;write((0x80),0);for(i=0;i<9;i++){write(table[i],1);delay1ms(1);}write((0x80+0x09),0); //bai write(0x30+bai,1);delay1ms(1);write((0x80+0x0a),0); //.write(table[9],1);delay1ms(1);write((0x80+0x0b),0); //shi write(0x30+shi,1);delay1ms(1);write((0x80+0x0c),0); //gewrite(0x30+ge,1);delay1ms(1);write((0x80+0x0d),0); //Mwrite(table[10],1);delay1ms(1);}。

超声波测距程序(有备注)

超声波测距程序(有备注)

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsfr P4 = 0xC0; //P4口定义sfr P4SW = 0XBB; //P4口寄存器定义void InitLCD(); //OLED初始化void LCD_P6x8Str(unsigned char x,unsigned char y,uint c); //OLED写函数sbit buzzer=P3^7; //蜂鸣器控制端.写0响sbit relay=P3^6; //继电器控制端.写0拨动//sbit led=P0^6; //LED控制端.写0亮sbit trig=P1^0; //超声波控制端sbit echo=P3^2; //超声波接收端uchar flag_succeed; //超声波回波标志uchar flag_move=0; //电机启动标志,1为相对前一个状态未启动uint h,l,time,distance; //时间、距离变量void delay20us() //20微妙延时函数{uchar k;for(k=0;k<100;k++);}void delay(uint z) //简单延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void motor() //电机驱动函数{if(distance>=130) //水用至限定水位{relay=1; //启动电机flag_move=1; //标记电机为启动过的状态}if(distance<=30 && flag_move==1)//水加至限定水位{relay=0; //关闭电机flag_move=0; //取消标记状态}}void main(){relay=0; //关闭电机P4SW=0xff; //P4口全设置成I/O口InitLCD(); //初始化清屏trig=0; //拉低控制脚TMOD=0x01; //定时器工作方式1EA=1; //开总中断while(1){EA=0; //关中断trig=1; //给高电平发送delay20us();//延时trig=0; //发送完毕while(echo==0); //等待回波引脚变高电平flag_succeed=0; //清除成功标志EA=1; //开总中断EX0=1; //开外部中断0TH0=0; //定时器0计数清零TL0=0;TF0=0; //定时器0中断标志清除TR0=1; //开定时器0中断delay(30); //简单延时,等待高电平结束TR0=0; //关定时器0中断EX0=0; //关外部中断0if(flag_succeed==1) //回波成功{time=h*256+l; //时间计算distance=time*0.172; //距离计算LCD_P6x8Str(1,1,distance); //距离显示motor(); //电机控制}if(flag_succeed==0) //回波失败{distance=0; //距离清零buzzer=0; //蜂鸣器报警}delay(90); //延时,防止回波混乱buzzer=1; //关闭蜂鸣器}}void int0() interrupt 0 //外部中断0中断函数{h=TH0; //提取计数数据l=TL0;flag_succeed=1; //回波接收成功EX0=0; //关外部中断0}void t0() interrupt 1 //定时器0中断函数{TH0=0; //计数清零TL0=0;}。

超声波测距并实时监控距离报警51C程序

超声波测距并实时监控距离报警51C程序
if(succeed_flag==1)
{
time=timeH * 256+timeL;
distance=time*0.0172; //厘米
if( distance < jiexian )
{
//uchar i;
// for( i = 5; i > 0;i --)//鸣五下蜂鸣器和闪五下LED
-------------------------------------*/
void timer1() interrupt 3
{
TH1=0;
TL1=0;
}
{
timeH =TH1;//取出定时器的值
timeL =TL1;//取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
/*-------------------------------------
定时器1中断,用做超声波测距计时
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0;//定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay(20);//等待测量的结果
TR1=0;//关闭定时器1
EX0=0; //关闭外部中断0
{
warning = !warning;
LED = !LED;
}
/*------------延时函数---------*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//x 的位移 //y 的位移
bit
flag =0;
sbit key=P3^2; //按键按下 模块 1 工作 sbit key1=P3^3; //模块 1 稳定 按键按下模块 2 工作
sbit key2=P3^4; //按下 显示 X,Y
unsigned char cons discode[] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff/*-*/};
S2=X%100/10;
S3=X%10;
S4=Y/100;
S5=Y%100/10;
S6=Y%10;
while(1) { P0=0x00; delay1(2); P0=(discode[S1]);
P2=0; delay1(2); P0=(discode[S2]); P2=1; delay1(2);
P0=(discode[S3]); P2=2; delay1(2); P0=(discode[S4]); P2=3; delay1(2); P0=(discode[S5]);
{
TH1=0xf8;
TL1=0x30;
Display();
timer++;
if(timer>=400)
{
timer=0;
TX=1;
TX1=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; TX1=0; } } /*********************************************************/
void zd0() interrupt 1
//T0 中断用来计数器溢出,超过测距范围
{
flag=1;
//中断溢出标志
}
/********************************************************/
void zd3() interrupt 3
//T1 中断用来扫描数码管和计 800MS 启动模块
for(i=1;i>0;i--) for(j=1879;j>0;j--); }
void delay1(unsigned char e) {
unsigned char f; for(e;e>0;e--) for(f=110;f>0;f--);
} /********************************************************/
#define TX P1_2 #define RX1 P1_3
//2 接收发射
#define TX1 P1_4
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long A;
unsigned long D; unsigned long S=0;
TH0=0;
TL0=0;
TH1=0xf8;
//2MS 定时
TL1=0x30;
ET0=1; ET1=1;
//允许 T0 中断 //允许 T1 中断
TR1=1; EA=1;
//开启定时器 //开启总中断
delay();
if(key1==0)
{
while(1)
{
while(!RX1); TR0=1;
//当 RX 为零时等待 //开启计数//“Biblioteka ”disbuff[2]=10;
//“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
/********************************************************/
void main( void )
{ while(1) { if(key==0) { TMOD=0x11; TH0=0; TL0=0; TH1=0xf8; TL1=0x30; ET0=1; ET1=1; TR1=1; EA=1;
//设 T0 为方式 1,GATE=1;
//2MS 定时
//允许 T0 中断 //允许 T1 中断 //开启定时器 //开启总中断
//用于显示
unsigned int S1;
unsigned int S2;
unsigned int S3;
unsigned int S4;
unsigned int S5;
unsigned int S6;
unsigned int e1;
unsigned int e2; unsigned int X; unsigned int Y;
P2=4; delay1(2); P0=(discode[S6]); P2=5; delay1(2);
} } } } } } } } }
while(RX1); TR0=0;
//当 RX 为 1 计数并等待 //关闭计数
Conut();
//计算
D=S;
if(key2==0)
{
delay();
if(key2==0)
{ e1=A*A;
e2=D*D; X=(e2-e1+16)/8;
//通过公式计算
Y=sqrt(e2-X*X);
S1=X/100;
void Conut(void) {
time=TH0*256+TL0;
TH0=0; TL0=0;
S=(time*1.7)/100; //算出来是 CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10;
//“-”
disbuff[1]=10;
unsigned char const positon[6]={ 0,1,2,3,4,5};
unsigned char disbuff[4] ={ 0,0,0,0,};
/********************************************************/
void Display(void)
//扫描数码管
{
if(posit==0)
{P0=(discode[disbuff[posit]])&0x7f;}
else
{P0=discode[disbuff[posit]];}
P2=positon[posit];
if(++posit>=3)
posit=0;
} /********************************************************/ void delay() { uint i,j;
delay(); if(key==0)
{ while(1)
{ while(!RX); TR0=1;
while(RX); TR0=0;
//当 RX 为零时等待 //开启计数 //当 RX 为 1 计数并等待 //关闭计数
Conut();
//计算
A=S;
if(key1==0)
{ TMOD=0x11;
//设 T0 为方式 1,GATE=1;
附图:
超声波物体定位源程序
其中 D 是已经的距离 可自己设 L1 是超声波发射和接收 1,L2 是超声波发射和接收 2。 并通过数码管显示,然后通过按键调节。
程序代码:
#include <AT89x51.H> //头文件
#include <intrins.h>
#include <math.h>
#define uint unsigned int #define RX P1_1 //1 接收发射
相关文档
最新文档