




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、#inelude#defineucharunsignedchar#defineuintunsignedint#defineleddataPO#definereadalarmsecond0 xc7定義從DS1302中讀鬧鐘秒值的命令字節(jié).#definewritealarmsecond0 xc6定義往DS1302中寫鬧鐘秒值的命令字節(jié).#definereadalarmminute0 xc5定義從DS1302中讀鬧鐘分值的命令字節(jié).#definewritealarmminute0 xc4定義往DS1302中寫鬧鐘分值的命令字節(jié).#definereadalarmhour0 xc3定義從DS1302中讀
2、鬧鐘小時值的命令字節(jié).#definewritealarmhour0 xc2定義往DS1302中寫鬧鐘小時值的命令字節(jié).sbitlcdrs=P2AO;/LCD數(shù)據(jù)/命令選擇端(H/L)sbitlcdrw=P2Al;/LCD讀/寫選擇端(H/L)sbitlcden=P2A2;/LCD使能控制sbitDQ=P3A4;蜂鳴器控制端sbitbeep=P2A3;sbitkmenu=P3A0;功能鍵sbitkup=P3Al;增人鍵sbitkdown=P3A2;減小鍵sbitkalarm=P3A3;鬧鐘查看鍵sbitdsclk=PlAl;/dsl3O2的時鐘信號端sbitdsdata=PlAO;/dsl3O2
3、的數(shù)據(jù)I/O端sbitdsrst=PlA2;/dsl3O2的復位端sbitACC7=ACCA7;定義累加器的最高和最低位。sbitACC0=ACCA0;bitflagalarm,flagseta,flagset;/分別定義鬧鐘響標志位,鬧鐘設置標志位,和時間設置標志位.ucharkmenunum,s,m,h;功能鍵被按次數(shù)的計數(shù)器.charsecond,minute,houi;year;month,day,week;ucharinittime7=0 x00z0 x00,0 xl6,0 x01,0 x05,0 x07,0 x11;初始化后設置為:年5月1口星期口,16點0分0秒,從左往右的數(shù)據(jù)依
4、次是,秒,分,時,口,月,星期,年。ucharcodetl=,20-;液晶固定顯示部分。ucharcodet2=N:ucharcodet3=nCL0CKALARM:11;各函數(shù)聲明.voiddelay(uintz);亳秒級延時函數(shù)。voiddi();蜂鳴器發(fā)聲函數(shù)。voidwritecom(ucharcom);液晶寫命令函數(shù)。voidwritedata(uchardat);液晶寫數(shù)據(jù)函數(shù)。voidwritetime(ucharaddzchardat);/液晶刷新時分秒。voidwritenyr(ucharaddzchardat);液晶刷新口期。voidwriteweek(charweek);/
5、液晶星期幾顯示函數(shù)。voidkeyscan();/鍵盤打描函數(shù)。voiddswritebyte(uchard);/往DS1302寫入一個字節(jié)。uchardsreadbyte();/從DS1302讀出一個字節(jié)。voiddswrite(ucharadd,uchardat);向DS1302的指定地址寫入一個字節(jié)。uchardsread(ucharadd);從DS1302的指定地址讀出一個字節(jié).voidinitl302time(uchar*pClock);/DS1302時間初始化函數(shù).voidinit();初始化函數(shù)。dsl8b20_delay(ucharxus);延時xusvoidwrite_one
6、char(uchardat);向18B20寫一字節(jié)ucharread_onechar();從18B20讀一字節(jié)uintread_wendu();/DS18B20讀溫度voidwendu_desplay(uintdat);/溫度值送液晶顯示函數(shù)voiddelay(uintz)亳秒級延時函數(shù)。uintx,y;for(x=z;x0;x-)for(y=110;y0;y-);dsl8b20_delay(ucharxus)延時xuswhile(xus-);voiddsl8b2OJnit()/DS18B2O初始化ucharx=0;DQ=1;dsl8b20_delay(8);DQ=0;dsl8b20_dela
7、y(80);DQ=1;dsl8b20_delay(14);x=DQ;dsl8b20_delay(20);voidwrite_onechar(uchardat)寫一字節(jié)uchari;for(i=8;i0;i-)DQ=O;if(dat&0 x01=0 x01)DQ=1;elseDQ=O;dsl8b20_delay(5);DQ=1;dsl8b20_delay(l);dat=l;ucharread_onechar()讀一字節(jié)ucharvalue=O,i;for(i=8;i0;i-)value=l;DQ=O;dsl8b20_delay(l);DQ=1;if(DQ=l)value|=0 x80;elsev
8、alue&二0 x7f;dsl8b20_delay(4);returnvalue;uintread_wendu()/DS18B20讀溫度uchara=O,b=O;uintwen=OxOOOO;dsl8b20_init();初始化write_onechar(Oxcc);/跳過讀序號列號的操作write-onechar(0 x44);/啟動溫度轉(zhuǎn)換dsl8b20_delay(150);dsl8b20_init();初始化write_onechar(Oxcc);跳過讀序號列號的操作前兩個就是溫write_onechar(Oxbe);讀取溫度寄存器等(共可讀9個寄存器)度dsl8b20_delay(1
9、50);b=read_onechar();讀取溫度值低位a=read_onechar();讀取溫度值高位wen=a;wen=(wen8)|b;returnwen;voidwendu_desplay(uintdat)溫度轉(zhuǎn)換后送顯示floattemp;unsignedchartemp_shiztemp_ge,temp_shu;temp=dat*0.625;/dat*0.0625*10temp_shi=temp/100;取十位temp除不用定義類型temp_ge=(uint)temp)%100/10;取個位temp求模要定義類型,為16位,故定義uinttemp_shu=(uint)temp)%1
10、00%10;/取小數(shù)writecom(0 x80+0 x40+10);送顯示writedata(0 x30+temp_shi);writedata(0 x30+temp_ge);writedata(0 x2e);writedata(0 x30+temp_shu);writedata(Oxdf);溫度符號writedata(0 x43);voiddi()蜂鳴器發(fā)聲函數(shù)。beep=O;delay(lOO);beep=l;voidwritecom(ucharcom)液晶寫命令函數(shù)。lcden=0;lcdrw=0;lcdrs=O;lcddata=com;delay(3);lcden=l;delay(3
11、);lcden=0;voidwritedata(uchardat)液晶寫數(shù)據(jù)函數(shù)。lcden=0;lcdrw=0;lcdrs=l;lcddata=dat;delay(3);lcden=l;delay(3);lcden=0;voidwritetime(ucharaddzchardat)液晶刷新時分秒。0為時的開始位置,3為分,6為秒。charshi,ge;shi=dat/10;ge=dat%10;writecom(0 x80+0 x40+add);writedata(0 x30+shi);writedata(0 x30+ge);voidwritenyr(ucharadd,chardat)液晶刷新
12、日期。2為年,5為月,8為口。charshi,ge;shi=dat/10;ge=dat%10;writecom(0 x80+add);writedata(0 x30+shi);writedata(0 x30+ge);voidwriteweek(charweek)液晶星期幾顯示函數(shù)。writecom(0 x80+12);switch(week)case1:writedataCMdelay;writedata(O);delay(5);writedataCN);break;case2:writedata(T);delay;writedata(U);delay(5);writedataCE);brea
13、k;case3:writedataCWdelay;writedata(E);delay(5);writedata(D);break;case4:writedata(T);delay;writedata(H,);delay(5);writedata(U);break;case5:writedata(F);delay(5);writedata(R);delay(5);writedata(T);break;case6:writedata(S);delay(5);writedata(A);delay(5);writedata(T);break;case7:writedata(S);delay;writ
14、edata(U);delay(5);writedataCN);break;voidkeyscan()鍵盤打描函數(shù)。uchari;if(flagalarm=l)如果鬧鐘在響,任意鍵停止鬧鐘響。if(kmenu=0)|(kup=O)|(kdown=0)|(kalarm=0)delay;if(kmenu=0)|(kup=O)|(kdown=0)|(kalarm=0)while(!(kmenu&kup&kdown&kalarm);di();flagalarm=O;/清除鬧鐘標志。if(kmenu=0)檢測功能鍵。delay(4);if(kmenu=0)kmenunum+;/記錄功能鍵按下次數(shù)。if(f
15、lagseta=l)/檢測是否在進行鬧鐘設置。if(kmenunum=4)kmenunum=l;/因為進行鬧鐘設置時,只調(diào)節(jié)時分秒,所以,kmenunum只能等于1,2,3。flagset=l;/設置標志位,表示在進行各種時間設置。while(!kmenu);di();switch(kmenunum)定位光標閃爍點。case1:writecom(0 x80+0 x40+7);/秒閃爍。writecom(OxOf);/開光標閃爍。break;case2:writecom(0 x80+0 x40+4);/分閃爍。break;case3:writecom(0 x80+0 x40+l);/時閃爍。br
16、eak;case4:writecom(0 x80+12);星期閃爍.break;case5:writecom(0 x80+9);口閃爍.break;case6:writecom(0 x80+6);月閃爍.break;case7:writecom(0 x80+3);年閃爍.break;case8:kmenunum=0;writecom(OxOc);/取消光標閃爍。flagset=O;取消時間調(diào)節(jié)標志。dswrite(0 x8ez0 x00);廠允許寫操作*/dswrite(0 x80,second/10*16+second%10);退出時間設置功能時,往DS1302dswrite(0 x82/m
17、inute/10*16+minute%10);中保存所有時間變量的值。dswrite(0 x84,hour/10*16+hour%10);dswrite(0 x8a,week/10*16+week%10);dswrite(0 x86,day/10*16+day%10);dswrite(0 x88,month/10*16+month%10);dswrite(0 x8c/year/10*16+year%10);dswrite(0 x8e,0 x80);廠禁止寫操作*7break;if(kmenunum!=O)只有當功能鍵按下時才檢測增人,減小鍵.if(kup=O)delay(2);if(kup=O
18、)while(ikup);di();switch(kmenunum)根據(jù)功能鍵被按下的次數(shù),調(diào)節(jié)相應數(shù)值。case1:second+;訐(second=60)second=0;writetime(7,second);writecom(0 x80+0 x40+7);/因為,上面送液晶顯示break;一次,光標后移一位,所以要將光標復位.case2:minute+;if(minute=60)minute=0;writetime(4,minute);writecom(0 x80+0 x40+4);break;case3:hour+;if(hour=24)hour=0;writetime(l,hour
19、);writecom(0 x80+0 x40+l);break;case4:week+;if(week=8)week=l;writeweek(week);writecom(0 x80+12);break;case5:day+;if(day=32)day=l;writenyr(9,day);writecom(0 x80+9);break;case6:month+;if(month=13)month=l;writenyr(6,month);writecom(0 x80+6);break;case7:year+;if(year=100)year=O;writenyr(3,year);writecom
20、(0 x80+3);break;if(kdown=0)delay(2);if(kdown=0)while(lkdown);di();switch(kmenunum)根據(jù)功能鍵被按次數(shù)調(diào)節(jié)相應數(shù)值.case1:second;if(second=-l)second=59;writetime(7,second);writecom(0 x80+0 x40+7);break;case2:minute-;if(minute=-l)minute=59;writetime(4,minute);writecom(0 x80+0 x40+4);break;case3:hour-;訐(hour=-l)hour=23
21、;writetime(l,hour);writecom(0 x80+0 x40+l);break;case4:week-;訐(week=0)week=7;writeweek(week);writecom(0 x80+12);break;case5:day-;if(day=0)day=31;writenyr(9,day);writecom(0 x80+9);break;case6:month-;訐(month=O)month=12;writenyr(6,month);writecom(0 x80+6);break;case7:year-;訐(year=-l)year=99;writenyr(3,
22、year);writecom(0 x80+3);break;if(kalarm=O)/檢測鬧鐘調(diào)節(jié)鍵是否按卜,此條if語句與if(kmenunum!=O)在同一個層次。delay(2);if(kalarm=O)flagseta=flagseta;while(!kalarm);di();if(flagseta=O)此時,退出鬧鐘設置,保存各相關數(shù)值。flagset=O;/清除時間設置標志,在if(kalarm=O)這個if語句writecom(0 x80+0 x40);中,不用flagset=l這條語句來設置/flagset標志位,因為,如果進行了鬧鐘時間的設置,就會執(zhí)行前面if(kmenunu
23、m=O)語句中的flagset=l這條語句。writedata();清除液晶上的“Ri”鬧鐘調(diào)節(jié)標志。/writedata(H);/*for(i=0;i0;i-)dsdata=ACCO;dsclk=1;為什么這里時鐘先為1后為0,因為dsclk初始化為0,而,每次循環(huán)最后,都將其置0,這樣就形成一個從0開始的上升沿,恰好滿足dsl302寫數(shù)據(jù)在上升沿,但是,時鐘必須從0開始的要求.dsclk=0;ACC=ACC1;uchardsreadbyte()/從DS1302讀出一個字節(jié)。uchari;for(i=&i0;i-)ACC=ACC1;ACC7=dsdata;dsclk=1;讀數(shù)據(jù)也一樣,雖然是
24、下降沿,但是,也要從0開始.這樣設置dsclk剛好滿足要求。dsclk=0;returnACC;voiddswrite(ucharadd,uchardat)向DS1302的指定地址寫入一個字節(jié)。dsrst=0;dsclk=0;dsrst=1;dswritebyte(add);/*先寫入地址,命令字節(jié)*/dswritebyte(dat);/*再寫lByte數(shù)據(jù)*/dsclk=1;dsrst=0;uchardsread(ucharadd)從DS1302的指定地址讀出一個字節(jié).uchardat;dsrst=0;dsclk=0;dsrst=1;dswritebyte(add);/*先寫入地址,命令字節(jié)
25、*/dat=dsreadbyte();/*再讀lByte數(shù)據(jù)*/dsclk=l;dsrst=0;returndat;voidinitl302time(uchar*pClock)/DS1302時間初始化函數(shù).uchari;ucharadd=0 x80;dswrite(0 x8e,0 x00);廠允許寫操作*7for(i=7;i0;i_)dswrite(add,*pClock);廠依次寫入秒分時日月星期年*/pClock+;add+=2;/因為DS1302同一個時鐘寄存器占兩個地址,最低位為0,是用于寫的地址,最低位為1,是用于讀的地址所以add加2.dswrite(0 x8e,0 x80);廠禁
26、止寫操作庁/voidinit()/初始化函數(shù)。ucharnum;變量初始化.flagset=O;/時間設置標志位置0,表示未進行時間設置flagseta=O;鬧鐘設置標志位置0.flagalarm=0;/鬧鐘標志位置0.kmenunum=0;/功能鍵被按次數(shù)計數(shù)器置0.lcden=0;/液晶使能端置6液晶能夠工作了./DS1302初始化。dswrite(0 x8e,0 x00);/*允許寫操作字/dswrite(writealarmsecond,0);/往DS1302中保存鬧鐘的初始時分秒值。dswrite(writealarmminute,O);dswrite(writealarmhour,
27、0);dswrite(0 x8e,0 x80);廠禁止寫操作戶/dswrite(0 x8e,0 x00);/*允許寫操作字/dswrite(0 x80,0 x00);/打開DS1302晶振,使其開始工作。dswrite(0 x84,0 x00);/設置為24小時制。initl302time(inittime);/初始化時間為:年5月1口星期口,16點0分0秒,從左往右的數(shù)據(jù)依次是,秒,分,時,口,月,星期,年。dswrite(0 x8e,0 x80);嚴禁止寫操作車/1602液晶初始化。writecom(0 x38);writecom(OxOc);writecom(0 x06);writecom(OxOl);writecom(0 x80);for(num=0;num16;num+)寫入液晶固定顯示部分。writedata(tlnum);delay(l);writecom(0 x80+0 x40);/換到液晶第二行。for(num=0;num16;num+)writedata(t2num);delay(l);vo
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋租賃明細合同書
- 伸縮縫安裝工程施工合同
- 合同訂立履行情況
- 建筑消防工程勞務分包合同
- 煙囪塔拆除施工方案
- 建筑裝飾材料及施工技術(shù)考試題及答案
- 斜坡被動網(wǎng)施工方案
- 鋼排架施工方案
- 不銹鋼護欄加工合同
- 軟土沉井施工方案
- 機械加工廠安全生產(chǎn)和環(huán)境保護應急預案
- (完整word版)A3試卷模板
- 2023年福建省中考英語聽力試題(試題卷+音頻+錄音原文)
- 公司的JMP軟件培訓教程
- 筑基功法精選
- 歐洲電力市場深度報告:歐洲電力市場供需格局和電價分析
- 橋梁實心墩(高墩) 翻模工程專項施工方案
- 寧夏水利建筑工程預算定額
- 2023年考研考博-考博英語-煤炭科學研究總院考試歷年高頻考點真題薈萃帶答案
- 吳階平醫(yī)學基金-廣東省生殖道感染的流行病學調(diào)查-王加義-2013-3-22
- 中藥制劑檢驗的依據(jù)和程序
評論
0/150
提交評論