51單片機ds1302時鐘報告概述_第1頁
51單片機ds1302時鐘報告概述_第2頁
51單片機ds1302時鐘報告概述_第3頁
51單片機ds1302時鐘報告概述_第4頁
51單片機ds1302時鐘報告概述_第5頁
已閱讀5頁,還剩10頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、杭州電子科技大學信息工程學院杭州電子科技大學信息工程學院單片機課程設計報告項目:DS1302時鐘 學生姓名 學 號 完成日期 2016年12月29日1摘要時鐘在各行各業發揮著重要的作用,而它滿足人們的各種需要,更顯得重要,隨著數字技術的迅速發展,微控制器在社會的各個領域得到了廣泛的應用,由于數字系統有著模擬系統所沒有的優勢,如抗干擾性強、便于和PC機相聯、系統易于升級維護。本設計是以單片機AT80C51和DS1302芯片控制的時間計數。利用AT80C51芯片進行低成本時鐘控制系統的設計,能夠簡化系統構成、降低系統成本、增強系統性能、滿足更多應用場合的需要。系統實現對時鐘日期等在LCD上的實時顯

2、示。關鍵詞 時鐘;AT80C51;DS1302;abstractThe clock plays an important role in all walks of life, and it meet the various needs of the people, the more important, with the rapid development of digital technology, micro controller has been widely used in various fields of society, because the digital system ha

3、s a simulation system has advantages, such as strong anti-interference, easy to machine and PC. The system is easy to maintain and upgrade.This design is based on single-chip microcomputer AT80C51 and DS1302 chip control time count. The design of low cost clock control system based on AT80C51 chip c

4、an simplify the system structure, reduce the system cost, enhance the system performance and meet the needs of more applications. System to achieve real-time display of the clock date on the LCD.Keywords: clock; AT80C51; DS1302;第一章 緒論1.1時鐘模塊的介紹 1.1.1 DS1302簡介DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電

5、路,它可以對年、月、日、周、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.0V5.5V。采用三線接口與CPU進行同步通信,并可采用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個31×8的用于臨時性存放數據的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進行涓細電流充電的能力。1.1.2 DS1302結構DS1302的引腳排列,其中Vcc2為主電源,VCC1為后備電源。在主電源關閉的情況下,也能保持時鐘的連續運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2

6、大于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為低電平時,

7、才能將RST置為高電平。I/O為串行數據輸入輸出端(雙向),后面有詳細說明。SCLK為時鐘輸入端。 下圖為DS1302的引腳功能圖:圖1 Ds1302引腳口1.2單片機概述單片微型計算機的誕生是計算機發展史上的一個新的里程碑。近年來,隨著技術的發展和進步,以及市場對產品功能和性能的要求不斷提高,直流電動機的應用更加廣泛,尤其是在智能機器人中的應用。直流電動機的起動和調速性能、過載能力強等特點顯得十分重要,為了能夠適應發展的要求,單閉環直流電動機的調速控制系統得到了很大的發展。而作為單片嵌入式系統的核心單片機,正朝著多功能、多選擇、高速度、低功耗、低價格、大存儲容量和強I/O功能等方向發展。隨著

8、計算機檔次的不斷提高,功能的不斷完善,單片機已越來越廣泛地應用在各種領域的控制、自動化、智能化等方面,特別是在直流電動機的調速控制系統中。這是因為單片機具有很多優點:體積小,功能全,抗干擾能力強,可靠性高,結構合理,指令豐富,控制功能強,造價低等。所以選用單片機作為控制系統的核心以提高整個系統的可靠性和可行性。本設計的80C51單片機屬于MCS-51系列單片機,由Intel公司開發,其結構是8048的延伸,改進了8048的缺點,增加了如乘(MUL)、除(DIV)、減(SUBB)、比較(CMP)、16位數據指針、布爾代數運算等指令,以及串行通信能力和5個中斷源。采用40引腳雙列直插式DIP(Du

9、al In Line Package),內有128個RAM單元及4K的ROM。圖2 80C51單片機引腳口第2章 總體方案2.1系統框架設計方案說明:時鐘系統以80C51單片機為控制核心,由輸入模塊、LCD顯示模塊及時鐘電路組成。采用獨立式鍵盤作為命令的輸入,單片機在程序控制下,定時讀取DS1302的片內數據,完成年、月、日、小時、分鐘、秒的實時顯示。圖3 系統框架設計2.2設計思路時鐘系統的主要功能包括:實現對時間的顯示,時間的調整,能夠很方便的實現時間系統控制。程序啟動后,由DS1302的初始化,LCD1602的初始化后進入主循環,主循環由掃描按鍵,讀取時間,顯示三部分構成。第3章 系統硬

