




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 基于單片機(jī)和DS1302的電子鐘數(shù)字鐘的設(shè)計斧頭幫 2010-05-17Proteus仿真圖:C程序:/*程序名稱:基于單片機(jī)和時鐘芯片DS1302的電子時鐘程序功能: 時鐘芯片采用DS1302顯示采用液晶屏LCD1602初始時間2010-06-01 12:00程序 斧頭幫 2010.05.17*/ #include<reg51.h> /包含單片機(jī)寄存器的頭文件#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芯片的接口,復(fù)位端口定義在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ù)做好準(zhǔn)備 delaynus(2); /稍微等待,使硬件做好準(zhǔn)備 for(i=0;i<8;i+) /連續(xù)寫8個二進(jìn)制位數(shù)據(jù) DATA=dat&0x01; /取出dat的第0位數(shù)據(jù)寫入1302delaynus(2); /稍微等待,使硬件做好準(zhǔn)備SCLK=1; /上升沿寫入數(shù)據(jù)delaynus(2); /稍微等待,使硬件做好準(zhǔn)備SCLK=0; /重新拉低SCLK,形成脈沖dat>>=1; /將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備寫入下一個數(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); /稍微等待,使硬件做好準(zhǔn)備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、; /稍微等待,使硬件做好準(zhǔn)備for(i=0;i<8;i+) /連續(xù)讀8個二進(jìn)制位數(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進(jìn)行初始化設(shè)置*/ void Init_DS1302(void) WriteSet1302(0x8E,0x00); /根據(jù)寫狀態(tài)寄存器命令字,寫入不保護(hù)指令 WriteSet1302(0x80,(0/10)<
7、<4|(0%10); /根據(jù)寫秒寄存器命令字,寫入秒的初始值 /'/'除法運(yùn)算,取整;'%'取模運(yùn)算,取余 /數(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; /忙碌標(biāo)志位,將BF位定義為P0.7引腳/*函數(shù)功能:延時1ms(3j+2)*i=(3×33+2)
9、5;10=1010(微秒),可以認(rèn)為是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_(); /空操作四個機(jī)器周期,給硬件反應(yīng)時間 result=BF; /將忙碌標(biāo)志電平賦給result E=0; /將E恢復(fù)低電平 return result; /*函數(shù)功能:將模式設(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ā)生正跳變,所以應(yīng)先置"0" _nop_(); _nop_(); /空操作兩個機(jī)器周期,給硬件反應(yīng)時間 P0=dictate; /將數(shù)據(jù)送入P0口,即寫入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=0; /當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /*函數(shù)功能:指定字符
12、顯示的實際地址入口參數(shù):x*/ void WriteAddress(uchar x) WriteInstruction(x|0x80); /顯示位置的確定方法規(guī)定為"80H+地址碼x" /*函數(shù)功能:將數(shù)據(jù)(字符的標(biāo)準(zhǔn)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ā)生正跳變,所以應(yīng)先置"0" P0=y;
13、/將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=0; /當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /*函數(shù)功能:對LCD的顯示模式進(jìn)行初始化設(shè)置*/void LcdInitiate(void) delaynms(15); /延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間 WriteInstruction(0x38); /顯示模式設(shè)置:16&
14、#215;2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口delaynms(5); /延時5ms,給硬件一點(diǎn)反應(yīng)時間 WriteInstruction(0x38);delaynms(5); /延時5ms,給硬件一點(diǎn)反應(yīng)時間WriteInstruction(0x38); /連續(xù)三次,確保初始化成功delaynms(5); /延時5ms,給硬件一點(diǎn)反應(yīng)時間WriteInstruction(0x0c); /顯示模式設(shè)置:顯示開,無光標(biāo),光標(biāo)不閃爍delaynms(5); /延時5ms,給硬件一點(diǎn)反應(yīng)時間WriteInstruction(0x06); /顯示模式設(shè)置:光標(biāo)右移,字符不移delaynms(5)
15、; /延時5ms,給硬件一點(diǎn)反應(yīng)時間WriteInstruction(0x01); /清屏幕指令,將以前的顯示內(nèi)容清除delaynms(5); /延時5ms,給硬件一點(diǎn)反應(yīng)時間 /*以下是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給硬件一點(diǎn)反應(yīng)時間 /*函數(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給硬件一點(diǎn)反應(yīng)時間 /*函數(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給硬件一點(diǎn)反應(yīng)時間 /*函數(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給硬件一點(diǎn)反應(yīng)時間 /*函數(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給硬件一點(diǎn)反應(yīng)時間 /*函數(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給硬件一點(diǎn)反應(yīng)時間 /*函數(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進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒
26、、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補(bǔ)償功能。工作電壓寬達(dá)2.55.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對后背電源進(jìn)行涓細(xì)電流充電的能力。DS1302的外部引腳分配如圖1所示及內(nèi)部結(jié)構(gòu)如圖2所示。DS1302用于數(shù)據(jù)記錄,特別是對某些具有特殊意義的數(shù)據(jù)點(diǎn)的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,因此廣泛應(yīng)用于測量系統(tǒng)中。DS1302的外部引腳功能說明如圖所示:圖3 DS1302封裝圖X1,X232.768kHz晶振引腳GND地RST復(fù)位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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZSA 278-2024 軌道交通.用銑磨機(jī)器人
- 2025年度高新技術(shù)企業(yè)員工離職競業(yè)限制補(bǔ)償金合同
- 二零二五年度教育行業(yè)人才招聘定金協(xié)議
- 二零二五年度金融機(jī)構(gòu)間反洗錢合作協(xié)議
- 2025年度金融項目評審合同風(fēng)險控制
- 二零二五商場合同管理操作手冊附小時計費(fèi)服務(wù)條款
- 2025年度環(huán)保產(chǎn)業(yè)合作開發(fā)合伙協(xié)議書
- 二零二五年度供用熱力合同糾紛司法解釋及執(zhí)行難點(diǎn)解析
- 二零二五年度超市促銷活動商品陳列策劃合同
- 2025沈陽公司總經(jīng)理聘用合同全面規(guī)范管理細(xì)則
- Vue.js前端開發(fā)實戰(zhàn)(第2版)全套完整教學(xué)課件
- 2023風(fēng)力發(fā)電機(jī)組延壽評估技術(shù)規(guī)范
- 鞋業(yè)-品質(zhì)培訓(xùn)
- 小學(xué)思政課《愛國主義教育》
- 瓜豆原理【模型專題】(含答案解析)
- 單價、數(shù)量、總價-教學(xué)課件【A3演示文稿設(shè)計與制作】
- 中小學(xué)生安全教育手冊全面版
- 變電站安裝工程安全風(fēng)險分級管控清單
- DDI-能力解構(gòu)詞典
- 燃?xì)夤艿拦こ瘫O(jiān)理實施細(xì)則
- 安全經(jīng)驗分享之行車安全經(jīng)驗分享
評論
0/150
提交評論