3.11

本文介绍了一种基于IIC协议的PCF8591模数/数模转换器的应用实例。通过单片机控制实现对外部模拟信号的连续读取,并将读取到的数据在LCD显示屏上显示。
/*-----------------------------------------------
  名称:IIC协议 PCF8591 AD/DA转换
  论坛:www.doflye.net
  编写:shifang
  修改:无
  内容:使用4路AD中的1路检测外部模拟量输入
------------------------------------------------*/  
#include <reg52.h>                
#include "i2c.h"
#include "delay.h"
#include "display.h"


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


sbit KEY1 = P1^0;
sbit KEY2 = P1^1;


bit flag = 1;
extern bit ack;


extern void InitLcd1602();
extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
unsigned char ReadADC(unsigned char Chl);
void ValueToString(unsigned char *str,unsigned char val);
bit WriteDAC(unsigned char dat);
/*------------------------------------------------
              主程序
------------------------------------------------*/
main()
{
    unsigned char num1 = 0,num2 = 0,num3 = 0,num4 = 0;
    unsigned char str1[10],str2[10],str3[10],str4[10];


     EA = 1;
     TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
     TR0 = 1;


    Init_Timer0();
    InitLcd1602();


    while (1)         //主循环
    {
      num1 = ReadADC(0);
 ValueToString(str1,num1);
 LcdShowStr(0,0,str1);


 num2 = ReadADC(1);
 ValueToString(str2,num2);
 LcdShowStr(8,0,str2);


 num3 = ReadADC(2);
 ValueToString(str3,num3);   dx
 LcdShowStr(0,1,str3);


 num4 = ReadADC(3);
 ValueToString(str4,num4);
 LcdShowStr(8,1,str4);
    }
}


void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0;


     TH0 = 0xFC;
TL0 = 0x67;
cnt++;
if(cnt >= 1000)
{
    cnt = 0;
flag = 1;
}  
}


void ValueToString(unsigned char *str,unsigned char val)
{
     static unsigned char i = 1;
     val = (val*25)/255;
     str[0] = 'C';
str[1] = i + '0';
str[2] = ':';
str[3] = val/10+'0';
str[4] = '.';
str[5] = (val/10)%10+'0';
str[6] = val%10+'0';
str[7] = 'v';


i++;
if(i>4)
{
    i = 1;
}
}
/*------------------------------------------------
             读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();  
}*/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值