1838【毕设课设】基于单片机位移测量显示系统设计(仿真 程序 论文)

基于单片机位移测量显示系统设计

设计目的和意义

本设计旨在实现一个基于红外发射接收模块GP2D12的位移测量系统,通过STC52单片机进行数据处理,采用A/D转换、显示以及与PC机的通信程序,开发出一套便携式的红外距离测量系统。系统可以高精度地实时测量距离,并将测量值通过数码管直接显示出来。当位移大于30cm时,系统输出报警声音。

关键词

红外测距;STC52单片机;A/D转换;数码管显示;报警
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
仿真、代码等资料下载地址:
https://docs.qq.com/doc/p/ffc421513a628b30450ae742547c0b850456d7c8

设计要求

  1. 位移测量和显示

    • 系统可以高精度地实时测量距离。
    • 距离通过数码管显示出来。
    • 当位移大于30cm时,输出报警声音。
  2. 电路设计

    • 设计基于红外测距的位移测量显示电路,并在仿真软件Proteus v7.5上运行。
    • 课程设计报告中附上仿真电路图和控制程序清单。

设计总体方案及方案论证

本系统采用红外测距传感器GP2D12进行位移测量,通过ADC0832进行A/D转换,STC52单片机作为核心控制器,通过数码管显示测量结果,并在位移大于30cm时输出报警声音。系统硬件电路简单,成本低,易于实现。

总体设计框图

系统包括位移测量、A/D转换、显示、控制和报警五个部分。总体设计框图如下:

红外测距传感器
ADC0832 A/D转换
单片机控制
数码管显示
报警

硬件电路设计

系统硬件电路包括红外测距传感器、A/D转换模块、单片机控制模块、数码管显示模块和报警模块。

硬件电路图

硬件电路图如图所示,包括红外测距传感器GP2D12、A/D转换模块ADC0832、单片机AT89S51、数码管显示模块和报警模块。

硬件电路详细描述

  1. 红外测距传感器

    • 使用GP2D12红外测距传感器测量当前距离,并将模拟信号传输给ADC0832。
    • GP2D12的VCC引脚连接+5V电源,GND引脚连接地,VO引脚连接ADC0832的CH0引脚。
  2. A/D转换模块

    • 使用ADC0832进行模拟信号的A/D转换,将模拟信号转换为数字信号传输给单片机。
    • ADC0832的DI、DO、CLK和CS引脚分别连接单片机的P0.0、P0.1、P0.2和P0.3引脚。
  3. 单片机控制模块

    • 采用AT89S51单片机作为控制核心,接收A/D转换模块的数字信号,并根据测量结果控制数码管显示和报警。
    • 单片机的P1.0引脚连接报警模块,P2端口连接数码管显示模块。
  4. 数码管显示模块

    • 使用共阴数码管显示测量结果。
    • 数码管的段选引脚连接单片机的P2端口,通过74HC595移位寄存器进行控制。
  5. 报警模块

    • 使用蜂鸣器作为报警器,当位移大于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转换,数码管显示测量结果,单片机控制报警,实现了对位移的高精度测量和显示。通过本次设计,我深入了解了单片机的工作原理和应用方法,掌握了硬件电路设计和软件编程的基本技能,增强了解决实际问题的能力。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值