10、件設計3.1 單片機控制模塊本設計采用protues仿真,80C51單片機的VCC、GND、XTAL1、XTAL2、RST、EA腳均沒有接外部電路,也可使用圖4 80C51電路的設計3.2 DS1302模塊本設計采用protues仿真,DS1302的X1、X2、GND腳沒有接外部電路,即可使用圖5 DS1302電路的設計3.3 LCD顯示模塊本設計采用protues仿真,LCD1602的Vcc、VEE、VDD、VSS、GND腳沒有接外部電路,即可使用圖6 LCD1602電路的設計3.1 獨立鍵盤控制模塊本設計采用protues仿真,共有5個按鍵,分別對應不同功能,如下表:本設計中有5個獨立式按

11、鍵,具體功能如下:I/O口按鍵具體功能P3.0K1開啟時間修改P3.1K2時間位選加P3.2K3時間位選減P3.3K4時間加P3.7K5時間減表1 獨立按鍵功能圖7 獨立按鍵電路的設計結論通過本次實驗設計,使我們學到了許多書本上無法學到的知識,也使我們深刻體會到單片機技術應用領域的廣泛。不僅讓我們對學過的單片機知識有了很多的鞏固,同時也對單片機這一門學科產生了更大的興趣。通過本次設計,較系統地掌握有關單片機控制的設計思想和設計方法,主要對51系列單片機的結構、功能、及內部資源,LCD顯示器等的了解,并對其進行測試和加以應用的知識得到學習。附錄一:總電路圖附錄二:程序15#include <

12、;reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit K1 = P30;/定義K1鍵sbit K2 = P31;/定義K2鍵 sbit K3 = P32;/定義K3鍵sbit K4 = P33;/P13定義K4鍵sbit K5 = P37;sbit BEEP=P23;/定義蜂鳴器sbit reset = P12;/P25;sbit sclk = P10;/P26;sbit io = P11;/P27;sbit LCD_RS=P35;sbit LCD_RW=P3

13、6; sbit LCD_EN=P34;uchar count_10ms;/定義10ms計數器bit K1_FLAG=0;/定義按鍵標志位,當按下K1鍵時,該位置1,K1鍵未按下時0。uchar disp_buf16 =0x00;/定義顯示緩沖區uchar time_buf7 =0,0,0,0,0,0,0;/DS1302時間緩沖區,存放秒、分、時、日、月、星期、年uchar temp 2=0;/用來存放設置時的小時、分鐘的中間值uint m=0,n=0,r=0;/*以下是函數聲明*/void Delay_ms(uint xms);bit lcd_busy();void lcd_wcmd(ucha

14、r cmd);void lcd_wdat(uchar dat);void lcd_clr();void lcd_init();void write_byte(uchar inbyte);/寫一字節數據函數聲明uchar read_byte();/讀一字節數據函數聲明void write_ds1302(uchar cmd,uchar indata);/寫DS1302函數聲明uchar read_ds1302(uchar addr);/讀DS1302函數聲明void set_ds1302(uchar addr,uchar *p,uchar n); /設置DS1302初始時間函數聲明void get

15、_ds1302(uchar addr,uchar *p,uchar n); /讀當前時間函數聲明void init_ds1302();/DS1302初始化函數聲明/*以下是延時函數*/void Delay_ms(uint xms)uint i,j;for(i=xms;i>0;i-)/i=xms即延時約xms毫秒for(j=70;j>0;j-);/*以下是LCD忙碌檢查函數*/bit lcd_busy()bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(

16、P0&0x80);LCD_EN = 0;return result;/*以下是寫指令寄存器IR函數*/void lcd_wcmd(uchar cmd)Delay_ms(5);LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EN = 1;_nop_();_nop_();_nop_();_nop_();LCD_EN = 0;/*以下是寫寄存器DR函數*/void lcd_wdat(uchar dat)Delay_ms(5);LCD_RS = 1;LCD

17、_RW = 0;LCD_EN = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EN = 1;_nop_();_nop_();_nop_();_nop_();LCD_EN = 0;/*以下是LCD清屏函數*/void lcd_clr()lcd_wcmd(0x01);/清除LCD的顯示內容Delay_ms(5);/*以下是LCD初始化函數*/void lcd_init()Delay_ms(15);/等待LCD電源穩定lcd_wcmd(0x38);/16*2顯示,5*7點陣,8位數據Delay_ms(5);lcd_wcmd(0x38);Delay_m

