DS1302定時鬧鐘課程設計_第1頁
DS1302定時鬧鐘課程設計_第2頁
DS1302定時鬧鐘課程設計_第3頁
DS1302定時鬧鐘課程設計_第4頁
DS1302定時鬧鐘課程設計_第5頁
已閱讀5頁,還剩17頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、課程設計報告課程設計名稱: 單片機課程設計 課程設計題目: DS1302 實時時鐘(3) 專業班級: * 姓 名: * 學 號: * 實驗室號:信息樓205/220 實驗組號: 實驗時間: (-11.7.15) 批閱時間: 指導教師: 成 績: 1. 題目名稱DS1302 實時時鐘(3)2. 課設目的1.掌握KEILuV 下匯編語言的調試方法2.練習利用單片機小系統板編程實現一些簡單功能的方法。3. 課設內容1. 掌握KEILuV 下匯編語言的調試方法2. 編寫軟件(或借鑒網絡共享的匯編語言程序)實現功能: 由鍵盤切換顯示年,月,日,時,分,秒由鍵盤設置年,月,日,時,分,秒3. 由鍵盤設置定

2、時時間,當時鐘的時間和定時時間相同時, 蜂鳴器響5 聲,數碼管閃爍3次4. 課設方案1、DS1302的結構及工作原理DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V5.5V。采用三線接口與CPU進行同步通信,并可采用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個31×8的用于臨時性存放數據的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。1.

3、1 引腳功能及結構圖1示出DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鐘的連續運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc10.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節或多字節數據的傳送手段。當RST為高電平時,所有的數據傳送被初始化

4、,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數據傳送,I/O引腳變為高阻態。上電運行時,在Vcc2.5V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數據輸入輸出端(雙向),后面有詳細說明。SCLK始終是輸入端。1.2 DS1302的控制字節DS1302的控制字如圖2所示。控制字節的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數據寫入DS1302中,位6如果為0,則表示存取日歷時鐘數據,為1表示存取RAM數據;位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制字節總

5、是從最低位開始輸出。 1.3 數據輸入輸出(I/O)在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數據被寫入DS1302,數據輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數據,讀出數據時從低位0位到高位7。1.4 DS1302的寄存器DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關,存放的數據位為BCD碼形式,其日歷、時間寄存器及其控制字見表1。 此外,DS1302還有年份寄存器、控制寄存器、充電寄存器、時鐘突發寄存器及與RAM相關的寄存器等。時鐘突發寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內容。DS1302與RAM

6、相關的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態為一個8位的字節,其命令控制字為C0HFDH,其中奇數為讀操作,偶數為寫操作;另一類為突發方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節,命令控制字為FEH(寫)、FFH(讀)。 設置數碼管顯示和鍵盤掃描2、程序設計流程圖 DS1302實時時鐘顯示While(key=n)n=3n=1n=2 調節當前時間顯示日期 顯示鬧鐘時間調節日期調節鬧鐘時間鬧鐘時間到? no yes 報警、閃爍3、m2t1原理圖 板號NO.19 DS1302接線圖5課設總結1、程序清單及注釋主函數 /*程序功能:實現DS1302功能并具有

7、整點報時,鬧鐘功能。C P U :STC12C5608AD晶 振:22.1184MHz調用文件:主函數時 間:2011年7月10日20:13:41*/#include<reg52.h>#include<intrins.h>#include"delay.h"#include"DS1302.h"#include"CH451.h"#define uchar unsigned char#define uint unsigned intvoid main ()initCH451();iniDS1302();/initim

8、er0();while(1)mode();Timer_approach();Time_adjustment(); 子程序1/*程序功能:數碼管顯示和鍵盤掃描的程序C P U :STC12C5608AD晶 振:22.1184MHz調用文件:delay.h函數接口:void initCH451(void) /初始化CH451 void CH451_wr(uint add,uchar dat) /寫到數碼管add位dat數據 void P_Key(void) /檢測鍵盤按鍵 uchar If_Key_Press(void) /檢測后是否已經按下 uchar Which_Key_Press(void)

9、 /檢測后按了那個鍵 uint address(uchar AD) /將地址翻譯機器碼 uchar Trans_Num(uchar d8) /將顯示位翻譯機器碼Author:時 間:2011年7月11日11:41:*/#include <reg52.h>#include <intrins.h>#include"delay.h"#define uchar unsigned char#define uint unsigned intsbit CLK=P34;sbit DIN=P33;sbit LOAD=P23;sbit DOUT=P22;uchar co

10、de smg=0xBE,0x24,0xEA,0xE6,0x74,0xD6,0xDE,0xA4,0xFE,0xF4,0xFC,0x5E,0x9A,0x6E,0xDA,0xD8,0x01;uint code addr=0x0A00,0x0900,0x0B00,0x0800,0x0C00,0x0D00,0x0E00,0x0F00;uchar WKP=0,kp=0;void clock (void)delay();CLK = 0;delay();CLK = 1;delay();void setCH451(uint CTRL)uchar i;for (i=0;i<12;i+) DIN=CTRL&a

