微控制器和24c02的問題(彙編)

2022-07-15 05:51:45 字數 7984 閱讀 8264

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 應該是全域性變數,應寫在主函式之前!...