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

📄 urm37b.asm

📁 软件 模拟IIC总线读写数据
💻 ASM
字号:
; urm37 超声波传感器测试程序
    $MOD51 
    ORG  0000H     
    LJMP 0003H;         
    MOV P0,#0ffH;
    MOV P1,#0ffH;
    mov p2,#0ffh;
    mov p3,#0ffh;
    ;/***** init data ***********/
   

    ;/*******system test******/
    ;  系统测试
    mov p0,#01000001b;
    mov p2,#11111110b;
    lcall delay0;
    mov p0,#01000010b;
    mov p2,#11111101b;
    lcall delay0;
    mov p0,#01000011b;
    mov p2,#11111011b;
    lcall delay0;
    ;************************
    ; p3.3=SDA       p3.2=SCL
    ;********************;

;*****主测试程序*******
  read_ultra: ;读超声波数据,送入p0 p2口
    lcall IIC_START; 启动信号
    mov a,#10010110b; 发送地址150 
    lcall sendbyte;   
    lcall send9rw;    发送RW=1
    lcall IIC_ACK; 读取返回应答信号
    jb f0,read_ultra;  无应答信号,重发数据

    lcall readbyte;  读16位超声波数据
    mov p2,r2;
    lcall readbyte;
    mov p0,r2;
  

    lcall delay0;
    lcall delay0;
    lcall delay0;
    lcall delay0; 
  
    lcall delay0;
    lcall delay0;
    lcall delay0;
    lcall delay0;   
  ljmp   read_ultra;


;************************;
  IIC_START: ;IIC启动信号
     clr p3.2;
     nop;
     nop;
     nop;
     setb p3.3;
     nop;
     nop;
     nop;
     setb p3.2;
     nop;
     nop;
     nop;
     clr p3.3;
     nop;
     nop;
     nop;
     clr p3.2;
     nop;
     nop;
     nop;
  ret; 
;************************;

  IIC_ACK:  ; 读取返回应答信号
     setb p3.3 ; SDA 为输入线
     setb p3.2 ; 使SDA上数据有效
     nop;
     nop;
     nop;
     nop;
     nop;
     nop;
     clr f0;     预设 F0=0 标志位
     mov c,p3.3; 输入SDA引脚状态
     jnc cend;   应答正常,则F0=0
     setb f0;    应答不正常,则F0=1
  cend: 
     clr p3.2;   子程序结束,使SCL=0
  ret;
 ;*************************;

   sendbyte:  ; 发送1 Byte 数据
     mov r0,#08h;  8位数据长度送 r0
   wlp:

     rlc A;
     mov p3.3,c;  A中数据送SDA脚发送
     lcall delay1;
     setb p3.2;   同步脉冲SCL发送,SDA数据有效
     lcall delay1;
     clr p3.2;
     djnz r0,wlp;
     lcall delay1;
    ret;
 ;*************************;

   send9rw:  ; 发送RW 1位
     clr p3.2;
     lcall delay1;
     setb p3.3;  SDA=1为接收数据
     nop;
     nop;
     nop; 
     setb p3.2;
     nop;
     nop;
     nop;
     clr p3.2;
     nop;
     nop;
     nop;
     setb p3.3;
   ret;
 ;*************************;

   readbyte:   ; 读1 Byte 数据
     mov r0,#08h;
   rlp:
     setb p3.3; 置SDA为输入方式
     setb p3.2; 使SDA数据有效
     mov c,p3.3; 读入SDA引脚状态
     mov a,r2;
     rlc a;
     mov r2,a; 读入数据放入A 和 R2
     nop;
     nop;
     nop;
     clr p3.2;
     nop;
     nop;
     nop;
     djnz r0,rlp;
   ret;
 ;*************************;
     


      

;*****************************;
   ;延时子程序
delay1:mov r5,#03h;
   pa4:
       mov r6,#0fh;
   pa3:nop;
       djnz r6,pa3;
       djnz r5,pa4;
       ret;


        
delay0:mov r5,#0fFh;
  PA2: mov r6,#0ffh;
  pa1: NOP;
       djnz r6,pa1;
       DJNZ R5,PA2; 
       RET;


end
 

⌨️ 快捷键说明

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