⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial_kuozhan_a.asm

📁 串行通信
💻 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 + -