微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机学习之二十:E2PROM芯片24C02的读写程序

单片机学习之二十:E2PROM芯片24C02的读写程序

时间:11-18 来源:互联网 点击:

0A0H

(3)、发数据写入24C02的地址,本例中为01H

(4)、往24C02中写入数据,这里是3个字节,分别为48h,0ebh,52h。

(5)、写完毕发出停止信号

读过程:

(1)、主机发出start信号

(2)、发写24C02的寻址字节1010 000 0

(大家可能要问:我们是读数据,为什么要发写信号呢?这是因为你首先要送出一个信号,说明从24C02中的哪个地址读取数据。)

(3)、发要读取的数据在24C02中的地址,即01h

(4)、主机发start信号

(5)、发读24C02的寻址字节1010 000 1

(5)、从24 C02中读取数据

(6)、读取完毕发出停止信号

在这个程序中,我们把开始信号,结束信号、写一个字节数据、读一个字节数据都编制成为通用的子程序,便于在程序中随时调用。发送和接受应答位的过程放到子程序中,这样可以使得程序结构简化。具体的程序如下所示,希望大家认真理解。

三、实验程序

Org 0000h

I2cdata equ 30h ;发送数据缓冲区的首址

2402data equ 01h ;接受缓冲区首址

numdata equ 03h ;传送的字节数,传送3个字节

Sda bit p1.7

Scl bit p1.6

Ajmp main

Main: Lcall init ;初始化给30h,31h,32h中存入0,1,2的段码

Mainwr: Lcall start ;启动

Mov r7,#0a0h

Lcall send ;发送写24C02的寻址字节

Mov r7,#2402data

Lcall send ;发送数据存入24C02的地址

Mov r5,#Numdata ;欲发送的字节数

Mov r0,#i2cdata ;发送缓冲区的首址

wrloop: Mov a,@r0

Mov r7,a

Inc r0

Lcall send

Djnz r5, wrloop ;把3个字节的数据发送出去

lcall stop ;停止

lcall d1s

mov r5,#Numdata ; 要读取的字节数重新赋值

Mainre: lcall start ;启动

Mov r7,#0a0h

Lcall send ;发送写24C02的寻址字节

Mov r7,#2402data

Lcall send ;发接受缓冲区首址

Lcall start ; 再次启动

Mov r7,#0a1h

Lcall send ;发送读24C02的寻址字节

Reloop: Lcall read ;调用读取一个字节数据的子程序

mov p0,r7 ;把读进来的数送到p0口显示

lcall d1s

lcall d1s

Djnz r5,reloop

Lcall stop ;3字节读取完毕发出停止信号

Ajmp $

init: mov p2,#0ffh ;初始化,30h、31h、32h中存入0、1、2的段码

mov 30h,#48h

mov 31h,#0ebh

mov 32h,#52h

ret

start: setb sda ;启动信号子程序,大家可以参考开始信号的时序图

setb scl

lcall d5u

clr sda

lcall d5u

clr scl

ret

stop: clr sda ;停止信号子程序

setb scl

lcall d5u

setb sda

lcall d5u

clr sda

clr scl

ret

;send是发送一个字节子程序

send: mov r6,#08h

mov a,r7 ;要发送的数在r7中

sendlop1 : rlc a ;左环移,把A的最高位移入cy

mov sda,c ;把cy的值通过sda发送出去

setb scl ;在scl上产生一个时钟

lcall d5u

clr scl

djnz r6, sendlop1 ;重复8次,发送一个字节

;cack是检查应答信号的子程序

cack: setb sda ;主机首先拉高sda

setb scl ;发出一个时钟

lcall d5u

sendlop2:mov c,sda ;读入sda的状态,如果是0表示接受到了应答

jc sendlop2

clr scl ;接受到应答位,结束时钟

ret

read: mov r6,#08h ;读取一个字节子程序

readlop1: setb sda ;置sda为输入方式

setb scl ;发出一个时钟

lcall d5u

mov c,sda ;读入sda状态

rlc a ;把该位的状态移入A中

clr scl ;结束时钟

djnz r6,readlop1 ;重复8次,读入一个字节

mov r7,a ;读进来的数放在r7中

;sack是发送应答位子程序

sack: clr sda ;拉低sda线

setb scl ;发出时钟信号

lcall d5u

clr scl

setb sda

ret

d5u: nop ;延时5us子程序

nop

nop

nop

nop

ret

d1s: mov r1,#100 ;延时1s子程序

del1: mov r4,#20

del2: mov r3,#0ffh

del3: djnz r3,del3

djnz r4,del2

djnz r1,del1

ret

end

大家把这个程序下载到测试板上面,发现数码管依次显示数字0、1、2

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top