单个模拟电压监测
一、 任务
在VoltageMonitor_1.DSN的电路中测量由电位器产生的模拟电压,当电压小于1V时,使连接在P1.0上的(黄)色LED亮;当电压大于4V时,使连接在P1.1上的(红)色LED亮;当电压在1~4V时,所有LED熄灭。
要求:当信号变化后,必须在100毫秒内做出响应。
二、 设计参考:
① 测量方法。要在100ms内做出响应,因此,可选择定时时间为50ms,在这个时间内对模拟电压进行转换(采样)。
② 若采样值小于51,则意味着电压小于1V,此时输出使黄色LED亮;若采样值大于204,则意味着电压大于4V,此时输出使红色LED亮;其余,两个LED熄灭。
③ LED显示:
0 亮
1 灭
④ 地址分配:
0809片选地址 2000H
通道地址 片选地址+通道编号
#include <reg51.h> //宏定义 #define AD_Convert(i) (*((unsigned char volatile xdata *) (0x2000 + i)) = 0) // 启动AD转换 #define AD_Read(i) (*((unsigned char volatile xdata *) (0x2000 + i))) // 读AD转换结果 sbit led1 = P1^0; sbit led2 = P1^1; unsigned char count = 0; unsigned int bAD_Val = 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(bAD_Val<51) { led1 = 0; } else if(bAD_Val>204) { led2 = 0; } else { P1 = 0xff; } } } /*********************************************************************** ** 函数名称: INT_INT1() ** 功 能: INT1中断服务程序,使用工作寄存器组1 ** 入口参数: 无 ** 出口参数: 无 ***********************************************************************/ void INT_INT1(void) interrupt 2 using 1 { // 此处添加读和保存AD转换结果的语句(结果保存到bAD_Val) bAD_Val = AD_Read(6); } /*********************************************************************** ** 函数名称: INT_T1() ** 功 能: T1中断服务程序,使用工作寄存器组1 ** 入口参数: 无 ** 出口参数: 无 ***********************************************************************/ void INT_T1() interrupt 3 { TH1 = 0xFC; TL1 = 0x18; count++; if(count == 20) { AD_Convert(6); //通道六 count = 0; } }