超声波三维测距程序doc_第1页
超声波三维测距程序doc_第2页
超声波三维测距程序doc_第3页
超声波三维测距程序doc_第4页
超声波三维测距程序doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、/采用的芯片为STC15系列#includereg51.h#include math.h sfr INT_CLKO=0 x8F;/外部中断与时钟输出控制寄存器sfr P_SW1= 0 xA2;/外设功能切换寄存器1sfr AUXR = 0 x8e; /辅助寄存器sfr T2H = 0 xd6; /定时器2高8位sfr T2L = 0 xd7; /定时器2低8位#define CCP_S0 0 x10/P_SW1.4#define CCP_S1 0 x20/P_SW1.5#define S1_S0 0 x40 /P_SW1.6#define S1_S1 0 x80 /P_SW1.7sfr CCO

2、N=0 xD8;/PCA控制寄存器sbit CCF0=CCON0;/PCA模块0中断标志sbit CCF1=CCON1;/PCA模块1中断标志sbit CR=CCON6;/PCA定时器运行控制位sbit CF=CCON7;/PCA定时器溢出标志sfr CMOD=0 xD9;/PCA模式寄存器sfr CL=0 xE9;/PCA定时器低字节sfr CH=0 xF9;/PCA定时器高字节sfr CCAPM0=0 xDA;/PCA模块0模式寄存器sfr CCAP0L=0 xEA;/PCA模块0捕获寄存器LOWsfr CCAP0H=0 xFA;/PCA模块0捕获寄存器HIGHsfr CCAPM1=0 x

3、DB;/PCA模块1模式寄存器sfr CCAP1L=0 xEB;/PCA模块1捕获寄存器LOWsfr CCAP1H=0 xFB;/PCA模块1捕获寄存器HIGHsfr CCAPM2=0 xDC;/PCA模块2模式寄存器sfr CCAP2L=0 xEC;/PCA模块2捕获寄存器LOWsfr CCAP2H=0 xFC;/PCA模块2捕获寄存器HIGHsfr PCA_PWM0=0 xf2;/PCA模块0的PWM寄存器sfr PCA_PWM1=0 xf3;/PCA模块1的PWM寄存器sfr PCA_PWM2=0 xf4;/PCA模块2的PWM寄存器#define FOSC 11059200L /系统频

4、率#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

5、0;/超声波1发送控制端口(控制光耦继电器)sbit CSB_R1 = P01;/超声波1接收控制端口(控制三极管)sbit CSB_T2 = P02;/超声波2发送控制端口(控制光耦继电器)sbit CSB_R2 = P03;/超声波2接收控制端口(控制三极管)sbit CSB_T3 = P04;/超声波3发送控制端口(控制光耦继电器)sbit CSB_R3 = P05;/超声波3接收控制端口(控制三极管)sbit LED =P12;uint count = 0;/定义计数变量uint distance = 0;/定义距离变量uchar *p;/定义指针(用于串口发送数据)uchar cou

6、nt116;/定义数组,存放距离bit flag = 0;/定义标志位void Send_data(uchar *b);/*延时函数*/*函数原型:void delay(void)/*函数功能:延时/*输入参数:无/*输出参数:无/*/void delay_us(uchar i)unsigned int j;for(;i0;i-)for(j = 6;j0;j-) ;void delay_ms(uchar i)unsigned int j;for(;i0;i-)for(j = 847;j0;j-) ;/*count1cle初始化函数*/*函数原型:void count1cle(void)/*函数

7、功能:count1cle初始化/*输入参数:无/*输出参数:无/*/void count1cle()uchar i;for(i = 0;i16;i+)count1i = 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=0 x08; /选择PCA的时钟源为S

8、YSCLK,使用外部晶振12MHz,PCA频率为46.875kHz CCAPM0=0 x42; /CCAPM0是PCA0模块的寄存器 0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P13 PCA_PWM0=0 x00; /把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0 CL=0; /比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装 CH=0;CCAP0H=0 x80; / 占空比控制CCAP0L=0 x80; CCON=0; /PCA控制寄存器,设置为0 CR=0; /PCA计数开关为关,停止产

9、生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=0 x08; /选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHz CCAPM1=0 x42; /CCAPM0是PCA0模块的寄存器 0100 0010;ECOM

10、0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P13 PCA_PWM1=0 x00; /把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0 CL=0; /比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装 CH=0;CCAP1H=0 x80; / 占空比控制CCAP1L=0 x80; CCON=0; /PCA控制寄存器,设置为0 CR=0; /PCA计数开关为关,停止产生pwm波/*PWM0初始化函数*/*函数原型:void PCA_Init(void)/*函数功能:PWM初始化/*输入参数:无/*输出参数:无/*/void P

11、CA2_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=0 x08; /选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHz CCAPM2=0 x42; /CCAPM0是PCA0模块的寄存器 0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P13 PCA_PWM2=0 x00; /把与CCAP0H和CCAP0L组成9位数的EP

