(在两个中)识别最大模拟输入通道

(在两个中)识别最大模拟输入通道

一、  任务

利用0809采集两路模拟电压,将电压值最大的通道号显示在LED显示器上。(硬件电路参见AD_CH2_1.DSN)。

二、  设计参考:

① 算法:依次采集两路模拟电压,并将其保存。当所有通道都采集完后,比较通道的采样值,将采样值最大的通道号显示(当采样值一样时,显示其中最小通道编号)。注:通道IN0~IN7的编号分别为0~7。

② LED显示的段码:

字符                    编码

0                         0C0H

1                         0F9H

2                         0A4H

3                         0B0H

4                         99H

5                         92H

6                         82H

7                         0F8H

8                         80H

9                         90H

③ 地址分配:

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转换结果


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<0) 
	{
		P1 = 0xF8;
	}
	else if(num>0) 
	{
		P1 = 0xA4;
	}
	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(2);
	        INx = 2;
	        break;
       case 2: 
	bAD_Val2 = AD_Read(7);
	INx = 1;
	break;
	}
	num = bAD_Val1 - bAD_Val2;
}

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


完了








猜你喜欢

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