我用11.0592M晶振,可模拟通信时接受到的数据好像不对,我的程序如下,请指教:
            SCL BIT P1.0
            SDA BIT P1.1
          SLAW  EQU 60H             ;寻址字节写存放单元
         SLAR  EQU 61H
        NUMBYT EQU 63H          ;传送字节数n存放单元
      ACK  BIT 64H             ;应答位标志存放单元
     MTD  EQU 65H             ;发送缓冲区首址
     MRD  EQU 40H             ;接收缓冲区首址
  
   ORG  0000H
   LJMP  100H
   ORG 100H
MAIN:   MOV P1,#00H 
           SETB P1.7               ;指示灯7亮
            MOV R6,#00H
            MOV R5,#00H           ;串口通信用
            MOV MTD,#00H
ICRED: MOV SLAW,#0A0H
           MOV SLAR,#0A1H
            LCALL  SEQURD
       MOV A,40H
       CJNE A,#02H,ERR          ;判断首地址接受到的值正确与否
       SETB P1.5
       SJMP $
ERR:   SETB P1.3
       SJMP $
      
;启动I2C总线子程序
STA:  SETB SDA
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR SDA
      NOP                              
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      NOP
      RET
;结束总线子程序
STOP: CLR SDA
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      SETB SDA
      NOP
      NOP
      NOP
      NOP
      NOP
      RET
;发送应答子程序
MACK: CLR SDA
      NOP
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      NOP
      NOP
      RET
;发送非应答子程序
MNACK:SETB SDA
      NOP
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      NOP
      NOP
      RET
;检查应答位子程序
;ACK=1,表示有应答
CACK:
      SETB SDA
      NOP
      NOP
      SETB SCL
      CLR ACK
      NOP
      NOP
      MOV C,SDA
      JC CEND
      SETB ACK
CEND: NOP
      CLR SCL
      NOP
      RET
;发送一个字节子程序
;字节数据放入ACC
;占用R0,C,ACC
WRBYT:
      MOV R0,#08H
WLP:  
      RLC A
      JC   WR1
      SJMP WR0
WLP1: DJNZ R0,WLP
      NOP
      RET
WR1:  SETB SDA
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      NOP
      NOP
      CLR SDA
      SJMP WLP1
WR0:  CLR SDA
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      SJMP WLP1
;读取字节子程序
;读出的值在ACC
;占用R2,R0,C
RDBYT:
      MOV R0,#08H
RLP:  SETB SDA
      NOP
      SETB SCL
      NOP
      NOP
      MOV C,SDA
      MOV A,R2
      CLR SCL
      RLC A
      MOV R2,A
      NOP
      NOP
      NOP
      DJNZ R0,RLP
      RET
;模拟总线发送n个字节数据
WRNBYT: PUSH PSW
        MOV PSW,#18H
        LCALL STA
        MOV A,SLAW
        LCALL WRBYT
        LCALL CACK
        JB ACK,WRNBYT
        MOV R1,#MTD
WRDA:   MOV A,@R1
        LCALL WRBYT
        LCALL CACK
        JB ACK,WRNBYT
        INC R1
        DJNZ NUMBYT,WRDA
        LCALL STOP
        POP PSW
        RET
;模拟总线接受n个字节数据
RDNBYT: PUSH PSW
        MOV PSW,#18H
        LCALL STA
        MOV A,SLAR
        LCALL WRBYT
        LCALL CACK
        JB ACK,RDNBYT
RDN:    MOV R1,#MRD
RDN1:   LCALL RDBYT
        MOV @R1,A
        DJNZ NUMBYT,RDN2
        LCALL MNACK
        LCALL STOP
        POP PSW
        RET
RDN2:   LCALL MACK
        INC R1
        SJMP RDN1
;读指定地址n个数据子程序
SEQURD: 
        MOV NUMBYT,#01H
        LCALL WRNBYT
        MOV NUMBYT,#10H
        LCALL RDNBYT   
        RET        
END

 
					
				
 
			
			
			
						
			 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

