📄 ds1302 c51ò»
字号:
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 + -