當前位置:首頁 » 編程軟體 » ds1302編程

ds1302編程

發布時間: 2022-06-16 08:18:00

① 關於51單片機 DS1302時鍾編程問題

ACC是個特殊寄存器,在reg52.h里有聲明
通常用來存放數據移位運算。
ACC>>=1; //這里就是將ACC里的數據右移並賦值給自己,舉例0xff也就是1111 1111經過右移1位計算,得到0111 1111

ACC_7 應該在最開始的時候定義過,也就是sbit ACC_7=ACC^7;
ACC_7代表ACC的最高位,也就是第剛才舉例中右移一次得到0的那個位
而T_DIO應該是bit類型的,所以,賦值給ACC_7
也就是說ACC 0111 1111最高位被賦值為1,又變成了1111 1111
希望能幫助你

② DS1302編程的問題

就看ds1302技術手冊就行,其實,ds1302的程序都有現成的,網路知道里,網路文庫里都可以搜索到無數個程序答案的。

③ 匯編高手DS1302的編程LCD1602顯示

;=====液晶屏通信引腳定義=====
RS BIT P2.0
RW BIT P2.1
E BIT P2.2
DB0_DB7 EQU P0;=====DS1302通信引腳定義=====
RST BIT P3.0
SCLK BIT P3.1
IO BIT P3.2;=====數據設定引腳定義========
MODE BIT P3.3
JIA BIT P3.4
JIAN BIT P3.5;=====定義數據存儲地址========
DS1302_ADDR DATA 30H ;地址寄存器
DS1302_DATA DATA 31H ;數據寄存器
TIME_YEAR DATA 32H ;年寄存器
TIME_MONT DATA 33H ;月寄存器
TIME_DAY DATA 34H ;天寄存器
WEEK_DATA DATA 35H ;星期寄存器
HOUR DATA 36H ;小時寄存器
MINTUE DATA 37H ;分鍾寄存器
SECOND DATA 38H ;秒鍾寄存器;=========顯示數據緩沖地址============
YEAR_HBUF DATA 40H
YEAR_LBUF DATA 41H
MONT_HBUF DATA 42H
MONT_LBUF DATA 43H
DAY_HBUF DATA 44H
DAY_LBUF DATA 45H
WEEK_HBUF DATA 46H
WEEK_LBUF DATA 47H
HOUR_HBUF DATA 48H
HOUR_LBUF DATA 49H
MINTUE_HBUF DATA 4AH
MINTUE_LBUF DATA 4BH
SECOND_HBUF DATA 4CH
SECOND_LBUF DATA 4DH;============程序開始==============
ORG 00H
AJMP START
;==================================
ORG 0050H
START:
MOV SP,#70H
LCALL INITIALZE ;調用初始化液晶屏幕
LCALL INIT_P ;調用初始畫面
MOV A, #00000001B ;清液晶屏,寫成空白
LCALL WRITE_COM;============主程序================
MAIN:
LCALL RD_DS1302
LCALL DATA_BUF
LCALL DISPLAY
AJMP MAIN;==========讀1302子程序=================
RD_DS1302:
MOV DS1302_ADDR,#8DH ;讀DS1302中的年
LCALL READ ;調用讀DS1302子程序
MOV TIME_YEAR, DS1302_DATA ;把讀出的年數據存入年寄存器中 MOV DS1302_ADDR,#8BH ;讀DS1302中的星期
LCALL READ
MOV WEEK_DATA, DS1302_DATA ;把讀出的星期數據存入星期寄存器中 MOV DS1302_ADDR,#89H ;讀DS1302中的月
LCALL READ
MOV TIME_MONT, DS1302_DATA ;把讀出的月數據存入月寄存器中 MOV DS1302_ADDR,#87H ;讀DS1302中的天
LCALL READ
MOV TIME_DAY, DS1302_DATA ;把讀出的天數據存入天寄存器中 MOV DS1302_ADDR,#85H ;讀DS1302中的小時
LCALL READ
MOV HOUR, DS1302_DATA ;把讀出的天數據存入小時寄存器中 MOV DS1302_ADDR,#83H ;讀DS1302中的分鍾
LCALL READ
MOV MINTUE, DS1302_DATA ;把讀出的天數據存入分鍾寄存器中 MOV DS1302_ADDR,#81H ;讀DS1302中的秒鍾
LCALL READ
MOV SECOND, DS1302_DATA ;把讀出的天數據存入秒鍾寄存器中
RET
;===========按鍵子程序=================;=========數據分離後送顯示緩存==================
DATA_BUF:
MOV R0,TIME_YEAR ;年數據分離,送顯示緩存
LCALL DIVIDE
MOV YEAR_HBUF,R1
MOV YEAR_LBUF,R2 MOV R0,TIME_MONT ;月數據分離,送顯示緩存
LCALL DIVIDE
MOV MONT_HBUF,R1
MOV MONT_LBUF,R2 MOV R0,TIME_DAY ;日數據分離,送顯示緩存
LCALL DIVIDE
MOV DAY_HBUF,R1
MOV DAY_LBUF,R2 MOV R0,WEEK_DATA ;星期數據分離,送顯示緩存
LCALL DIVIDE
MOV WEEK_HBUF,R1
MOV WEEK_LBUF,R2 MOV R0,HOUR ;小時數據分離,送顯示緩存
LCALL DIVIDE
MOV HOUR_HBUF,R1
MOV HOUR_LBUF,R2 MOV R0,MINTUE ;分鍾數據分離,送顯示緩存
LCALL DIVIDE
MOV MINTUE_HBUF,R1
MOV MINTUE_LBUF,R2 MOV R0,SECOND ;秒鍾數據分離,送顯示緩存
LCALL DIVIDE
MOV SECOND_HBUF,R1
MOV SECOND_LBUF,R2
RET