11、mp;0x01;clock();/判斷最低位CTRL >>= 1;/右移之后再判斷DIN = 1;LOAD = 0;delay();LOAD = 1;void initCH451(void)uint ini=0x0201,sys=0x0403,CTRL=0x0500; /ini芯片內部復位;sys初始化系統參數;uint ss=0x0628;DIN= 0;delay();DIN= 1;delay();/初始化,令DIN先置低再置高。setCH451(ini);setCH451(sys);setCH451(CTRL);setCH451(ss);void CH451_wr(uint a

12、dd,uchar dat)uchar i;add+=dat;for (i=0;i<12;i+)DIN=add&0x01;clock();DIN = 1;add>>=1;LOAD = 0;delay();LOAD = 1;void P_Key(void)unsigned char i; unsigned char command; /定義命令字,和數據存儲器 command=0x07; /輸入讀451命令字 LOAD=0; for(i=0;i<4;i+) DIN=command&1; /送入最低位 CLK=0; command>>=1; /往右

13、移一位 CLK=1; /產生時鐘上升沿鎖通知CH451輸入位數據 LOAD=1; /產生加載上升沿通知CH451處理命令數據 kp=0; /清除keycode for(i=0;i<7;i+) kp<<=1; /數據移入keycode,高位在前,低位在后 kp|=DOUT; /從高到低讀入451的數據 CLK=0; /產生時鐘下升沿通知CH451輸出下一位 CLK=1; WKP=kp&0x40; WKP>>=6; kp&=0xBF;uchar If_Key_Press(void)return WKP;uchar Which_Key_Press(voi

14、d)return kp;uint address(uchar AD)uint ret;ret=addrAD;return ret;uchar Trans_Num(uchar d8)uchar ret;ret=smgd8;return ret;void clrD(void) /清屏uchar i;for (i=0;i<8;i+)CH451_wr(addri,0x00);子程序2:C51 COMPILER V9.00 DELAY 07/12/2011 11:15:03 PAGE 1 /函數作用:延時函數 /晶 振:22.1184MHz /接口程序:void Delay_Ms(unsigned

15、 int T) /毫秒延時程序 / void delayu(unsigned int T)/作 者:pandawbp /時 間:2011年7月4日13:53:45 /#include<intrins.h>void Delay_Ms(unsigned int T) /毫秒延時程序/仿真300-1sunsigned int i;while (T-)for (i=0;i<566;i+);/STC12C5201為566 /1-9.775us 5-40.1us 10-78us 100-750usvoid delayu(unsigned int T)unsigned char i;whi

16、le(T-)for (i=6;i>0;i-);/STC12C5201為6void delay(void)/延時兩個機器周期 _nop_(); _nop_();子程序3:C51 COMPILER V9.00 DS1302 /*程序功能:DS1302實時時鐘以及、 按鍵調節時鐘C P U :STC12C5608AD晶 振:22.1184MHz調用文件:delay.h函數接口:修改內容:TH0set/按鍵掃描時間定時器0工作方式1時 間:2011年7月11日11:41:03*/#include <reg52.h>#include <intrins.h>#include&

17、quot;CH451.h"#include"delay.h"#define uchar unsigned char#define uint unsigned int#define TH0set 0x00/按鍵掃描時間定時器0工作方式1sbit BUZZ=P26;sbit SCLK=P21;sbit IO=P20;sbit CE=P17;uchar sj3,flag=1;/sj為時間 sj2是小時=timer0uchar timer2;/鬧鐘緩沖區uchar ModeNow;/現行模式(0為時鐘模式,1為鬧鐘調節模式,2為年月日模式)void initimer0 (

18、void) /初始化定時器1(按鍵使用) EA=1; ET0=1; TH0=TH0set; TL0=0x00; TMOD=0x11; TR0=1;void DS1302_wr(uchar address,uchar dat)uchar i;CE=0;SCLK=0;CE=1;for (i=0;i<8;i+)SCLK=0;IO=address&0x01;SCLK=1;address>>=1;for (i=0;i<8;i+)SCLK=0;IO=dat&0x01;delay();SCLK=1;delay();dat>>=1;CE=0;uchar DS

