基于单片机位移测量显示系统设计
设计目的和意义
本设计旨在实现一个基于红外发射接收模块GP2D12的位移测量系统,通过STC52单片机进行数据处理,采用A/D转换、显示以及与PC机的通信程序,开发出一套便携式的红外距离测量系统。系统可以高精度地实时测量距离,并将测量值通过数码管直接显示出来。当位移大于30cm时,系统输出报警声音。
关键词
红外测距;STC52单片机;A/D转换;数码管显示;报警
仿真、代码等资料下载地址:
https://docs.qq.com/doc/p/ffc421513a628b30450ae742547c0b850456d7c8
设计要求
-
位移测量和显示:
- 系统可以高精度地实时测量距离。
- 距离通过数码管显示出来。
- 当位移大于30cm时,输出报警声音。
-
电路设计:
- 设计基于红外测距的位移测量显示电路,并在仿真软件Proteus v7.5上运行。
- 课程设计报告中附上仿真电路图和控制程序清单。
设计总体方案及方案论证
本系统采用红外测距传感器GP2D12进行位移测量,通过ADC0832进行A/D转换,STC52单片机作为核心控制器,通过数码管显示测量结果,并在位移大于30cm时输出报警声音。系统硬件电路简单,成本低,易于实现。
总体设计框图
系统包括位移测量、A/D转换、显示、控制和报警五个部分。总体设计框图如下:
硬件电路设计
系统硬件电路包括红外测距传感器、A/D转换模块、单片机控制模块、数码管显示模块和报警模块。
硬件电路图
硬件电路图如图所示,包括红外测距传感器GP2D12、A/D转换模块ADC0832、单片机AT89S51、数码管显示模块和报警模块。
硬件电路详细描述
-
红外测距传感器:
- 使用GP2D12红外测距传感器测量当前距离,并将模拟信号传输给ADC0832。
- GP2D12的VCC引脚连接+5V电源,GND引脚连接地,VO引脚连接ADC0832的CH0引脚。
-
A/D转换模块:
- 使用ADC0832进行模拟信号的A/D转换,将模拟信号转换为数字信号传输给单片机。
- ADC0832的DI、DO、CLK和CS引脚分别连接单片机的P0.0、P0.1、P0.2和P0.3引脚。
-
单片机控制模块:
- 采用AT89S51单片机作为控制核心,接收A/D转换模块的数字信号,并根据测量结果控制数码管显示和报警。
- 单片机的P1.0引脚连接报警模块,P2端口连接数码管显示模块。
-
数码管显示模块:
- 使用共阴数码管显示测量结果。
- 数码管的段选引脚连接单片机的P2端口,通过74HC595移位寄存器进行控制。
-
报警模块:
- 使用蜂鸣器作为报警器,当位移大于30cm时输出报警声音。
- 蜂鸣器连接单片机的P1.0引脚。
系统软件设计
系统软件设计包括A/D转换程序、测距程序、显示程序、报警程序和主程序设计。
A/D转换程序
A/D转换程序负责读取ADC0832的A/D转换结果,并将数字信号传输给单片机。
测距程序
测距程序负责根据A/D转换结果计算位移值,并判断是否超过30cm。
显示程序
显示程序负责将测量结果通过数码管显示出来。
报警程序
报警程序负责在位移大于30cm时输出报警声音。
主程序设计
主程序负责系统的初始化和主循环,包括A/D转换、测距、显示和报警的执行。
系统仿真与调试
系统软件程序的调试通过KEIL编程软件进行,编写并调试源程序,实现各项功能。系统硬件电路的仿真与调试通过Proteus v7.5仿真软件进行,仿真硬件电路的工作情况,验证设计的正确性。
仿真电路图
仿真电路图如图所示,包括红外测距传感器GP2D12、A/D转换模块ADC0832、单片机AT89S51、数码管显示模块和报警模块。
控制程序清单
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
sbit DIO = P0^0; //数据线
sbit CLK = P0^1; //时钟线
sbit CS = P0^2; //片选线
sbit BEEP = P1^0; //蜂鸣器
// 获取指定通道的A/D转换结果
INT8U Get_CHx_AD_Value(INT8U ch) {
INT8U i, dat1 = 0, dat2 = 0;
CS = 0; CLK = 0;
DIO = 1; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0; DIO = 1; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0; DIO = 0; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0; DIO = 1; _nop_(); _nop_();
for (i = 0; i < 8; i++) {
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
dat1 = (dat1 << 1) | DIO;
}
for (i = 0; i < 8; i++) {
dat2 = dat2 | ((INT8U)DIO << i);
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
}
CS = 1;
return (dat1 == dat2) ? dat1 : 0x00;
}
// 595引脚定义
sbit DS = P3^5;
sbit SH_CP = P3^6;
sbit ST_CP = P3^7;
#define M_C 1388
#define B_C -5
#define K_C 2
code INT8U SEG_CODE[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };
INT8U Disp_Buff[] = {0, 0, 0};
void delay_ms(INT16U x) {
INT8U t;
while (x--) {
for (t = 0; t < 120; t++);
}
}
void Alarm() {
INT8U i, j;
for (i = 0; i < 200; i++) {
BEEP = ~BEEP;
j = 150;
while (--j);
}
}
void Serial_Input_595(INT8U dat) {
INT8U i;
for (i = 0; i < 8; i++) {
if (dat & 0x80) DS = 1; else DS = 0;
dat <<= 1;
SH_CP = 0; _nop_(); _nop_();
SH_CP = 1; _nop_(); _nop_();
}
SH_CP = 0;
}
void Parallel_Output_595() {
ST_CP = 0; _nop_();
ST_CP = 1; _nop_();
ST_CP = 0; _nop_();
}
float Get_Distance() {
INT8U i;
float AD_Sum = 0.0;
for (i = 0; i < 10; i++) {
AD_Sum += Get_CHx_AD_Value(0);
}
return M_C / (AD_Sum / 10.0 + B_C) - K_C;
}
void DEC_TO_3DIGIT(INT16U d) {
Disp_Buff[0] = 0;
Disp_Buff[1] = 0;
Disp_Buff[2] = 0;
while (d >= 100) { d -= 100; ++Disp_Buff[2]; }
while (d >= 10) { d -= 10; ++Disp_Buff[1]; }
Disp_Buff[0] = d;
}
void main() {
float d;
delay_ms(700);
while (1) {
d = Get_Distance();
if (d > 30.0) Alarm();
DEC_TO_3DIGIT((INT16U)(d * 10));
Serial_Input_595(SEG_CODE[Disp_Buff[0]]);
Serial_Input_595(SEG_CODE[Disp_Buff[1]] & 0x7F);
Serial_Input_595(SEG_CODE[Disp_Buff[2]]);
Parallel_Output_595();
}
}
结果与讨论
通过对系统的调试和测试,验证了系统的各项功能。红外测距传感器GP2D12能够准确测量当前距离,ADC0832能够将模拟信号转换为数字信号,数码管实时显示测量结果,当位移大于30cm时,蜂鸣器输出报警声音。系统工作稳定、可靠,达到了设计要求。
总结
本设计通过单片机实现了基于红外测距的位移测量显示系统,具有测量精度高、性能稳定可靠、操作方便等优点。系统通过红外测距传感器测量距离,ADC0832进行A/D转换,数码管显示测量结果,单片机控制报警,实现了对位移的高精度测量和显示。通过本次设计,我深入了解了单片机的工作原理和应用方法,掌握了硬件电路设计和软件编程的基本技能,增强了解决实际问题的能力。