欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
24c08 I2C總線協議操作程序匯編和C語言2個版本詳解,終于搞出來了
[打印本頁]
作者:
hongniu
時間:
2015-6-23 20:47
標題:
24c08 I2C總線協議操作程序匯編和C語言2個版本詳解,終于搞出來了
;24c08操作時序為:起始信號sclk拉高情況下sda由高變低,表示起始
; 結束信號sclk拉高情況下sda由低變高,表示結束
; 字節由高位向低位依次發送
; 第一個字節是地址和讀寫控制,第二個是存儲地址,第三個是數據,每個數據結束器件都會發送 ack應答信號;
; I2C 總線協議
;I2C 總線協議定義如下
;1 只有在總線空閑時才允許啟動數據傳送
;2 在數據傳送過程中當時鐘線為高電平時數據線必須保持穩定狀態不允許有跳變時鐘線
;為高電平時數據線的任何電平變化將被看作總線的起始或停止信號
;起始信號
;時鐘線保持高電平期間數據線電平從高到低的跳變作為I2C 總線的起始信號
;停止信號
;時鐘線保持高電平期間數據線電平從低到高的跳變作為I2C 總線的停止信號
;
ORG 0000H
SCL EQU P2.6
SDA EQU P2.7
AJMP MAIN
ORG 00030H
MAIN:LCALL INIT ;主函數,
LCALL WRITE2408
LCALL DELAY1
LCALL READ2408
MOV P0,A
AJMP $
INIT: SETB SCL ;初始化
LCALL DELAY
SETB SDA
LCALL DELAY
RET
START:SETB SDA ;起始信號
LCALL DELAY
SETB SCL
LCALL DELAY
CLR SDA
LCALL DELAY
RET
STOP:CLR SDA ; 停止信號
LCALL DELAY
SETB SCL
LCALL DELAY
SETB SDA
RET
ACK:SETB SCL ;應答信號
LCALL DELAY
JB SDA,$
CLR SCL
LCALL DELAY
SETB SDA
LCALL DELAY
RET
WRITE: MOV R4,#08H ;寫
LOOP: CLR SCL
LCALL DELAY
RLC A
MOV SDA,C
LCALL DELAY
SETB SCL
LCALL DELAY
DJNZ R4,LOOP
CLR SCL ;哎呀吃大虧了,我說怎么就是寫一個A0算完了而且還有一個停止信號,娘了個逼我程序里不是這樣的啊,奧今天我才看透,原來A0的最低位是0
LCALL DELAY ;這里以前是先把SDA釋放,再拉低SCL ,相當于一個停止信號啊,所以U820受到后把總線禁止了,也難怪寫不出了,哈哈哈又學一招
SETB SDA ;原來這么細微的變動都會是你的程序白搭,即使你其他的都是對的;
LCALL DELAY ;加油;2010年7月22日午與天津宿舍
RET ;EEPROM的成功讀取時很有意義的,嘿嘿
READ:MOV R4,#08H ;讀
SETB SDA
LCALL DELAY
LOP: CLR SCL
LCALL DELAY
SETB SCL
LCALL DELAY
MOV C,SDA
RLC A
DJNZ R4,LOP
CLR SCL
RET
DELAY: ;數據穩定
NOP
NOP
NOP
NOP
NOP
RET
WRITE2408:LCALL START
MOV A,#0A0H
LCALL WRITE
LCALL ACK ;向U820的00H單元寫0x88;
MOV A,#00H
LCALL WRITE
LCALL ACK
MOV A,#88H
LCALL WRITE
LCALL ACK
LCALL STOP
RET
READ2408:LCALL START
MOV A,#0A0H
LCALL WRITE
LCALL ACK
MOV A,#00H ;從U820的00H單元讀出數據
LCALL WRITE
LCALL ACK
LCALL START
MOV A,#0A1H
LCALL WRITE
LCALL ACK
LCALL READ
LCALL STOP
RET
DELAY1: ;延時1S,在應用中這個可以是主程序啊哈哈,真他媽了噶比的爽老子也做出來了;爽啊
MOV R7,#0A7H
DL1:
MOV R6,#0ABH
DL0:
MOV R5,#10H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
NOP
RET
END
#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^7;
sbit scl=P2^6;
void delay1(uchar z)
{
uchar j,k;
for(k=0;k<z;k++)
{
for(j=0;j<100;j++) ; //此處j不得小于27否則讀不出數據
}
}
void delay()
{
;;
}
void init()
{
sda=1;
delay();
scl=1;
delay();
}
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack()
{
scl=1;
delay();
if(sda==1)
{ delay1(1000);
}
scl=0;
delay();
sda=1;
delay();
}
void write_24c08(uchar add)
{
uchar a,i;
i=add;
scl=0;
delay();
for(a=0;a<8;a++)
{
i=i<<1;
sda=CY;
delay();
scl=1;
delay();
scl=0;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_24c08()
{
uchar a,readdate;
scl=0;
delay();
sda=1;
delay();
for(a=0;a<8;a++)
{
scl=1;
delay();
readdate=(readdate<<1)|sda; //這里注意啊,不要換成別的
scl=0;
delay();
}
return readdate;
}
void main()
{
init();
start();
write_24c08(0xa0);
ack();
write_24c08(0x21);
ack();
write_24c08(0xf0);
ack();
stop();
delay1(100);
start();
write_24c08(0xa0);
ack();
write_24c08(0x21);
ack();
start();
write_24c08(0xa1);
ack();
P0=read_24c08();
stop();
while(1);
}
復制代碼
作者:
amchina
時間:
2015-6-24 07:45
好,贊一個,最起碼不要黑幣。衷心感謝
作者:
TXDD
時間:
2017-7-14 16:28
你好,24c08的封裝資料有嗎
作者:
jljhma2000
時間:
2018-4-24 20:16
謝謝分享!我最近在研究一個IC,是I2C接口。
作者:
jljhma2000
時間:
2018-4-24 20:17
謝謝分享!
作者:
分立元件
時間:
2020-10-9 15:41
謝謝樓主,我終于調通了24C08
作者:
aking991
時間:
2020-10-14 08:55
你這個程序只適用于0-0xFF之內的讀和寫,如果地址大于0xFF就會從頭寫了,不信你試試,建議再學習學習修改一下就可實現大容量的EEPROM的讀寫
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1