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

877A软件模拟I2C通信读写24C02

发布时间:2020-05-28 发布时间:
|

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


;1.24CXX的SDA接877A的RB5口,SCLK接877A的RB4口,WP接地,A0,A1,A2接地
;2.实验本实验须将MCD-DEMO实验板上的93CXX系列芯片先取下,在实验过程中不要按动同样接在RB口的按键,以免影响通信时序.
;3.实验板上拔码开关S4,S5要置ON,其它拔码开关都可以关闭。
;PIC 单片机 学习网  陈学乾  http://www.pic16.com   讨论论坛:http://pic16.com/bbs/
;版权所有,转载请注明出处,并不能去掉或改变文件中的说明文字。
;程序文件名“MCD-24C02.ASM"
;程序清单如下:
;************************************
    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           
  MOVLW  0FFH
  MOVWF  PORTC            ;数码管先全部熄灭
  MOVLW  0FFH
  MOVWF  PORTA
  MOVLW  0FFH
  MOVWF  PORTB            ;SDT,SCLK都为高 

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

  CLRW         ;地址00H
  CALL RD24    ;读地址
  MOVWF DAT     ;读出的值送F1
  SUBLW .9    ;若读出的值大于9,则F1送为0,从0开始(因为1位数码管只能显示到0-9)
  BC  TT2     ;C=0就转TT2
TT1
  CLRF  DAT
TT2
  MOVFW DAT
  CALL TABLE   ;取显示段码
  MOVWF PORTC   ;段码送C口
  BCF   PORTA ,1  ;点亮第一位数码管
  INCF  DAT ,1     ;每次上电,存入24CXX的00H地址的值加1
  CLRW             ;地址00H
  CALL  WT24       ;写24CXX
  GOTO  $
;****************************
RD24  
       MOVWF ADDR       ;地址暂存于F4中
       CALL START24   ;启动I2C
       MOVLW 0A0H 
       CALL SUBS    ;写器件地址1010000+最后一位0写操作 
       MOVFW ADDR       ;载入地址
       CALL SUBS    ;写地址 
       CALL START24   ;再发开始信号
       MOVLW  0A1H    ;写器件地址1010000+最后一位1读操作
       CALL SUBS      
       BSF STATUS ,RP0
       BSF TRISB ,5            ;设SDA脚为输入,准备读
       BCF STATUS ,RP0 
       MOVLW 08H          ;共读8位数据
       MOVWF 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          ;送停止信号
       MOVFW  TEMP          ;将读的数据送入W中
       RETURN
;******************************写入24C02程序
WT24    MOVWF ADDR         ;  先将地址暂存于F4  
        CALL START24      ;开始条件
        MOVLW 0A0H
        CALL  SUBS      ;写器件地址1010000+最后一位0写操作
        MOVFW ADDR          ;载入地址
        CALL  SUBS      ;写地址
        MOVFW 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                   ;写数据 
       MOVWF TEMP     ;将要写的数据存于F2中
       MOVLW 08H
       MOVWF 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                   ;源程序结束
;*****************************************************


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

热门文章 更多
单片机的抗干扰措施有哪些