单个模拟电压监测

单个模拟电压监测

一、  任务

在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;
    }
}



















猜你喜欢

转载自blog.csdn.net/qq_31131773/article/details/80607629
今日推荐