超声波C语言程序

合集下载

超声波测距程序

超声波测距程序

超声波测距程序超声波程序如下:/**********************************包含头文件**********************************/#include#include "1602.h"/************************************宏定义************************************/#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;/************************************位定义************************************/sbit INPUT = P3^2; //回声接收端口sbit OUTPUT = P1^0; //超声触发端口sbit Beep = P2^0 ; // 蜂鸣器/********************************定义变量和数组********************************/long int distance=0; //距离变量uchar table[]=" Welcome to ";uchar table0[]=" chaoshengbo ";uchar table1[]="There's no echo.";uchar table2[]=" csbcj ";uchar table3[]="Distance:";uchar count;/***********************************函数声明***********************************/extern void initLCD();extern void write_date(uchar date);extern void write_com(uchar com);extern void delay(uint x);/************************************************************** ****************//* 函数名称 : Delay_xMs *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//************************************************************** ****************/void Delay_xMs(unsigned int x){unsigned int i,j;for(i = 0;i < x;i++ ){for(j = 0;j < 3;j++ ){;}}}/************************************************************** ****************//* 函数名称 : Alarm *//* 函数描述 : 蜂鸣器发声函数 *//* 输入参数 : t *//* 参数描述 : 发声的次数 *//* 返回值 : 无 *//************************************************************** ****************/void Alarm(uchar t){uchar i;for(i = 0;i < t;i++){Beep = 1;Delay_xMs(1000);Beep = 0;Delay_xMs(1000);}}/************************************************************** ****************//* 函数名称 : delayt *//* 函数描述 : 延时函数 *//* 输入参数 : x*//* 参数描述 : 延时时间数据 *//* 返回值 : 无 *//************************************************************** ****************/void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}/************************************************************** ****************//* 函数名称 : Init_MCU *//* 函数描述 : 初始化单片机函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Init_MCU(void){TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式TL0 = 0x66;TH0 = 0xfc; //1msET0 = 1; //开定时器2EA = 1; //总中断使能}/************************************************************** ****************//* 函数名称 : Init_Parameter *//* 函数描述 : 初始化参数和IO口函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//******************************************************************************/void Init_Parameter(void){OUTPUT =1;INPUT = 1;count = 0;distance = 0;}/************************************************************** ****************//* 函数名称 : display_char *//* 函数描述 : 显示字符串函数 *//* 输入参数 : point,address *//* 参数描述 : 写入的字符串的地址指针 1602显示对应的地址 */ /* 返回值 : 无 *//************************************************************** ****************/void display_char(uchar *point,uchar address){uchar i;write_com(0x80 + address);for(i = 0;i < 16; i++){write_date(*point);point++;}}/************************************************************** ****************//* 函数名称 : display *//* 函数描述 : 显示数字*//* 输入参数 : number,address *//* 参数描述 : number写入的数据,address地址 *//* 返回值 : 无 *//************************************************************** ****************/void display(int number,uchar address){uchar b,c,d,e;b= (number / 1000);c= (number / 100) % 10;d = (number / 10) % 10;e = number % 10;write_com(0x80 + address);write_date(b + 48);write_date(c + 48);write_date(d + 48);write_date(46); //小数点的ASCIIwrite_date(e + 48);write_date(99); //"c"的ASCIIwrite_date(109); //"m"的ASCII}/************************************************************** ****************//* 函数名称 : Trig_SuperSonic *//* 函数描述 : 发出声波函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Trig_SuperSonic(void)//出发声波{OUTPUT = 1;delayt(1);OUTPUT = 0;}/************************************************************** ****************//* 函数名称 : Measure_Distance *//* 函数描述 : 计算距离函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Measure_Distance(void){uchar l;uint h,y;TR0 = 1;while(INPUT){;}TR0 = 0;l = TL0;h = TH0;y = (h << 8) + l;y = y - 0xfc66;//us部分distance = y + 1000 * count;//计算总时间TL0 = 0x66;TH0 = 0xfc;delayt(30);distance = VELOCITY_30C * distance / 20000;}/************************************************************** ****************//* 函数名称 : main *//* 函数描述 : 主函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void main(void){Beep = 0;rw = 0;initLCD();Init_MCU();Init_Parameter();Alarm(2);display_char(table,0x00);display_char(table0,0x40);Delay_xMs(30000);display_char(table2,0x00);display_char(table1,0x40);while(1){Trig_SuperSonic(); //触发超声波发射while(INPUT == 0) //等待回声{;}Measure_Distance(); //计算脉宽并转换为距离display_char(table3,0x40);display(distance,0x49); //显示距离Init_Parameter(); // 参数重新初始化delayt(100); //延时,两次发射之间要至少有10ms间隔}}/************************************************************** ****************//* 函数名称 : timer0 *//* 函数描述 : T0中断处理函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void timer0 (void) interrupt 1{TF0 = 0;TL0 = 0x66;TH0 = 0xfc;count++;if(count == 18)//超声波回声脉宽最多18ms{TR0 =0;TL0 = 0x66;TH0 = 0xfc;count = 0;}}/************************************************************** ****************/1602程序如下:/************************************宏定义************************************/#define uchar unsigned char#define uint unsigned int/************************************位定义************************************/sbit dula = P2^6;sbit wela = P2^7;sbit rs = P2^3;sbit rw = P2^4;sbit lcden = P2^5;/************************************************************** ****************//* 函数名称 : delay *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//************************************************************** ****************/void delay(uint x){uint a,b;for(a = x;a > 0;a--){for(b = 10;b > 0;b--){;}}}/************************************************************** ****************//* 函数名称 : write_com *//* 函数描述 : 1602写命令函数 *//* 输入参数 : com*//* 参数描述 : 控制命令 *//* 返回值 : 无 *//************************************************************** ****************/void write_com(uchar com){P0 = com;rs = 0;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : write_date *//* 函数描述 : 1602写数据函数 *//* 输入参数 : date *//* 参数描述 : 要写入的数据 *//* 返回值 : 无 *//******************************************************************************/void write_date(uchar date){P0 = date;rs = 1;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : initLCD *//* 函数描述 : 1602初始化函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void initLCD(void){dula = 0;wela = 0;write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x01);delay(20);}/************************************************************** ****************/51程序如下:#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */ sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B;sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99;/* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5;sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。

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<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语言程序

