这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » uart转iic程序(51汇编)

共5条 1/1 1 跳转至

uart转iic程序(51汇编)

专家
2010-08-21 15:43:45     打赏

;******************************************************************************
;  uart转iic程序
;******************************************************************************
org     0000h
        ajmp    start

org     0100h
;=============================
;      初始化串口(UART)
;=============================

start:
         mov    scon,#50h     ;serial mode1
         mov    tmod,#20h     ;timer1 mode2
         mov    th1,#0fdh     ;baud rate: 9600
         mov    tl1,#0fdh     ;
         setb   tr1          ;tcon.6  timer1 connect and work
         mov    pcon,#00h     ;smod=0
         mov    r0,#30h       ;串口接收数据缓冲区起始地址
         mov    r1,#60h       ;串口发送数据缓冲区起始地址
         mov    r6,#0         ;收数计数器
         mov    r5,#5

         setb   p1.4          ;程序指示灯
;===========================
;       等待UART发送数据
;===========================

receive1:
         jbc    ri,receive21        ;receive interrupt
         ajmp   receive1

receive21:
         mov    a,sbuf
         inc    r6                  ;收数计数器
         mov    @r0,a
         inc    r0

dl:
         mov    4ah, #02h           ;延时,等待接受后面的数据
dl0:
         mov    4bh, #0efh
dl1:
         djnz   4bh,dl1
         djnz   4ah,dl0

         jbc    ri,receive21         ;判断是否完成所有数据的接受
;======================================
;     判断读写及字节,字个数
;======================================
         cjne   r6,#2,begin
         ajmp   write00
begin:
         mov    a,33h                  ;判断字节数
         anl    a,#0fh                 ;cont3:0加1后给r2
         add    a,#1
         mov    r2,a

         mov    a,33h                  ;判断字操作,还是字节操作
         mov    c,acc.4
         jc     loop02                  ;=1 word
loop08:
         mov    a,33h                  ;判断读写
         mov    c,acc.5
         jc     read                    ;=1 read

;=============================
;       写E2操作
;=============================


write00:
         mov    r0,#30h
write:
         lcall  bstart                         ;起动总线
         mov    a,@r0                          ;发送器件从地址
         inc    r0
send12:
         lcall  sendbyte
         lcall  rack
         dec    r6                              ;发送成功计数器-1
         clr    p1.3                            ;完成第9个种
         lcall  nop10                           ;等待芯片释放SDA

loop01:
         mov    a, @r0
         inc    r0
         lcall  sendbyte
         lcall  rack
         clr    p1.3
         nop
         nop
         nop
         djnz   r6,loop01
         lcall  bstop
         ajmp   start

loop02:
         ajmp   word

;=================================
;       读E2操作
;=================================

read:
         push   02h
         mov    r0,#30h
         lcall  bstart
loop03:
         mov    a,@r0
         inc    r0
         lcall  sendbyte
         lcall  rack
         clr    p1.3
         dec    r6                              ;发送成功计数器-1
         cjne   r0,#34h,loop03                  ;判断是否发送完控制字
         ;plcall  bstop
         lcall  del00

         lcall  bstart                        ;重新起动总线
         mov    a,30h                         ;写芯片地址
         add    a,#1
         lcall  sendbyte
         lcall  rack
         clr    p1.3
rdn1:
         lcall  readbyte                      ;读操作开始
         djnz   r2,retrdn
         lcall  nack
         clr    p1.3                          ;完成第9种
         lcall  nop10
         mov    @r1,a
         lcall  bstop
         ;inc    r2                              ;判断是否接受完成时R2减1,恢复r2值
         ajmp   send00
retrdn:
         lcall  tack
         clr    p1.3
         lcall  nop10
         setb   p1.2                           ;主机应答后释放SDA
         lcall  nop10
         mov    @r1,a                        ;R1读数据缓冲区起始地址
         inc    r1
         inc    r2                             ;判断是否接受完成时R2减1,恢复r2值
         djnz   r2,rdn1
         lcall  bstop               ;并结束总线
send00:
         pop    02h
         mov    r1,#60h
send:                                         ;将iic接收到的E2数据通过串口发给PC
         mov    a,@r1
         mov    sbuf,a
         inc    r1
         djnz   r2,tint
tint00:
         jbc    ti,stop
         ajmp   tint00
stop:
         ajmp   start
tint:
         jbc    ti,send
         ajmp   tint

word:
         mov    a,r2
         rl     a
         mov    r2,a
         ajmp   loop08

;===================================
;       起始位,启动IIC
;===================================

bstart:
         setb    p1.3
         setb    p1.2
         lcall   nop10
         clr     p1.2
         lcall   nop10
         clr     p1.3
         lcall   nop10
         ret

;==================================
;      单字节写
;==================================

sendbyte:
         mov    r3,#08h
loop04:
         clr    p1.3
         lcall  nop10
         rlc    a
         mov    p1.2,c
         lcall  nop10
         cpl    p1.3                    ;p1.3=1
         lcall  nop20
         djnz   r3,loop04
         nop
         nop
         ret

;====================================
;       单字节读
;====================================

readbyte:
         mov    r3,#08h
         clr    a
loop05:
         clr    p1.3
         lcall  nop20
         setb   p1.3
         lcall  nop10
         setb   p1.2       ;;
         ;lcall  nop10      ;;
         mov    c,p1.2
         rlc    a
         nop
         nop
         nop
         nop
         djnz   r3,loop05
         ret

;===================================
;  主机发送数据等待接收从机的应答
;===================================
rack:                                                  ;   rack:
         clr    p1.3                   ;p1.3=0         ;         clr    p1.3
         setb   p1.2                                   ;         setb   p1.2
         lcall  nop20                                  ;         lcall  nop20
         setb   p1.3                                   ;         setb   p1.3
         lcall  nop10                                  ;         lcall  nop10
loop06:                                                ;         jnb     p1.2,loop10
         setb   p1.5                  ;无应答指示      ;   loop06:
         jb     p1.2,loop06           ;等待RTC应答     ;         setb p1.7
         clr    p1.5                                   ;         lcall  nop20
         lcall  nop20                                  ;         djnz   r5,loop11
         ret                                           ;         ajmp   start
                                                       ;    loop11:
;===================================                   ;         jb    p1.2,loop06
;   主机接收数据回复从机应答                           ;    loop10:
;===================================                    ;        clr p1.7
                                                        ;         ret
tack:                                                   ;
         clr    p1.3
         lcall  nop10
         clr    p1.2
         lcall  nop10
         cpl    p1.3
         lcall  nop20
         ret

;====================================
;        发送非应答信号
;====================================

nack:
         clr    p1.3
         lcall  nop10
         setb   p1.2
         lcall  nop10
         cpl    p1.3
         lcall  nop20
         ret

;====================================
;       停止位
;====================================

bstop:
         clr    p1.3
         lcall  nop10
         clr    p1.2
         lcall  del00
         setb   p1.3
         lcall  nop10
         setb   p1.2
         lcall  nop10
         ret

;=========================================
;         延时子程序
;=========================================

nop10:
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         ret

nop20:
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         ret

del00:
         mov r7,#40
loop07:
         djnz r7 ,loop07
         ret
//改动
tack:                                                   ;
         clr    p1.3
         lcall  nop10
         setb   p1.2
         lcall  nop10
         clr    p1.2
         lcall  nop10
         setb    p1.3
         lcall  nop20
         ret

;====================================
;        发送非应答信号
;====================================

nack:
         setb    p1.3
         lcall  nop10
         setb   p1.2
         lcall  nop10
         clr    p1.2
         lcall   nop10
         cpl    p1.3
         lcall  nop20
         ret




关键词: 程序     汇编     lcall     nop10     nop20    

院士
2010-08-21 20:41:54     打赏
2楼

专家
2010-08-22 22:28:03     打赏
3楼

以前念书的时候写的


菜鸟
2010-08-24 21:18:16     打赏
4楼

使我想起了我写汇编时的情形...


专家
2010-08-25 08:41:10     打赏
5楼
有回忆就有快乐!

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]