超声波测距电路图及程序_第1页
超声波测距电路图及程序_第2页
超声波测距电路图及程序_第3页
超声波测距电路图及程序_第4页
超声波测距电路图及程序_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/#include <AT892051.H>#include <AT89X51.H>#define k1 P2_0#define csbout P2_7 /超声波发送#define csbint P3_2 /超声波接收#define csbc 0.034#define DQ P3_0unsigned char opto,digit;unsigned xm1,xm2,xm0,xm3,xm4,key,jpjs;unsigned sx1,mqs,buffer5;unsigned convert10=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8

2、,0x80,0x90;/09bit cl; /段码unsigned int s,t,i, xx,j,sj1,sj2,sj3,sx1;typedef unsigned char byte;typedef unsigned int word;void js();void delay(int i); /延时函数void scanLED(); /显示函数void allToBuffer(); /显示转换函数void keyscan();void offmsd();void delay1(word useconds);byte ow_reset(void);byte read_byte(void);vo

3、id write_byte(char val);char Read_Temperature(void);void main() /主函数EA=1; /中断允许TMOD=0x11; /设定时器0为计数,设定时器1定时 ET0=1; /定时器0中断允许ET1=1; /定时器1中断允许TH0=0x00;TL0=0x00;TH1=0x9E; /定时器T1置为25msTL1=0x57;csbint=1; /p3.2置位csbout=1; /p2.7置位cl=0;opto=0xff;jpjs=0;sj1=20;sj3=600;TR1=1;while(1)keyscan();if(jpjs<1)js(

4、);if(s>sj3)buffer2=0x00;buffer1=0x00;buffer0=0x00;else if(s<sj1)buffer2=0x00;buffer1=0x00;buffer0=0x00;else allToBuffer();else allToBuffer(); /将值转换成LED段码 offmsd();scanLED(); /显示函数 void scanLED() /显示功能模块digit=0x01;for( i=0; i<5; i+) /5位数显示P0=digit&opto; /依次显示各位数P1=bufferi; /显示数据送P1口delay

5、(20); /延时处理if(!(P0&0xEF) /判断5位是否显示完key=0;digit<<1; /循环左移1位void allToBuffer() /转换距离数码管功能模块 int temperature;xm0=s/100;xm1=(s-100*xm0)/10;xm2=s-100*xm0-10*xm1;buffer2=convertxm2;buffer1=convertxm1;buffer0=convertxm0;temperature=Read_Temperature();xm3=temperature/10;xm4=temperature-10*xm3;buff

6、er4=convertxm4; buffer3=convertxm3;void delay(int i) while(-i);void js()int temprature;temprature=Read_Temperature(); if(cl=1)TR1=0; /定时器1关闭 TH0=0x00;TL0=0x00;/定时器0清零 i=10;while(i-)csbout=!csbout; 期超声波TR0=1; i=mqs; while(i-)i=0;while(csbint)i+;if(i>=2450) csbint=0;TR0=0;TH1=0x9E;TL1=0x57;t=TH0; /

7、连续取反10次 发射5个周 /开启计数器t0 /盲区 /上限值t=t*256+TL0;s=t*(csbc+0.61*temprature)/2;TR1=1;cl=0;void keyscan() /健盘处理函数xx=0;if(k1!=1) / 判断开关是否按下delay(400); /延时去抖动 延时3.6msif(k1!=1) / 判断开关是否按下 while(!k1)delay(30);xx+;if(xx>2000)jpjs+;if(jpjs>4)jpjs=0;xx=0;mqs=65; /while循环一周期9us ,20cm需要等待65*9us void offmsd()if

8、 (buffer0 = 0x3f)buffer0 = 0x00;/ds18b20的完整程序(c51)(sparkstar)/DS1820 C51 子程序/这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间/sbit DQ =P21;/根据实际情况定义端口/延时void delay1(word useconds)for(;useconds>0;useconds-);/复位byte ow_reset(void)byte presence;DQ = 0; /pull DQ line lowdelay1(29); / leave it low for 480us DQ = 1;

9、 / allow line to return highdelay1(3); / wait for presencepresence = DQ; / get presence signal delay1(25); / wait for end of timeslotreturn(presence); / presence signal returned / 0=presence, 1 = no part/从 1-wire 总线上读取一个字节 byte read_byte(void)byte i;byte value = 0;for (i=8;i>0;i-)value>>=1;

10、DQ = 0; / pull DQ low to start timeslot DQ = 1; / then return highdelay1(1); /for (i=0; i<3; i+);if(DQ)value|=0x80;delay1(6); / wait for rest of timeslot return(value);/向 1-WIRE 总线上写一个字节void write_byte(char val)byte i;for (i=8; i>0; i-) / writes byte, one bit at a time DQ = 0; / pull DQ low to start timeslotDQ = val&0x01;delay1(5); / hold value for remainder of timeslot DQ = 1;val=val/2;delay1(5);/读取温度char Read_Temperature(void)unionbyte c2;int x;temp;ow_reset();write_byte(0xCC); / Skip ROM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论