超声波测距实验解析.docx

上传人:b****5 文档编号:3979696 上传时间:2022-11-26 格式:DOCX 页数:16 大小:18.20KB
下载 相关 举报
超声波测距实验解析.docx_第1页
第1页 / 共16页
超声波测距实验解析.docx_第2页
第2页 / 共16页
超声波测距实验解析.docx_第3页
第3页 / 共16页
超声波测距实验解析.docx_第4页
第4页 / 共16页
超声波测距实验解析.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

超声波测距实验解析.docx

《超声波测距实验解析.docx》由会员分享,可在线阅读,更多相关《超声波测距实验解析.docx(16页珍藏版)》请在冰豆网上搜索。

超声波测距实验解析.docx

超声波测距实验解析

实验7超声波测距实验

(1)实验目的

掌握超声波测距的原理

掌握超声波测距的软件编程

(2)实验器材

电源POWER模块、测距&振动&压力&角度模块、主控制器模块、LCD1602、超声波模块、连接线

(3)实验程序

ceju

#include

#include"1602.h"

#include"delay.h"

#defineucharunsignedchar

#defineuintunsignedint

//#defineTrigP2^6

//#defineEchoP2^7

voidTime0_Init()

{

TMOD|=0X01;//定时0,工作方式1,16位定时器

TH0=0;

TL0=0;

ET0=1;//允许T0中断

EA=1;//开启总中断

}

sbitTrig=P2^6;

sbitEcho=P2^7;

doublet;

ints;

intge;

intshi;

intbai;

voidmain(void)

{

Time0_Init();

lcd_init();

while

(1)

{

Trig=0;

Trig=1;

delay_ms

(1);

Trig=0;

while(Echo==0);

{

}

TR0=1;

while(Echo==1)

{

}

TR0=0;

t=(double)(TH0*256+TL0)*12.0/11.0592;

TH0=0;

TL0=0;

s=(int)340*t/20000;

ge=s%10;

s=s/10;

shi=s%10;

s=s/10;

bai=s;

delay_ms(100);

lcd_display_str(0,0,"s=");

lcd_1602_display_num(1,1,bai);

lcd_1602_display_num(2,1,shi);

lcd_1602_display_num(3,1,ge);

}

}

(4)测试步骤

1.将超声波模块插入测距&振动&压力&角度传感器模块J5,按表1的连线关系连好线。

给模块上电。

2.编写程序,并下载到主控制器。

3.用物体挡住超声波模块,观察液晶显示的距离。

移动物体,观察液晶显示的距离是否与实际吻合。

(5)实验结果

液晶显示屏上显示超声波模块距离阻挡物的距离(直线距离),最大可到400cm左右。

 

实验8PWM直流电机调速实验

(1)实验目的

了解单片机硬件PWM的配置方法

掌握直流电机速度的控制方法

(2)实验器材

电源POWER模块、CPU_51模块、速度&加速度度传感器模块、LCD1602、超声波模块、连接线

(3)实验程序

main.c

#include"1602.h"

#include"delay.h"

#include

intge,shi,bai,age,ashi;

sbitKEY1=P1^4;

inti=0;

inta;

//定时器初始化

voidTime0_Init()

{

TMOD|=0X01;//定时0,工作方式1,16位定时器

TH0=(65536-46080)/256;//定时时间:

50ms,50ms后进入中断

TL0=(65536-46080)%256;

ET0=1;//允许T0中断

TR0=1;//启动定时器0

EA=1;//开启总中断

}

voidTime1_Init()

{

TMOD|=0x50;//定时器1,工作方式1,16位计数器

TH1=0;//计数器赋初值

TL1=0;

TR1=1;//启动计数器

}

 

intcount,speed=100;

/*定时器0中断函数

count用于计数,计满即是1s,speed变量存1s内得到的脉冲数。

*/

voidTime0_Int()interrupt1

{

count++;

//lcd_1602_display_num(1,0,2);

if(count>19)

{

speed=TH1*256+TL1;//取得1s,计数器1得到的脉冲数

count=0;

TH1=0;

TL1=0;

}

TH0=(65536-46080)/256;//定时器0,重新赋初值

TL0=(65536-46080)%256;

}

 

/*PWM初始化

PWM的频率是11.0592/256MHZ,通过改变CCAP0H和CCAP0L的值,可以改变PWM的占空比。

*/

voidPWM_Init()

