⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302 c51ò»

📁 里面包括很多的驱动程序的
💻
📖 第 1 页 / 共 3 页
字号:
C51编程:ds1302带来的烦恼 [digital_king ] [68次] 01-5-23 下午 07:37:19
我的毕业设计项目中包含了有关ds1302的内容!我被要求用c51来编它的初始化程序,
我编的程序用wave软件模拟通过,但是仿真时就无法正常运行!
我怀疑是不是我的bdata类型定义的过多,但是不定义这种类型的数据就无法位操作!
但是bdata一共只有16字节还要分配给特殊寄存器一些,所以可能就会因此出错!
所以我希望c51的高手和诸多前辈们可以给我帮帮忙,找1302的c初始化程序发给我,
或是给一些指点!!我的信箱:greer@21cn.com
还望各位 ,不吝赐教!! 

可以采用C51和汇编联合编程 [skey] [40次] 01-5-23 下午 08:01:10 
将初始化和读写用汇编写,其他用C51写
仿硬件部分最好是用仿真器,如初始化、读写部分。如不这样,你编在多也没用的
我以前在学校的时候帮老师做事用过,现在不放哪儿了,对不起 

我自己编的,很差,你看看 [秋雨] [32次] 01-5-23 下午 08:13:24 
void st1302(void)
{uchar qqq;
 qqq++;
 qqq++;
 qqq++;
 REST=1;
 clkbit=0x8e;
 w1302();
 clkbit=0x0;
 w1302();
 REST=0;
 qqq++;
qqq++;
qqq++;
 REST=1;
 clkbit=0x90;
 w1302();
 clkbit=0xa7;
 w1302();
 REST=0;
}

void w1302(void)
{uchar qqq;
for(B=8;B;B--)
  {if(clkbit0)IO=1;
   else IO=0;
   clkbit/=2;
   SCLK=1;
   qqq++;
   SCLK=0;
} } 

谢谢你! [digital_king ] [14次] 01-5-23 下午 08:18:23 
这就是我现在无奈之下只得采用的办法,但是我们搞的东西全都使用c,
而且汇编的东西我也走通了,但是老师要求尽量用c,没办法,还得继续找,继续调!
非常感谢你,能交个朋友么??我的qq是10461207
信箱:greer@21cn.com 

谢谢你,但能用么?? [digital_king ] [9次] 01-5-23 下午 08:24:22 
非常感谢你,但是你的程序好像太简单了,你用过么??
能交个朋友么??我的信箱:greer@21cn.com感谢你的帮助1! 

你可以看看这个 [skey] [42次] 01-5-23 下午 08:31:44 
对不起,1302的是序我忘了,我看看先,后天答复(明天不上班)。
这可能是以前的程序:先看看
WE:   MOV A,20H
      MOV R6,#08H
      CLR P1.7
      NOP
      SETB P1.7
      NOP
W1:   CLR P1.5
      RRC A
      MOV P1.6,C
      SETB P1.5
      DJNZ R6,W1
      RET

RD:   CLR P1.7
      NOP
      SETB P1.7
      NOP
      SEBT P1.5
      MOV R6,#08H
R1:   CLR P1.5
      MOV C,P1.6
      RRC A
      SETB P1.5
      DJNZ R6,R1
      MOV 21H,A
      RET
其实这种类型的接口,主要在时序上多下工夫,你按照它的要求一般就能搞定!



当然内用了!不过我c51不太熟,程序可能挺乱 [秋雨] [8次] 01-5-23 下午 08:54:44 
汇编的我也有,你要吗? 

DS1302完整的汇编子程序,谁愿意把它换成C51 [方塘] [32次] 01-5-24 上午 08:36:15 

;----------------------------------------------------------
        YearH       EQU  67H    ;  RAM  年高位,BCD码
        YearL       EQU  68H    ;  RAM  年低位,BCD码
        Month       EQU  69H    ;  RAM  月,BCD码
        Day         EQU  6AH    ;  RAM  日,BCD码
        Hour        EQU  6BH    ;  RAM  时,BCD码
        Minute      EQU  6CH    ;  RAM  分,BCD码
        Second      EQU  6DH    ;  RAM  秒,BCD码
        Week        EQU  6EH
;----------------------------------------------------------
;**********************************************************
;     ************* 读写(1302)时间子程序   ***********
;**********************************************************
W_1302TIME:
          MOV    B,    #8EH
          LCALL  IN_TIME
          MOV    B,    #00H        ;写操作前WP=0
          LCALL  IN_TIME
          CLR    T_RST
