微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > PCF8591是不是有一套固定的操作方法?求大神解答啊,,

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

时间:10-02 整理:3721RD 点击:
是这样的,,我想通过改变PCF8591外围电位器而改变数码管和上位机(串口通讯)的值 用的是I2C总线通讯其中关于赋值是这样写的
Send_Byte(PCF8591,0x40)
ad_val=Rcv_Byte(PCF8591);
结果是不管怎么拧电位器 数码管和上位机的值始终都不变  试了好多办法就是就是解决不了  希望大家帮忙看看,,,是不是我PCF8591操作不当呢?。下面是全部程序
#include<reg52.h>
#include<stdio.h>
#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;
}            

大家帮忙看看  给我指条路,,,让我大概知道哪有问题,,,现在试了好多改变都没有  只是显示一个数值不改变

我也不懂 帮顶上去~~~

等待大神的出现

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top