版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 基于單片機和DS1302的電子鐘數(shù)字鐘的設計斧頭幫 2010-05-17Proteus仿真圖:C程序:/*程序名稱:基于單片機和時鐘芯片DS1302的電子時鐘程序功能: 時鐘芯片采用DS1302顯示采用液晶屏LCD1602初始時間2010-06-01 12:00程序 斧頭幫 2010.05.17*/ #include<reg51.h> /包含單片機寄存器的頭文件#include<intrins.h> /包含_nop_()函數(shù)定義的頭文件#define uchar unsigned char#define uint unsigned int/*以下是DS1302芯片的操
2、作程序*/uchar code digit10="0123456789" /定義字符數(shù)組顯示數(shù)字sbit DATA=P11; /位定義1302芯片的接口,數(shù)據(jù)輸出端定義在P1.1引腳sbit RST=P12; /位定義1302芯片的接口,復位端口定義在P1.1引腳sbit SCLK=P10; /位定義1302芯片的接口,時鐘輸出端口定義在P1.1引腳/*函數(shù)功能:延時若干微秒入口參數(shù):n*/ void delaynus(uchar n) uchar i; for(i=0;i<n;i+) ;/*函數(shù)功能:向1302寫一個字節(jié)數(shù)據(jù)入口參數(shù):x*/ void Write13
3、02(uchar dat) uchar i; SCLK=0; /拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準備 delaynus(2); /稍微等待,使硬件做好準備 for(i=0;i<8;i+) /連續(xù)寫8個二進制位數(shù)據(jù) DATA=dat&0x01; /取出dat的第0位數(shù)據(jù)寫入1302delaynus(2); /稍微等待,使硬件做好準備SCLK=1; /上升沿寫入數(shù)據(jù)delaynus(2); /稍微等待,使硬件做好準備SCLK=0; /重新拉低SCLK,形成脈沖dat>>=1; /將dat的各數(shù)據(jù)位右移1位,準備寫入下一個數(shù)據(jù)位 /*函數(shù)功能:根據(jù)命令字,向1302寫
4、一個字節(jié)數(shù)據(jù)入口參數(shù):Cmd,儲存命令字;dat,儲存待寫的數(shù)據(jù)*/ void WriteSet1302(uchar Cmd,uchar dat) RST=0; /禁止數(shù)據(jù)傳遞 SCLK=0; /確保寫數(shù)居前SCLK被拉低RST=1; /啟動數(shù)據(jù)傳輸delaynus(2); /稍微等待,使硬件做好準備Write1302(Cmd); /寫入命令字Write1302(dat); /寫數(shù)據(jù)SCLK=1; /將時鐘電平置于已知狀態(tài)RST=0; /禁止數(shù)據(jù)傳遞 /*函數(shù)功能:從1302讀一個字節(jié)數(shù)據(jù)入口參數(shù):x*/ uchar Read1302(void) uchar i,dat;delaynus(2)
5、; /稍微等待,使硬件做好準備for(i=0;i<8;i+) /連續(xù)讀8個二進制位數(shù)據(jù) dat>>=1; /將dat的各數(shù)據(jù)位右移1位,因為先讀出的是字節(jié)的最低位if(DATA=1) /如果讀出的數(shù)據(jù)是1 dat|=0x80; /將1取出,寫在dat的最高位 SCLK=1; /將SCLK置于高電平,為下降沿讀出 delaynus(2); /稍微等待 SCLK=0; /拉低SCLK,形成脈沖下降沿 delaynus(2); /稍微等待 return dat; /將讀出的數(shù)據(jù)返回 /*函數(shù)功能:根據(jù)命令字,從1302讀取一個字節(jié)數(shù)據(jù)入口參數(shù):Cmd*/ uchar ReadSet
6、1302(uchar Cmd) uchar dat; RST=0; /拉低RST SCLK=0; /確保寫數(shù)居前SCLK被拉低 RST=1; /啟動數(shù)據(jù)傳輸 Write1302(Cmd); /寫入命令字 dat=Read1302(); /讀出數(shù)據(jù) SCLK=1; /將時鐘電平置于已知狀態(tài) RST=0; /禁止數(shù)據(jù)傳遞 return dat; /將讀出的數(shù)據(jù)返回/*函數(shù)功能: 1302進行初始化設置*/ void Init_DS1302(void) WriteSet1302(0x8E,0x00); /根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令 WriteSet1302(0x80,(0/10)<
7、<4|(0%10); /根據(jù)寫秒寄存器命令字,寫入秒的初始值 /'/'除法運算,取整;'%'取模運算,取余 /數(shù)據(jù)前四位為十位,后四位為個位,詳見寄存器表 WriteSet1302(0x82,(0/10)<<4|(0%10); /根據(jù)寫分寄存器命令字,寫入分的初始值WriteSet1302(0x84,(12/10)<<4|(12%10); /根據(jù)寫小時寄存器命令字,寫入小時的初始值WriteSet1302(0x86,(01/10)<<4|(01%10); /根據(jù)寫日寄存器命令字,寫入日的初始值WriteSet1302(0
8、x88,(06/10)<<4|(06%10); /根據(jù)寫月寄存器命令字,寫入月的初始值WriteSet1302(0x8c,(10/10)<<4|(10%10); /根據(jù)寫小時寄存器命令字,寫入小時的初始值/*以下是對液晶模塊的操作程序*/sbit RS=P20; /寄存器選擇位,將RS位定義為P2.0引腳sbit RW=P21; /讀寫選擇位,將RW位定義為P2.1引腳sbit E=P22; /使能信號位,將E位定義為P2.2引腳sbit BF=P07; /忙碌標志位,將BF位定義為P0.7引腳/*函數(shù)功能:延時1ms(3j+2)*i=(3×33+2)
9、5;10=1010(微秒),可以認為是1毫秒*/void delay1ms() unsigned char i,j; for(i=0;i<10;i+) for(j=0;j<33;j+) ; /*函數(shù)功能:延時若干毫秒入口參數(shù):n*/ void delaynms(unsigned char n) unsigned char i;for(i=0;i<n;i+) delay1ms(); /*函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)返回值:result。result=1,忙碌;result=0,不忙*/bit BusyTest(void) bit result;RS=0; /根據(jù)規(guī)定,RS為
10、低電平,RW為高電平時,可以讀狀態(tài) RW=1; E=1; /E=1,才允許讀寫 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 result=BF; /將忙碌標志電平賦給result E=0; /將E恢復低電平 return result; /*函數(shù)功能:將模式設置指令或顯示地址寫入液晶模塊入口參數(shù):dictate*/void WriteInstruction (uchar dictate) while(BusyTest()=1); /如果忙就等待 RS=0; /根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令 RW=0
11、; E=0; /E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖, / 就是讓E從0到1發(fā)生正跳變,所以應先置"0" _nop_(); _nop_(); /空操作兩個機器周期,給硬件反應時間 P0=dictate; /將數(shù)據(jù)送入P0口,即寫入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 E=0; /當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /*函數(shù)功能:指定字符
12、顯示的實際地址入口參數(shù):x*/ void WriteAddress(uchar x) WriteInstruction(x|0x80); /顯示位置的確定方法規(guī)定為"80H+地址碼x" /*函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊入口參數(shù):y(為字符常量)*/ void WriteData(uchar y) while(BusyTest()=1); RS=1; /RS為高電平,RW為低電平時,可以寫入數(shù)據(jù) RW=0; E=0; /E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖, / 就是讓E從0到1發(fā)生正跳變,所以應先置"0" P0=y;
13、/將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 E=0; /當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /*函數(shù)功能:對LCD的顯示模式進行初始化設置*/void LcdInitiate(void) delaynms(15); /延時15ms,首次寫指令時應給LCD一段較長的反應時間 WriteInstruction(0x38); /顯示模式設置:16&
14、#215;2顯示,5×7點陣,8位數(shù)據(jù)接口delaynms(5); /延時5ms,給硬件一點反應時間 WriteInstruction(0x38);delaynms(5); /延時5ms,給硬件一點反應時間WriteInstruction(0x38); /連續(xù)三次,確保初始化成功delaynms(5); /延時5ms,給硬件一點反應時間WriteInstruction(0x0c); /顯示模式設置:顯示開,無光標,光標不閃爍delaynms(5); /延時5ms,給硬件一點反應時間WriteInstruction(0x06); /顯示模式設置:光標右移,字符不移delaynms(5)
15、; /延時5ms,給硬件一點反應時間WriteInstruction(0x01); /清屏幕指令,將以前的顯示內(nèi)容清除delaynms(5); /延時5ms,給硬件一點反應時間 /*以下是1302數(shù)據(jù)的顯示程序*/*函數(shù)功能:顯示秒入口參數(shù):x*/ void DisplaySecond(uchar x) uchar i,j; /j,k,l分別儲存溫度的百位、十位和個位i=x/10; /取十位j=x%10;/取個位 WriteAddress(0x49); /寫顯示地址,將在第2行第7列開始顯示W(wǎng)riteData(digiti); /將百位數(shù)字的字符常量寫入LCDWriteData(digitj)
16、; /將十位數(shù)字的字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應時間 /*函數(shù)功能:顯示分鐘入口參數(shù):x*/ void DisplayMinute(uchar x) uchar i,j; /j,k,l分別儲存溫度的百位、十位和個位i=x/10; /取十位j=x%10; /取個位 WriteAddress(0x46); /寫顯示地址,將在第2行第7列開始顯示W(wǎng)riteData(digiti); /將百位數(shù)字的字符常量寫入LCDWriteData(digitj); /將十位數(shù)字的字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應時間 /*函數(shù)功能:顯
17、示小時入口參數(shù):x*/ void DisplayHour(unsigned char x) uchar i,j; /j,k,l分別儲存溫度的百位、十位和個位i=x/10;/取十位j=x%10;/取個位 WriteAddress(0x43); /寫顯示地址,將在第2行第7列開始顯示W(wǎng)riteData(digiti); /將百位數(shù)字的字符常量寫入LCDWriteData(digitj); /將十位數(shù)字的字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應時間 /*函數(shù)功能:顯示日入口參數(shù):x*/ void DisplayDay(uchar x) uchar i,j; /j,k,
18、l分別儲存溫度的百位、十位和個位i=x/10; /取十位j=x%10; /取個位 WriteAddress(0x0c); /寫顯示地址,將在第2行第7列開始顯示W(wǎng)riteData(digiti); /將百位數(shù)字的字符常量寫入LCDWriteData(digitj); /將十位數(shù)字的字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應時間 /*函數(shù)功能:顯示月入口參數(shù):x*/ void DisplayMonth(uchar x) uchar i,j; /j,k,l分別儲存溫度的百位、十位和個位i=x/10; /取十位j=x%10; /取個位 WriteAddress(0x09
19、); /寫顯示地址,將在第2行第7列開始顯示W(wǎng)riteData(digiti); /將百位數(shù)字的字符常量寫入LCDWriteData(digitj); /將十位數(shù)字的字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應時間 /*函數(shù)功能:顯示年入口參數(shù):x*/ void DisplayYear(uchar x) uchar i,j; /j,k,l分別儲存溫度的百位、十位和個位i=x/10; /取十位j=x%10; /取個位 WriteAddress(0x06); /寫顯示地址,將在第2行第7列開始顯示W(wǎng)riteData(digiti); /將百位數(shù)字的字符常量寫入LCDWr
20、iteData(digitj); /將十位數(shù)字的字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應時間 /*函數(shù)功能:液晶顯示年月日以及時間*/ void displaytime() uchar second,minute,hour,day,month,year; /分別儲存苗、分、小時,日,月,年 uchar ReadValue; /儲存從1302讀取的數(shù)據(jù) WriteAddress(0x01); /寫Date的顯示地址,將在第1行第2列開始顯示 WriteData('D'); /將字符常量寫入LCD WriteData('a'); /將
21、字符常量寫入LCD WriteData('t'); /將字符常量寫入LCD WriteData('e'); /將字符常量寫入LCD WriteData(':'); /將字符常量寫入LCD WriteAddress(0x08); /寫年月分隔符的顯示地址, 顯示在第1行第9列 WriteData('-'); /將字符常量寫入LCD WriteAddress(0x0b); /寫月日分隔符的顯示地址, 顯示在第1行第12列 WriteData('-'); /將字符常量寫入LCD WriteAddress(0x45); /
22、寫小時與分鐘分隔符的顯示地址, 顯示在第2行第6列 WriteData(':'); /將字符常量寫入LCD WriteAddress(0x48); /寫分鐘與秒分隔符的顯示地址, 顯示在第2行第9列 WriteData(':'); /將字符常量寫入LCD while(1) ReadValue = ReadSet1302(0x81); /從秒寄存器讀數(shù)據(jù) second =(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);/將讀出數(shù)據(jù)轉(zhuǎn)化 DisplaySecond(second); /顯示秒 Read
23、Value = ReadSet1302(0x83); /從分寄存器讀 minute =(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); /將讀出數(shù)據(jù)轉(zhuǎn)化 DisplayMinute(minute); /顯示分 ReadValue = ReadSet1302(0x85); /從分寄存器讀 hour =(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); /將讀出數(shù)據(jù)轉(zhuǎn)化 DisplayHour(hour); /顯示小時 ReadValue = ReadSet1302(0
24、x87); /從分寄存器讀 day =(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); /將讀出數(shù)據(jù)轉(zhuǎn)化 DisplayDay(day); /顯示日 ReadValue = ReadSet1302(0x89); /從分寄存器讀 month =(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); /將讀出數(shù)據(jù)轉(zhuǎn)化 DisplayMonth(month); /顯示月 ReadValue = ReadSet1302(0x8d); /從分寄存器讀 year =(ReadVal
25、ue&0x70)>>4)*10 + (ReadValue&0x0F); /將讀出數(shù)據(jù)轉(zhuǎn)化 DisplayYear(year); /顯示年 /*函數(shù)功能:主函數(shù)*/ void main(void) LcdInitiate(); /將液晶初始化 Init_DS1302(); /將1302初始化 displaytime(); /顯示時間時鐘芯片DS1302中文資料:DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒
26、、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.55.5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后背電源進行涓細電流充電的能力。DS1302的外部引腳分配如圖1所示及內(nèi)部結(jié)構(gòu)如圖2所示。DS1302用于數(shù)據(jù)記錄,特別是對某些具有特殊意義的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,因此廣泛應用于測量系統(tǒng)中。DS1302的外部引腳功能說明如圖所示:圖3 DS1302封裝圖X1,X232.768kHz晶振引腳GND地RST復位I/O數(shù)據(jù)輸入/輸出SCLK串行時鐘VCC1電池引腳VCC2主電源引腳DS1302有下列幾組寄存器: DS1302有關(guān)日歷、時間的寄存器共有12
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年建筑工程合同財務指南
- 2024年建筑施工合同詳細內(nèi)容
- 9A Unit4 Growing Up (選拔卷)-【單元測試】(譯林版)(解析版)
- 2024年戰(zhàn)略合作意向:電商平臺合作協(xié)議
- 2024城市更新!舊區(qū)改造項目合作協(xié)議
- 2024年建筑維護與保養(yǎng)合同
- 2024年彈簧墊圈購銷協(xié)議
- 2024年度聯(lián)合研發(fā)協(xié)議
- 2024年廣告設計與發(fā)布合同(含新媒體)
- 2024年修訂版:股權(quán)投資價值評估協(xié)議
- 云南省昆明市五華區(qū)2022-2023學年九年級上學期期中檢測物理試題
- 人教版四年級上冊美術(shù)教案設計-表格
- 居間人土方合同協(xié)議書
- 銀行保安服務外包采購項目投標方案技術(shù)方案(技術(shù)方案)
- 社會工作方法 個案工作 個案所需表格
- 2024屆中國一汽全球校園招聘高頻500題難、易錯點模擬試題附帶答案詳解
- 2024大連機場招聘109人高頻500題難、易錯點模擬試題附帶答案詳解
- 2024新教材高中政治 第二單元 經(jīng)濟發(fā)展與社會進步 第三課 我國的經(jīng)濟發(fā)展 3.1 堅持新發(fā)展理念教學設計 部編版必修2
- JGJ46-2005施工現(xiàn)場臨時用電安全技術(shù)規(guī)范專題理論考試試題
- 財務管理委托代理會計服務 投標文件(技術(shù)方案)
- 2024年全國高考Ⅰ卷英語試題及答案
評論
0/150
提交評論