12、C0H和EPC0L置为0 CL=0; /比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装 CH=0;CCAP2H=0 x80; / 占空比控制CCAP2L=0 x80; CCON=0; /PCA控制寄存器,设置为0 CR=0; /PCA计数开关为关,停止产生pwm波/*INT0初始化函数*/*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/*/void INT0_Init()INT1 = 1;IT0 = 1;/设置INT0为下降沿触发EX0 = 0;/不允许INT0中断EA = 1;/打开总中断/*INT0中断函

13、数*/*函数原型:void INT0(void) /*函数功能:INT0中断处理/*输入参数:无/*输出参数:无/*/void EXINT0() interrupt 0count = TH0;count = count8;count = count+TL0-47536;/记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; /关T0中断/EX0 = 0;/不允许INT0中断/*INT0初始化函数*/*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/*/void INT1_Init()INT1 = 1;IT1 =

14、1;/设置INT0为下降沿触发EX1 = 0;/不允许INT0中断EA = 1;/打开总中断/*INT1中断函数*/*函数原型:void INT1(void) /*函数功能:INT1中断处理/*输入参数:无/*输出参数:无/*/void EXINT1() interrupt 2count = TH0;count = count8;count = count+TL0-47536;/记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; /关T0中断/EX1 = 0;/不允许INT0中断/*INT0初始化函数*/*函数原型:void INT0_Init(void)/*函数功能:IN

15、T0初始化/*输入参数:无/*输出参数:无/*/void INT2_Init()INT_CLKO&=0 xEF;/(EX2 = 1)使能INT2中断EA = 1;/打开总中断/*INT2中断函数*/*函数原型:void INT2(void) /*函数功能:INT2中断处理/*输入参数:无/*输出参数:无/*/void EXIT2() interrupt 10count = TH0;count = count8; /装入计数初值 TL0=T0MS;EA = 1; /开中断使能ET0 = 1; /允许溢出TR0 = 0; /关T0中断/*Timer0中断函数*/*函数原型:void Timer0(

16、void)/*函数功能:Timer0中断处理/*输入参数:无/*输出参数:无/*/void Timer0() interrupt 1TL0 = 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

17、_S1=0 P_SW1 = ACC; /(P3.0/RxD, P3.1/TxD)SCON = 0 x40; /8位可变波特率T2L = (65536 - (FOSC/4/BAUD); /设置波特率重装值 T2H = (65536 - (FOSC/4/BAUD)8; AUXR = 0 x14; /T2为1T模式, 并启动定时器2 AUXR |= 0 x01; /选择定时器2为串口1的波特率发生器/ ES = 1; /使能串口1中断/ EA = 1; /开启全局中断/*串口中断处理函数*/*函数原型:void Serial_Int(void)/*函数功能:串口中断处理/*输入参数:无/*输出参数:

18、无/*/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); /等待发送完

19、成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)

20、;/*主函数*/*函数原型: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接收控制端口

21、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=0 x00; / PWM0占空比控制为0CCAP2L=CCAP2H=0 x00; / PWM2占空比控制为0 CR=1; /PCA计数开关为开,

22、产生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|=0 x10;/(EX2 = 1)使能INT2中断CCAP0L=CCAP0H=0 x00; / PWM0占空比控制为0CCAP2L=CCAP2H=0 x00; / PWM2占空比控制为0 CR=1; /PCA计数开关为开,产生pw

23、m波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|=0 x10;/(EX2 = 1)使能INT2中断CCAP1L=CCAP1H=0 x00; / PWM0占空比控制为0CCAP2L=CCAP2H=0 x00; / PWM2占空比控制为0 CR=1; /PCA计数开关为开,产生pwm波TR0 = 1; /开T0中断del

24、ay_us(18);/延时186us,等待8个超声波发送完成CR = 0; /PCA计数开关为关,停止产生pwm波break;/超声波1发,超声波1收,作为AP的距离case 5:CSB_T1 = 1;/打开超声波1发送控制端口CCAP1L=CCAP1H=0 x00; / PWM0占空比控制为0CCAP2L=CCAP2H=0 x00; / PWM2占空比控制为0 CR=1; /PCA计数开关为开,产生pwm波TR0 = 1; /开T0中断delay_us(20);/延时186us,等待8个超声波发送完成CR = 0; /PCA计数开关为关,停止产生pwm波EX0 = 1;/允许外部中断0CSB

25、_R1 = 1;/打开超声波1接收控制端口break;/超声波2发,超声波2收,作为BP的距离case 6:CSB_T2 = 1;/打开超声波2发送控制端口CCAP0L=CCAP0H=0 x00; / PWM0占空比控制为0CCAP2L=CCAP2H=0 x00; / PWM2占空比控制为0 CR=1; /PCA计数开关为开,产生pwm波TR0 = 1; /开T0中断delay_us(18);/延时186us,等待8个超声波发送完成CR = 0; /PCA计数开关为关,停止产生pwm波EX1 = 1;/允许外部中断0CSB_R2 = 1;/打开超声波3接收控制端口break;/超声波3发,超声波3收,作为B

温馨提示

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

评论

0/150

提交评论