(精品)基于单片机的超声波测距仪的设计参考毕业论文 下载本文

编译中出现一些问题,可以降低优化级别试一试。Emphasis是选择编译优先方式,第一项是代码量优化(最终生成的代码量小);第二项是速度优先(最终生成的代码速度快);第三项是缺省。默认的是速度优先,可根据需要更改。设置完成后按确认返回主界面,工程文件建立、设置完毕。

7.2.3 编译、连接

在设置好工程后,即可进行编译、连接。选择菜单Project->Build target,对当前工程进行连接,如果当前文件已修改,软件会先对该文件进行编译,然后再连接以产生目标代码;如果选择Rebuild All target files将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而Translate?.项则仅对该文件进行编译,不进行连接。以上操作也可以通过工具栏按钮直接进行。图7.6是有关编译、设置的工具栏按钮,从左到右分别是:编译、编译连接、全部重建、停止编译和对工程进行设置。编译过程中的信息将出现在输出窗口中的Build页中,如果源程序中有语法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序反复修改之后,最终会得到如图7.7所示的结果,提示获得了名为exam1.designarticlesmeasure.=P1^1;

sbit k1=P3^7; sbit k2=P3^6; sbit k3=P3^5; sbit send=P1^0; sbit recieve=P3^2; uchar temp_) {

unsigned int j,k; while(n--!=0) { for(j=0;j<10;j++) for(k=0;k<72;k++) ; } }

void delay_us(uchar n) {

uchar i; i=0;

while(i

void dsreset(void) DS18B20重设 {

unsigned int i;

tem_in=0; i=103;

while(i>0)i--; tem_in=1; i=4;

while(i>0)i--; }

uchar readbyte(void) 直接读一字节程序 {

uchar i,k; i=8; k=0; while(i--) { tem_in=1; delay_us(1); tem_in=0; k=k>>1; tem_in=1; NOP; if(tem_in)k |= 0x80; tem_in为1时,则该位也为1 delay_us(4); }

return(k); }

void tmpwrite(unsigned char dat) 函数功能:向B20写一字节 { unsigned int i; unsigned char j; bit testb;

for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { tem_in=0;i++;i++; tem_in=1; i=8;while(i>0)i--; } else { tem_in=0; i=8;while(i>0)i--; tem_in=1;i++;i++; } }

}

void tmpchange(void) {

dsreset(); 复位 delay(1);

tmpwrite(0xcc); 跳过序列号命令 tmpwrite(0x44); 转换命令 }

void tmp(void) 温度采集及转换 {

int m,n=0;

float temnum1=0; dsreset(); delay(1);

tmpwrite(0xcc); tmpwrite(0xbe);

temp_l=readbyte(); 低位在前 temp_=flag1; temp_==0xf8)tembuf[3]=10; temnum=temnum1; }

void dis(void) 温度显示 {

uchar i;

uchar j=0xfe; for(i=0;i<4;i++) 输送显示数据 { P0=0xff; P0=ledcode[tembuf[i]]; if(i==1)P0=ledcode[tembuf[i]]+0x80; 小数点显示 P2=j; delay(15); j=(j<<1)+0x01; } }

void distance(void) 计算测量得到的距离 {

double radical,dist; if(b!=0) {

radical=sqrt(1+(temnum+273)273); dist=165.7*t*radical;

dist=dist+0.005; 四舍五入并留两位小数 if(dist>0&&dist<10)

{ dispbuf[3]=11; dispbuf[2]=(uchar)dist; dispbuf[1]=(uchar)(dist*10); dispbuf[0]=(uchar)(dist*100); }

if(dist>=10&&dist<=0) 测量距离大于10米或小于0显示\也有出错的意思

{

dispbuf[3]=10; dispbuf[2]=10; dispbuf[1]=10; dispbuf[0]=10; }

if(dist<100&&dist>=10) { dispbuf[3]=(uchar)dist10; dispbuf[2]=(uchar)dist; dispbuf[1]=(uchar)(dist*10); dispbuf[0]=(uchar)(dist*100); } }

else

{ 当T1溢出时,则测量时间无效 dispbuf[3]=10; dispbuf[2]=10; dispbuf[1]=10; dispbuf[0]=10; } }

void dis1(void) 距离显示 {

uchar i;

uchar j=0xfe; for(i=0;i<0;i++) *输送显示数据* { P0=0xff; P0=ledcode[dispbuf[i]]; if(i==2)P0=ledcode[dispbuf[i]]+0x80; 小数点显示 P2=j; delay10ms(1); j=(j<<1)+0x01; } }

void dis2(void) {