4路AD中的4路检测外部模拟量输入 使用液晶显示

/*-----------------------------------------------
  名称:IIC协议 PCF8591 AD/DA转换
  内容:使用4路AD中的4路检测外部模拟量输入 使用液晶显示
------------------------------------------------*/  
#include <reg52.h>                
#include "i2c.h"
#include "delay.h"
#include "1602.h"
#include <stdio.h>

#define AddWr 0x90   //写数据地址 
#define AddRd 0x91   //读数据地址

extern bit ack;
unsigned char ReadADC(unsigned char Chl);
unsigned char sec;
bit WriteDAC(unsigned char dat);

void timer_init()
{
     TH0 = 0x3c;//高位
     TL0 = 0xb0;//低位
}
/*------------------------------------------------
              主程序
------------------------------------------------*/
main()
{
 unsigned char num=0,i;
 unsigned char temp[7];//定义显示区域临时存储数组
 float Voltage;        //定义浮点变量
 LCD_Init();           //初始化液晶
 DelayMs(20);          //延时有助于稳定
 LCD_Clear();          //清屏
 TMOD = 0x01;
 timer_init();
 TR0 = 1;//开关
 EA = 1;//总开关
 ET0 = 1;//外部中断开关
 sec = 0;

while (1)              //主循环
  {

 if(sec%4 == 0)
 {
     for(i=0;i<5;i++)//连续读5次,取最后一次,以便读取稳定值
     num=ReadADC(0);      //读取第1路电压值,范围是0-255
     Voltage=(float)num*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
     sprintf(temp,"CHL0 %3.2fV",Voltage);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
     LCD_Write_String(0,0,temp);
}
if(sec%4 == 1)
{
     for(i=0;i<5;i++) 
     num=ReadADC(1);
     Voltage=(float)num*5/256;   
     sprintf(temp,"CHL1 %3.2fV",Voltage);
     LCD_Write_String(0,0,temp);
}
if(sec%4 == 2)
{
     for(i=0;i<5;i++) 
     num=ReadADC(2);
     Voltage=(float)num*5/256;   
     sprintf(temp,"CHL2 %3.2fV",Voltage);
     LCD_Write_String(0,0,temp);
}
if(sec%4 == 3)
{
     for(i=0;i<5;i++) 
     num=ReadADC(3);
     Voltage=(float)num*5/256;   
     sprintf(temp,"CHL3 %3.2fV",Voltage);
     LCD_Write_String(0,0,temp);
}
 //主循环中添加其他需要一直工作的程序
 DelayMs(200);

  }
}
/*------------------------------------------------
             读AD转值程序
输入参数 Chl 表示需要转换的通道,范围从0-3
返回值范围0-255
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
 {
   unsigned char Val;
   Start_I2c();               //启动总线
   SendByte(AddWr);             //发送器件地址
     if(ack==0)return(0);
   SendByte(0x40|Chl);            //发送器件子地址
     if(ack==0)return(0);
   Start_I2c();
   SendByte(AddWr+1);
      if(ack==0)return(0);
   Val=RcvByte();
   NoAck_I2c();                 //发送非应位
   Stop_I2c();                  //结束总线
  return(Val);
 }
/*------------------------------------------------
               写入DA转换数值
输入参数:dat 表示需要转换的DA数值,范围是0-255
------------------------------------------------*/
/*bit WriteDAC(unsigned char dat)
{
   Start_I2c();               //启动总线
   SendByte(AddWr);             //发送器件地址
     if(ack==0)return(0);
   SendByte(0x40);            //发送器件子地址
     if(ack==0)return(0);
   SendByte(dat);             //发送数据
     if(ack==0)return(0);
   Stop_I2c();  
}*/

void ISR_T0(void) interrupt 1
{
    unsigned char i;
    EA = 0;//关掉其他中断
    timer_init();
    i++;
    if(i==20)
    {
        sec++;
        i = 0;
    }//如果i=20时完成了1s
    EA = 1;//结束后再打开中断
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XuLujuncsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值