/*********************************問一個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 (70.55 KB, 下載次數: 34)
下載附件
2019-6-14 05:50 上傳
|