W_Second: MOV    B,    #80H
          LCALL  IN_TIME
          MOV    B,    Second      ;秒
          LCALL  IN_TIME
          CLR    T_RST
W_Minute: MOV    B,    #82H
          LCALL  IN_TIME
          MOV    B,    Minute      ;分
          LCALL  IN_TIME
          CLR    T_RST
W_Hour:   MOV    B,    #84H
          LCALL  IN_TIME
          MOV    B,    Hour        ;小时
          LCALL  IN_TIME
          CLR    T_RST
W_Day:    MOV    B,    #86H
          LCALL  IN_TIME
          MOV    B,    Day         ;日期
          LCALL  IN_TIME
          CLR    T_RST
W_Month:  MOV    B,    #88H
          LCALL  IN_TIME
          MOV    B,    Month       ;月份
          LCALL  IN_TIME
          CLR    T_RST
W_Week:   MOV    B,    #8AH
          LCALL  IN_TIME
          MOV    B,    Week        ;星期
          LCALL  IN_TIME
          CLR    T_RST
W_YearL:  MOV    B,    #8CH
          LCALL  IN_TIME
          MOV    B,    YearL       ;年
          LCALL  IN_TIME
          CLR    T_RST
          MOV    B,    #8EH        ;W_CONTROL
          LCALL  IN_TIME
          MOV    B,    #80H        ;控制,WP=1,写保护
          LCALL  IN_TIME    
          CLR    T_RST
          RET
R_TIME:          ;读时间子程序 出口:Second,Minute,Hour,Day,Month,Week,YearL
R_Second: MOV    B,    #81H 
          LCALL  IN_TIME
          LCALL  OUT_TIME
          MOV    Second, A         ;秒
          CLR    T_RST
R_Minute: MOV    B,    #83H
          LCALL  IN_TIME
          LCALL  OUT_TIME
          MOV    Minute, A         ;分
          CLR    T_RST
R_Hour:   MOV    B,    #85H
          LCALL  IN_TIME
          LCALL  OUT_TIME
          MOV    Hour,   A         ;时
          CLR    T_RST
R_Day:    MOV    B,    #87H
          LCALL  IN_TIME
          LCALL  OUT_TIME
          MOV    Day,    A         ;日期
          CLR    T_RST
R_Month:  MOV    B,    #89H
          LCALL  IN_TIME
          LCALL  OUT_TIME
          MOV    Month,  A         ;月份
          CLR    T_RST
R_Week:   MOV    B,    #8BH
          LCALL  IN_TIME
          LCALL  OUT_TIME
          MOV    Week,   A         ;星期
          CLR    T_RST
R_YearL:  MOV    B,    #8DH
          LCALL  IN_TIME
          LCALL  OUT_TIME
          MOV    YearL,  A         ;年
          CLR    T_RST
          CJNE   A, #98H,IFyear20  ;A<>98H
          SJMP   ISYear20          ;A=98H
IFYear20: JC     ISYear20          ;C=1, A<98H, IS 20
          MOV    YearH,#19H        ;C=0, A>98H, IS 19
          SJMP   Year_END
ISYear20: MOV    YearH,#20H
Year_END: RET

IN_TIME:  SETB   T_RST             ;输入数据
          MOV    R4,   #8H
IN_TIME1: MOV    A,    B
          RRC    A
          MOV    B,    A
          MOV    T_IO, C
          SETB   T_CLK
          CLR    T_CLK
          DJNZ   R4,   IN_TIME1
          RET
OUT_TIME: SETB   T_RST             ;输出数据
          MOV    R4,    #8H
OUT_TI1:  MOV    C,     T_IO
          RRC    A
          SETB   T_CLK
          CLR    T_CLK
          DJNZ   R4,    OUT_TI1
          RET


我早就换过了! [digital_king ] [7次] 01-5-24 下午 01:52:46 
我早就换过了,而且软编译也通过了,可是用仿真器仿真过后,读出来数是随机的!! 

完整的DS1302 C51驱动程序 [shiaf] [46次] 01-5-24 下午 02:27:02 
// DS1302时钟芯片 C 源程序
// 程序设计:施爱飞
// 2001年3月13日

#pragma small
#include <reg52.h>