#include"reg51.h"#include"intrins.h"#include"math.h"#define uchar unsigned char#define uint unsigned int#define Lcd_Data P0 //定义LCD数据端口//定义显示缓冲uchar code dispbuf[33]={"Temperature: `CDistance: mm "};uchar numcode[10]={'0','1','2','3','4','5','6','7','8','9'};uint num[29]={0};uchar jsh,jsl; //计数器的高低位uchar count=0; //10秒计次数uint distance; //距离sbit RS=P2^0; //LCD RSsbit RW=P2^1; //LCD RWsbit E =P2^2; //LCD Esbit Busy = P0^7; //LCD 忙uchar bdata flag; //DS18B20存在标准sbit DQ =P2^7; //DS18B20数字端口uint temp; //温度变量void delay(void); //延时函数void Init_LCD(void); //初始化LCDvoid Write_Comm(uchar); //写入LCD命令void Write_Data(uchar); //写入LCD数据void Read_Busy(void); //检查LCD是否忙void Init_18B20(void); //初始化18B20uchar ReadOneChar(void); //读取一个字节void WriteOneChar(uchar dat) ;//写入一个字节void testtemp(void); //启动温度转换,启动后750MS才能读取到温度uint wd(void); //读取温度void Delay(uint time); //延时函数sbit sta_flag =flag^0; //10MS到标准位sbit fuhao =flag^1; //温度的符号位sbit START =P1^0; //启动测距sbit CNT =P2^5; //发射超声波sbit CSBIN =P2^6; //返回信号sbit BUZZER=P3^7;void timer1(void) ;void delay1ms(void); //延时1MSvoid sys_init(void); //系统初始化void display(void); //显示函数void computer(void); //计算void hextobcd(void); //转换成BCDvoid bm(void); //求补码void delay15(uchar us); //延时15US/************************************************************************ 系统主函数*************************************************************************/ void main(void){uchar i,j;for(i=0;i<255;i++)for(j=0;j<255;j++); //延时sys_init(); //初始化display(); //显示sta_flag=0; //标准复位waitforstarting: //检测按键while(START);for(i=0;i<20;i++)delay1ms();if(START)goto waitforstarting;BUZZER=0; //蜂鸣器鸣音提升按键按下i=100000;while(i--);BUZZER=1;i=100000;while(i--);TR0=1; //启动定时器0ET0=1;testtemp(); //启动温度转换while(1){if(sta_flag) //10MS到了{while(0==CSBIN); //收到回波TR1=0;jsh=TH1;jsl=TL1;if(15==count) //900MS到检测温度{temp=wd(); //读取温度count=0;testtemp(); //重新启动转换display(); //刷新显示}computer(); //就算距离hextobcd(); //转换成BCD码sta_flag=0;}}}//******************定时器1溢出*************************** void timer1(void)interrupt 2 using 1{TR1=0;}/*****************************************************定时器0溢出中断函数,每60MS溢出*****************************************************/void timer0(void)interrupt 1 using 0{TH0=0x15;TL0=0xA0;TH1=0;TL1=0;sta_flag=1;count++;_nop_(); //开始发送40KHz的超声波_nop_();_nop_();_nop_();CNT=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();CNT=0;_nop_();_nop_();_nop_();_nop_();TR1=1;delay15(50); //延时避开直达信号}/****************************************************系统初始化*******************************************************/ void sys_init(void){uchar i;for(i=0;i<29;i++) //显示清零{ num[i]=0;}TMOD=0x11;TH0=0x15;TL0=0xA0;P0=0;CNT=0;CSBIN=1;EA=1;}/****************************************距离计算****************************************/void computer(void){float c,d,s;uint t;if(temp<0x8000) //温度为负c=331.4+0.61*temp*0.0625;elsec=331.4-0.61*temp*0.0625;t=jsh*256+jsl-120; //计算计数值d=(c*t*0.001)/2;d*=d;s=d-7.98;distance=sqrt(s); //修正后的值}/**************************************数据转换函数**************************************/void hextobcd(void){float tp;unsigned long int tmp;fuhao=0;if(temp<0x8000)tp=temp*0.0625;else //温度为负则求补码的到原码{bm();tp=temp*0.0625;fuhao=1;}tp*=10;tmp=tp;num[12]=tmp/100;if(fuhao)num[12]=num[12]|0x80; //加上符号位num[13]=tmp/10-(tmp/100)*10;tmp=distance;num[25]=tmp/1000;tmp%=1000;num[26]=tmp/100;tmp%=100;num[27]=tmp/10;tmp%=10;num[28]=tmp/1;}/*************************************温度转换函数*************************************//**************启动温度转换*************************/void testtemp(void){Init_18B20();//初始化18B20if(flag){WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换}}/***********读取温度函数**************/uint wd(void){unsigned int a = 0, b = 0, t = 0;Init_18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a = ReadOneChar(); //读取字节b = ReadOneChar();t = b;t <<= 8;t = t | a;return (t);}/***************18B20复位函数**********************DS18B20复位函数*/void Init_18B20(void) //初始化18B20{DQ = 1; //DQ复位Delay(10);DQ = 0; //单片机将DQ拉低Delay(80); //480usDQ = 1; //拉高总线Delay(10);//稍做延时后如果x=0则初始化成功x=1则初始化失败if(DQ)flag=0;elseflag=1;Delay(20);/*******************读取一个字节******************************/ uchar ReadOneChar(void){uchar i = 0;uchar dat = 0;for (i = 8; i > 0; i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ)dat |= 0x80; //拼装Delay(15);}return (dat);}/*********************写入一个字节****************************/ void WriteOneChar(unsigned char dat){unsigned char i = 0;for (i = 8; i > 0; i--){DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat>>=1;}}/********************************************对温度的转换,得到原码********************************************/void bm(void){temp=~temp;temp+=1;/***************************显示函数********************************/void display(void){{uchar a,b,d;Init_LCD();Write_Comm(0x01); //清显示Write_Comm(0x80); //写首地址for(a=0;a<16;a++){d=dispbuf[a];if((a>11)&&(a<14)) //如果是结果位到num[]里面读取{d=numcode[num[a]];}if(14==a) //显示°{d=0xdf;}Write_Data(d);}Write_Comm(0xc0); //--------------???????????for(b=16;b<33;b++){d=dispbuf[b];if((b>24)&&(b<29)){d=numcode[num[b]];}Write_Data(d);}}}void Read_Busy(void) //读忙信号判断{do{Lcd_Data = 0xff;RS = 0;RW = 1;E = 0;delay();E = 1;}while(Busy); //如果忙则等待}/*******************写指令函数******************************/ void Write_Comm(uchar lcdcomm){Lcd_Data = lcdcomm;RS = 0;RW = 0;E = 0;Read_Busy();E = 1;}/*********************写数据函数****************************/ void Write_Data(uchar lcddata)//写数据函数{Lcd_Data = lcddata;RS = 1;RW = 0;E = 0;Read_Busy(); //判断是否忙状态E = 1;}/*********************初始化LCD****************************/ void Init_LCD(void){delay();//稍微延时,等待LCD进入工作状态Write_Comm(0x01);//清显示// Write_Comm(0x02);//光标归位Write_Comm(0x38);//8位2行5*8Write_Comm(0x06);//文字不动,光标右移Write_Comm(0x0c);//显示开/关,光标开闪烁开// Write_Comm(0x18);//左移}/***************************延时n*15US函数****************************/void delay15(uchar us){do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();us--;}while(us);}/**********************************18b20延时函数*************************************/void Delay(uint time){while( time-- );}/****************************************************延时1MS*******************************************************/ void delay1ms(void){uchar i,j;for(i=0;i<2;i++)for(j=0;j<255;j++);}/****************************************显示延时函数*************************************/void delay(){uchar y;for(y=0;y<0xff;y++);}。

超声波测距仪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语言程序
unsigned char KEY_flag=0; //按键选择标志
//延时函数
void Delay_ms(int jj) //延时函数
{
int ii; //延时变量
while(jj--)//延时n毫秒
for(ii=0;ii<116;ii++);//延时1毫秒
}
void Conut(void) //测量函数
TH0=0; //定时器清零
TL0=0; //定时器清零
TH1=0xf8; //2MS定时
TL1=0x30; //2MS定时
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
if((S/10>SET_H)||(S/10>SET_H)) //水位过低过高报警,
{
LED=0;SPEAK=0; //报警
}
else
{
LED=1;SPEAK=1; //不报警
}
////////////////////////////////
Table[2]= SET_H%10+0X30;
LCD1602_Disp_ZF(0x86+0x40,Table,3);
Table[0]= SET_L/100+0X30; //显示最小值
Table[1]= SET_L%100/10+0X30;
Table[2]= SET_L%10+0X30;
{
KEY_flag++; //模式选择
ISP_ERASE(0x2c00); //注意:字节编程时必须要先要擦除整个扇区

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


//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; } } /*********************************************************/

超声波测距C程序

#include<AT89X51.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;//外部中断,接CX20106的脚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();//延时usvoid display(uint dat);//4位数码管显示函数,只用了位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;//定时器方式用于计时TH0=0;TL0=0; /* 设定T0的工作模式为*/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;//清定时TR0=1;//开定时for(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) //中断标志位置,说明有回波{ //以下为路程计算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;//关定时器ET0=0;//关外部中断flag=1; //置位标志位tmp=TH0*256+TL0; //读取定时器的值if((tmp>0)&&(tmp<60000))//判断是否超出范围,此设置的范围为到米,实际不能达到米{high_time=TH0;//把计时值放入缓冲low_time=TL0;}else//超出范围则重新测量{high_time=0;low_time=0;}}。

超声波全部程序

#include<iom16v.h>#include<macros.h>#include"delay.h"#include"BC7281.h"#include"lcd.h"#define uchar unsigned char#define uint unsigned int#define SET(a,b) a|=(1<<b) //SET(PORTD,PD3)=>PORTD|=BIT(3);#define CLR(a,b) a&=~(1<<b) //SET(DDRD,PD3)=>DDRD&=~BIT(3);#define CPL(a,b) a^=(1<<b) //CPL(A,B)=>A^B,(0^0=0,0^1=0,//1^0=0,1^1=1)异或=与#define CHK(a,b) (a&(1<<b)) //CHK(DDRD,PD3)=>DDRD=BIT(3);//CHK(PORTD,PD3)=>PORTD=BIT(3);uint got_num, got_num1[5],temp;uint S1,S2,S3,S4,get_num,d,D,shu,ru,mi,ma;long int Zchang=0,Jshu=0;unsigned long int value=0;uchar Flag=0,m=0,biaozhi=0,T=0;Mima[10]={0,1,2,3,4,5,6,7,8,9};uchar table[]={'0','1','2','3','4','5','6','7','8','9'}; //数码,直接调用/************got_num发送10个脉冲的个数;got_num1[5]把数据从小到大排列数组;temp是got_num1[5]交换式据中间变量*************//************Flag,m实现循环*************//****************************************************************************/ /*****************************测距离物体长度********************************/ /**************************************************************************/ void PWM40K_style(){DDRD|=BIT(7);TCCR2=0X18; //CTC模式[比较匹配触发OC2(OC2为原OC2的取反)]OCR2=0X0C;}void PWM40K_ON(){TCNT2=0X00;TCCR2=0X1A; //CTC模式,8分频}void PWM40K_OFF(){TCNT2=0X00;TCCR2=0X00;}void INT1_init(){CLR(DDRD,PD3); //(DDRD&=~BIT(3))中断1设为输入SET(PORTD,PD3);MCUCR=0X08; //(PORTD|=BIT(3)中断1上升沿触发GICR&=~(1<<INT1); //中断1标志位清零(低电平触发方式不带中断标志位) }void ceju(){PWM40K_ON();delay_nus(250); //发十个脉冲PWM40K_OFF(); //停止发脉冲TCNT1=0X0000; //定时器1初始值为0TCCR1A=0X00; //发完的同时开始计数TCCR1B=0X02; //开定时器1GIFR|=(1<<INTF1); //清中断标志位delay_nus(700);GICR|=(1<<INT1); //外部中断1使能delay_nms(10); //延时足够的时间,以便下一次使用66?}void distance() //获得距离值,测5次{CLI();INT1_init();PWM40K_style();SEI();for (m=0;m<5;m++){ceju();}}#pragma interrupt_handler int1wave:3 //设定中断入口地址void int1wave(void){uchar i,j;GICR&=~(1<<INT1); //关中断1TCCR1B=0X00; //关定时器1got_num=TCNT1;if ( got_num<1700){got_num+=130; //补偿值}elseif ( got_num<3800){got_num+=50; //补偿值}else{got_num-=80; //补偿值}got_num1[Flag]=got_num; //将测得的值放入数组中got_num=0; //清零if (Flag==4){for(j=0;j<Flag-1;j++) //把5次数据由小到大排列{ for(i=0;i<Flag-j-1;i++){if( got_num1[i]> got_num1[i+1]){temp=got_num1[i+1];got_num1[i+1]= got_num1[i];got_num1[i]=temp;}}}for (i=1;i<4;i++) //去掉最小值,去掉最大值,取中间3个{got_num+=got_num1[i];}got_num= got_num/3; //求平均值value=got_num*33550/200000; //距离算法,以厘米为单位//(335.5M/S)=(33550CM/1X10^6uS):// value=10(发10个波计一次数)// got_num*(33550CM/1X10^6)=got_num*33550/200000;LCD_write(1,1,"物距");wr_byte(':');wr_byte(table[value/1000]);wr_byte(table[value%1000/100]);wr_byte(table[value%1000%100/10]);wr_byte('.');wr_byte(table[value%10]);wr_byte('C');wr_byte('M');}Flag++;/* if (Flag<5) //?????????????????????????{value=1000;}*/if (Flag==5){Flag=0;}}/********************************测物体长度**********************************/void CES1() //光电传感器检测到物体输出低电平,测量S1 {if(((PIND&0x02)==0x00)&&(biaozhi==0)) //右面检测到{S1=value;biaozhi++;}}void CES2() //测量S2{if(((PIND&0x02)==0x02)&&(biaozhi==1)){S2=value;biaozhi=0;wchang0();zchang0();}//wchang();与zchang();见下面AA,BB }void CES3(){if(((PIND&0x02)==0x00)&&(biaozhi==0)) //右面检测到{S3=value;biaozhi++;}}void CES4() //测量S2{if(((PIND&0x02)==0x02)&&(biaozhi==1)){S4=value;biaozhi=0;wchang1();zchang1();}//wchang();与zchang();见下面CC,DD }/*************************************物长0***********************************/ void wchang0() //: AA{if(S1>=S2){if(((PIND&0x02)==0x02)){d=S1-S2;}}else{d=0;}}/*************************************物长1***********************************/ void wchang1() //: CC{if(S4>=S3){if(((PIND&0x02)==0x02)){D=S4-S3;}}else{D=0;}}/*******************************显示物长0 ***********************************/ void xswchang0(){CES1();CES2();wchang0();get_num=d;LCD_write(2,1,"物长");wr_byte(':');wr_byte(table[get_num/1000]);wr_byte(table[get_num%1000/100]);wr_byte(table[get_num%1000%100/10]);wr_byte('.');wr_byte(table[get_num%10]);wr_byte('C');wr_byte('M');}/******************************* 显示物长1*******************************/void xswchang1(){CES3();CES4();wchang1();get_num=D;LCD_write(2,1,"物长");wr_byte(':');wr_byte(table[get_num/1000]);wr_byte(table[get_num%1000/100]);wr_byte(table[get_num%1000%100/10]);wr_byte('.');wr_byte(table[get_num%10]);wr_byte('C');wr_byte('M');}/*******************************计总长,个数0********************************/ void zchang0(){ //: BBZchang+=d;if(S1>=S2){Jshu++;}if((Zchang>99999)|(Jshu>999)) //总长最大9999.9CM;计数最多999个{Zchang=0;Jshu=0;}LCD_write(3,1,"总长");wr_byte(':');wr_byte(table[Zchang/10000]);wr_byte(table[Zchang/1000%10]);wr_byte(table[Zchang%1000/100]);wr_byte(table[Zchang%1000%100/10]);wr_byte('.');wr_byte(table[Zchang%10]);wr_byte('C');wr_byte('M');LCD_write(4,1,"计数");wr_byte(':');wr_byte(table[Jshu%1000/100]);wr_byte(table[Jshu%1000%100/10]);wr_byte(table[Jshu%10]);LCD_write(4,5,"个");}/*******************************计总长,个数1********************************/ void zchang1() //: DD{Zchang-=d;if(S4>=S3){Jshu--;}if((Zchang<0)|(Jshu<0)){Zchang=0;Jshu=0;}LCD_write(3,1,"总长");wr_byte(':');wr_byte(table[Zchang/10000]);wr_byte(table[Zchang/1000%10]);wr_byte(table[Zchang%1000/100]);wr_byte(table[Zchang%1000%100/10]);wr_byte('.');wr_byte(table[Zchang%10]);wr_byte('C');wr_byte('M');LCD_write(4,1,"计数");wr_byte(':');wr_byte(table[Jshu%1000/100]);wr_byte(table[Jshu%1000%100/10]);wr_byte(table[Jshu%10]);LCD_write(4,5,"个");}void panduan(){if(GB_Number==0x0D) //键值等于1时木棒长度,计数加{xswchang0();}if(GB_Number==0x0E) //键值等于2时木棒长度,计数减{xswchang1();}}void dianji(){switch(GB_Number){/*****************************顺转数据相加************************************/ case 0x0C:{DDRA|=BIT(2); PORTA|=BIT(2); delay_nus(1);LCD_write(1,8,"逆");LCD_write(3,8,"相");LCD_write(2,8,"转");LCD_write(4,8,"加");}break;/****************************逆转测数据相减***********************************/ case 0x0D:{DDRA|=BIT(3); PORTA|=BIT(3); delay_nus(1);LCD_write(1,8,"顺");LCD_write(3,8,"相");LCD_write(2,8,"转");LCD_write(4,8,"减");}break;/******************************停止数据丢失**********************************/ case 0x0E:{DDRA&=~0x0C; PORTA&=~0x0C; delay_nus(1);LCD_write(1,8," ");LCD_write(2,8,"停");LCD_write(3,8,"止");LCD_write(4,8," ");got_num=0, got_num1[5]=0;value=0,D=0;S1=0,S2=0,S3=0,S4=0,get_num=0,d=0;Zchang=0,Jshu=0;Flag=0,m=0,biaozhi=0;}break;/***************************暂停数据不丢失**********************************/ case 0x0F:{LCD_write(1,8," ");LCD_write(2,8,"暂");LCD_write(3,8,"停");LCD_write(4,8," ");}break;}}void main(){DDRA=BIT(2)|BIT(3);PORTA&=~BIT(2);PORTA&=~BIT(3);BC7281_init();int0_init();LCD_int();SEI();while(1) // 一直测距{if(T==0){switch(GB_Number){case 0: LCD_write(2,1,"学习是灯,");shu=0;ru=0;mi=0;ma=0;break;case 1: LCD_write(2,1,"努力是油。

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);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数名: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++;
}
/***********************初始化定时器*********************/
void CSB_init(void )
{
TMOD = 0x11; /*设CTC1工作于模式1 */
IP=0x01; /*置外部中断INT0优先级为高*/
IT0=0; /*设置外部中断0的中断方式为电平触发*/
void main()
{
CSB_init(); /*初始化定时器*/
EA=1;
CLflag=0;
TL0=0x00;
TH0=0x00; /*定时器0的初始时间*/
Trig=1;
delay1(100);
Trig=0;
while(Echo==0);/*开启检测时会自动置位*/
TR0=1; /*启动定时器0,开始记时*/
CLflag=0; /*测量标志*/
Trig=0;
//EA=1; /*开总中断*/
ET0=1;
TR0=0;
}
/******************将测量的时间转换为距离************/
void Timetojuli( )
{
number[0]=l/1000; /*米*/
l=l-number[0]*1000;
#define RS485_T RS485RTPIN=1; //RS485设置为发送状态
/******************串口初始化函数********************************/
void Serial_Init()
{
SCON=0x50; //串口工作方式为:8位Uart模式1,接收使能
RS485_T;
ES=0; //设置RS485为发送状态
SBUF=Char; //发送数据
while(!TI); //检测上一个字节是否发送完毕,及是否为发送下一字节做好准备
TI=0;
ES=1;
RS485_R; //清楚发送中断标志位
}
/***********************************************************************
for(j;j<4;j++)
{
Send_Char(*Data); //发送一个字节数据
Data++;//指针向后移
}
}
#endif
EX0=1;
while(!CLflag);
Timetojuli( );
}
#ifndef __MAX485_H
#define __MAX485_H
sbit RS485RTPIN=P3^4; //RS485收发使能位定义
#define RS485_R RS485RTPIN=0; //RS485设置为接收状态
函数名:Send_Char()
功能:从串口发送一个字节的数据
入口参数:Char:要发送的一个字节数据
************************************************************************/
void Send_Char( char Char)
{
number[1]=l/100; /*分米*/
l=l-number[1]*100;
number[2]=l/10;/*厘米*/
number[3]=l%10;
}
/********************中断函数0*************************/
void serve_INT0( ) interrupt 0
sbit Echo=P3^2; /*外部中断0检测接收信号*/
#define ss=0.344
char number[4]; /*存储数据*/
/*********************延时函数****************************/
void delay1( int j )
{ int i;
相关文档
最新文档