346 基于单片机大气压监测报警系统电路方案设计【毕设课设】

本文介绍了使用MCS-51单片机为核心的低成本、模块化大气压检测系统,包括硬件选型(如AT89系列、MPX4115传感器和ADC0832转换器),软件编程(C语言实现,功能模块化),以及如何通过ADC0832进行压力值转换和数码管显示。
摘要由CSDN通过智能技术生成

本系统是以MCS-51单片机为检测中心的大气压检测系统。其总体设计是围绕低成本、模块化、微型化的特点展开的。在硬件选择方面, 选择性价比高的AT89系列单片机、MPX4115压力传感器、ADC0832模数转换器、四位一体共阳七段式数码管显示器;在软件方面, 采用了功能模块化;源程序由C语言编写,经过KeilμVision软件编译,将hex文件烧录到芯片中。为了降低整个系统的成本, 在满足性能要求的前提下, 选择低成本元器件, 简化系统设计。同时,抗干扰能力强、微型化、微功耗等特点。

完整版 电路图和程序代码 下载地址

https://pan.baidu.com/s/11y-Xr5V7itAN8gn0CHGI_w?pwd=8888

部分代码展示

#include<reg52.h> 
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char

//ADC0832的引脚
sbit ADCS =P3^1;  //ADC0832 chip seclect
sbit ADDI =P3^2;  //ADC0832 k in
sbit ADDO =P3^2;  //ADC0832 k out
sbit ADCLK =P3^0;  //ADC0832 clock signal080307208

unsigned char dispbitcode[8]={
	0xf1,0xf2,0xf4,0xf8,0xef,0xdf,0xbf,0x7f
	};  //位扫描
unsigned char dispcode[11]={
	0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff
	};  //共阳数码管字段码
unsigned char dispbuf[4];
uint temp;
uchar getdata; //获取ADC转换回来的值

void delay_1ms(void)  //12mhz delay 1.01ms
{
	unsigned char x,y;   
	x=3;
	while(x--) 
	{
	y=40;
	while(y--);
	}
}

void display(void)  //数码管显示函数
{
	char k;
	for(k=0;k<4;k++)
	{
		P2 = dispbitcode[k];
		P0 = dispcode[dispbuf[k]];
		if(k==1)      //加上数码管的dp小数点
		P0&=0x7f;
		delay_1ms();      
	}
}

/*读ADC0832函数*/
//采集并返回
unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
{
	uchar i=0;
	uchar j;
	uint dat=0;
	uchar 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;
	ADDO=1;//收数据
	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
}

/*主程序*/
void main(void) 
{  
	while(1)
	{      unsigned int temp;
		float  press;                 
		getdata=Adc0832(0);
		if(14<getdata<243)                           //当压力值介于15kpa到115kpa之间时,遵循线性变换
		{                
			int vary=getdata;                        //y=(115-15)/(243-13)*X+15kpa            
			press=((10.0/23.0)*vary)+9.3;            //测试时补偿值为9.3
			temp=(int)(press*10);                    //放大10倍,便于后面的计算
			dispbuf[3]=temp/1000;                     //取压力值百位
			dispbuf[2]=(temp%1000)/100;                //取压力值十位
			dispbuf[1]=((temp%1000)%100)/10;            //取压力值个位
			dispbuf[0]=((temp%1000)%100)%10;            //取压力值十分位
			display();
		}        
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值