为什么处理好后,显示的是00 FF 数据码 数据码反码
/*-----------------------------------------------
名称:IIC协议 PCF8591ADDA转换
日期:2009.5
修改:无
内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量(不是电位器的电压),用LED亮度渐变(用num自加)指示
结果:成功!LED
------------------------------------------------*/
#include<reg52.h>
#include<intrins.h>//包含NOP空指令函数_nop_();
#define uint unsigned int
#define uchar unsigned char
#define addwr 0x90
#define addrd 0x91
sbit scl=P1^1;
sbit sda=P1^2;
bit adflag;
uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
uchar data Display[2];//定义临时存放数码管数值
/*------------------------------------------------
延时程序
------------------------------------------------*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*------------------------------------------------
初始化定时器1
------------------------------------------------*/
void init_timer1()
{
TMOD=0x10;
TH1=0xff;
TH0=0;
EA=1;
TR1=1;
ET1=1;
}
/*------------------------------------------------
启动IIC总线
------------------------------------------------*/
void start()
{
sda=1;
_nop_();
scl=1;
_nop_();
sda=0;
_nop_();
scl=0;
}
/*------------------------------------------------
停止IIC总线
------------------------------------------------*/
void stop()
{
sda=0;
_nop_();
scl=1;
_nop_();
sda=1;
_nop_();
scl=0;
}
/*------------------------------------------------
应答IIC总线
------------------------------------------------*/
void ack()
{
sda=0;
_nop_();
scl=1;
_nop_();
scl=0;
_nop_();
}
/*------------------------------------------------
非应答IIC总线
------------------------------------------------*/
void NoAck()
{
sda=1;
_nop_();
scl=1;
_nop_();
scl=0;
_nop_();
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void send(uchar num)
{
uchar temp,bitcount;
temp=num;
for(bitcount=8;bitcount>0;bitcount--)
{
scl=0;
_nop_();
if((temp&0x80)==0x80)
sda=1;
else
sda=0;
temp=temp<<1;
scl=1;
_nop_();
}
scl=0;
}
/*------------------------------------------------
读入一个字节并返回
------------------------------------------------*/
uchar Read()
{
uchar temp=0;
uchar num=8;
sda=1;
while(num)
{
scl=0;
_nop_();
scl=1;
_nop_();
if(sda)
{
temp=temp|0x01;
}
else
{
temp=temp&0xfe;
}
if(num-1)
{
temp=temp<<1;
}
num--;
}
return(temp);
}
/*------------------------------------------------
写入DA数模转换值
------------------------------------------------*/
void DAC(uchar Data)
{
start();
send(addwr); //写入芯片地址
ack();
send(0x42); //写入控制位,使能DAC输出
ack();
send(Data); //写数据
ack();
stop();
}
/*------------------------------------------------
读取AD模数转换的值,有返回值
------------------------------------------------*/
uchar ReadADC(uchar Ch1)
{
uchar temp;
start();
send(addwr); //写入芯片地址
ack();
send(0x00|Ch1);
ack();//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
//Chl的值分别为0、1、2、3,分别代表1-4通道
start();
send(addrd); //读入地址
ack();
temp=Read(); //读数据
scl=0;
NoAck();
stop();
return(temp);
}
/*------------------------------------------------
主程序
------------------------------------------------*/
void main()
{
uchar num;
init_timer1();
while(1)
{
DAC(num); //DA输出,可以用LED模拟电压变化
num++; //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
delay(20); //延时用于清晰看出变化
if(adflag==1) //定时采集输入模拟量
{
adflag=0;
Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示
Display[1]=Datatab[((ReadADC(0))%50)/10];
/* Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
Display[3]=Datatab[((ReadADC(1))%50)/10];
Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
Display[5]=Datatab[((ReadADC(2))%50)/10];
Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
Display[7]=Datatab[((ReadADC(3))%50)/10];*/
}
}
}
/*------------------------------------------------
定时器中断程序
------------------------------------------------*/
void Timer1_isr() interrupt 3
{
static unsigned int count,j;
TH1=0xfb; //重新赋值
TL1=0x00;
j++;
if(j==200) //本程序,采样时间多少无所谓
{
j=0;
adflag=1;
}
P0=Display[count];
P2=count;
count++;
if(count==2)
{
count=0;
}
}