[讨论] PCF8591是不是有一套固定的操作方法?求大神解答啊,,

想个名字0   2014-2-21 01:30 楼主
是这样的,,我想通过改变PCF8591外围电位器而改变数码管和上位机(串口通讯)的值 用的是I2C总线通讯其中关于赋值是这样写的
Send_Byte(PCF8591,0x40)
ad_val=Rcv_Byte(PCF8591);
结果是不管怎么拧电位器 数码管和上位机的值始终都不变  试了好多办法就是就是解决不了  希望大家帮忙看看,,,是不是我PCF8591操作不当呢?。。。下面是全部程序
#include
#include
#include"I2C.h"       

#define PCF8591 0x90   //PCF8591地址

unsigned char ad_val,a,t0_num,flag_num,flag_on,flag_uart,flag_time;
float ad_vo;
                                         
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数码管段选0~9
//unsigned char code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //位选

void init()   //定时器初始化
{                  
   TMOD=0x21;   //设置定时器1为工作方式2,定时器0为工作方式1
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   TH1=0xf3;   //波特率为4800
   TL1=0xf3;
   TR1=1;
   PCON=0x80;   //波特率加倍,晶振为12MHZ时为了减小误差
   ET0=1;
   SM0=0;
   SM1=1;
   REN=1;
   EA=1;
   ES=1;
}

void Display(unsigned int value)   //数码管显示函数
{
   unsigned char ge,shi,bai;
   bai=value/100;
   shi=value%100/10;
   ge=value%100%10;
   P0=table[bai];
   P2=0x7f;
   P0=0x00;
   Nop();
   P0=table[shi];
   P2=0xbf;
   P0=0x00;
   Nop();
   P0=table[ge];
   P2=0xdf;
   P0=0x00;
   Nop();
}

unsigned char Rcv_Byte(unsigned char value)   //接受AD数据
{
   unsigned char Data;
   I2c_Star();   //开启总线
   Write_Byte(value+1);   //发送器件地址
   Data=Read_Byte;   //读取数据
   Ack_I2c(1);   //发送非就答位
   I2c_Stop();   //结束总线
   return Data;
}

void Send_Byte(unsigned char value,unsigned char i)   //发送数据
{
   I2c_Star();
   Write_Byte(value);
   Write_Byte(i);
   I2c_Stop();
}

void main()
{
   init();
   while(1)
   {
      if(flag_uart==1)   //若上位机发来数据
          {
             flag_uart=0;
                 ES=0;
                 TI=1;
                 switch(flag_on)
                 {
                    case 0:puts("Turn on AD!\n");
                                  TR0=1;
                                          break;
                        case 1:printf("Turn off AD!\n");
                                  TR0=0;
                                          break;
                        case 2:puts("Error!\n");
                                      break;
                 }
             while(!TI);
             TI=0;
             ES=1;
          }

          if(flag_time==1)
          {
             flag_time=0;
                 Send_Byte(PCF8591,0x40);
                 ad_val=Rcv_Byte(PCF8591);
                 ad_vo=(float)ad_val*5.0/256.0;
             ES=0;
                 TI=1;
                 printf("The voltage is%fV\n",ad_vo);
                 while(!TI);
                 TI=0;
                 ES=1;
                  
          }
                 Display(ad_val);
   }
}

void T0_time() interrupt 1
{
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   t0_num++;
   if(t0_num==20)
   {
      t0_num=0;
          flag_time=1;
   }
}

void ser() interrupt 4
{
   RI=0;
   a=SBUF;
   flag_uart=1;
   if(a==1)
      flag_on=0;
   if(a==2)
      flag_on=1;
   else
      flag_on=0;
}             

回复评论 (3)

求大神啊。。。。
点赞  2014-2-21 01:38
到底是哪里出现问题了啊,,,要纠结死了,,,
点赞  2014-2-21 01:38
P0口用之前  好像应该现付高电平吧?P0=0xFF;
点赞  2014-2-28 16:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复