超声波测距实验解析.docx
《超声波测距实验解析.docx》由会员分享,可在线阅读,更多相关《超声波测距实验解析.docx(16页珍藏版)》请在冰豆网上搜索。
![超声波测距实验解析.docx](https://file1.bdocx.com/fileroot1/2022-11/26/f7a2030f-e73f-4646-8ffb-58560d7cafa7/f7a2030f-e73f-4646-8ffb-58560d7cafa71.gif)
超声波测距实验解析
实验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传感器时,其测得的温度会发生变化,显示的温度也随之改变。