两个模拟信号差超限时报警

两个模拟信号差超限时报警

一、  任务

利用0809采集两路模拟电压,当两电压值相差超过1V时,蓝色LED亮,此时若低通道号的电压值大,红色LED亮;若高通道号的电压值大,则黄色LED亮。(硬件电路参见AD_CH2_2.DSN)。

二、  设计参考:

① 算法:依次采集两路模拟电压,并将其保存。当所有通道都采集完后,计算两通道采样值的差(低通道号采样值减高通道号采样值)。若差值小于-51,则蓝色和黄色LED亮;若差值大于51,则蓝色和红色LED亮;其余,所有LED熄灭。注:通道IN0~IN7的编号分别为0~7。

② LED显示:

输出                    LED显示

0                         亮

1                         灭

③ 地址分配:

0809片选地址     3C00H

通道地址             片选地址+通道编号

直接代码

#include <reg51.h>

//宏定义
#define	AD_Convert(i)	(*((unsigned char volatile xdata *) (0x3C00 + i)) = 0)	// 启动AD转换
#define	AD_Read(i)	(*((unsigned char volatile xdata *) (0x3C00 + i)))		// 读AD转换结果


sbit led_blue = P1^0;
sbit led_red = P1^3;
sbit led_yellow = P1^5;
unsigned char INx = 1;
unsigned char count = 0;
unsigned int	bAD_Val1 = 0;		// 转换结果
unsigned int	bAD_Val2 = 0;
int num=0;
/***********************************************************************
** 函数名称:	main()
** 功    能:	程序入口
** 入口参数:	无
** 出口参数:	无
***********************************************************************/
void  main(void)
{
	// 初始化
	TMOD = 0x10;
	TH1 = 0xFC;
	TL1 = 0x18;
	IT1 = 1;
	
	// 此处添加中断设置的语句(ET1, PT1, IT1, EX1, PX1)
  ET1 = 1;
	EX1 = 1;
	PX1 = 1;
	PT1 = 0;
	// 此处添加定时设置的语句(TMOD, TH1, TL1)

	// 此处添加启动内部定时的语句(TR1)
  TR1 = 1;
	// 开中断
	EA = 1;
	// 主循环
	while( 1 )
	{
	if(num<(-51)) 
	{
		led_blue = 0;
		led_yellow = 0;
	}
	else if(num>51) 
	{
		led_blue = 0;
		led_red = 0;
	}
	else 
	{
	P1 = 0xff;
	}
	}
}

/***********************************************************************
** 函数名称:	INT_INT1()
** 功    能:	INT1中断服务程序,使用工作寄存器组1
** 入口参数:	无
** 出口参数:	无
***********************************************************************/
void	INT_INT1(void)	interrupt 2 using 1
{
	// 此处添加读和保存AD转换结果的语句(结果保存到bAD_Val)
	switch(INx)
	{
		case 1:
          bAD_Val1 = AD_Read(1);
	        INx = 2;
	        break;
   case 2: 
					bAD_Val2 = AD_Read(5);
					INx = 1;
					break;
	}
	num = bAD_Val1 - bAD_Val2;
}

/***********************************************************************
** 函数名称:	INT_T1()
** 功    能:	T1中断服务程序,使用工作寄存器组1
** 入口参数:	无
** 出口参数:	无
***********************************************************************/
void INT_T1() interrupt 3 
{
  TH1 = 0xFC;
	TL1 = 0x18;
  count++;
  if(count == 8)
	{
		switch(INx)
	{
		case 1:
          AD_Convert(1);
	        break;
   case 2: 
					AD_Convert(5);
					break;
	}
	 count = 0;
	}
}

完了




猜你喜欢

转载自blog.csdn.net/qq_31131773/article/details/80607984