(在两个中)识别最大模拟输入通道
一、 任务
利用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; } }完了