{

//PCA工作模式寄存器,设置PCA/PWM时钟源输入为sysclk/12关闭PCA溢出计数中断

CMOD=0X00;

CCON=0X00;//PCA控制寄存器

CCAPM0=0X42;//PCA比较/捕获寄存器,设置P1.3pwm输出,无中断

CL=0X00;//PCA的16位计数器

CH=0X00;//PCA捕获/比较寄存器,当PCA模块用于PWM模式时,他们用来控制输出的占空比

CCAP0L=0XC0;//占空比25%CCAP0H=CCAP0L=0X80时占空比50%0(ˇ?

ˇ)0X40时75%

CCAP0H=0XC0;

CR=1;//启动PCA定时器

}

 

intb;

voidmain(void)

{

inttest_li=0;

lcd_init();

Time0_Init();

Time1_Init();

PWM_Init();

 

while

(1){

while(KEY1){;}//开关不闭合不改变

if(i==0)

{CCAP0L=0XC0;

CCAP0H=0XC0;

a=25;}

elseif(i==1)

{CCAP0L=0X80;

CCAP0H=0X80;

a=50;}

else{CCAP0L=0X40;

CCAP0H=0X40;

a=75;}

b=speed;

ge=b%10;

b=b/10;

shi=b%10;

bai=b/10;

age=a%10;

ashi=a/10;

lcd_display_str(0,1,"speed=");

lcd_1602_display_num(7,1,bai);

lcd_1602_display_num(8,1,shi);

lcd_1602_display_num(9,1,ge);

lcd_display_str(0,0,"zhankon=");

lcd_1602_display_num(9,0,age);

lcd_1602_display_num(10,0,ashi);

i++;

i=i%3;

delay_ms(1000);

}

}

(4)测试步骤

1.按照连线方法连线。

2.自行编写主程序

3.给系统上电。

4.观察液晶屏显示的转速是否正确,连续按下轻触开关KEY1,观察液晶屏显示的转速和占空比是否变化。

(5)实验结果

液晶显示屏上第一行显示占空比,第二行显示转速。

占空比随按键按下变化,同时转速也发生变化。

占空比大时转速快。

 

实验9红外对管转速测量实验

(1)实验目的

了解电机驱动的原理

了解红外对管的工作原理

掌握使用红外对管测速的方法

(2)实验器材

电源POWER模块、红外传感器模块、主控制器模块、LCD1602、超声波模块、连接线

(3)实验程序

main.c

#include"1602.h"

#include"delay.h"

#include

intge,shi,bai,age,ashi;

sbitKEY1=P1^4;

inti=0;

inta;

//定时器初始化

voidTime0_Init()

{

TMOD|=0X01;//定时0,工作方式1,16位定时器

TH0=(65536-46080)/256;//定时时间:

50ms,50ms后进入中断

TL0=(65536-46080)%256;

ET0=1;//允许T0中断

TR0=1;//启动定时器0

EA=1;//开启总中断

}

voidTime1_Init()

{

TMOD|=0x50;//定时器1,工作方式1,16位计数器

TH1=0;//计数器赋初值

TL1=0;

TR1=1;//启动计数器

}

 

intcount,speed=100;

/*定时器0中断函数

count用于计数,计满即是1s,speed变量存1s内得到的脉冲数。

*/

voidTime0_Int()interrupt1

{

count++;

//lcd_1602_display_num(1,0,2);

if(count>19)

{

speed=TH1*256+TL1;//取得1s,计数器1得到的脉冲数

count=0;

TH1=0;

TL1=0;

}

TH0=(65536-46080)/256;//定时器0,重新赋初值

TL0=(65536-46080)%256;

}

 

/*PWM初始化

PWM的频率是11.0592/256MHZ,通过改变CCAP0H和CCAP0L的值,可以改变PWM的占空比。

*/

voidPWM_Init()

{

//PCA工作模式寄存器,设置PCA/PWM时钟源输入为sysclk/12关闭PCA溢出计数中断

CMOD=0X00;

CCON=0X00;//PCA控制寄存器

CCAPM0=0X42;//PCA比较/捕获寄存器,设置P1.3pwm输出,无中断

CL=0X00;//PCA的16位计数器

CH=0X00;//PCA捕获/比较寄存器,当PCA模块用于PWM模式时,他们用来控制输出的占空比

CCAP0L=0XC0;//占空比25%CCAP0H=CCAP0L=0X80时占空比50%0(ˇ?

ˇ)0X40时75%

CCAP0H=0XC0;

CR=1;//启动PCA定时器

}

#defineN=100

intb;

voidmain(void)

{

Time0_Init();

Time1_Init();

lcd_init();

while

(1){

b=speed/N;

ge=b%10;

b=b/10;

shi=b%10;

bai=b/10;

lcd_display_str(0,1,"v=");

lcd_1602_display_num(1,0,bai);

lcd_1602_display_num(2,0,shi);

lcd_1602_display_num(3,0,ge);

}

delay_ms(1000);}

 

