赞助论坛
  • 3466阅读
  • 0回复

学习单片机之---DS1302与PIC16F877接口程序 [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-06 16:08:58 
初学PIC,原来是搞51的.写了个程序,经过几天辛苦调试,终于在PIC16F877上运行通过,特此发布,算我初学PIC给大家见面礼,呵呵,希望能有用.
;================================================
;DS1302控制子程序
;=================================================
;程序包括:DS1302初始化,时间数据写入和读取程序
;DS1302_init   ;init ds1302
;Set_DS1302   ;set time to ds1302
;Get_DS1302   ;get time from ds1302
;=================================================

;============== 1302定义 ===========================================
#DEFINE T_IO       PORTE,2       ;1302 I_O
#DEFINE T_CLK     PORTE,1       ;1302时钟
#DEFINE T_RST     PORTE,0       ;1302使能位
#DEFINE DS1302_RX   20H         ;保存接受的1个数据
#DEFINE DS1302_TX   28H         ;准备写入到DS1302的一个数据

counter   equ     xxxh
temp_cnt   equ     xxxh    

;**************************************************
;     DS1302初始化程序
;**************************************************
DS1302_init
    ;未写
    return
;**********************************************************
;子程序名:Set_DS1302
;功   能:设置DS1302 初始时间,并启动计时。
;说   明:
;调   用:Write_byte
;入口参数:初始时间在:W_Second,W_Minute,W_Hour,W_Day,W_Month,W_Week.W_YearL(地址连续)
;出口参数:无
;消耗资源:counter,SecAddr(预定义)
;设   计:zhengYanbo       日   期:2005.4.21
;修   改:               日   期:
;**********************************************************
Set_DS1302:
      bcf   T_RST
      bcf   T_CLK
      bsf   T_RST
      movlw   8eh
      movwf   DS1302_TX   ;数据发送寄存器
      call   Write_byte   ;发送字节
      movlw   00h       ;WP=0
      movwf   DS1302_TX
      call   Write_byte
      bsf   T_CLK
      bcf   T_RST
     
      movlw   W_Second
      movwf   FSR
      movlw   counter,D’7’
      movlw   80h      
      movwf   SecAddr     ;秒写地址
S13021:      
      bcf   T_RST
      bcf   T_CLK
      bsf   T_RST
      movf   SecAddr,W
      movwf   DS1302_TX
      call   Write_byte   ;写秒地址
      movf   INDF,W
      movwf   DS1302_TX
      call   Write_byte   ;写秒数据
      incf   FSR
      incf   SecAddr
      incf   SecAddr
      bsf   T_CLK
      bcf   T_RST
      decfsz counter,F
      goto   S13021
     
      bcf   T_RST
      bcf   T_CLK
      bsf   T_RST
      movlw   8eh       ;控制寄存器
      movwf   DS1302_TX
      call   Write_byte
      movlw   80h       ;控制WP=1,写保护
      movwf   DS1302_TX
      call   Write_byte
      bsf   T_CLK
      bcf   T_RST
      return

;**********************************************************
;子程序名:Get_DS1302
;功   能:从DS1302 读时间
;说   明:
;调   用:Write_byte,Read_byte
;入口参数:时间保存在:R_Second,R_Minute,R_Hour,R_Day,R_Month,R_Week.R_YearL
;出口参数:无
;消耗资源: counter,SecAddr(预先定义)
;设   计:zhengYanbo       日   期:2005.4.21
;修   改:             日   期:
;**********************************************************
Get_DS1302:    
      movlw   R_Second       ;准备地址
      movwf   FSR
      movlw   D’7’
      movwf   counter
      movlw   81h         ;秒读地址
      movwf   SecAddr      
G13021  
      bcf     T_RST
      bcf     T_CLK
      bsf     T_RST
      movf   SecAddr,W
      movwf   DS1302_TX
      call   Write_byte
      call   Read_byte
      movf   DS1302_RX,W
      movwf   INDF
      incf   FSR
      incf   SecAddr
      incf   SecAddr
      bsf     T_CLK
      bcf     T_RST
      decfsz   counter,F     ;接受7个数据
      goto   G13021
      return
;**********************************************************
;功   能:写1302一字节 (内部子程序)
;入口:数据预先在DS1302_TX中
;出口:无
;消耗资源:temp_cnt(预先定义)
;**********************************************************
Write_byte
      movlw   D’8’
      movwf   tmp_cnt
W_shift  
      rrf     DS1302_TX,F   ;带C移位(低位在前)
      btfsc   STATUS,C
      goto   send_1
      bcf     T_IO
      goto   send_0
send_1  
      bsf     T_IO
send_0
      bsf     T_CLK       ;上升沿写
      nop
      bcf     T_CLK
      decfsz   temp_cnt,F
      goto   W_shift
      return
;**********************************************************
;功   能:读1302一字节 (内部子程序)
;入口:无
;出口:数据保存在DS1302_RX中
;消耗资源:temp_cnt(预先定义)
;**********************************************************
Read_byte
      bsf     STATUS,RP0   ;bank1
      bsf     TRISE,2     ;设置串行数据口为输入
      bcf     STATUS,RP0   ;bank0
      movlw   D’8’
      movwf   temp_cnt
R_shift  
      btfsc   T_IO
      goto   get_1
      bcf     STATUS,C   ;clr c
      goto   get_0
get_1  
      bsf     STATUS,C
get_0
      rrf     DS1302_RX,F
      bsf     T_CLK      
      nop
      bcf     T_CLK     ;下降沿读
      decfsz   temp_cnt,F
      goto   R_shift

      ;reset   output
      bsf     STATUS,RP0   ;bank1
      bcf     TRISE,2     ;设置T_IO为输出
      bcf     STATUS,RP0   ;bank0      
      return
这个程序一定要,PIC默认PORTE为A/D口,切记,切记!改为其他口时候请参考PIC的DATASHEET
;=============================================
;     初始化端口
;=============================================
Port_Init
    bsf   STATUS,RP0   ;bank1
    bcf   ADCON1,PCFG0
    bsf   ADCON1,PCFG1
    bsf   ADCON1,PCFG2
    bcf   ADCON1,PCFG3   ;PORTA and PORTE:digital I/O
    bcf   STATUS,RP0   ;bank0
    return