全部評論(1條)
-
- 嚴小華2009 2011-10-22 00:00:00
- //------------------------------------------------------------------ //名稱:DS1302時鐘 //------------------------------------------------------------------ //說明:從DS1302 中讀取時鐘數(shù)據(jù),在LCD上顯示日期和時間 //------------------------------------------------------------------ #include <reg51.h> #include <intrins.h> #include <string.h> #define uchar unsigned char #define uint unsigned int sbit IO=P1^0; //DS1302數(shù)據(jù)線 sbit SCLK=P1^1; //DS1302時鐘線a sbit RST=P1^2; //DS1302復位線 uchar WEEK[][4]={ "***","SUN","MON","TUS","WEN","THU","FRI","SAT"}; //亦可定義成指針數(shù)組*WEEK[] uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "}; uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "}; uchar DateTime[7]; void Initialize_LCD(); void Display_LCD_String(uchar p,uchar *s); void DelayMS(uint ms); //------------------------------------------------------------------ //函數(shù)名稱:Write_A_Byte_TO_DS1302(uchar x) //函數(shù)功能:向DS1302寫入一個字節(jié) //輸入?yún)?shù):x 將要寫入的數(shù)據(jù) //返回值:無 //時序原理:在控制指令字輸入后的下一個SCLK時鐘的上升沿時數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從第0位開始 //------------------------------------------------------------------ void Write_A_Byte_TO_DS1302(uchar x) { uchar i; SCLK=0; //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準備 for (i=0;i<8;i++) { IO=x & 0x01; //取出x的第0位數(shù)據(jù)寫入1302 SCLK=1; //上升沿寫入數(shù)據(jù) SCLK=0; //重新拉低SCLK,形成脈沖 x >>=1; //將x的各數(shù)據(jù)位右移1位,準備寫入下一個數(shù)據(jù)位 } } //------------------------------------------------------------------ //函數(shù)名稱:Get_A_Byte_FROM_DS1302() //函數(shù)功能:從DS1302讀取一個字節(jié) //輸入?yún)?shù):無 //返回值:讀取的數(shù)據(jù) //時序原理:在緊跟8位的控制指令字后的下一個SCLK時鐘的下降沿時讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7 //注意:DS1302中所存放的數(shù)據(jù)是BCD碼,在讀寫時要注意轉(zhuǎn)換 //例如:00011000,當把它視為二進制數(shù)時,其值為24;但作為2位BCD碼時,其值為18。 //------------------------------------------------------------------ uchar Get_A_Byte_FROM_DS1302() { uchar i,b=0x00; for (i=0;i<8;i++) { b |= _crol_((uchar)IO,i);//將uchar類型的IO數(shù)據(jù)左移i位 SCLK=1; //將SCLK置于高電平,為下降沿讀出 SCLK=0; //時鐘下降沿讀取 } return (b/16)*10+b%16; //從二進制數(shù)返回BCD碼 } //------------------------------------------------------------------ //函數(shù)名稱:Read_Data(uchar addr) //函數(shù)功能:從DS1302的指定寄存器讀數(shù)據(jù) //輸入?yún)?shù):addr 為讀寄存器的地址 //返回值:dat 讀取的數(shù)據(jù) //命令字:也即讀寄存器的地址 Z高位位7必須為1,位6如果為0表示存取日歷數(shù)據(jù),位5至位1表示操作單元的地址,位0為1表示讀操作 //------------------------------------------------------------------ uchar Read_Data(uchar addr) { uchar dat; RST=0; //拉低RST SCLK=0; //確保寫數(shù)據(jù)前SCLK被拉低 RST=1; //啟動數(shù)據(jù)傳輸,只有在SCLK為低電平時才能將RST置為高電平 Write_A_Byte_TO_DS1302(addr); //寫入命令字 dat=Get_A_Byte_FROM_DS1302(); SCLK=1; //將時鐘電平置于已知狀態(tài) RST=0; //禁止數(shù)據(jù)傳遞 return dat; } //------------------------------------------------------------------ //函數(shù)名稱:GetTime() //函數(shù)功能:讀取當前日期時間,將秒、分鐘、小時、日期、月份、周日、年份七個數(shù)值分//別存入數(shù)組DateTime[0]~ DateTime[6] //輸入?yún)?shù):無 //返回值:無 //------------------------------------------------------------------ void GetTime() { uchar i,addr =0x81; for (i=0;i<7;i++) { DateTime[i] = Read_Data(addr); addr+=2; } } //------------------------------------------------------------------ //日期與時間值轉(zhuǎn)換為數(shù)字字符 //------------------------------------------------------------------ void Format_DataTime(uchar d,uchar *a) { a[0]=d/10+'0'; a[1]=d%10+'0'; } //------------------------------------------------------------------ //主程序 //------------------------------------------------------------------ void main() { Initialize_LCD(); while(1) { GetTime(); Format_DataTime(DateTime[6],LCD_DSY_BUFFER1+5); //0x8D 年份寄存器 Format_DataTime(DateTime[4],LCD_DSY_BUFFER1+8); //0x89 月份寄存器 Format_DataTime(DateTime[3],LCD_DSY_BUFFER1+11); //0x87 日期寄存器 //星期 strcpy (LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);//將字符串WEEK[DateTime[5]]復制到字符數(shù)組LCD_DSY_BUFFER1+13中 //0x8B 周日寄存器 Format_DataTime(DateTime[2],LCD_DSY_BUFFER2+5); //0x85 小時寄存器 Format_DataTime(DateTime[1],LCD_DSY_BUFFER2+8); //0x83 分鐘寄存器 Format_DataTime(DateTime[0],LCD_DSY_BUFFER2+11); //0x81 秒寄存器 Display_LCD_String(0x00,LCD_DSY_BUFFER1); //diyi行顯示年、月、日、星期幾 Display_LCD_String(0x40,LCD_DSY_BUFFER2); //第二行顯示小時、分鐘、秒 } } //-------------------------------------------------------- //注意:1.本例中DS1302的屬性設置為:自動根據(jù)PC的時間初始化。 //可以編程寫入某個自定的初始時間,然后由該時間開始顯示時鐘。 // // //--------------------------------------------------------
-
贊(3)
回復(0)
熱門問答
- 請教一個單片機時鐘計時器c語言程序和原理圖 注:不要復制的
2011-10-21 07:23:51
381
1
- 跪求單片機at89c52頻率計c語言程序
- 還有跪求那個方波的名字叫神馬~~~
2015-04-23 09:42:30
372
1
- 求51單片機語言用動態(tài)顯示設計0-60秒的計時器程序,原理圖如圖。
- 求51單片機語言用動態(tài)顯示設計0-60秒的計時器程序,原理圖如圖。動態(tài)顯示管是陰極的,我編的程序是不是哪里進入誤區(qū)了,能我?guī)椭赋鰜砘蛘咔蟠笊窬幒谜_的程序,誠信感謝,賞金不夠見諒。 。還有這種原理圖位選和段選如何選,好像不同于P2^6和P2^7的位選段... 求51單片機語言用動態(tài)顯示設計0-60秒的計時器程序,原理圖如圖。動態(tài)顯示管是陰極的,我編的程序是不是哪里進入誤區(qū)了,能我?guī)椭赋鰜砘蛘咔蟠笊窬幒谜_的程序,誠信感謝,賞金不夠見諒。 。還有這種原理圖位選和段選如何選,好像不同于P2^6和P2^7的位選段選是嗎? 展開
2015-10-30 01:47:35
374
1
- 51單片機溫度控制系統(tǒng)的C語言程序
- 設計基于單片計算機的溫度控制器。用于控制電加熱爐的溫度。具體要求如下1.溫度連續(xù)可調(diào),范圍為30℃~150℃2.超調(diào)量σ%≤20%3.溫度誤差≤±0.5℃4.人-機對話方便5.控制算法采用PID或改... 設計基于單片計算機的溫度控制器。用于控制電加熱爐的溫度。具體要求如下 1. 溫度連續(xù)可調(diào),范圍為30℃~150℃ 2. 超調(diào)量σ%≤20% 3. 溫度誤差≤±0.5℃ 4. 人-機對話方便 5. 控制算法采用PID或改進的PID或其他算法 .請發(fā)至3166109374@qq.com 謝謝幫忙 具體見http://wenku.baidu.com/view/e0feacf0f121dd36a22d822c 展開
2015-06-07 00:06:30
504
3
- C語言,計時器
- 給段C語言編寫的計時器代碼,謝謝
2017-10-08 06:42:46
735
1
- 怎么用c語言編寫一個計時器?。?!
- 需要用什么函數(shù)等等!
2007-10-10 09:03:11
477
5
- 單片機做頻率計數(shù)碼管的顯示C語言程序
- #include
float time=0; float freq=0; unsigned char dsh=0; unsigned char dsz=0; unsigned char dsl=0; main() {EA=1; ET0=1; ET1=1; TMOD=0x061; TH0=-1000/256; TL0=-1000%256; TH1=0xfb; TL1=0xfb; TR0=1; TR1=1; while...
2010-06-19 23:43:52
533
2
- c語言寫的計時器
2016-09-10 21:55:59
464
1
- 求C語言計時器的例子
- 我想為執(zhí)行某個功能建立一個計時器。比如說,當A功能開始時,A計時器開始計時,當A功能結(jié)束時,A計時器結(jié)束計時,將A執(zhí)行的時間返回給我,這樣的計時器該怎么寫?
2011-11-29 00:21:26
642
2
- 求C語言編寫的計時器源代碼
- 急需一打字游戲的計時器源代碼,C語言編寫。
2013-09-04 01:38:24
297
2
- 求基于單片機的低頻信號發(fā)生器的原理圖和程序
- 需要的是4*4鍵盤DAC0832濾波電路放大電路AT89C51液晶顯示... 需要的是4*4鍵盤 DAC0832 濾波電路 放大電路 AT89C51 液晶顯示 展開
2015-04-15 00:58:46
259
2
- 急?。。。。。。?!題目是寫一個溫度傳感器的C語言程序
- 傳感器由電位器模擬電位器連接于模數(shù)轉(zhuǎn)換器通道1(PAD0)。此模數(shù)轉(zhuǎn)換器ATD0是10bits并在0-2.55V的電壓之間變化。當外界溫度0度時電壓為0。溫度102.3度時電壓2.55v。Z后把攝氏溫度輸... 傳感器由電位器模擬 電位器連接于模數(shù)轉(zhuǎn)換器通道1(PAD0)。此模數(shù)轉(zhuǎn)換器ATD0是10bits 并在0-2.55V的電壓之間變化。當外界溫度0度時電壓為0。溫度102.3度時電壓2.55v。Z后把攝氏溫度輸出在LCD上每秒溫度刷新一次 用(tempo_n(xx))) 問題補充: 要通過hc12芯片 展開
2011-04-06 15:57:57
409
2
- c語言 程序設計 關于程序調(diào)試
- #include"stdio.h"#include"stdlib.h"#include"time.h"voidmain(){inti,j;statics0,s1;time_tt;srand((unsigned)time(&t));for(i=0;i<1000;i++){j=rand()%2;if(j==1)s0++;else;s1++;}... #include"stdio.h" #include"stdlib.h" #include"time.h" void main() { int i,j; static s0,s1; time_t t; srand((unsigned) time(&t)); for(i=0;i<1000;i++) { j=rand()%2; if(j==1) s0++; else; s1++; } printf("\n s0=%d s1=%d \n ",s0,s1); } 為什么這段程序 不管是在單步調(diào)試 還是斷點調(diào)試 都看不到 s0 和s1 的值呢? 只能看到其他的 i j Loaded 'ntdll.dll', no matching symbolic information found. 這又是什么意思??? 展開
2011-05-25 02:19:45
449
3
- C51單片機計時器50ms程序編寫
2017-05-24 09:29:03
623
2
- 急?。。?! ?。【帉懸粋€溫度傳感器的C語言程序(能寫多少算多少)
- 傳感器由電位器模擬電位器連接于模數(shù)轉(zhuǎn)換器通道1(PAD0)。此模數(shù)轉(zhuǎn)換器ATD0是10bits并在0-2.55V的電壓之間變化。當外界溫度0度時電壓為0。溫度102.3度時電壓2.55v。Z后把攝氏溫度輸... 傳感器由電位器模擬 電位器連接于模數(shù)轉(zhuǎn)換器通道1(PAD0)。此模數(shù)轉(zhuǎn)換器ATD0是10bits 并在0-2.55V的電壓之間變化。當外界溫度0度時電壓為0。溫度102.3度時電壓2.55v。Z后把攝氏溫度輸出在LCD上每秒溫度刷新一次 用(tempo_n(xx))) 要通過hc12芯片 展開
2011-04-05 05:09:08
359
2
- 步進電機轉(zhuǎn)動90度、180度的c 語言程序
- 向高手求助,期待你們的回答。
2010-08-18 10:22:42
502
2
- 設計一個FPGA計時器程序
- 要求4位動態(tài)顯示顯示000.0S,精確度0.01S(這個沒有也可以),按鍵開始、暫停、清零.
2013-06-26 00:32:29
353
2
- 求一段匯編程序,利用51單片機控制3個超聲波傳感器測距的C語言程序
2017-07-25 22:41:03
341
1
- YL-69土壤濕度傳感器通過51單片機在數(shù)碼管上顯示的C語言程序。
- 這個傳感器上有DO輸出口,只要在數(shù)碼管上顯示就好了。... 這個傳感器上有DO輸出口,只要在數(shù)碼管上顯示就好了。 展開
2018-01-01 10:22:00
366
2
- 關于51單片機 的秒表/時鐘計時器設計摘要
- 秒表/時鐘計時器設計 有關的資料 我都要 謝謝各位了
2018-11-16 12:00:04
377
0
4月突出貢獻榜
推薦主頁
最新話題





參與評論
登錄后參與評論