;=========日歷顯示子程序==========
DISPLAY:
MOV A,#10000001B ;設定年第1位的顯示地址為第1行,第1列
LCALL WRITE_COM
MOV A, #32H ;數字2的ASCII碼
LCALL WRITE_DATA MOV A,#10000010B ;設定年第2位的顯示地址為第1行,第2列
LCALL WRITE_COM
MOV A, #30H ;數字0的ASCII碼
LCALL WRITE_DATA MOV A,#10000011B ;設定年第3位的顯示地址為第1行,第3列
LCALL WRITE_COM
MOV A, YEAR_LBUF ;年的底位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#10000100B ;設定年第4位的顯示地址為第1行,第4列
LCALL WRITE_COM
MOV A, YEAR_HBUF ;年的高位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#10000101B ;設定斜線的顯示地址為第1行,第5列
LCALL WRITE_COM
MOV A,#2FH ;斜線的ASCII碼
LCALL WRITE_DATA MOV A,#10000110B ;設定月第1位的顯示地址為第1行,第6列
LCALL WRITE_COM
MOV A, MONT_LBUF ;月的低位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#10000111B ;設定月第2位的顯示地址為第1行,第7列
LCALL WRITE_COM
MOV A, MONT_HBUF ;月的高位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#10001000B ;設定斜線的顯示地址為第1行,第8列
LCALL WRITE_COM
MOV A,#2FH ;斜線的ASCII碼
LCALL WRITE_DATA MOV A,#10001001B ;設定天第1位的顯示地址為第1行,第9列
LCALL WRITE_COM
MOV A, DAY_LBUF ;天的低位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#10001010B ;設定天第2位的顯示地址為第1行,第10列
LCALL WRITE_COM
MOV A, DAY_HBUF ;天的高位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#10001101B ;設定星期第2位的顯示地址為第1行,第13列
LCALL WRITE_COM
MOV A, WEEK_DATA ;星期的高位緩存數據
SUBB A,#1
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#11000000B ;設定小時第1位的顯示地址為第2行,第0列
LCALL WRITE_COM
MOV A, HOUR_LBUF ;小時的低位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#11000001B ;設定小時第2位的顯示地址為第2行,第1列
LCALL WRITE_COM
MOV A, HOUR_HBUF ;小時的高位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#11000010B ;設定冒號的顯示地址為第2行,第2列
LCALL WRITE_COM
MOV A, #3AH ;冒號的ASCII碼
LCALL WRITE_DATA MOV A,#11000011B ;設定分鍾第1位的顯示地址為第2行,第3列
LCALL WRITE_COM
MOV A, MINTUE_LBUF ;分鍾的低位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#11000100B ;設定分鍾第2位的顯示地址為第2行,第4列
LCALL WRITE_COM
MOV A, MINTUE_HBUF ;分鍾的高位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#11000101B ;設定冒號的顯示地址為第2行,第5列
LCALL WRITE_COM
MOV A, #3AH ;冒號的ASCII碼
LCALL WRITE_DATA MOV A,#11000110B ;設定秒鍾第1位的顯示地址為第2行,第6列
LCALL WRITE_COM
MOV A, SECOND_LBUF ;秒鍾的低位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA MOV A,#11000111B ;設定秒鍾第2位的顯示地址為第2行,第7列
LCALL WRITE_COM
MOV A, SECOND_HBUF ;秒鍾的高位緩存數據
ADD A,#30H ;加30H修正取ASCII碼
LCALL WRITE_DATA
RET;=========初始畫面==============
INIT_P:
MOV A,#10000000B ;設定顯示地址1000為第1行,1010為第0列
LCALL WRITE_COM ;調用寫液晶指令子程序
MOV DPTR,#LINE1
LCALL DISP
MOV A,#11000000B ;設定顯示地址1100為第2行,1010為第0列
LCALL WRITE_COM ;調用寫液晶指令子程序
MOV DPTR,#LINE2
LCALL DISP
LCALL DELAY2 ;調用延時2秒程序
RET
;=========顯示的字元串============
LINE1: DB ' Welcome Use '
LINE2: DB ' wan nian li'