(4)测试步骤

1.按照实验原理编写程序,编译生成HEX文件。

2.按照连线方法连线。

3.给系统上电。

4.通过串口给单片机烧写程序。

5.观察液晶屏显示的转速是否正确,旋转转速调节旋钮,观察液晶屏显示的转速值是

否变化。

若否,分析原因,重复测试步骤。

(5)实验结果

液晶显示屏上显示转速,旋转转速调节旋钮,液晶显示屏上显示的转速会随着旋钮的旋转而改变。

实验1018B20温度测量实验

(1)实验目的

研究温度传感器DS18B20的原理和使用

学习单总线通信方式的使用方法。

(2)实验器材

电源POWER模块、温湿度传感器模块、主控制器模块、LCD1602、超声波模块、连接线

(3)实验程序

main.c

#include

#include"1602.h"

#include"delay.h"

#defineucharunsignedchar

#defineuintunsignedint

 

sbitDQ=P1^3;

/*****************************************************

DS18B20

****************************************************/

voiddelay_18B20(uintn)

{

while(n--);

}

voidDS18B20_Reset()//DS18B20的复位程序

 

{

DQ=1;//DQ复位

delay_18B20(40);//延时

DQ=0;//DQ拉低

delay_18B20(800);//精确延时大于480us

DQ=1;//拉高

delay_18B20(10);

while(DQ);

delay_18B20(200);

}

 

ucharDS18B20_Read()//DS18B20的读数据程序

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(40);

}

return(dat);

}

 

voidDS18B20_Write(ucharwdata)//DS18B20的写数据程序

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=wdata&0x01;

delay_18B20(50);

DQ=1;

wdata>>=1;

}

}

uintdisdata[7];

uinttflag;

unsignedinttvalue;

 

voidDS18B20_Display(unsignedinttvalue)

{

ucharflagdat;

disdata[0]=tvalue/1000;//百位数

disdata[1]=tvalue%1000/100;//十位数

disdata[2]=tvalue%100/10;//个位数

disdata[3]='.';

disdata[4]=tvalue%10;//小数位

disdata[5]=0xDF;

disdata[6]='C'+0x30;

//Write_String(0x80,"CurrentTemp:

");

lcd_display_str(0,0,"CurrentTemp:

");

//lcd_1602_display_num(2,1,disdata[0]);

lcd_1602_display_num(3,1,disdata[1]);

lcd_1602_display_num(4,1,disdata[2]);

//lcd_1602_display_num(5,1,disdata[3]);

//lcd_1602_display_num(6,1,disdata[4]);

//lcd_1602_display_num(7,1,disdata[5]);

//lcd_1602_display_num(8,1,disdata[6]);

if(tflag==0)

{flagdat=0x20;}//正温度不显示符号

else

{flagdat=0x2d;}//负温度显示负号:

-

if(disdata[0]==0x30)

{

disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{

disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

//lcd_1602_display_num(1,1,flagdat);

//Write_Char(0xc0,flagdat);//显示符号

//Write_String(0xc1,disdata);

}

 

voidmain(void)

{

while

(1)

{

lcd_init();

DS18B20_Reset();

//DS18B20_Write(0xCC);

//DS18B20_Write(0x44);

//delay_18B20(100);

//DS18B20_Reset();

//DS18B20_Write(0xCC);//跳过读序号列号的操作

//DS18B20_Write(0xBE);

//delay_18B20(100);

tvalue=DS18B20_Read();

DS18B20_Display(tvalue);

//lcd_display_str(0,0,"CurrentTemp:

");

/*lcd_1602_display_num(1,1,flagdat);

lcd_1602_display_num(2,1,disdata[0]);

lcd_1602_display_num(3,1,disdata[1]);

lcd_1602_display_num(3,1,disdata[2]);

lcd_1602_display_num(3,1,disdata[3]);

lcd_1602_display_num(3,1,disdata[4]);

lcd_1602_display_num(3,1,disdata[5]);

lcd_1602_display_num(3,1,disdata[6]);*/

//delay_ms(100);

}

}

(4)测试步骤

1.按照实验原理编写程序,编译生成HEX文件。

2.按照连线方法连线。

3.打开POWER板上的+3.3V的电源开关。

4.通过串口给单片机烧写程序。

5.观察LCD显示的温度是否正确。

若否,分析原因重复测试步骤。

(5)实验结果

液晶显示屏上显示18B20测得的室内温度,当用手触摸18B20传感器时,其测得的温度会发生变化,显示的温度也随之改变。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1