A. 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);
}
B. 51單片機 ,電位器通過PCF8591轉換,來控制pwm輸出來控制燈亮度。求keil代碼 1
提供一個思路,8591轉換得到一個數據,這個數據是0~255之間,可以將該數據換算成0~100之間的PWM值,再用定時器產生一個相應的脈沖序列就可以控制LED亮度了,定時時間可以定在50~100us這樣PWM周期就在5~10毫秒。
C. pcf8591 單片機DA轉換
你想讓單片機輸出3V電壓? 不經過8591 ?
你可以讓埠輸出PWM,根據占空比,經過外部電路整型後得到3V電壓。
或者發送控制命令,使8591的DA輸出經過電路整理後的電壓達到3V
D. AVR學習板中AD轉換實驗,PCF8591T接法SCL,SDA接上拉電阻。這種接法,怎麼和單片機通信,百度都查不到。
下個PCF8591的DATASHEET吧,模擬量可通過1、2、3、4腳接入,就是說可以接4路模擬量輸入,然後通過9、10兩個腳接到單片機相應是通過串列方式和單片機通信,SCL是時鍾信號,SDA是數據,具體如何傳送數據你可以看看單片機和24C02通信方式,是相似的,和DS1302也是相似的。結合晶元手冊上的時序圖和指令,就能看明白了 的IIC匯流排上,這個看你的單片機資料,那兩個腳是IIC
E. 用光敏電阻採集數據後用12864怎麼連續顯示變數,單片機用的是STC8591,
采樣到的電壓值的數據,然後這個數值/ADC解析度再乘參考電壓,這個電壓作對10的求余運算,得出的一串字元串數值,存在一個char數組里,LCD對這個數組寫操作,電壓值便顯示出來了。
F. 如何使用51單片機和1602顯示器再加1302時鍾晶元加8591數模轉換做一個電壓表和時鍾,最好再帶有電流表
你這個,,不難,,我以前做過,使用的12位AD,需要的話,,加qqq504111933,,,跟你說說『
G. 基於51單片機怎麼讓pcf8591輸出正弦波形
pcf8591是一個有4個模擬輸入,一個模擬輸出,這個晶元與單片機之間的通信是通過IIC實現的,單片機可以控制一個模擬輸出,將模擬輸出等時的一位一位的增加後一位位的減小就能輸出正弦波了
H. 8591單片機的內部組建有哪些
是哪個廠家的產品?
I. 用51單片機pcf8591怎麼實現led燈的亮度自適應調節
用8591檢測光敏電阻兩端的電壓值,單片機根據這個值用PWM調整LED亮度
J. 51單片機PCF8591晶元應該怎麼用 目前看了許多視頻,但是對這個晶元還是不是很理解,目前只了
你好!
8591是比較常用的AD晶元,可以根據你的要求完成設計