1樓:匿名使用者
這是我在圖書館找到的24lc64的讀寫程式,自己琢磨吧,我也在琢磨:
sda p1.7
scl p1.6
wcom equ 0a0h ;器件的地址和器件寫資料命令wby equ 36h ;要寫的資料
addh equ 30h ;地址高位元組
addl equ 31h ;地址低位元組
stack equ 6fh ;堆疊棧底
org 0000h
ljmp wr0
org 0030h
wr0:
mov sp,#stack
mov addh,#01h
mov addl,#10h
lcall wrsub
sjmp $
wrsub:
acall start1
mov a,#wcom
acall wrbyte
acall ack1
mov a,addh
acall wrbyte
acall ack1
mov a,addl
acall wrbyte
acall ack1
mov a,#wby
acall wrbyte
setb p1.7 ;傳送非應答訊號,表示傳送結束acall wrrdclk
acall stop1
ret;寫一位元組程式
wrbyte:
mov r2,#08h
wrbyte1:
rlc a
mov p1.7,c
acall wrrdclk
djnz r2,wrbyte1
ret;讀一位元組程式
rdbyte:
setb p1.7
mov r2,#08h
rdbyte1:
alcall wrrdclk
rlc a
nopdjnz r2,rdbyte1
ret;讀或者寫一位子程式
wrrdclk:
setb p1.6
nopnop
nopnop
mov c,p1.7
clr p1.6
nopnop
nopnop
nopret
;查詢應答程式
ack1:
clr p1.6
setb p1.7
setb p1.6
ackl:
mov c,p1.7
jc ackl
clr p1.6
ret;啟動匯流排
start1:
setb p1.7
setb p1.6
nopnop
nopnop
nopclr p1.7
nopnop
nopnop
clr p1.6
nopnop
nopnop
ret;停止匯流排
stop1
clr p1.7
setb p1.6
nopnop
nopnop
setb p1.7
nopnop
nopnop
clr p1.6
nopnop
nopnopret
2樓:威惠智慧
如果你要i2c的c程式
留下email 我發給你
是i2c通用的程式哦
3樓:浮傲南陶天
呵呵,看來你對微控制器的輸入輸出埠不是很熟悉!
置一是正為了讀取埠引腳上的電平!你置一後,埠引腳便是高電平了,這個高點平是內部上拉電阻提供的!當外部加個低電平到引腳上時,這個高電平會被拉成低電平!
這樣便可以順利讀得高低電平!
如後你置零的話,不管外部輸入高電平還是低電平都被微控制器內部拉成低電平,這樣你讀得的一直是低電平!
求解51微控制器i2c對24c02讀寫彙編程式
4樓:匿名使用者
;**************************************
;at24c04測試程式 供參考
;工作頻率: 12.000mhz
;**************************************
scl bit p2.0 ;at24c04的時鐘線
sda bit p2.1 ;at24c04的資料線
buf equ 30h ;資料快取區
;**************************************
org 0
jmp reset
org 100h
reset:
call at24c04_writepage ;寫一頁資料
call delay5ms ;寫一頁資料需延時5ms
call at24c04_readpage ;讀一頁資料
jmp $
;**************************************
;向at24c04寫1頁(16位元組)資料
;將testdata開始的16個測試資料寫如裝置的00~0f地址中
;入口引數:無
;出口引數:無
;**************************************
at24c04_writepage:
call at24c04_start ;起始訊號
mov a,#0a0h ;傳送裝置地址+寫訊號
call at24c04_sendbyte ;傳送
mov a,#00h ;傳送儲存單元地址
call at24c04_sendbyte ;傳送
mov r0,#16 ;16位元組計數器
mov dptr,#testdata ;測試資料首地址
writenext:
clr a ;讀取測試資料
movc a,@a+dptr
call at24c04_sendbyte ;寫入裝置
inc dptr ;準備下一個資料的地址
djnz r0,writenext ;判斷16位元組是否完成
call at24c04_stop ;停止訊號
rettestdata:
db 000h,011h,022h,033h,044h,055h,066h,077h
db 088h,099h,0aah,0bbh,0cch,0ddh,0eeh,0ffh
;**************************************
;從at24c04讀取1頁(16位元組)資料
;將裝置的00~0f地址中的資料讀出存放在data區的buf中
;入口引數:無
;出口引數:無
;**************************************
at24c04_readpage:
call at24c04_start ;起始訊號
mov a,#0a0h ;傳送裝置地址+寫訊號
call at24c04_sendbyte ;傳送
mov a,#00h ;傳送儲存單元地址
call at24c04_sendbyte ;傳送
call at24c04_start ;起始訊號
mov a,#0a1h ;傳送裝置地址+讀訊號
call at24c04_sendbyte ;傳送
mov r0,#16 ;16位元組計數器
mov r1,#buf ;資料緩衝區首地址
readnext:
call at24c04_recvbyte ;讀取資料
mov @r1,a ;儲存資料
cjne r0,#2,$+3 ;判斷迴應ack還是nak
call at24c04_sendack ;傳送應答訊號
inc r1 ;緩衝區地址加1
djnz r0,readnext ;判斷16位元組是否完成
call at24c04_stop ;停止訊號
ret;**************************************
;延時5微秒
;不同的工作環境,需要調整此函式
;入口引數:無
;出口引數:無
;**************************************
delay5us: ;2 當改用1t的mcu時,請調整此延時函式
nop ;1
ret ;2
;**************************************
;延時5毫秒
;不同的工作環境,需要調整此函式
;入口引數:無
;出口引數:無
;**************************************
delay5ms: ;2 當改用1t的mcu時,請調整此延時函式
push acc ;2
push dpl ;2
push dph ;2
mov dptr,#-500 ;2
delay5ms1:
nop ;1
nop ;1
nop ;1
nop ;1
inc dptr ;2
mov a,dpl ;1
orl a,dph ;1
jnz delay5ms1 ;2
pop dph ;2
pop dpl ;2
pop acc ;2
ret ;2
;**************************************
;起始訊號
;入口引數:無
;出口引數:無
;**************************************
at24c04_start:
setb sda
setb scl ;拉高時鐘線
call delay5us ;延時
clr sda ;產生下降沿
call delay5us ;延時
clr scl ;拉低時鐘線
ret;**************************************
;停止訊號
;入口引數:無
;出口引數:無
;**************************************
at24c04_stop:
clr sda
setb scl ;拉高時鐘線
call delay5us ;延時
setb sda ;產生上升沿
call delay5us ;延時
ret;**************************************
;傳送應答訊號
;入口引數:c (0:ack 1:nak)
;出口引數:無
;**************************************
at24c04_sendack:
mov sda,c ;寫應答訊號
setb scl ;拉高時鐘線
call delay5us ;延時
clr scl ;拉低時鐘線
call delay5us ;延時
ret;**************************************
;接收應答訊號
;入口引數:無
;出口引數:c
;**************************************
at24c04_recvack:
setb scl ;拉高時鐘線
call delay5us ;延時
mov c,sda ;讀應答訊號
clr scl ;拉低時鐘線
call delay5us ;延時
ret;**************************************
;向iic匯流排傳送一個位元組資料
;入口引數:acc
;出口引數:無
;**************************************
at24c04_sendbyte:
push 0
mov 0,#8 ;8位計數器
sendnext:
rlc a ;移出資料的最高位
mov sda,c ;送資料口
setb scl ;拉高時鐘線
call delay5us ;延時
clr scl ;拉低時鐘線
call delay5us ;延時
djnz 0,sendnext ;判斷8位資料是否傳送完成
pop 0
jmp at24c04_recvack ;接收應答訊號
; ret
;**************************************
;從iic匯流排接收一個位元組資料
;入口引數:無
;出口引數:acc
;**************************************
at24c04_recvbyte:
setb sda ;使能內部上拉,準備讀取資料
push 0
mov 0,#8 ;8位計數器
recvnext:
setb scl ;拉高時鐘線
call delay5us ;延時
mov c,sda ;讀資料口
rlc a ;儲存資料
clr scl ;拉低時鐘線
call delay5us ;延時
djnz 0,recvnext ;判斷8位資料是否接收完成
pop 0
ret;**************************************end
51微控制器程式設計時彙編和C語言如何結合
c語言和組合語言之間主要存在 相互呼叫 混合程式設計等關係,舉例來說吧 1 c語言呼叫匯編回子程式答 此時,彙編子程式需要申明為外部程式 include extern void delay void sbit pluse p1 0 main 彙編子程式 彙編部分需要做如此處理。public dela...
求助微控制器c語言程式問題,求助 微控制器C語言程式問題
第一個是在主程式中設定的定時計數器中斷相關引數設定,tmod 0x10 設定定時計數器的工作方式為方式1 16為計數器 也就是計數範圍為 0 65536 th1 65536 200 256 tl1 65536 200 256 設定計數器的初值為 200.ea 1 開總中斷,et1 1 開定時計數器1...
微控制器c語言程式設計的程式問題,一個微控制器c語言程式設計的程式問題!
define keyr p0 define keyc p0 這兩項後面去掉加分號!else p0 0x2f else p0 0x37 這些else多餘,一個if對應一個else define keyr p0 define keyc p0 char key 7 6 應該是全域性變數,應寫在主函式之前!...