仿真图:
功能简介:
单片机采用AT89C51,最小系统由晶振和复位电路组成
液晶显示采用LCD1602用于显示该项目的参数信息
具有多个功能按键,分别是设置、加、减和确认切换按键
采用ADC0832将压力传感器MPX4115出来的模拟信号转换为数字信号再送入单片机处理
芯片/模块的特点:
ADC0832特点:
8位分辨率:ADC0832可以将模拟输入信号转换为8位数字输出。这意味着它可以将模拟信号划分为256个不同的离散电平,提供相对较低的分辨率。
双通道输入:ADC0832具有两个模拟输入通道,使其能够同时转换两个模拟信号。这对于需要同时测量多个信号的应用非常有用。
内部参考电压源:ADC0832提供了一个内部的参考电压源,它可以用作模拟输入信号的参考电压。这样可以简化外部电路设计,并提供更稳定和准确的参考电压。
串行输出:ADC0832通过串行接口(SPI或I2C)输出转换结果。这种串行输出形式使其与微控制器或其他数字设备的通信变得更加简单和方便。
低功耗:ADC0832具有较低的功耗特性,适合在低功耗应用中使用。
可编程时钟频率:ADC0832的转换速度可以通过控制输入时钟频率进行编程。这使得可以根据应用的需求调整转换速度,并平衡转换精度和速度。
内部自校准:ADC0832具有内部自校准电路,可以降低转换误差,并提供更准确的转换结果。
MPX4115特点:
压力测量范围广:MPX4115可以测量从0到115kPa(0到16.7 psi)的绝对压力范围。这使得它适用于多种应用,包括空气、气体和液体的压力测量。
高精度:MPX4115具有较高的压力测量精度,能够提供较准确的测量结果。精度通常为±1.5%FS,具体数值可能会有所不同。
输出电压信号:MPX4115通过模拟电压输出来表示测量到的压力值。它在其供电范围内产生一个与压力成正比的电压信号。
耐用性:MPX4115采用耐用的封装材料,能够在苛刻的环境条件下工作。它通常有良好的抗震动和抗振动性能。
可调节增益和偏移:MPX4115允许用户通过调整供电电压和引脚上的分压电阻来调节输出信号的增益和偏移,以适应不同应用需求。
无铅封装:为了符合环保要求,MPX4115采用无铅封装,符合RoHS标准。
主程序:
#include <reg52.h>
#include <intrins.h> //包含NOP空指令函数_nop_
#include <stdio.h>
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
//------------------------------ADC0832的引脚------------------------------
sbit ADCS =P2^3; //ADC0832 chip seclect
sbit ADDI =P2^5; //ADC0832 k in
sbit ADDO =P2^5; //ADC0832 k out
sbit ADCLK =P2^4;
sbit GREEN =P3^3;
sbit RED =P3^4;
sbit LOUD =P2^6;
sbit Motor=P3^7;
void delaynms(uint x);
void ad0808(void);
void display(void);
void Delay_ms(unsigned int n);
unsigned int Adc0832(unsigned char channel);
void Display_weight(void);
void Tishi(void);
uint ad_0809,a1,a2,a3;
uchar out,out1,weight1;
unsigned int weight2;
uchar table[]="kg";
uchar table1[]="Weight: . ";
void main()
{
Init_LCD1602();
RED=0;
GREEN=0;
while(1)
{
display();
Display_weight();
}
}
//------------------------------显示距离函数----------------------------
void display()
{
int i;
for(i=0;i<12;i++)
{
LCD1602_write_data(table[i]);
}
}
//----------------MS延时函数(12M晶振下测试)--------------------------------
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
//-------------------显示物体重量-------------------------------
void Display_weight(void)
{
unsigned int i;
float press;
weight1=Adc0832(0);
if(14<weight1<243)
{
int vary=weight1;
press=((10.0/23.0)*vary)+9.3;
weight2=(int)(press*10);
}
table1[7]=(weight2/1000)+0x30;
table1[8]=(weight2%1000)/100+0x30;
table1[9]=((weight2%1000)%100)/10+0x30;
table1[11]=((weight2%1000)%100)%10+0x30;
LCD1602_write_com(0x80);
for(i=0;i<12;i++)
{
LCD1602_write_data(table1[i]);
}
}
//--------------------采集并返回--------------------------------
unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
{
unsigned char i=0;
unsigned char j;
unsigned int dat=0;
unsigned char ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
设计文件:
链接:https://pan.baidu.com/s/1P7QFXawrmXByx0udOweAnA?pwd=h95m