④ 單片機中的DS1302編程時,它的讀、寫底層函數是干什麼用的,DS1302的初始化又是做什麼的

#include "ds1302.h"
void delaynus(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++);
}
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,為脈沖上升沿寫入數據做好准備
delaynus(2); //稍微等待,使硬體做好准備
for(i=0;i<8;i++) //連續寫8個二進制位數據
{ DATA=dat&0x01; //取出dat的第0位數據寫入1302 低位在前,高位在後
delaynus(2); //稍微等待,使硬體做好准備
SCLK=1; //上升沿寫入數據
delaynus(2); //稍微等待,使硬體做好准備
SCLK=0; //重新拉低SCLK,形成脈沖
dat>>=1; //將dat的各數據位右移1位,准備寫入下一個數據位
} }
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止數據傳遞
SCLK=0; //確保寫數居前SCLK被拉低
RST=1; //啟動數據傳輸
delaynus(2); //稍微等待,使硬體做好准備
Write1302(Cmd); //寫入命令字
Write1302(dat); //寫數據
SCLK=1; //將時鍾電平置於高電平狀態
RST=0; //禁止數據傳遞
}
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬體做好准備
for(i=0;i<8;i++) //連續讀8個二進制位數據
{ dat>>=1;
if(DATA==1) //如果讀出的數據是1
dat|=0x80; //將1取出,寫在dat的最高位
SCLK=1; //將SCLK置於高電平,為下降沿讀出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脈沖下降沿
delaynus(2); //稍微等待
}
return dat; //將讀出的數據返回
}
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //確保寫數居前SCLK被拉低
RST=1; //啟動數據傳輸
Write1302(Cmd); //寫入命令字
dat=Read1302(); //讀出數據
SCLK=1; //將時鍾電平置於已知狀態
RST=0; //禁止數據傳遞
return dat; //將讀出的數據返回
}
void Init_DS1302(void)
{
unsigned char flag;

flag= ReadSet1302(0x81);
if(flag&0x80) //判斷時鍾晶元是否關閉
{ WriteSet1302(0x8E,0x00); //根據寫狀態寄存器命令字,寫入不保護指令
WriteSet1302(0x80,((55/10)<<4|(55%10))); //根據寫秒寄存器命令字,寫入秒的初始值
WriteSet1302(0x82,((59/10)<<4|(59%10))); //根據寫分寄存器命令字,寫入分的初始值
WriteSet1302(0x84,((23/10)<<4|(23%10))); //根據寫小時寄存器命令字,寫入小時的初始值
WriteSet1302(0x86,((18/10)<<4|(18%10))); //根據寫日寄存器命令字,寫入日的初始值
WriteSet1302(0x88,((6/10)<<4|(6%10))); //根據寫月寄存器命令字,寫入月的初始值
WriteSet1302(0x8c,((9/10)<<4|(9%10))); //根據寫年寄存器命令字,寫入年的初始值
WriteSet1302(0x90,0xa5); //打開充電功能 選擇2K電阻充電方式
WriteSet1302(0x8E,0x80); //根據寫狀態寄存器命令字,寫入保護指令
}
}

