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

📄 c1.asm.txt

📁 这个好用啊
💻 TXT
字号:
 写过程:

(1)、主机首先发出开始信号

(2)、发出写24C02的寻址字节1010 000 0,即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

特记:起始信号
时钟线保持高电平期间数据线电平从高到低的跳变作为I2C 总线的起始信号
停止信号
时钟线保持高电平期间数据线电平从低到高的跳变作为I2C 总线的停止信号

应答信号
I2C 总线数据传送时每成功地传送一个字节数据后接收器都必须产生一个应答信号应答的器
件在第9 个时钟周期时将SDA 线拉低表示其已收到一个8 位数据
CAT24WC01/02/04/08/16 在接收到起始信号和从器件地址之后响应一个应答信号如果器件已选择
了写操作则在每接收一个8 位字节之后响应一个应答信号
当CAT24WC01/02/04/08/16 工作于读模式时在发送一个8 位数据后释放SDA 线并监视一个应答
信号一旦接收到应答信号CAT24WC01/02/04/08/16 继续发送数据如主器件没有发送应答信号器
件停止传送数据且等待一个停止信号

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -