?? 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 + -