基于单片机的地震数据采集显示系统设计-216

通过X方向和Y方向的模拟量传感器进行采集模拟值,内置报警范围。包含的电路有自检电路,显示电路,传感器电路,AD采集电路,声光报警电路。

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

​​​​​​https://pan.baidu.com/s/1OjKltnq5VGewkz3bRBiMJA?pwd=8888

部分代码展示

#include <reg52.h>                              /* 包含头文件 */
#include <math.h>
#include "uart.h"
#include "display.h"
#define uint	unsigned int
#define uchar	unsigned char                   /* 宏定义 */
sbit	ale	= P2 ^ 6;
sbit	start	= P2 ^ 7;
sbit	eoc	= P3 ^ 2;
sbit	oe	= P3 ^ 3;                       /* 定义adc0809的控制引脚 */
sbit	adda	= P2 ^ 0;
sbit	addb	= P2 ^ 1;
sbit	addc	= P2 ^ 2;                       /* adc0809的地址引脚 */
/*
 * sbit rs=P2^3;
 * sbit rw=P2^4;
 * sbit en=P2^5;					   //液晶的控制引脚
 */

unsigned long	voltdata[8];
uint		i, j, k, l, t, sum, a[5];       /* 定义全局变量 */
unsigned char	CH;
uchar		add;                            /* 地址变量 */
long		TxBuf[8];                       /* 四个显示的位 */
long		realvolt;
unsigned char	t0Count;
unsigned char	flagAu = 1;

bit Aflag = 0;
bit Bflag = 0;
bit Check = 0;

sbit LED = P3^0;	//声光报警
sbit BUZ = P3^1;	//声光报警
sbit KEY = P3^4;	//自检按键
sbit ALE = P3^5;	//自检指示
sbit GRE = P3^6;

void delay_ms( uint ms )
{
	for (; ms > 0; ms-- )
		for ( j = 113; j > 0; j-- )
			;
}

/*
 * 函数说明
 */
void addselect()                                /* 量程选择 */
{
	CH++;                                   /* 通道号加 */
	if ( CH > 7 )                           /* 最大到7		  符号&:按位与符号,二进制的对应位如果都为1,那么结果的对应位就为1,否则为0 */
		CH = 0;                         /* 清零,一共八个通道0 1 2 ,对应二进制是0000.0001.0010. */
	adda	= CH & 0x01;                    /* 例如1通道计算方法:将通道对应的二进制0101&0001,结果就是0001,赋值给adda(引脚只能接受最低位的数据,只有1和0),那么adda引脚就是高电平 */
	addb	= (CH & 0x02) >> 1;             /* 然后将通道1的二进制0101&0010,结果就是0000(因为所有位都不同),然后整组数据右移一位,赋值给addb,那么addb引脚就是低电平 */
	addc	= (CH & 0x04) >> 2;             /* 然后将通道1的二进制0101&0100,结果就是0100,然后整组数据右移两位,赋值给addc,那么addc引脚就是高电平,最后芯片的通道选择引脚的状态就是101,则选择的就是通道5了 */
	delay( 5 );                             /* 短延时 */
}


uint adtrans()                                  /* AD转换 */
{
	addselect();
	sum = 0;                                /* 滤波开始 */
	for ( i = 0; i < 5; i++ )
	{
		ale	= 1;
		ale	= 0;
		start	= 1;                    /* 启动AD转换。 */
		start	= 0;
		while ( eoc == 0 )
			;                       /* 等待转换结束。 */
		oe	= 1;
		a[i]	= P1;                   /* 出入转换结果。 */
		delay( 5 );                     /* //每隔5usAD转换并采集一次数据,将得到的数值存入数组中 */
	}
	for ( j = 0; j < 4; j++ )
		for ( i = 0; i < 4 - j; i++ )
			if ( a[i] > a[i + 1] )
			{
				t		= a[i];
				a[i]		= a[i + 1];
				a[i + 1]	= t;
			}
	for ( i = 1; i < 4; i++ )
	{
		sum += a[i];
	} /* 采用冒泡法比较,取中间3个数值 */
	voltdata[CH] = sum / 3;

	delay( 1 );
	oe		= 0;
	voltdata[CH]	= 4 * (100 * voltdata[CH]) / 51; /* 处理运算结果。 */
	/*
	 * voltdata[CH]是读取到的ad值,乘以100是让小数点后移两位,乘以4是量程扩大四倍也就是5*4=20V,然后除以51(和乘以0.0196一样)得到实际的电压值
	 * 8位AD最小分辨率就是0.0196V
	 */
	return(voltdata[CH]);
}

物联沃分享整理
物联沃-IOTWORD物联网 » 基于单片机的地震数据采集显示系统设计-216

发表回复