18、s(5);lcd_wcmd(0x38);Delay_ms(5);lcd_wcmd(0x0c);/顯示開,關光標Delay_ms(5);lcd_wcmd(0x06);/移動光標Delay_ms(5);lcd_wcmd(0x01);/清除LCD的顯示內容Delay_ms(5);/*以下是寫一字節數據函數*/void write_byte(uchar inbyte)uchar i;for(i=0;i<8;i+)sclk=0;/寫時低電平改變數據if(inbyte&0x01)io=1;elseio=0;sclk=1;/高電平把數據寫入DS1302_nop_();inbyte=inbyte

19、>>1;/*以下是讀一字節數據函數*/uchar read_byte()uchar i,temp=0;io=1;for(i=0;i<7;i+)sclk=0;if(io=1)temp=temp|0x80;elsetemp=temp&0x7f;sclk=1;/產生下跳沿temp=temp>>1;return (temp);/*寫DS1302函數,往DS1302的某個地址寫入數據*/void write_ds1302(uchar cmd,uchar indata)sclk=0;reset=1;write_byte(cmd);write_byte(indata);

20、sclk=0;reset=0;/*讀DS1302函數,讀DS1302某地址的的數據*/uchar read_ds1302(uchar addr)uchar backdata;sclk=0;reset=1;write_byte(addr);/先寫地址backdata=read_byte();/然后讀數據sclk=0;reset=0;return (backdata);/*以下是蜂鳴器響一聲函數*/void beep()BEEP=0;/蜂鳴器響Delay_ms(100);BEEP=1; /關閉蜂鳴器Delay_ms(100);/*以下是轉換函數,負責將走時數據轉換為適合LCD顯示的數據*/void

21、 LCD_conv (uchar in7,in5,in4,in1,in2,in3 )/形參in1、in2、in3接收實參time_buf2、time_buf1、time_buf0傳來的小時、分鐘、秒數據disp_buf0=in1/10+0x30;/小時十位數據disp_buf1=in1%10+0x30;/小時個位數據disp_buf2=in2/10+0x30;/分鐘十位數據disp_buf3=in2%10+0x30;/分鐘個位數據disp_buf4=in3/10+0x30;/秒十位數據disp_buf5=in3%10+0x30;/秒個位數據disp_buf6=2+0x30;/年千位數據disp

22、_buf7=0+0x30;/年百位數據disp_buf8=in7/10+0x30;/年十位數據disp_buf9=in7%10+0x30;/年時個位數據disp_buf10=in5/10+0x30;/月十位數據disp_buf11=in5%10+0x30;/月個位數據disp_buf12=in4/10+0x30;/日十位數據disp_buf13=in4%10+0x30;/日個位數據/*以下是LCD顯示函數,負責將函數LCD_conv轉換后的數據顯示在LCD上*/void LCD_disp ()lcd_wcmd(0x80+3);/顯示第一行lcd_wdat(disp_buf6);/顯示年千位lc

23、d_wdat(disp_buf7);/顯示年百位lcd_wdat(disp_buf8);/顯示年十位lcd_wdat(disp_buf9);/顯示年個位lcd_wdat(0x3a);lcd_wdat(disp_buf10);/顯示月十位lcd_wdat(disp_buf11);/顯示月個位lcd_wdat(0x3a);lcd_wdat(disp_buf12);/顯示日十位lcd_wdat(disp_buf13);/顯示日個位lcd_wcmd(0x44 + 0x80);/從第2行第4列開始顯示lcd_wdat(disp_buf0);/顯示小時十位lcd_wdat(disp_buf1);/顯示小時

24、個位lcd_wdat(0x3a);/顯示':'lcd_wdat(disp_buf2);/顯示分鐘十位lcd_wdat(disp_buf3);/顯示分鐘個位lcd_wdat(0x3a);/顯示':'lcd_wdat(disp_buf4);/顯示秒十位lcd_wdat(disp_buf5);/顯示秒個位/*以下是按鍵處理函數*/void KeyProcess()uchar miao16,min16,hour16,ri16,yue16,nian16;/定義16進制的分鐘和小時變量write_ds1302(0x8e,0x00);/DS1302寫保護控制字,允許寫lcd_

25、wcmd(0x0f);lcd_wcmd(0x80+0x40+12);if(K2=0)Delay_ms(10);/延時去抖if(K2=0)while(!K2);m+;if(m=7)m=1;if(K3=0)Delay_ms(10);/延時去抖if(K3=0)while(!K3);m-;if(m=0)m=6;if(m!=0)if(m=1&&K4=0)Delay_ms(10);/延時去抖if(m=1&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+8);while(!K4);beep();time_buf1=time_buf1+1;/分鐘

