/*-----------------------------------------------
名称: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();
}*/
名称: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();
}*/
本文介绍了一种基于IIC协议的PCF8591模数/数模转换器的应用实例。通过单片机控制实现对外部模拟信号的连续读取,并将读取到的数据在LCD显示屏上显示。
2543

被折叠的 条评论
为什么被折叠?



