两个模拟信号差超限时报警
一、 任务
利用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; } }完了