26、加1if(time_buf1=60) time_buf1=0;/當分鐘加到60時初始化為0min16=time_buf1/10*16+time_buf1%10;/將所得的分鐘數據轉變成16進制數據write_ds1302(0x82,min16);if(m=2&&K4=0)Delay_ms(10);/延時去抖if(m=2&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+5);while(!K4);beep();time_buf2=time_buf2+1;/小時減1if(time_buf2=24) time_buf2=0;/當變成0時

27、初始化為24hour16=time_buf2/10*16+time_buf2%10;/將所得的小時數據轉變成16進制數據write_ds1302(0x84,hour16);if(m=3&&K4=0)Delay_ms(10);/延時去抖if(m=3&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+12);while(!K4);beep();time_buf3=time_buf3+1;/日減1if(time_buf3=32) time_buf3=1;/當日加到31初始化為0ri16=time_buf3/10*16+time_buf3%10;/將

28、所得的日數據轉變成16進制數據write_ds1302(0x86,ri16);if(m=4&&K4=0)Delay_ms(10);/延時去抖if(m=4&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+9);while(!K4);beep();time_buf4=time_buf4+1;/月加1if(time_buf4=13) time_buf4=1;/當月加到12初始化為1yue16=time_buf4/10*16+time_buf4%10;/將所得的月數據轉變成16進制數據write_ds1302(0x88,yue16);if(m=5&

29、amp;&K4=0)Delay_ms(10);/延時去抖if(m=5&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+6);while(!K4);beep();time_buf6=time_buf6+1;/年減1if(time_buf6=100) time_buf6=0;/當年加到100初始化為0nian16=time_buf6/10*16+time_buf6%10;/將所得的年數據轉變成16進制數據write_ds1302(0x8C,nian16);if(m=6&&K4=0)Delay_ms(10);/延時去抖if(m=6&

30、;&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+11);while(!K4);beep();time_buf0=time_buf0+1;/秒加1if(time_buf0=60) time_buf0=0;/當秒加到60時初始化為0nian16=time_buf0/10*16+time_buf0%10;/將所得的秒數據轉變成16進制數據write_ds1302(0x80,miao16);if(m=1&&K5=0)Delay_ms(10);/延時去抖if(m=1&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x

31、80+0x40+8);while(!K5);beep();time_buf1=time_buf1-1;/分鐘減1if(time_buf1=-1) time_buf1=59;/當分鐘加到60時初始化為0min16=time_buf1/10*16+time_buf1%10;/將所得的分鐘數據轉變成16進制數據write_ds1302(0x82,min16);if(m=2&&K5=0)Delay_ms(10);/延時去抖if(m=2&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+5);while(!K5);beep();time_bu

32、f2=time_buf2-1;/小時減1if(time_buf2=-1) time_buf2=23;/當小時變成0時初始化為24hour16=time_buf2/10*16+time_buf2%10;/將所得的小時數據轉變成16進制數據write_ds1302(0x84,hour16);if(m=3&&K5=0)Delay_ms(10);/延時去抖if(m=3&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+12);while(!K5);beep();time_buf3=time_buf3-1;/日減1if(time_buf3=0) tim

33、e_buf3=31;/當日加到60時初始化為0ri16=time_buf3/10*16+time_buf3%10;/將所得的日數據轉變成16進制數據write_ds1302(0x86,ri16);if(m=4&&K5=0)Delay_ms(10);/延時去抖if(m=4&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+9);while(!K5);beep();time_buf4=time_buf4-1;/月減1if(time_buf4=0) time_buf4=12;/當月加到12時初始化為0yue16=time_buf4/10*16+ti

34、me_buf4%10;/將所得的月數據轉變成16進制數據write_ds1302(0x88,yue16);if(m=5&&K5=0)Delay_ms(10);/延時去抖if(m=5&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+6);while(!K5);beep();time_buf6=time_buf6-1;/年減1if(time_buf6=0) time_buf6=99;/當年加到60時初始化為0nian16=time_buf6/10*16+time_buf6%10;/將所得的年數據轉變成16進制數據write_ds1302(0x8

35、C,nian16);if(m=6&&K5=0)Delay_ms(10);/延時去抖if(m=6&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+11);while(!K5);beep();time_buf0=time_buf0-1;/秒減1if(time_buf0=0) time_buf0=59;/當秒加到60時初始化為0nian16=time_buf0/10*16+time_buf0%10;/將所得的秒數據轉變成16進制數據write_ds1302(0x80,miao16);/*以下是讀取時間函數,負責讀取當前的時間,并將讀取到的時間轉換為10進制數*/void get_time

溫馨提示

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

評論

0/150

提交評論