




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、. 單片機電子時鐘設計報告1、 設計任務 本次課程設計的電子時鐘電路,是基于單片機STC89C52、時鐘芯片和液晶顯示,運用C語言編程實現。電子時鐘可以顯示日期的年、月、日和時間的時、分、秒,具有復位功能。2、 系統(tǒng)硬件設備及芯片簡介 數字電子鐘系統(tǒng)設計已經成熟,但是目前系統(tǒng)設計時基本 都是采用 LED 作為顯示電路,造成硬件電路復雜、功耗高、產 品體積龐大等特點;液晶顯示模塊由于具有低功耗、壽命長、 體積小、顯示內容豐富、價格低、接口控制方便等優(yōu)點,因此 在各類電子產品中被極廣泛地推廣和應用。字符型液晶顯示模 塊是一類專門用于顯示字母、數字、符號等點陣式液晶顯示模 塊。本系統(tǒng)設計采用字符型液
2、品顯示模塊 LCD1602 作為顯示器 件,這樣不僅簡化了系統(tǒng)的硬件設計,而且極大地提高了系統(tǒng) 的可靠性。1LCD1602 簡介字符型液晶顯示模塊 LCD1602 已經是單片機應用設計中 最常用的信息顯示器件。LCD1602 可以顯示兩行,每行 16 個 字符,采用5V 電源供電,外圍電路配置簡單,價格便宜,具 有很高的性價比。2LCD1602 功能介紹2.1 引腳功能LCD1602 采用標準 14 腳(無背光)或 16 腳(帶背光)接口,各引腳功能見表 1。表 1 引腳功能編號符號引腳說明編號符號引腳說明1VSS電源地9D2Data I/O2VDD電源正極10D3Data I/O3VL液晶顯
3、示偏壓信號11D4Data I/O4RS數據/命令選擇端12D5Data I/O5R/W讀/寫選擇端13D6Data I/O6E使能信號14D7Data I/O7D0Data I/O15BLA背光源正極8D1Data I/O16BLK背光源負極2.2 LCD1602 讀寫指令LCD1602 讀寫指令較多且較復雜,具體使用可以查相關資料,下面僅列出最常用的的一些命令:寫指令 38H:顯示模式設置;寫指令 08H:顯示關閉;寫指令 01H:顯示清屏;寫指令 06H:顯示光標移動設置;寫指令 0CH:顯示開及光標設置。2.3 LCD1602 讀寫操作時序LCD1602 讀寫操作時序總體上來說是比較簡
4、單的,掌握其有兩種方法:一種是只看時序圖,另外一種方法是直接記憶和總結讀寫時電平高低和變化。很顯然第二種更簡單和直接,下面就列出典型讀寫的時序要求,以方便編寫程序。(1) 讀狀態(tài):輸入:RSL,RWH,EH。 輸出:D0D7狀態(tài)字。(2) 寫指令:輸入:RSL,RWL,D0D7指令碼,E上升沿。輸出:無。(3)讀數據:輸入:RSH,RWH,EH。輸出:D0D7數據。(4)寫 數 據:輸入:RSH,RWL,D0D7數據,E上升沿。輸出:無。2.4 LCD1602 顯示方法液晶顯示模塊是慢速顯示器件,所以在執(zhí)行每條指令之前一定要確認模塊的忙標志為低電平(即不忙),否則該指令失效。顯示字符時,要先輸
5、入顯示字符地址,即告訴模塊在哪里顯示字符。因為寫入顯示地址時要求最高位 D7 恒定為高電平,所以實際寫入的數據應該是要顯示地址值加上 80H,即將最高位 D7 置為 1。在使用此顯示模塊時一般要對其進行初始化,設置所需要的顯示參數。液晶模塊在顯示字符時光標是自動右移的,無需人工干預。每次輸入指令前,都要判斷液晶模塊是否處于忙狀態(tài)。3數字電子鐘硬件電路設計硬件電路系統(tǒng)設計主要由單片機最小系統(tǒng)、輸入電路、輸 出電路等組成。單片機最小系統(tǒng)同所有單片機系統(tǒng),在此不作 討論。輸入電路主要時間調節(jié)電路,為簡化系統(tǒng)我們使兩個外 部中斷來調節(jié)“時”和“分”數值,即將 INT0、INT1 分別接 兩個按鈕。LC
6、D 顯示器和單片機接口電路可以采用總線方式或 者是模擬口線方式,本設計采用第二種方式,即以單片機 I/O 模擬控制信號。具體電路見圖 1,P0 口作為數據,并接上拉電 阻提升電壓,P2.0 接 LCD 的 RS 端、P2.1 接 LCD 的 R/W 端、 P2.2 接 LCD 的 E 端,“分”調節(jié)按鈕接 INT0,“時”調節(jié)按鈕 接 INT1,圖 1 省略了電源和單片機最小系統(tǒng)電路。圖 1 數字電子鐘硬件電路 3、 設計電路圖及程序1. 電路圖如下原理圖如下:2. 程序共有四段程序,用Keil仿真是程序列表如圖Regx52.h程序為:#ifndef _AT89X52_H_#define _A
7、T89X52_H_sfr P0 = 0x80;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr P1 = 0x90;sfr SCON = 0x98;sfr SBUF = 0x99;sfr P2 = 0xA0;sfr IE = 0xA8;sfr P3 = 0xB0;sfr IP = 0xB8;sfr T2CON = 0xC8;sfr T2
8、MOD = 0xC9;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;/*-P0 Bit Registers-*/sbit P0_0 = 0x80;sbit P0_1 = 0x81;sbit P0_2 = 0x82;sbit P0_3 = 0x83;sbit P0_4 = 0x84;sbit P0_5 = 0x85;sbit P0_6 = 0x86;sbit P0_7 = 0x87;/*-PCON Bit Values-*/#
9、define IDL_ 0x01#define STOP_ 0x02#define PD_ 0x02 /* Alternate definition */#define GF0_ 0x04#define GF1_ 0x08#define SMOD_ 0x80/*-TCON Bit Registers-*/sbit IT0 = 0x88;sbit IE0 = 0x89;sbit IT1 = 0x8A;sbit IE1 = 0x8B;sbit TR0 = 0x8C;sbit TF0 = 0x8D;sbit TR1 = 0x8E;sbit TF1 = 0x8F;/*-TMOD Bit Values-
10、*/#define T0_M0_ 0x01#define T0_M1_ 0x02#define T0_CT_ 0x04#define T0_GATE_ 0x08#define T1_M0_ 0x10#define T1_M1_ 0x20#define T1_CT_ 0x40#define T1_GATE_ 0x80#define T1_MASK_ 0xF0#define T0_MASK_ 0x0F/*-P1 Bit Registers-*/sbit P1_0 = 0x90;sbit P1_1 = 0x91;sbit P1_2 = 0x92;sbit P1_3 = 0x93;sbit P1_4
11、= 0x94;sbit P1_5 = 0x95;sbit P1_6 = 0x96;sbit P1_7 = 0x97;sbit T2 = 0x90; /* External input to Timer/Counter 2, clock out */sbit T2EX = 0x91; /* Timer/Counter 2 capture/reload trigger & dir ctl */*-SCON Bit Registers-*/sbit RI = 0x98;sbit TI = 0x99;sbit RB8 = 0x9A;sbit TB8 = 0x9B;sbit REN = 0x9C;sbi
12、t SM2 = 0x9D;sbit SM1 = 0x9E;sbit SM0 = 0x9F;/*-P2 Bit Registers-*/sbit P2_0 = 0xA0;sbit P2_1 = 0xA1;sbit P2_2 = 0xA2;sbit P2_3 = 0xA3;sbit P2_4 = 0xA4;sbit P2_5 = 0xA5;sbit P2_6 = 0xA6;sbit P2_7 = 0xA7;/*-IE Bit Registers-*/sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */sbit ET0 = 0xA9; /* 1=E
13、nable Timer 0 interrupt */sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */sbit ES = 0xAC; /* 1=Enable Serial port interrupt */sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */sbit EA = 0xAF; /* 0=Disable all interrupts */*-P3 Bit Registers (Mnemon
14、ics & Ports)-*/sbit P3_0 = 0xB0;sbit P3_1 = 0xB1;sbit P3_2 = 0xB2;sbit P3_3 = 0xB3;sbit P3_4 = 0xB4;sbit P3_5 = 0xB5;sbit P3_6 = 0xB6;sbit P3_7 = 0xB7;sbit RXD = 0xB0; /* Serial data input */sbit TXD = 0xB1; /* Serial data output */sbit INT0 = 0xB2; /* External interrupt 0 */sbit INT1 = 0xB3; /* Ext
15、ernal interrupt 1 */sbit T0 = 0xB4; /* Timer 0 external input */sbit T1 = 0xB5; /* Timer 1 external input */sbit WR = 0xB6; /* External data memory write strobe */sbit RD = 0xB7; /* External data memory read strobe */*-IP Bit Registers-*/sbit PX0 = 0xB8;sbit PT0 = 0xB9;sbit PX1 = 0xBA;sbit PT1 = 0xB
16、B;sbit PS = 0xBC;sbit PT2 = 0xBD;/*-T2CON Bit Registers-*/sbit CP_RL2= 0xC8; /* 0=Reload, 1=Capture select */sbit C_T2 = 0xC9; /* 0=Timer, 1=Counter */sbit TR2 = 0xCA; /* 0=Stop timer, 1=Start timer */sbit EXEN2= 0xCB; /* Timer 2 external enable */sbit TCLK = 0xCC; /* 0=Serial clock uses Timer 1 ove
17、rflow, 1=Timer 2 */sbit RCLK = 0xCD; /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */sbit EXF2 = 0xCE; /* Timer 2 external flag */sbit TF2 = 0xCF; /* Timer 2 overflow flag */*-T2MOD Bit Values-*/#define DCEN_ 0x01 /* 1=Timer 2 can be configured as up/down counter */#define T2OE_ 0x02 /* Timer 2
18、 output enable */*-PSW Bit Registers-*/sbit P = 0xD0;sbit FL = 0xD1;sbit OV = 0xD2;sbit RS0 = 0xD3;sbit RS1 = 0xD4;sbit F0 = 0xD5;sbit AC = 0xD6;sbit CY = 0xD7;/*-Interrupt Vectors:Interrupt Address = (Number * 8) + 3-*/#define IE0_VECTOR0 /* 0x03 External Interrupt 0 */#define TF0_VECTOR1 /* 0x0B T
19、imer 0 */#define IE1_VECTOR2 /* 0x13 External Interrupt 1 */#define TF1_VECTOR3 /* 0x1B Timer 1 */#define SIO_VECTOR4 /* 0x23 Serial port */#define TF2_VECTOR5 /* 0x2B Timer 2 */#define EX2_VECTOR5 /* 0x2B External Interrupt 2 */#endifLCD1602驅動程序為:#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_
20、2005_4_9#include /Port Definitions*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口/內部等待函數*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();/while(DBPort&0x80);/在用Proteus仿真時,注意用屏蔽此語句,在調用GotoXY()時,會進入死循環(huán), /可能在寫該控制字時,該模塊沒有返回寫入完
21、備命令,即DBPort&0x80=0x80 /實際硬件時打開此語句LcdEn=0;return DBPort;/向LCD寫入命令或數據*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光標返回原點void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意順序LcdEn
22、=1;_nop_();/注意順序LcdEn=0;_nop_();LCD_Wait();/設置顯示模式*#define LCD_SHOW0x04 /顯示開#define LCD_HIDE0x00 /顯示關 #define LCD_CURSOR0x02 /顯示光標#define LCD_NO_CURSOR0x00 /無光標 #define LCD_FLASH0x01 /光標閃動#define LCD_NO_FLASH0x00 /光標不閃動void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|Display
23、Mode);/設置輸入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 畫面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/移動光標或屏幕*/*#define LCD_CURSOR0x02 #define LCD_SCREEN0x08#define LCD_LEFT0x00#define LCD_RIG
24、HT0x04void LCD_Move(unsigned char object, unsigned char direction)if(object=LCD_CURSOR)LCD_Write(LCD_COMMAND,0x10|direction);if(object=LCD_SCREEN)LCD_Write(LCD_COMMAND,0x18|direction);*/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位數據端口,2行顯示,5*7點陣LCD_Write(LCD_COMMAND,0x38);LCD_Se
25、tDisplay(LCD_SHOW|LCD_NO_CURSOR); /開啟顯示, 無光標LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC遞增, 畫面不動/*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str)while(*
26、str!=0)LCD_Write(LCD_DATA,*str);str+;/*void LCD_LoadChar(unsigned char user8, unsigned char place)unsigned char i;LCD_Write(LCD_COMMAND,0x40|(place*8);for(i=0; i0; i-) DS1302_IO = ACC0; /相當于匯編中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /實時時鐘讀取一字節(jié)(內部函數) un
27、signed char i; for(i=8; i0; i-) ACC = ACC 1; /相當于匯編中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要寫的數據 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302Inp
28、utByte(ucDa); / 寫1Byte數據 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/讀取DS1302某地址的數據 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 讀1Byte數據 DS1302_CLK = 1; DS1302_RST = 0; ret
29、urn(ucData);void DS1302_SetProtect(bit flag) /是否寫保護if(flag)Write1302(0x8E,0x10);elseWrite1302(0x8E,0x00);void DS1302_SetTime(unsigned char Address, unsigned char Value) / 設置時間函數DS1302_SetProtect(0);Write1302(Address, (Value/10)Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS
30、1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x7
31、0)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);void DateToStr(SYSTEMTIME *Time)Time-DateString0 = Time-Year/10 + 0;Time-DateString1 = Time-Year%
32、10 + 0;Time-DateString2 = -;Time-DateString3 = Time-Month/10 + 0;Time-DateString4 = Time-Month%10 + 0;Time-DateString5 = -;Time-DateString6 = Time-Day/10 + 0;Time-DateString7 = Time-Day%10 + 0;Time-DateString8 = 0;void TimeToStr(SYSTEMTIME *Time)Time-TimeString0 = Time-Hour/10 + 0;Time-TimeString1 =
33、 Time-Hour%10 + 0;Time-TimeString2 = :;Time-TimeString3 = Time-Minute/10 + 0;Time-TimeString4 = Time-Minute%10 + 0;Time-TimeString5 = :;Time-TimeString6 = Time-Second/10 + 0;Time-TimeString7 = Time-Second%10 + 0;Time-DateString8 = 0;void Initial_DS1302(void)unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) DS1302_SetTime(DS1302_SECOND,0);/*void BurstWrite1302(unsigned char *pWClock)/往DS1302寫入時鐘數據(多字節(jié)方式) unsigned char
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度綠色交通優(yōu)先股入股合作協議書
- 二零二五年度科技產品銷售提成及創(chuàng)新激勵協議
- 二零二五年度金融機構資金結算服務協議
- 二零二五年度山坪塘承包合同履行中的合同糾紛解決
- 二零二五年度終止雙方在線教育平臺合作協議
- 二零二五年度海底油氣管道水平定向鉆施工合作協議
- 二零二五年度全球市場傭金分成合作協議
- 2、2024廣西專業(yè)技術人員繼續(xù)教育公需科目參考答案(97分)
- 2025年合作貨運從業(yè)資格證科目一考試答案
- 預制裝配式檢查井施工工法
- 社會階層與教育選擇行為分析-深度研究
- 2025年內蒙古呼和浩特市屬國企業(yè)紀檢監(jiān)察機構招聘工作人員80人高頻重點模擬試卷提升(共500題附帶答案詳解)
- 社會工作行政(第三版)課件匯 時立榮 第6-11章 項目管理- 社會工作行政的挑戰(zhàn)、變革與數字化發(fā)展
- 全過程工程咨詢文件管理標準
- 模特攝影及肖像使用合同協議范本
- 2025年湘潭醫(yī)衛(wèi)職業(yè)技術學院高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
- 《預制高強混凝土風電塔筒生產技術規(guī)程》文本附編制說明
- 2025福建福州地鐵集團限公司運營分公司校園招聘高頻重點提升(共500題)附帶答案詳解
- 兒童睡眠障礙治療
- 四川省建筑行業(yè)調研報告
- 北京市豐臺區(qū)2024-2025學年高三上學期期末英語試題
評論
0/150
提交評論