51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
DS1302与PIC16F877接口程序
作者:佚名  发布时间:2009/10/16  阅读次数:1055  字体大小: 【】 【】【
       初学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              



我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号