📄 serial_kuozhan_a.asm
字号:
;//***************************************************
;//实现功能:实现单片机模拟IIC总线对24cxx的读写
;//目标板 :51开发板
;//***************************************************
sda equ P1.1;定义P1.1为IIC总线上的sda(数据线)
scl equ P1.2;定义P1.2为IIC总线上的scl(时钟线)
device_addr equ 0a0h;0xa0是器件的地址
org 00h
ajmp main
;//******************主函数***********************
;//描 述:实现单片机模拟IIC总线对24cxx的读写
;//入口参数:无
;//返回参数:无
;//设 计:ycj
;//最后修改:时间(2006.5.4) 修改人(ycj)
;//***********************************************
org 30h
main:
mov sp,#50h
;*******************测试写一个字节***************
;对24cxx的01h地址写一个数据08h
mov R7,#01h
mov R6,#08h
call write_byte
;读24cxx的01h地址并验证是否是刚才写进去的08h
mov R7,#1
call read_byte
cjne R7,#8,next
clr P1.6;是,点亮P1.6脚的发光二极管
next:
;*******************测试写n个字节***************
mov R1,#20h
mov a,#2
mov @R1,a;20h 2
inc R1
inc a
mov @R1,a;21h 3
inc R1
inc a
mov @R1,a;23h 4
mov R7,#02h;从24cxx的地址02h开始连续写3个数据,分别是02h , 03h , 04h
mov R1,#20h;要写的数据存放的首地址
mov R6,#3;数量3个
call write_n_byte
mov R7,#2;从24cxx的地址02h开始连续读3个数据
mov R1,#25h;读出的数据存放的首地址
mov R6,#3;数量3个
call read_n_byte
;验证读出来的3个数据是否是02h , 03h , 04h
mov R1,#25h
cjne @R1,#2,n1
clr P1.5;是02h,点亮P1.5脚的发光二极管
n1:
inc R1
cjne @R1,#3,n2
clr P1.4;是03h,点亮P1.4脚的发光二极管
n2:
inc R1
cjne @R1,#4,n3
clr P1.3;是04h,点亮P1.3脚的发光二极管
n3:
ajmp $;验证完毕
;//*******************对24cxx写n个字节***********************
;//描 述:实现单片机模拟IIC总线对24cxx的写n个字节
;//入口参数:R7 : 要写入的开始地址
;// R6 : 要写入数据的数量
;// R1 : 要写入的数据开始地址
;//返回参数:无
;//设 计:ycj
;//最后修改:时间(2006.5.4) 修改人(ycj)
;//***********************************************************
write_n_byte:
push acc
push psw
call start ;发送start信号
write_n_byte_l:
;发送器件地址
mov a,#device_addr
call send
call wait_ack;等待应答
;发送要写的开始地址
mov a,R7 ;wordaddress
call send
call wait_ack;等待应答
call delay
;写n个数据
write_n_byte_2:
mov a,@R1 ;write byte
call send
call wait_ack
call delay
inc R1;准备写的下一个数据
djnz R6,write_n_byte_2
call stop;发送stop信号
pop psw
pop acc
ret
;//*******************对24cxx写一个字节***********************
;//描 述:实现单片机模拟IIC总线对24cxx的写一个字节
;//入口参数:R7 : 要写的地址
;// R6 : 要写入的数据
;//返回参数:无
;//设 计:ycj
;//最后修改:时间(2006.5.4) 修改人(ycj)
;//***********************************************************
write_byte:
push acc
push psw
call start ;发送start信号
write_byte_l:
;发送器件地址
mov a,#device_addr ; #10100000b
call send
call wait_ack;等待应答
;发送要写的地址
mov a,R7 ;wordaddress
call send
call wait_ack
;写1个数据
mov a,R6 ;write byte
call send
call wait_ack
call stop;发送stop信号
pop psw
pop acc
ret
;//******************************延时函数*******************************
;//描 述:实现延时一小断时间
;//入口参数:无
;//返回参数:无
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//*********************************************************************
delay:
nop
nop
nop
nop
nop
ret
;//*******************对24cxx读n个字节***********************
;//描 述:实现单片机模拟IIC总线对24cxx的读n个字节
;//入口参数:R7 : 要读的首地址
;// R6 : 要读的数量
;// R1 : 读出的数据存放的首地址
;//返回参数:无
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//***********************************************************
read_n_byte:
push acc
push psw
call start;发送start信号
read_n_byte_1:
;发送器件地址
mov a,#device_addr ; #10100000b
call send
call wait_ack
;发送要读的首地址
mov a,R7 ;wordaddress
call send
call wait_ack
read_n_byte_2:
call delay
call start;发送start信号
mov a,#device_addr ; #10100000b
add a,#00000001b ;#10100000+1=10100001b读模式
call send
call wait_ack
call read
mov @R1,a
inc R1
djnz R6,read_n_byte_2
call stop
pop psw
pop acc
ret
;//*******************对24cxx读一个字节***********************
;//描 述:实现单片机模拟IIC总线对24cxx的读一个字节
;//入口参数:R7 : 要读的地址
;//返回参数:R7 : 返回读到的数据
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//***********************************************************
read_byte:
push acc
push psw
call start
read_byte_1:
mov a,#device_addr ; #10100000b
call send
call wait_ack
mov a,R7 ;wordaddress
call send
call wait_ack
read_byte_2:
call start
mov a,#device_addr ; #10100000b
add a,#00000001b ;#10100000+1=10100001b
call send
call wait_ack
call read
mov R7,a
call stop
pop psw
pop acc
ret
;//*******************等待应答函数***********************
;//描 述:等待24cxx的应答信号
;//入口参数:无
;//返回参数:无
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//******************************************************
wait_ack:
push acc
push psw
mov a,#0
setb scl ;for ack
call delay
wait_ack_1:
jb sda,wait_ack_2
jmp ack
wait_ack_2:
djnz r2, wait_ack_1
;time out
clr P1.7
ajmp $
ack:
clr sda
clr scl
call delay
pop psw
pop acc
ret
;//*******************IIC发送数据函数********************
;//描 述:模拟IIC总线发送数据
;//入口参数:a : 待发送的数据
;//返回参数:无
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//******************************************************
send:
push psw
mov r5,#8
send_0:
clr c
rlc a
call delay
mov sda,c
call delay
setb scl
call delay
clr scl
djnz r5,send_0
setb sda
pop psw
ret
;//****************IIC产生start信号函数*****************
;//描 述:模拟IIC总线发送一个start信号
;//入口参数:无
;//返回参数:无
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//*****************************************************
start:
setb sda ;start
setb scl
call delay
clr sda
call delay
clr scl
ret
;//****************IIC产生stop信号函数******************
;//描 述:模拟IIC总线发送一个stop信号
;//入口参数:无
;//返回参数:无
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//*****************************************************
stop:
push acc
push psw
clr scl
call delay
clr sda
call delay
setb scl
call delay
setb sda
;与下一个start需延时10ms
mov a,#250
mov R1,#20
stop_1:
djnz acc,$
mov a,#250
djnz R1,stop_1
pop psw
pop acc
ret
;//****************从IIC总线上读数据函数******************
;//描 述:从IIC总线上读一个byte的数据
;//入口参数:无
;//返回参数:a : 返回从总线上读到的数据
;//设 计:y
;//最后修改:时间(2006.5.4) 修改人(y)
;//*****************************************************
read:
push psw
mov a,#00h ;read byte 1
mov r7,#8
setb sda
call delay
read_1:
setb scl
call delay
clr c
mov c,sda
rlc a
clr scl
call delay
djnz r7,read_1
pop psw
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -