机电之家资源网
单片机首页|单片机基础|单片机应用|单片机开发|单片机文案|软件资料下载|音响制作|电路图下载 |嵌入式开发
培训信息
赞助商
877A软件模拟I2C通信读写24C02
877A软件模拟I2C通信读写24C02
 更新时间:2009-12-12 10:57:28  点击数:0
【字体: 字体颜色
;该试验功能是单片机复位一次,自动从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                   ;源程序结束
;*****************************************************
  • 上一篇: pic单片机双机异步通信
  • 下一篇: 没有了
  • 发表评论   告诉好友   打印此文  收藏此页  关闭窗口  返回顶部
    热点文章
     
    推荐文章
     
    相关文章
    网友评论:(只显示最新5条。)
    关于我们 | 联系我们 | 广告合作 | 付款方式 | 使用帮助 | 机电之家 | 会员助手 | 免费链接

    点击这里给我发消息66821730(技术支持)点击这里给我发消息66821730(广告投放) 点击这里给我发消息41031197(编辑) 点击这里给我发消息58733127(审核)
    本站提供的机电设备,机电供求等信息由机电企业自行提供,该企业负责信息内容的真实性、准确性和合法性。
    机电之家对此不承担任何保证责任,有侵犯您利益的地方请联系机电之家,机电之家将及时作出处理。
    Copyright 2007 机电之家 Inc All Rights Reserved.机电之家-由机电一体化网更名-声明
    电话:0571-87774297 传真:0571-87774298
    杭州滨兴科技有限公司提供技术支持

    主办:杭州市高新区(滨江)机电一体化学会
    中国行业电子商务100强网站

    网站经营许可证:浙B2-20080178-1