超声波全部程序_第1页
超声波全部程序_第2页
超声波全部程序_第3页
超声波全部程序_第4页
超声波全部程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

#include<iom16v.h>#include<macros.h>#include"delay.h"#include"BC7281.h"#include"lcd.h"#defineucharunsignedchar#defineuintunsignedint#defineSET(a,b)a|=(1<<b)//SET(PORTD,PD3)=>PORTD|=BIT(3);#defineCLR(a,b)a&=~(1<<b)//SET(DDRD,PD3)=>DDRD&=~BIT(3);#defineCPL(a,b)a^=(1<<b)//CPL(A,B)=>A^B,(0^0=0,0^1=0,//1^0=0,1^1=1)异或=与#defineCHK(a,b)(a&(1<<b))//CHK(DDRD,PD3)=>DDRD=BIT(3);//CHK(PORTD,PD3)=>PORTD=BIT(3);uintgot_num,got_num1[5],temp;uintS1,S2,S3,S4,get_num,d,D,shu,ru,mi,ma;longintZchang=0,Jshu=0;unsignedlongintvalue=0;ucharFlag=0,m=0,biaozhi=0,T=0;Mima[10]={0,1,2,3,4,5,6,7,8,9};uchartable[]={'0','1','2','3','4','5','6','7','8','9'};//数码,直接调用/************got_num发送10个脉冲的个数;got_num1[5]把数据从小到大排列数组;temp是got_num1[5]交换式据中间变量*************//************Flag,m实现循环*************//****************************************************************************//*****************************测距离物体长度********************************//**************************************************************************/voidPWM40K_style(){DDRD|=BIT(7); TCCR2=0X18; //CTC模式[比较匹配触发OC2(OC2为原OC2的取反)] OCR2=0X0C;}voidPWM40K_ON(){TCNT2=0X00; TCCR2=0X1A;//CTC模式,8分频}voidPWM40K_OFF(){TCNT2=0X00; TCCR2=0X00;}voidINT1_init(){CLR(DDRD,PD3);//(DDRD&=~BIT(3))中断1设为输入 SET(PORTD,PD3); MCUCR=0X08;//(PORTD|=BIT(3)中断1上升沿触发 GICR&=~(1<<INT1);//中断1标志位清零(低电平触发方式不带中断标志位)}voidceju(){PWM40K_ON(); delay_nus(250);//发十个脉冲 PWM40K_OFF();//停止发脉冲 TCNT1=0X0000;//定时器1初始值为0 TCCR1A=0X00;//发完的同时开始计数TCCR1B=0X02;//开定时器1 GIFR|=(1<<INTF1);//清中断标志位delay_nus(700); GICR|=(1<<INT1);//外部中断1使能 delay_nms(10);//延时足够的时间,以便下一次使用66?}voiddistance()//获得距离值,测5次{ CLI(); INT1_init();PWM40K_style(); SEI(); for(m=0;m<5;m++) { ceju(); }}#pragmainterrupt_handlerint1wave:3//设定中断入口地址voidint1wave(void){ uchari,j;GICR&=~(1<<INT1);//关中断1TCCR1B=0X00;//关定时器1got_num=TCNT1; if(got_num<1700) { got_num+=130;//补偿值 } else if(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; } }/********************************测物体长度**********************************/voidCES1()//光电传感器检测到物体输出低电平,测量S1{if(((PIND&0x02)==0x00)&&(biaozhi==0))//右面检测到 {S1=value;biaozhi++;}}voidCES2()//测量S2{ if(((PIND&0x02)==0x02)&&(biaozhi==1)) {S2=value;biaozhi=0;wchang0();zchang0();}//wchang();与zchang();见下面AA,BB}voidCES3(){if(((PIND&0x02)==0x00)&&(biaozhi==0))//右面检测到 {S3=value;biaozhi++;}}voidCES4()//测量S2{ if(((PIND&0x02)==0x02)&&(biaozhi==1)) {S4=value;biaozhi=0;wchang1();zchang1();}//wchang();与zchang();见下面CC,DD}/*************************************物长0***********************************/voidwchang0()//:AA{if(S1>=S2){if(((PIND&0x02)==0x02)) {d=S1-S2;}}else{d=0;}}/*************************************物长1***********************************/voidwchang1()//:CC{if(S4>=S3){if(((PIND&0x02)==0x02)) {D=S4-S3;}}else{D=0;}}/*******************************显示物长0***********************************/voidxswchang0(){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*******************************/voidxswchang1(){ 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********************************/voidzchang0(){//: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********************************/voidzchang1()//: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,"个");}voidpanduan(){if(GB_Number==0x0D)//键值等于1时木棒长度,计数加{xswchang0();}if(GB_Number==0x0E)//键值等于2时木棒长度,计数减{xswchang1();}}voiddianji(){ switch(GB_Number) {/*****************************顺转数据相加************************************/ case0x0C:{ 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;/****************************逆转测数据相减***********************************/ case0x0D:{ 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;/******************************停止数据丢失**********************************/ case0x0E:{ 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;/***************************暂停数据不丢失**********************************/ case0x0F:{ LCD_write(1,8,""); LCD_write(2,8,"暂"); LCD_write(3,8,"停"); LCD_write(4,8,""); }break; }}voidmain(){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){case0:LCD_write(2,1,"学习是灯,");shu=0;ru=0;mi=0;ma=0;break; case1:LCD_write(2,1,"努力是油。");shu=0;ru=0;mi=0;ma=0;break; case2:LCD_write(2,1,"要想灯亮,");break; case3:LCD_write(2,1,"必须加油。");shu=0;ru=0;mi=0;ma=0;break;case4:LCD_write(2,1,"学习是灯,");shu=0;ru=0;mi=0

温馨提示

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

评论

0/150

提交评论