⑤ 時鍾晶元ds1302編程

不知道,哈哈哈哈哈哈哈哈哈

⑥ 89C51單片機ds1302C編程問題

IO是寄存器的一個位,即位變數,而你定義的變數是一個8位,即它們的數據類型不一樣,位變數只有0和1,是一位bool型,相與和相或產生一個真(TURE)或者假(FASE),也是一個bool型,它們的類型是一樣的。
IO = add & 0x01;
add & 0x01意思是看add的第0位是真還是假(1還是0),然後把這個1還是0賦給IO
if(IO) 如果IO的根線是真值
temp = temp | 0x80; 是把最高位強制性寫1,第一次寫的,經過7次循環移位後,最終回到第0位
注意IO是一個位,是bool值
temp是八個位,是字元,它們類型不同,不要直接同值
如果直接賦值而不出錯,是因為編譯器強制性把類型轉換了。

⑦ DS1302 單片機編程

會不會是弄錯讀寫的地址?write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

⑧ DS1302晶元如何進行12/24 制顯示時間轉換的編程(C語言)

修改DS1302晶元的(85h、84h)寄存的BIT7進行12/24小時模式切換,BIT7=1是12小時模式,BIT7=0是24小時模式。

⑨ DS1302Z的詳細介紹誰知道

DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鍾電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。採用三線介面與CPU進行同步通信,並可採用突發方式一次傳送多個位元組的時鍾信號或RAM數據。DS1302內部有一個31×8的用於臨時性存放數據的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/後備電源雙電源引腳,同時提供了對後備電源進行涓細電流充電的能力。
1.1 引腳功能及結構
DS1302的引腳排列,其中Vcc1為後備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鍾的連續運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大於Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小於Vcc1時,DS1302由Vcc1供電。X1和X2是振盪源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單位元組或多位元組數據的傳送手段。當RST為高電平時,所有的數據傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數據傳送,I/O引腳變為高阻態。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串列數據輸入輸出端(雙向),後面有詳細說明。SCLK為時鍾輸入端。

下圖為DS1302的引腳功能圖:


1.2 DS1302的控制位元組
DS1302 的控制字如圖2所示。控制位元組的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數據寫入DS1302中,位6如果為0,則表示存取日歷時鍾數據,為1表示存取RAM數據;位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制位元組總是從最低位開始輸出。



1.3 數據輸入輸出(I/O)
在控制指令字輸入後的下一個SCLK時鍾的上升沿時,數據被寫入DS1302,數據輸入從低位即位0開始。同樣,在緊跟8位的控制指令字後的下一個SCLK脈沖的下降沿讀出DS1302的數據,讀出數據時從低位0位到高位7。
1.4 DS1302的寄存器
DS1302有12個寄存器,其中有7個寄存器與日歷、時鍾相關,存放的數據位為BCD碼形式,其日歷、時間寄存器及其控制字見表1。

此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鍾突發寄存器及與RAM相關的寄存器等。時鍾突發寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內容。 DS1302與RAM相關的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態為一個8位的位元組,其命令控制字為C0H~FDH,其中奇數為讀操作,偶數為寫操作;另一類為突發方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個位元組,命令控制字為FEH(寫)、FFH(讀)。