19、1302_re(uchar address)uchar i,value;CE=0;SCLK=0;CE=1;for(i=0;i<8;i+)SCLK=0;IO=(bit)(address&0x01);address>>=1;SCLK=1;for (i=0;i<8;i+)if (IO) value|=0x80;SCLK=1;value>>=1;SCLK=0;CE=0;return value;void iniDS1302(void)DS1302_wr(0x8E,0x00);/DS1302_wr(0x80,0x00);/DS1302_wr(0x82,0x00

20、);/DS1302_wr(0x84,0x00);uchar read1302(void) /返回一個整點數或0sj0=DS1302_re(0x81);Delay_Ms(10);CH451_wr(address(0),Trans_Num(sj0%16);CH451_wr(address(1),Trans_Num(sj0/16);sj1=DS1302_re(0x83);Delay_Ms(10);CH451_wr(address(3),Trans_Num(sj1%16);CH451_wr(address(4),Trans_Num(sj1/16);sj2=DS1302_re(0x85);Delay_M

21、s(10);CH451_wr(address(6),Trans_Num(sj2%16);CH451_wr(address(7),Trans_Num(sj2/16);CH451_wr(address(2),0x42);CH451_wr(address(5),0x42);if (sj0=0&&sj1=0) return sj2;else return 0;uchar exchange216(uchar n)uchar i,j;i=n/16;j=n%16;n=i*10+j;return n;uchar exchange210(uchar n)uchar i,j;i=n/10;j=n%

22、10;n=i*16+j;return n;void Timer_display(void)clrD();setCH451(0x0600);CH451_wr(address(6),Trans_Num(timer0/10);CH451_wr(address(5),Trans_Num(timer0%10);CH451_wr(address(3),Trans_Num(timer1/10);CH451_wr(address(2),Trans_Num(timer1%10);CH451_wr(address(4),0x40); void Timer_hour(void) /鬧鐘小時設定if(ModeNow=

23、1)timer0+;if (timer0=24) timer0=0;Timer_display();Delay_Ms(60);if (flag)Delay_Ms(250);flag=0;ModeNow=1;void Timer_min(void) /鬧鐘分鐘設定if(ModeNow=1)timer1+;if (timer1=60) timer1=0;Timer_display();Delay_Ms(60);if (flag)Delay_Ms(250);flag=0;ModeNow=1;void date(void)sj0=DS1302_re(0x87);Delay_Ms(10);CH451_w

24、r(address(0),Trans_Num(sj0%16);CH451_wr(address(1),Trans_Num(sj0/16);sj1=DS1302_re(0x89);Delay_Ms(10);CH451_wr(address(3),Trans_Num(sj1%16);CH451_wr(address(4),Trans_Num(sj1/16);sj2=DS1302_re(0x8d);Delay_Ms(10);CH451_wr(address(6),Trans_Num(sj2%16);CH451_wr(address(7),Trans_Num(sj2/16);CH451_wr(addr

25、ess(2),0x40);CH451_wr(address(5),0x40);void SwitchTime(uchar posi,uchar com,char bac)sjposi=exchange216(sjposi);if (sjposi=bac) sjposi=0;else sjposi+;sjposi=exchange210(sjposi);DS1302_wr(com,sjposi);if (ModeNow=0)read1302();else if (ModeNow=2)date();Delay_Ms(60);if (flag)Delay_Ms(250);flag=0;void Ti

26、me_adjustment(void)P_Key();if (If_Key_Press()switch(Which_Key_Press()case 0x00:if (ModeNow=0)SwitchTime(2,0x84,23);else if (ModeNow=2)SwitchTime(2,0x8c,99);break;case 0x03:if(ModeNow=0)SwitchTime(1,0x82,59);else if(ModeNow=2)SwitchTime(1,0x88,12);break;case 0x01:if (ModeNow=0)sj0=0;DS1302_wr(0x80,sj

27、0);else if(ModeNow=2)SwitchTime(0,0x86,31);break;case (0x09):ModeNow=0;break;case (0x0B):Timer_min();break;case (0x08):Timer_hour();break;case (0x0A):ModeNow=2;date();break;else flag=1;void mode(void)if (ModeNow=0)read1302();setCH451(0x0628);else if (ModeNow=2)date();setCH451(0x0600);void Timer_appr

28、oach(void)if(ModeNow=0)if (exchange216(sj2)=timer0&&exchange216(sj1)=timer1&&exchange216(sj0)=0)clrD();BUZZ=0;Delay_Ms(200);BUZZ=1;Delay_Ms(200);BUZZ=0;Delay_Ms(200);BUZZ=1;read1302();BUZZ=0;Delay_Ms(200);BUZZ=1;Delay_Ms(200);BUZZ=0;Delay_Ms(200);BUZZ=1;clrD();Delay_Ms(200);BUZZ=0;Delay_Ms(200);BUZZ=1;Delay_Ms(200);read1302();Delay_Ms(610);clrD();Delay_Ms(610); 2、上電實物照片截圖 3、程序實現功能的描述實現功能: 由鍵盤切換顯示年,月,日,時,分,秒由鍵盤設置年,月,日,時,分,秒由鍵盤設置定時時間,當時鐘的時間和定時時間相同時,蜂鳴器響5 聲,數碼管閃爍3次6出現的問題及解決方法根據我在調試中遇到的問題,特作如下說明:DS1302與微處理器進行數據交換時,首先由微處理器向電路發送命令字節,命令字節最高位MSB(D7)必須為邏輯1,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論