導航:首頁 > 操作系統 > 基於單片機的pcf8591

基於單片機的pcf8591

發布時間:2025-08-27 00:29:02

⑴ pcf8591的程序如何寫,用51單片機

只要單片機的埠和你的一樣只要復制下來用keil編譯就可實驗
一路差分輸入用數碼管顯示 p0段p1位沒用鎖存器。不一樣話顯示部分可自己編譯 ,其他無需改動
#include <reg52.h>
#include <intrins.h>

#define AddWr 0x90 //寫數據地址
#define AddRd 0x91 //讀數據地址
#define _Nop() _nop_() //定義空指令

bit ack; //應答標志位
#define DataPort P0 //定義數據埠 程序中遇到DataPort 則用P0 替換
#define CtrlPort P1
sbit SDA=P2^5;
sbit SCL=P2^4;

unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90};// 顯示段碼值0~9
unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分別對應相應的數碼管點亮,即位碼
unsigned char TempData[8]; //存儲顯示值的全局變數

extern bit ack;
unsigned char ReadADC(unsigned char Chl);
bit WriteDAC(unsigned char dat);
/*------------------------------------------------
主程序
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字元變數,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void Display(unsigned char FirstBit,unsigned char Num)
{

static unsigned char i=0;

DataPort=0; //清空數據,防止有交替重影

CtrlPort=WeiMa[i+FirstBit]; //取位碼

DataPort=TempData[i]; //取顯示數據,段碼
i++;
if(i==Num)
i=0;

}
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
//TH0=0x00; //給定初值
//TL0=0x00;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
}
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; //重新賦值 2ms
TL0=(65536-2000)%256;

Display(0,3);

}
void Start_I2c()
{
SDA=1; //發送起始條件的數據信號
_Nop();
SCL=1;
_Nop(); //起始條件建立時間大於4.7us,延時
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //發送起始信號
_Nop(); //起始條件鎖定時間大於4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //鉗住I2C匯流排,准備發送或接收數據
_Nop();
_Nop();
}
/*------------------------------------------------
結束匯流排
------------------------------------------------*/
void Stop_I2c()
{
SDA=0; //發送結束條件的數據信號
_Nop(); //發送結束條件的時鍾信號
SCL=1; //結束條件建立時間大於4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //發送I2C匯流排結束信號
_Nop();
_Nop();
_Nop();
_Nop();
}

/*----------------------------------------------------------------
位元組數據傳送函數
函數原型: void SendByte(unsigned char c);
功能: 將數據c發送出去,可以是地址,也可以是數據,發完後等待應答,並對
此狀態位進行操作.(不應答或非應答都使ack=0 假)
發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
------------------------------------------------------------------*/
void SendByte(unsigned char c)
{
unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位
{
if((c<<BitCnt)&0x80)SDA=1; //判斷發送位
else SDA=0;
_Nop();
SCL=1; //置時鍾線為高,通知被控器開始接收數據位
_Nop();
_Nop(); //保證時鍾高電平周期大於4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}

_Nop();
_Nop();
SDA=1; //8位發送完後釋放數據線,准備接收應答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; //判斷是否接收到應答信號
SCL=0;
_Nop();
_Nop();
}

/*----------------------------------------------------------------
位元組數據傳送函數
函數原型: unsigned char RcvByte();
功能: 用來接收從器件傳來的數據,並判斷匯流排錯誤(不發應答信號),
發完後請用應答函數。
------------------------------------------------------------------*/
unsigned char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;

retc=0;
SDA=1; //置數據線為輸入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; //置時鍾線為低,准備接收數據位
_Nop();
_Nop(); //時鍾低電平周期大於4.7us
_Nop();
_Nop();
_Nop();
SCL=1; //置時鍾線為高使數據線上數據有效
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}

/*----------------------------------------------------------------
應答子函數
原型: void Ack_I2c(void);

----------------------------------------------------------------*/
/*void Ack_I2c(void)
{

SDA=0;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //時鍾低電平周期大於4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清時鍾線,鉗住I2C匯流排以便繼續接收
_Nop();
_Nop();
}*/
/*----------------------------------------------------------------
非應答子函數
原型: void NoAck_I2c(void);

----------------------------------------------------------------*/
void NoAck_I2c(void)
{

SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //時鍾低電平周期大於4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清時鍾線,鉗住I2C匯流排以便繼續接收
_Nop();
_Nop();
}
main()
{
unsigned char num=0;
Init_Timer0();

while (1) //主循環
{

num=ReadADC(0);
TempData[2]=DuanMa[num/100];
TempData[1]=DuanMa[(num%100)/10];
TempData[0]=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(0x62|Chl); //發送器件子地址 0x62控制位元組可自行更改,可參考資料的圖五 部分更改《8591中文資料》
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //發送非應位
Stop_I2c(); //結束匯流排
return(Val);
}

⑵ PCF8591T的引腳,分別是什麼意思

模擬信號輸入端和引腳逗配地址端的意思。

閱讀全文

與基於單片機的pcf8591相關的資料

熱點內容
免費伺服器怎麼加模擬 瀏覽:689
你好鄰居安卓12怎麼下載手機版 瀏覽:874
java加密與解密的藝術pdf 瀏覽:181
守家管家應用加密密保答案 瀏覽:142
androidsocket通信原理 瀏覽:538
鄉鎮匯報材料在哪個app 瀏覽:260
linux下bin文件 瀏覽:490
如何玩轉順豐app 瀏覽:656
解壓球的正確方法 瀏覽:194
python開發的程序運行速度 瀏覽:504
基於單片機的pcf8591 瀏覽:794
暑假python培訓班在哪 瀏覽:520
見頂之紅選股器源碼公式 瀏覽:233
邏輯加密卡怎麼樣 瀏覽:280
下載和解壓有先後順序嗎 瀏覽:539
svn教程linux 瀏覽:732
同花順app股票賬戶怎麼綁定銀行卡 瀏覽:506
用python爬豆瓣數據 瀏覽:722
androidedittext長度限制 瀏覽:263
紅警3命令與征服蘇聯 瀏覽:409