×
单片机 > 单片机程序设计 > 详情

pic16f877A软件模拟I2C通信读写24C02

发布时间:2020-06-16 发布时间:
|

;该试验功能是 单片机 复位一次,自动从24C02中读取数据到数码管显示,然后对值加1再写入24C02,最终数码管中的数据就是开机的次数,具有一定的实用意义 
;本电路所使用24C02为ATMEL的,或不是该厂的,则烧写时间可能会有差异 
;必须调整本程序的DELAY时间 
;本实战的目的是让大家进上步熟悉I2C通信的时序,熟悉24CXX的读写,会用软件模拟I2C通信

;硬件接法: 
;1.24CXX的SDA接877A的RB5口,SCLK接877A的RB4口,WP接地,A0,A1,A2接地


LIST      P=16F877A, R=DEC 
    include "P16F877A.inc" 
;*********************************** 
__CONFIG _DEBUG_OFF&_CP_OFF&_WRT_HALF&_CPD_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC; 
;************************************ 定义查表偏移量 
#define SDA  PORTB,5 
#define SCLK PORTB,4 
;********************* 
COUNT     EQU   20H 
ADDR     EQU   21H 
DAT     EQU   23H 
TEMP     EQU   24H 
;********************** 
  ORG 000H 
  NOP              ;放置一条ICD必需的空操作指令 
  GOTO MAIN 
  ORG 004H 
  RETURN 
  ORG 0008H 
;****************************************************** 
TABLE             
        ADDWF PCL,1              ;地址偏移量加当前PC值                                       
    RETLW 0C0H    ;0  
    RETLW 0F9H    ;1                                 
    RETLW 0A4H    ;2 
    RETLW 0B0H    ;3 
    RETLW 99H    ;4 
    RETLW 92H    ;5 
    RETLW 82H    ;6 
    RETLW 0F8H    ;7 
    RETLW 80H    ;8 
    RETLW 98H    ;9 
        RETLW 00H    ;A 
    RETLW 00H    ;B 
    RETLW 00H    ;C 
    RETLW 00H    ;D 
    RETLW 00H    ;E 
        RETLW 00H    ;F 
;******************************************************* 
MAIN            
   MOV LW  0FFH 
   MOV WF  PORTC            ;数码管先全部熄灭 
   MOV LW  0FFH 
   MOV WF  PORTA 
   MOV LW  0FFH 
   MOV WF  PORTB            ;SDT,SCLK都为高  

  BSF STATUS,RP0          ;定义RA口,RC,RB口全部为输出 
   MOV LW 07H 
   MOV WF ADCON1            ;设置RA口全部为普通数字IO口 
  CLRW 
   MOV WF TRISB             ; 
   MOV WF TRISA 
   MOV WF TRISC           
   MOV WF OPTION_REG        ;开启RB口内部弱上拉 
  BCF STATUS,RP0 

  CLRW         ;地址00H 
  CALL RD24    ;读地址 
   MOV WF DAT     ;读出的值送F1 
  SUBLW .9    ;若读出的值大于9,则F1送为0,从0开始(因为1位数码管只能显示到0-9) 
  BC  TT2     ;C=0就转TT2 
TT1 
  CLRF  DAT 
TT2 
   MOV FW DAT 
  CALL TABLE   ;取显示段码 
   MOV WF PORTC   ;段码送C口 
  BCF   PORTA ,1  ;点亮第一位数码管 
  INCF  DAT ,1     ;每次上电,存入24CXX的00H地址的值加1 
  CLRW             ;地址00H 
  CALL  WT24       ;写24CXX 
  GOTO  $ 
;**************************** 
RD24   
        MOV WF ADDR       ;地址暂存于F4中 
       CALL START24   ;启动I2C 
        MOV LW 0A0H  
       CALL SUBS    ;写器件地址1010000+最后一位0写操作  
        MOV FW ADDR       ;载入地址 
       CALL SUBS    ;写地址  
       CALL START24   ;再发开始信号 
        MOV LW  0A1H    ;写器件地址1010000+最后一位1读操作 
       CALL SUBS       
       BSF STATUS ,RP0 
       BSF TRISB ,5            ;设SDA脚为输入,准备读 
       BCF STATUS ,RP0  
        MOV LW 08H          ;共读8位数据 
        MOV WF COUNT 
RD000  
       NOP 
       NOP 
       NOP 
       BSF SCLK            ;读数据 
       NOP 
       BSF STATUS,C 
       BTFSS SDA 
       BCF STATUS,C 
       RLF TEMP ,1 
       BCF SCLK 
       DECFSZ COUNT ,1      ;循环读完8位 
       GOTO RD000 
       BSF STATUS ,RP0 
       BCF TRISB ,5            ;恢复SDA脚为输出 
       BCF STATUS ,RP0 
       BSF SDA 
       CALL DELAY2 
       BSF SCLK 
       CALL DELAY2 
       BCF SCLK          ;应答毕,SDA置1 
       CALL STOP          ;送停止信号 
        MOV FW  TEMP          ;将读的数据送入W中 
       RETURN 
;******************************写入24C02程序 
WT24     MOV WF ADDR         ;  先将地址暂存于F4   
        CALL START24      ;开始条件 
         MOV LW 0A0H 
        CALL  SUBS      ;写器件地址1010000+最后一位0写操作 
         MOV FW ADDR          ;载入地址 
        CALL  SUBS      ;写地址 
         MOV FW DAT          ;载入数据  
        CALL SUBS       ;写数据 
        CALL STOP         ;停止信号 
        RETURN  

START24 
                      ;开始条件 
        BSF  SDA 
        BSF  SCLK 
        CALL DELAY2 
        BCF  SDA 
        CALL DELAY2 
        BCF  SCLK 
        RETURN  

STOP    
        BCF  SDA       ;停止条件 
        NOP 
        NOP  
        BSF  SCLK 
        CALL DELAY2 
        BSF  SDA 
        RETURN  

SUBS                   ;写数据  
        MOV WF TEMP     ;将要写的数据存于F2中 
        MOV LW 08H 
        MOV WF COUNT    ;写8位数据 
SH01   
       RLF TEMP ,1 
       BSF SDA 
       BTFSS  STATUS ,C 
       BCF SDA 
       NOP 
       BSF SCLK 
       CALL DELAY2 
       BCF SCLK 
       DECFSZ COUNT ,1  ;循环写完8位 
       GOTO SH01 
       BSF  SDA 
       NOP 
       NOP 
       BSF  SCLK 
       BSF  STATUS,RP0 
       BSF  TRISB ,5 
       BCF  STATUS,RP0 
REP 
       BTFSC SDA     ;判应答到否,未到则等待 
       GOTO REP 
       BCF  SCLK 
       BSF  STATUS,RP0 
       BCF  TRISB ,5 
       BCF  STATUS,RP0 
       RETURN 

DELAY2   
        NOP 
        NOP 
        NOP 
        NOP 
        RETURN  
;******************************************** 
       end                   ;源程序结束


关键字:pic16f877A  软件模拟  I2C通信  读写24C02 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义