找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1921|回复: 2
收起左侧

问一个单片机DA数值显示不稳定问题

[复制链接]
ID:523537 发表于 2019-6-14 05:50 | 显示全部楼层 |阅读模式
/*********************************问一个DA数值显示不稳定问题*************************************/     

我的问题是我定义了一个变量,但是读取PCF8591(支持I2C协议的AD/DA转换器)的数值的时候我是把指向变量的指针传进I2CRecStr(),这个是读取DA值函数,但是我发现数码管显示单片机电位器电阻值大小的时候,当数值大概大于60的时候显示稳定,但是如果小于60就会闪烁两个数值,比如52和211,42和171等等,使用了另一个电位器就没问题。然后我是用教程自己的程序时发现使用这两个电位器都没有这个问题,所以我想问下是我自己的函数写的有问题还是线路出现了问题呢?

单片机源程序如下:
/****************************我写的程序******************************************/
#include <reg52.h>
#include "Delay.h"
#include "Display.h"
#include "I2C.h"

#define uchar unsigned char


void main()
{
        uchar num;
        uchar PCF8591_addr, PCF8591_control_addr;
        PCF8591_addr = 0x90;
        PCF8591_control_addr = 0x00;
        
        Init_Timer0();
        
        while(1)
        {
                I2CRecStr(PCF8591_addr,PCF8591_control_addr, &num, 1);
                TempData[0] = DuanMa[num/100];
                TempData[1] = DuanMa[(num%100)/10];
                TempData[2] = DuanMa[(num%100)%10];
                DelayMs(200);
                        }
        
}



以下是I2C.c中的函数


/*----------------------------------------------------------------
                    向有子地址器件读取多字节数据函数               
函数原型: bit  I2RecStr(uchar sla,uchar suba,uchar *s,uchar no);  
功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
----------------------------------------------------------------*/

bit I2CRecStr(uchar sla, uchar suba, uchar *s, uchar no)
{
        uchar i;
        
        Start_I2C();
        WriteByte(sla);
        if(ack == 0)
        {
                return 0;
        }
        WriteByte(suba);
        if(ack == 0)
        {
                return 0;
        }
        
        Start_I2C();
        WriteByte(sla+1);
        if(ack == 0)
        {
                return 0;
        }
        for(i=0;i<(no-1);i++)
        {
                *s = ReadByte();
                Ack_I2C();
                s++;
        }
        *s = ReadByte();
        NoAck_I2C();
        Stop_I2C();
        return 1;
}


/*********************分割线***********************/
/*********************************教程源程序*****************************************/
main()
{
unsigned char num=0;
Init_Timer0();


while (1)         //主循环
  {

num=ReadADC(0);
TempData[0]=dofly_DuanMa[num/100];   
TempData[1]=dofly_DuanMa[(num%100)/10];
TempData[2]=dofly_DuanMa[(num%100)%10];
//主循环中添加其他需要一直工作的程序
DelayMs(100);
  }
}


/*------------------------------------------------
             读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);
}


/*************************以下是PCF8591的电路图*********************************/
SCL和SDA就是I2C的总线。
模数转换芯片.png

回复

使用道具 举报

ID:56665 发表于 2019-6-14 08:10 | 显示全部楼层
都不用看程序,从你描述的情形看,电位器肯定有问题。
回复

使用道具 举报

ID:10947 发表于 2019-6-15 17:02 | 显示全部楼层
电位器应该有问题,有点接触不良;
教程的源码可能经过了滤波,所以过滤掉了波动
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表