为什么处理好后,显示的是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; } }
|