基于单片机的红外测距系统设计 - 副本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京联合大学应用科技学院
实训报告
基于单片机的红外测距系统设计
系别电子
专业电子信息工程技术
年级12级02班
组长:张祎楠2012191294068
组员:殷跃2012191294070 白雨童2012191294063
目录
第1章绪论 (1)
1.1 本课题研究的目的 (1)
1.2 本课题研究的内容 (1)
13整个红外测距系统显示 (4)
第2章红外测距的软件设计 (5)
后记 (6)
第1章绪论
1.3 本课题研究的目的
我们所进行的课题便是做一个简易的,精确的,近距离的距离检测仪,这也是对我们所学知识的一种考验方法,从中我们可以更系统的认识单片机,了解AD转换和红外收发模块。
1.4 本课题研究的内容
红外传感器的测距基本原理为:红外发射电路的红外发光管发出红外光,红外接收电路的光敏接收管接收发射光,根据发射光的强弱判断出所测的距离。由于接收管接收的光强度是随着发光管与测量物的距离变化而变化的,因而,与测量物的距离近则接收光强,距离远则接收光弱。
具体方法如图1所示,红外模块发出并接收到红外线信号;AD转换模块将接收到的模拟信号转换成数字信号再交给单片机, 启动单片机中断程序,此时单片机得到数字信号也就是电压值,再由软件进行判别、计算,得出距离数并送给LED/LCD显示。
红外模块
电压距离公式
AD模块
单片机
显示模块
图1.1 反射能量法原理
图3.7 protues中整体系统
单片机AT89C52左端分别接了时钟电路和复位电路,这是单片机最小的系统。XTAL1和XTAL2串连一个晶振,并且分别接上一个20p的电容,两个电容另一端都接地,构成时钟电路。RST同时接上100p电容,4脚按键,1k电阻,4脚按键另一端接上一个1k电阻再与100p电容并联接VCC,1k电阻另一端则接地,构成复位电路。
单片机AT89C52右端P0端同时接LED的D1-D7端口和排阻,P2.0接CLK,P2.1接DO,P2.2接CS,P2.5接E,P2.6接RW,P2.7接RS。
MCP3001的VREF接vcc,IN+接红外距离传感器的Vo。
软件程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit RS=P2^0; //LCD命令/数据端
sbit RW=P2^1; //LCD读/写端
sbit LCDE=P2^2; //LCD使能端
sbit MCP_CS=P2^3; //MCP3001与AT89S52的管脚接线定义sbit MCP_DO=P2^4;
sbit MCP_CLK=P2^5;
uint measure;
uchar flag; //Busy标志
uchar code dis[]={"Measure Start"}; //显示
uchar code dis1[] = {"V= . V,L= CM"};
uchar code dis2[] = {"0123456789."}; //显示代码
uchar code dis3[]={"Out Measure!"}; //显示
uchar dis_buf[8]; //显示缓冲区
void L_delay(void); //短延时
void delay_ms(uint n); //延时函数
uint read_MCP(void); //读MCP3001
void init_1602(void); //1602初始化函数
void busy(void); //LCD忙标志判断函数
void dat_wrt(uchar dat); //写数据子函数
void cmd_wrt(uchar cmd); //写命令子函数
uint distance(void); //距离计算函数
void lcd_start(uchar start); //设定显示位置函数
void LCD_Clear(void); //LCD清屏函数
uchar dat_adj(uint dat1); //显示数据调整函数
void print(uchar *str); //字符串显示函数
void disp(uint dat); //显示子函数
uint average(void); //算术平均滤波程序
/****************************主函数*******************************/
main()
{
init_1602();
print(dis); //显示测量开始
delay_ms(1000);
while(1)
{
measure=distance();
disp(measure); //显示高度
delay_ms(100);
}
}
/**************************延时函数**************************/ void delay_ms(uint n)
{
uint j;
while(n--)
{
for(j=0;j<125;j++);
}
}
/***************************短延时****************************/ void L_delay(void)
{
uchar i;
for(i=0;i<5;i++)_nop_();
}
/************************读MCP3001函数*************************/ uint read_MCP(void)
////////////////////////// read_MCP 采集的数据并转换后的值//////////////////////////
{
uchar i;
uint temp=0;
MCP_CS=1;
L_delay();
MCP_CS=0; //CS置低,开始采样数据
for(i=0;i<13;i++) //读转换的10位数据
{