//下面是引脚连接关系
sbit ds1302_dat=P3^6;
sbit ds1302_clk=P2^6;
sbit ds1302_rst=P2^4;

sbit ACC_0 = ACC^0;
sbit ACC_1 = ACC^1;
sbit ACC_2 = ACC^2;
sbit ACC_3 = ACC^3;
sbit ACC_4 = ACC^4;
sbit ACC_5 = ACC^5;
sbit ACC_6 = ACC^6;
sbit ACC_7 = ACC^7;

unsigned char ReadRam_Byte(unsigned char address);    // 从Ram中读出一个字节
unsigned char ReadRTC_Byte(unsigned char address);    // 从RTC中读出一个字节
unsigned char WriteRam_Byte(unsigned char address,unsigned char number);    // 向
Ram中写入一个字节
unsigned char WriteRTC_Byte(unsigned char address,unsigned char number);    // 向
RTC中写入一个字节
void ReadRam(unsigned char data * buffer,unsigned char size);    // 从Ram中读出多
个字节
void ReadRTC(unsigned char data * buffer,unsigned char size);    // 从RTC中读出多
个字节
void WriteRam(unsigned char data * buffer,unsigned char size);    // 向Ram中写入多
个字节
void WriteRTC(unsigned char data * buffer,unsigned char size);    // 向RTC中写入多
个字节
unsigned char ReadSec(void);    // 从RTC中读出秒字节
unsigned char ReadMin(void);    // 从RTC中读出分字节
unsigned char ReadHr(void);    // 从RTC中读出时字节
unsigned char ReadDate(void);    // 从RTC中读出日字节
unsigned char ReadMonth(void);    // 从RTC中读出月字节
unsigned char ReadDay(void);    // 从RTC中读出星期字节
unsigned char ReadYear(void);    // 从RTC中读出年字节
void WriteSec(unsigned char number);    // 向RTC中写入秒字节
void WriteMin(unsigned char number);    // 向RTC中写入分字节
void WriteHr(unsigned char number);    // 向RTC中写入时字节
void WriteDate(unsigned char number);    // 向RTC中写入日字节
void WriteMonth(unsigned char number);    // 向RTC中写入月字节
void WriteDay(unsigned char number);    // 向RTC中写入星期字节
void WriteYear(unsigned char number);    // 向RTC中写入年字节
void WriteControl(unsigned char number);// 向慢速充电控制寄存器写入控制字节
void EnableWP(void);    // 禁止写保护
void DisableWP(void);    // 允许写保护

unsigned char ReadRam_Byte(unsigned char address)    // 从Ram中读出一个字节
{
    ds1302_clk = 0;
    ds1302_rst = 0;
    ds1302_rst = 1;
    ACC = address;
    ACC <<= 1;
    ACC |= 0xc1;
    
    ds1302_dat = ACC_0;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_1;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_2;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_3;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_4;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_5;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_6;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_7;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = 1;
    ACC_0 = ds1302_dat;    

    ds1302_clk = 1;
    ds1302_clk = 0;    
    ACC_1 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_2 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_3 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_4 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_5 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_6 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_7 = ds1302_dat;
    
    ds1302_rst = 0;
    ds1302_clk = 1;
    return ACC;
}

unsigned char ReadRTC_Byte(unsigned char address)    // 从RTC中读出一个字节
{
    ds1302_clk = 0;
    ds1302_rst = 0;
    ds1302_rst = 1;
    ACC = address;
    ACC <<= 1;
    ACC |= 0x81;
    
    ds1302_dat = ACC_0;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_1;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_2;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_3;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_4;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_5;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_6;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = ACC_7;
    ds1302_clk = 1;
    ds1302_clk = 0;
    
    ds1302_dat = 1;
    ACC_0 = ds1302_dat;    

    ds1302_clk = 1;
    ds1302_clk = 0;    
    ACC_1 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_2 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_3 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_4 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_5 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_6 = ds1302_dat;
    
    ds1302_clk = 1;
    ds1302_clk = 0;
    ACC_7 = ds1302_dat;
    
    ds1302_rst = 0;
    ds1302_clk = 1;
    return ACC;
}

unsigned char WriteRam_Byte(unsigned char address,unsigned char number)    // 向
Ram中写入一个字节
{
    ds1302_clk = 0;
    ds1302_rst = 0;
    ds1302_rst = 1;
    ACC = address;
    ACC <<= 1;
    ACC |= 0xc0;
    
    ds1302_dat = ACC_0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -