|
/*********************************問一個(gè)DA數(shù)值顯示不穩(wěn)定問題*************************************/
我的問題是我定義了一個(gè)變量,但是讀取PCF8591(支持I2C協(xié)議的AD/DA轉(zhuǎn)換器)的數(shù)值的時(shí)候我是把指向變量的指針傳進(jìn)I2CRecStr(),這個(gè)是讀取DA值函數(shù),但是我發(fā)現(xiàn)數(shù)碼管顯示單片機(jī)電位器電阻值大小的時(shí)候,當(dāng)數(shù)值大概大于60的時(shí)候顯示穩(wěn)定,但是如果小于60就會(huì)閃爍兩個(gè)數(shù)值,比如52和211,42和171等等,使用了另一個(gè)電位器就沒問題。然后我是用教程自己的程序時(shí)發(fā)現(xiàn)使用這兩個(gè)電位器都沒有這個(gè)問題,所以我想問下是我自己的函數(shù)寫的有問題還是線路出現(xiàn)了問題呢?
單片機(jī)源程序如下:
/****************************我寫的程序******************************************/
#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中的函數(shù)
/*----------------------------------------------------------------
向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit I2RecStr(uchar sla,uchar suba,uchar *s,uchar no);
功能: 從啟動(dòng)總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件
地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲(chǔ)區(qū),讀no個(gè)字節(jié)。
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結(jié)束總線。
----------------------------------------------------------------*/
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) //主循環(huán)
{
num=ReadADC(0);
TempData[0]=dofly_DuanMa[num/100];
TempData[1]=dofly_DuanMa[(num%100)/10];
TempData[2]=dofly_DuanMa[(num%100)%10];
//主循環(huán)中添加其他需要一直工作的程序
DelayMs(100);
}
}
/*------------------------------------------------
讀AD轉(zhuǎn)值程序
輸入?yún)?shù) Chl 表示需要轉(zhuǎn)換的通道,范圍從0-3
返回值范圍0-255
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //啟動(dòng)總線
SendByte(AddWr); //發(fā)送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //發(fā)送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //發(fā)送非應(yīng)位
Stop_I2c(); //結(jié)束總線
return(Val);
}
/*************************以下是PCF8591的電路圖*********************************/
SCL和SDA就是I2C的總線。
模數(shù)轉(zhuǎn)換芯片.png (70.55 KB, 下載次數(shù): 34)
下載附件
2019-6-14 05:50 上傳
|
|