2 DS1302實時顯示時間的軟硬體


DS1302與CPU的連接需要三條線,即SCLK(7)、I/O(6)、RST(5)。圖3示出DS1302與89C2051的連接圖,其中,時鍾的顯示用LCD。
2.1 DS1302與CPU的連接
實際上,在調試程序時可以不加電容器,只加一個32.768kHz 的晶振即可。只是選擇晶振時,不同的晶振,誤差也較大。另外,還可以在上面的電路中加入DS18B20,同時顯示實時溫度。只要佔用CPU一個口線即可。 LCD還可以換成LED,還可以使用北京衛信傑科技發展有限公司生產的10位多功能8段液晶顯示模塊LCM101,內含看門狗(WDT)/時鍾發生器及兩種頻率的蜂鳴器驅動電路,並有內置顯示RAM,可顯示任意欄位筆劃,具有3-4線串列介面,可與任何單片機、IC介面。功耗低,顯示狀態時電流為2μA (典型值),省電模式時小於1μA,工作電壓為2.4V~3.3V,顯示清晰。
2.2 DS1302實時時間流程
圖4示出DS1302的實時時間流程。根據此流程框圖,不難採集實時時間。下面結合流程圖對DS1302的基本操作進行編程:

3 調試中問題說明
DS1302 與微處理器進行數據交換時,首先由微處理器向電路發送命令位元組,命令位元組最高位Write Protect(D7)必須為邏輯1,如果D7=0,則禁止寫DS1302,即防寫;D6=0,指定時鍾數據,D6=1,指定RAM數據;D5~D1指定輸入或輸出的特定寄存器;最低位LSB(D0)為邏輯0,指定寫操作(輸入), D0=1,指定讀操作(輸出)。

在DS1302的時鍾日歷或RAM進行數據傳送時,DS1302必須首先發送命令位元組。若進行單位元組傳送,8位命令位元組傳送結束之後,在下2個SCLK周期的上升沿輸入數據位元組,或在下8個SCLK周期的下降沿輸出數據位元組。

DS1302與RAM相關的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態為一個8位的位元組,其命令控制字為C0H~FDH,其中奇數為讀操作,偶數為寫操作;再一類為突發方式下的RAM寄存器,在此方式下可一次性讀、寫所有的RAM的31個位元組。

要特別說明的是備用電源B1,可以用電池或者超級電容器(0.1F以上)。雖然DS1302在主電源掉電後的耗電很小,但是,如果要長時間保證時鍾正常,最好選用小型充電電池。可以用老式電腦主板上的3.6V充電電池。如果斷電時間較短(幾小時或幾天)時,就可以用漏電較小的普通電解電容器代替。100 μF就可以保證1小時的正常走時。DS1302在第一次加電後,必須進行初始化操作。初始化後就可以按正常方法調整時間。

典型工作電路

⑩ ds1302和單片機連接後,ds1302需要編程嗎

ds1302不用編程,只要單片機採集數據,進行處理就行。給DS1302一個地址一個地址寫好年、月、日、時、分、秒、星期,他就自己開始走時了,單片機是實時地把一個地址一個地址的年、月、日、時、分、秒、星期讀出來的。讀和寫的地址是獨立,都在DS1302晶元上。

熱點內容
如何評價一個伺服器的性能 發布:2025-05-17 23:40:53 瀏覽:270
淘寶客適合什麼伺服器 發布:2025-05-17 23:39:26 瀏覽:612
python循環文件 發布:2025-05-17 23:39:22 瀏覽:828
androidstudio更新 發布:2025-05-17 23:38:22 瀏覽:643
java項目面試 發布:2025-05-17 23:30:53 瀏覽:780
若主存儲器按位元組編址 發布:2025-05-17 23:30:46 瀏覽:24
kotlinandroid 發布:2025-05-17 23:19:09 瀏覽:974
雲編程英語 發布:2025-05-17 23:18:34 瀏覽:623
androidstudio導入類 發布:2025-05-17 23:15:36 瀏覽:237
私人電腦伺服器如何設置 發布:2025-05-17 23:14:48 瀏覽:366