最新熱點:
簡體版
訂閱頻道
訂閱電子報
Facebook
Instagram
主頁
專題報導
新聞中心
新品快遞
賣場報價
會員消息
討論區
搜索
我的文章
導航
說明
搜索
註冊
登錄
私人消息 (0)
公共消息 (0)
系統消息 (0)
好友消息 (0)
帖子消息 (0)
電腦領域 HKEPC Hardware
»
DIY 地帶
»
電子世界
» 關於 PCF8591 AD/DA 晶片o既問題
返回列表
發帖
superman9394
發短消息
加為好友
superman9394
當前離線
UID
22889
帖子
2408
精華
0
積分
1929
EPC Dollar
1929
註冊時間
2005-5-18
最後登錄
2023-8-28
進階會員
1
#
跳轉到
»
倒序看帖
打印
字體大小:
t
T
發表於 2013-10-28 01:51
|
只看該作者
關於 PCF8591 AD/DA 晶片o既問題
本帖最後由 superman9394 於 2013-10-28 02:02 編輯
唔知有冇師兄玩過呢粒 AD/DA IC 呢? 小弟最近係網上搵到以下 C 語言o既程式碼, 我想係 LCD 輸出 PCF8591 其他 Channel o既資料但失敗.
詳情係咁o既我見到較後部份o既 void ADC_PCF8591(uchar CtrlByte) 作者係話 "連續讀入4路通道的A/D轉換結果並保存到 Recv_Buffer", 入面亦見到係有個 for loop 行左 4次 Recv_Buffer[i++]=IIC_ReceiveByte(); 照咁睇 Recv_Buffer 應該有4筆資料, 但係我嘗試改動最後 void main() 入面o既 Convert_To_Voltage(Recv_Buffer[
0
]) 呢個位做 1/2/3, 但係都一樣係顯示返之前個 Channel o既資料, 係唔係我理解錯左呢?
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit SCL=P1^0; //I2C時鐘引腳
sbit SDA=P1^1; //I2C資料登錄輸出引腳
uchar Recv_Buffer[4]; //資料接收緩衝
uint Voltage[]={'0','0','0','0'}; //資料分解為電壓x.xx
bit bdata IIC_ERROR; //I2C錯誤標誌位元
uchar LCD_Line_1[]={" . V "};
//延時
void delay(int ms)
{
uchar i;
while(ms--) for(i=0;i<250;i++) Delay4us();
}
//LCD忙檢測
bit LCD_Busy_Check()
{
bit Result;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
Delay4us();
Result=(bit)(P3&0x80);
LCD_EN=0;
return Result;
}
//寫指令
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P3=cmd;
Delay4us();
LCD_EN=1;
Delay4us();
LCD_EN=0;
}
// 寫數據
void LCD_Write_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P3=dat;
Delay4us();
LCD_EN=1;
Delay4us();
LCD_EN=0;
}
//初始化
void LCD_Initialise()
{
LCD_Write_Command(0x38);
delay(5);
LCD_Write_Command(0x0c);
delay(5);
LCD_Write_Command(0x06);
delay(5);
LCD_Write_Command(0x01);
delay(5);
}
//設置顯示位置
void LCD_Set_Position(uchar pos)
{
LCD_Write_Command(pos|0x80);
}
//顯示一行
void LCD_Display_A_Line(uchar Line_Addr,uchar s[])
{
uchar i;
LCD_Set_Position(Line_Addr);
for(i=0;i<16;i++)LCD_Write_Data(s[i]);
}
// 將模數轉換後得到的值分解存入緩存
void Convert_To_Voltage(uchar val)
{
uchar Tmp; //最大值為255,對應5V,255/5=51
Voltage[2]=val/51+'0'; //整數部分
Tmp=val%51*10; // 第一位小數
Voltage[1]=Tmp/51+'0';
Tmp=Tmp%51*10;
Voltage[0]=Tmp/51+'0';
}
//啟動I2C匯流排
void IIC_Start()
{
SDA=1;
SCL=1;
Delay4us();
SDA=0;
Delay4us();
SCL=0;
}
//停止I2C匯流排
void IIC_Stop()
{
SDA=0;
SCL=1;
Delay4us();
SDA=1;
Delay4us();
SCL=0;
}
// 從機發送應答位
void Slave_ACK()
{
SDA=0;
SCL=1;
Delay4us();
SCL=0;
SDA=1;
}
// 從機發送非應答位
void Slave_NOACK()
{
SDA=1;
SCL=1;
Delay4us();
SCL=0;
SDA=0;
}
//發送一位元組
void IIC_SendByte(uchar wd)
{
uchar i;
for(i=0;i<8;i++) //迴圈移入8位
{
SDA=(bit)(wd&0x80);
_nop_();
_nop_();
SCL=1;
Delay4us();
SCL=0;
wd<<=1;
}
Delay4us();
SDA=1; //釋放匯流排並準備讀取應答
SCL=1;
Delay4us();
IIC_ERROR=SDA; //IIC_ERROR=1表示無應答
SCL=0;
Delay4us();
}
//接收一位元組
uchar IIC_ReceiveByte()
{
uchar i,rd=0x00;
for(i=0;i<8;i++)
{
SCL=1;
rd<<=1;
rd|=SDA;
Delay4us();
SCL=0;
Delay4us();
}
SCL=0;
Delay4us();
return rd;
}
//連續讀入4路通道的A/D轉換結果並保存到Recv_Buffer
void ADC_PCF8591(uchar CtrlByte)
{
uchar i;
IIC_Start();
IIC_SendByte(0x90); //發送寫地址
if(IIC_ERROR==1)return;
//IIC_SendByte(CtrlByte); //發送控制位元組
//if(IIC_ERROR==1)return;
IIC_Start(); //重新發送開始命令
IIC_SendByte(0x91); //發送讀地址
if(IIC_ERROR==1)return;
IIC_ReceiveByte(); //空讀一次,調整讀順序
Slave_ACK(); //收到一位元組後發送一個應答位元
for(i=0;i<4;i++)
{
Recv_Buffer[i++]=IIC_ReceiveByte();
Slave_ACK(); //收到一個位元組後發送一個應答位元
}
Slave_NOACK();
IIC_Stop(); //收到一個位元組後發送一個非應答位
}
//向 PCF8591發送1位元組進行AD轉換
//主程序
void main()
{
LCD_Initialise();
while(1)
{
ADC_PCF8591(0x04);
Convert_To_Voltage(Recv_Buffer[0]);
LCD_Line_1[2]=Voltage[2];
LCD_Line_1[4]=Voltage[1];
LCD_Line_1[5]=Voltage[0];
LCD_Display_A_Line(0x00, LCD_Line_1);
}
}
複製代碼
收藏
分享
0
0
Charcoal99
發短消息
加為好友
Charcoal99
當前離線
UID
255738
帖子
618
精華
0
積分
617
EPC Dollar
617
來自
HK
註冊時間
2012-5-12
最後登錄
2021-7-9
中級會員
2
#
發表於 2013-10-28 17:24
|
只看該作者
#194 行是你comment的嗎?
連續讀入是需要把 control-byte 的auto-increment flag 設置的, (即送出 CtrlByte 04),
但這code 跟本沒有把 control byte 送出去。
TOP
superman9394
發短消息
加為好友
superman9394
當前離線
UID
22889
帖子
2408
精華
0
積分
1929
EPC Dollar
1929
註冊時間
2005-5-18
最後登錄
2023-8-28
進階會員
3
#
發表於 2013-10-28 19:23
|
只看該作者
回復
2#
Charcoal99
因為 i2c 協定我都未係太了解, 呢句係原裝 mark 左做 comment, 我以為作者無用所以照去, 先多謝師兄提點, 等我轉頭試試再爬下文先.
TOP
返回列表
HKEPC
本站公告
最新消息
網站問題回報
大型電腦展
Event
完結活動記錄區
Sapphire HD 7770 組別
SEAGATE Wireless Plus 試用體驗分享
XFX R9 系列繪圖卡使用體驗分享
NVIDIA x Inno3D 繪圖卡超頻比賽
Linksys 「WRT1200AC」試用分享
「SAPPHIRE Next Gen 2015」徵文活動
「 ASUS ROG Insight 2015 」徵文活動專區
Linksys WRT 用家專享禮遇
「 ASROCK OCF 2015 」徵文活動專區
「LINKSYS EA7500.開箱」專區
Synology DSM 6.0 開箱文活動
LINKSYS EA9500 旗艦開箱文專區
LINKSYS MaxStream 系列‧無縫連接新體驗
「 LINKSYS VELOP .開箱文專區」
ASUSTOR AS6302T .開箱文提交專區
Sapphire HD 7700 超頻比賽(完結)
Sapphire HD 7750 組別
免費升級Galaxy GTX660
Everbest x HKEPC「ECS MOD」取消
舊"U" 迎新春 - 升級「Piledriver」
分享、教學精華文投稿
Plextor M6Pro SSD 開箱文比賽
ASUSTOR AS4004T.開箱文提交專區
AsRock Z77主機板開箱賞(完結)
Ducky Zero DK2108 試用徵文
WD Connected to Life 口號創作比賽
協助美女挑選 Plextor SSD
CM女郎「邊個夠佢靚」攝影比賽
WD Computex2013 大激賞
ANTEC TruePower Classic 550W 開箱文專區
WD Black2雙硬碟試用體驗」
XFX R9 系列 Benchmark 競猜活動
GALAX GTX970 / 980 開箱文分享
Synology RT1900ac 試用評測
Synology MR2200ac 開箱文開箱文試用體驗
我的 Antec 電源供應器包裝盒設計(完結)
Antec 產品聖誕寫真大激賞
GALAXY 送你全新3D Mark 序號
WD 包裝盒環保設計比賽
NVIDIA SHIELD 體驗會分享區
Plextor M6S 雙重賞
ASUS 主機板至尊十年霸
「 ASUS ROG Insight 2014 」分享活動專區
Inno3D GAME PACK 開箱文(已完結)
WD My Book Live 個人雲端 "智"幫手
Antec GX700 試用大激賞
ASUS Tech Forum 體驗會分享
Inno3D iChill 9 系繪圖卡開箱分享
Philips 揚聲器、耳機使用分享
NVIDIA SHIELD 體驗分享
ASUS STRIX Techday2015徵文活動專區
HKEPC足球挑戰賽
Plextor 「 M5 Pro 系列發佈會後感」分享
ZOTAC 「開箱文」分享
RAZER TOUR 徵文活動提交
Hardware
系統組件
系統故障
砌機組合
電腦資訊轉貼
顯卡討論
顯示屏幕
超頻領域
儲存燒錄
固態硬碟
外置儲存
HKEPC OC Lab
網絡寬頻
Linksys WRT 技術交流
NAS 專集
單板電腦
Portable Computer
行動電腦
NetBook 族群
Eeepc 專區
平板電腦
Computer Accessories
散熱特區
液冷降溫
機箱博覽
硬件周邊
DIY 地帶
電子世界
DIY地帶精華區
Diyer 個人展覽館
立體製作空間
輸入裝置
虛擬實境
Apple World
蘋果國度
蘋果影音
蘋果軟件
蘋果 iPhone
蘋果 iPad
iOS apps
出機攻略
Mobile Phone
Android Phone
Android Phone 軟件
Smart Phone
Smart Phone 軟件
Symbian Phone
Symbian Phone 軟件
電訊網絡
手機周邊
Software
軟體討論
Linux玩家
程式編寫
病毒攻防
Windows 探索
Microsoft Office 應用
Game Zone
電玩硬件
電玩軟體
手遊熱玩
Digital
數碼視聽
攝影學堂
作品藝廊
影音領域
耳界大開
數碼廣播
節目資訊
Leisure
興趣百科
動漫狂迷
體育世界
愛車人士
單車會社
Trading
交易廣場(電腦類)
交換/徵求
交易廣場 (電腦周邊及電玩類)
徵求/交換
交易廣場(其它類)
徵求/交換
易手格價
團購專區
組團諮詢
epc $ 拍賣場
拍賣完畢
徵求/問價
交易完結
[收藏此主題]
[關注此主題的新回覆]
[通過 QQ、MSN 分享給朋友]