單片機(jī)萬(wàn)年歷程序_第1頁(yè)
單片機(jī)萬(wàn)年歷程序_第2頁(yè)
單片機(jī)萬(wàn)年歷程序_第3頁(yè)
單片機(jī)萬(wàn)年歷程序_第4頁(yè)
單片機(jī)萬(wàn)年歷程序_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、單片機(jī)萬(wàn)年歷程序ttinclude 調(diào)用單片機(jī)頭義件無(wú)符號(hào)字符型宏定義 變量范W 0-255無(wú)符號(hào)字符型宏定義 變量范W 0-255無(wú)符號(hào)整型宏定義變量范困0-65535無(wú)符號(hào)整型宏定義變量范困0-65535Winclude eeprom52.hM include ,lnongli.hH bit flag_200ms;bit flag_100ms;sbit beep = P3A7;蜂鳴器定義bit flag beep en;uint clock value;用作鬧鐘用的uint clock value;用作鬧鐘用的sbit dq = P3A1;/18b20 10 I I 的定義uint tem

2、perature;溫度變量sbit dq = P3A1;/18b20 10 I I 的定義uint temperature;溫度變量uchar flag_nl;農(nóng)歷陽(yáng)歷顯示標(biāo)志位uchar menu_l,menu_2;uchar key_time,flag_value;用做連加的中間變最uchar key_time,flag_value;用做連加的中間變最bit key_500ms ;uchar n_nian.n_yue.n_ri;農(nóng)歷顯示的函數(shù)uchar n_nian.n_yue.n_ri;農(nóng)歷顯示的函數(shù)include Hdsl302.h,tinclude ”lcdl602h/把數(shù)據(jù)保存到單

3、片機(jī)內(nèi)部eeprom中/ void write_eeprom()(SectorErase(0 x2000);byte_write(0 x2000, fenl);byte_write(0 x2001, shil);byte_write(0 x2002, openl);byte_write(0 x2058/ a_a);把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*void read_eeprom()(fenl = byte_read(0 x2000);shil = byte_read(0 x2001);openl = byte_read(Ox2OO2);a_a = byte_read(0 x2058);

4、/*開(kāi)機(jī)自檢 eeprom 初始化*/void init_eeprom()read_eeprom(); 先讀if(a_a != 1)新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom(fenl = 3;openl = 1;a_a = 1;write_eeprom(); 保存數(shù)據(jù)/*“m*m*18b20 初始化函數(shù)void init_18b20()bitq;dq = l;把總線拿高delay_uint ;/15usdq = O;給岌位脈沖delay_uint(80);750usdq = l;把總線拿高等待delay_uint(10);/llOusq = dq;讀取18b20初始化信號(hào)delay_uint(20

5、);/200usdq = l;把總線拿高釋放總線寫 18b20 內(nèi)的數(shù)據(jù)void write_18b20(uchar dat)uchar i;for(i=0;i8;i+)(寫數(shù)據(jù)是低位開(kāi)頭dq = 0;把總線拿低寫時(shí)間隙開(kāi)頭dq = dat & 0 x01; /向 18b20 總線寫數(shù)據(jù)了delay_uint(5); / 60usdq = l;釋放總線讀取18b20內(nèi)的數(shù)據(jù)uchar read_18b20()(uchar Lvalue;for(i=0;i8;i+)(dq = 0;把總線拿低讀時(shí)間隙開(kāi)頭value = 1;讀數(shù)據(jù)是低位開(kāi)頭dq = 1;釋放總線if(dq = 1)開(kāi)頭讀寫數(shù)據(jù)va

6、lue | = 0 x80;delay_uint(5);彷Ous讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間return value; 返回?cái)?shù)據(jù)/讀取溫度的值讀出來(lái)的是小數(shù)uint read_temp()(uint value;uchar low;在讀取溫度的時(shí)候假如中斷的太頻繁了,就應(yīng)當(dāng)把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序init_18b20();初始化 18b20write-18b20(0 xcc);跳過(guò) 64 位 ROMwrite_18b20(0 x44); 啟動(dòng)次溫度轉(zhuǎn)換命令delay_uint(50);/500usinit_18b20();初始化18b20write_18b20(0 x

7、cc);跳過(guò)64位ROMwrite_18b20(0 xbe);發(fā)出讀取暫存器命令EA = O;low = read_18b2O();讀溫度低字節(jié)value = read_18b2O();讀溫度高字節(jié)EA=1;value = 8;把溫度的高位左移8位value |= low;把讀出的溫度低位放到value的低八位中value *=0.625;轉(zhuǎn)換到溫度值小數(shù)return value;返回讀出的溫度帶小數(shù)1ms延時(shí)函數(shù)void delay_lms(uint q)(uint ij;for(i=0;iq;i+)for(j=0;j120;j+);/*寫星期函數(shù)*/void write_week(ucha

8、r hang.uchar add,uchar week)寫星期函數(shù)(lf(hang=l)write_com(0 x80+add);elsewrite_com(0 x80+0 x40+add);switch(week)case l:writjdata(M);星期故為1時(shí).顯示write_data(0);write_data(,N,);break;case 2 write_data(T);/星期數(shù)抑;為2時(shí)顯示write_data(U);write_data(E);break;case 3:write_data(W);/星期數(shù)據(jù)為3時(shí)顯示write_data(,E,);write_data(D);

9、break;case 4:write_data(T);/星期數(shù)據(jù)為 4 是顯示write_data(H);write_data(Uj;break;case 5:write_data(Tj;/星期數(shù)據(jù)為5時(shí)顯示write_data(,R,);writjdata(T);break;case 6:write_data(S);/星期數(shù)據(jù)為 6 時(shí)顯示write_data(T);write data(A);break;case O:write_data(S);星期數(shù)據(jù)為7時(shí)顯示write_data(,U,);write_data(N);break;)/* 時(shí)鐘顯示*/void init_1602_dsl

10、302()write_sfm2_dsl302(l,l,shi);顯示時(shí)write_sfm2_dsl302(l,4Jen);顯示分writesf m 2_d si 302 (1,7, mi ao);顯示秒write_week(2z12zweek);/ write_sfml(144,week);顯示星期write_sfm3_18B20(lJl/temperature); 顯示溫度 if(flag_nl = 0) 顯示陽(yáng)歷(write_sfm2_dsl302(22nian); 顯示年 write_sfm2_dsl302(2/5,yue); 顯示月write_sfm2_dsl302(2/8/ri);/

11、顯示日else顯示農(nóng)歷(write_sfm2_dsl302(22n_nian); 顯示年write_sfm2_dsl302(2/5,n_yue); 顯示月write_sfm2_dsl302(2,&n_ri);/顯示日定時(shí)器 0 初始化程序void init_timeO()EA =1;開(kāi)總中斷TMOD = 0X01; 定時(shí)器0、工作方式1ETO =1; 開(kāi)定時(shí)器0中斷TR0 =1;允許定時(shí)器0定時(shí)/* 鬧鐘報(bào)警函數(shù)*/void menu_dis()(static uchar mm,value;if(flag_100ms = 1)/100ms 執(zhí)行一次(flag_100ms = 0;if(open

12、l = 1) 假如鬧鐘打開(kāi)(if(miao = 0) & (fen = fenl) & (shi = shil)(flag_beep_en = 1; /有報(bào)警打開(kāi)蜂鳴器響的標(biāo)志位if(flag_beep_en = 1) 鬧鐘以被打開(kāi)(clock_value+,;lf(clock_value 30)beep = 1; 蜂鳴器停1秒if(clock_value 40)clock value = 0;/ 1分鐘后自動(dòng)關(guān)閉鬧鐘value +;if(value = 10)value = 0;mm+;if(mm = 60)mm = 0;flagbeepen = 0;beep = 1;獨(dú)立按鍵程序uchar

13、 key_can;按鍵值void key() 獨(dú)立按鍵程序static uchar key_new;按鍵值還原keycan = 20;按鍵值還原P3 |=0 x78;對(duì)應(yīng)的按鍵P3 |=0 x78;對(duì)應(yīng)的按鍵10 I I輸出為1(delay_lms(l);按鍵消抖動(dòng)if(P3 & 0 x78) != 0 x78) & (keynew = 1)確認(rèn)是按鍵按下key_new = 0;switch(P3&0 x78)case 0 x70:key_can = 4;break;徂到按鍵值case 0 x68:key_can = 3;break;得到按鍵值case 0 x58:key can = 2;br

14、eak;得到按鍵偵case 0 x38:key_can = 1;break;徂到按鍵值/write_sf 1112(1,0,keycan);顯示按鍵值elsekey_new = 1;設(shè)置函數(shù)void key_with()if(key_ca n = 1)設(shè)置鍵(menu_l+;if(menu_l = 1) 設(shè)置時(shí)間(menu_2 = 1;writestringflA : : W: ”);write_string(2,0廣 20 -”);menu_2 = 1;write_string(l,O/ set clock );write_string(2,0, Y 00:00)if(menu_l 2) 回

15、到正常顯示(menu_l = 0;write_guanbiao( 1,2,0); 關(guān)閉光標(biāo) init_1602_dis_csf(); 初始化液晶顯示if(key_can = 2) 選擇罐(flag_200ms = 1;if(menu_l = 1)設(shè)置時(shí)間(menu_2 +;if(menu_2 7)menu_2 = 1;if(menu_l = 2) 設(shè)置鬧鐘(menu_2if(menu_2 3)menu_2 = 1;if(key_can = 3) 加(shi+=0 x01;if(shi&OxOf) = OxOa)shi = (shi & OxfO) + OxlO;if(shi = 0 x24)s

16、hi = 0;if(key_can = 4) 減(if(shi = 0 x00)shi = 0 x24;if(shi & OxOf) = 0 x00)shi = (shi I OxOa) - 0 x10;shiif(menu_2 = 2)/ 設(shè)置分(if(key_can = 3)加(fen+=0 x01;if (fen & OxOf) = OxOa)fen = (fen & OxfO) + 0 x10;if(fen = 0 x60)fen = 0;if(key_can = 4) 減fen = 0 x5a;if(fen & OxOf) = OxOO)fen = (fen | 0 x0a) - 0

17、 x10;fen 一;)if(menu_2 = 3)設(shè)置秒(if(key_can = 3) 加miao+=0 x01;if(miao & OxOf) = 0 x0a)miao = (miao & OxfO) + 0 x10;if(miao = 0 x60)miao = 0;if(key_can = 4) 減(if(miao = 0 x00)miao = 0 x5a;if(miao & OxOf) = 0 x00)miao = (miao | OxOa) - 0 x10; miao ;if(menu_2 = 4)設(shè)置星期if(key_can = 3) 加(week+=0 x01;if (week

18、 & OxOf) = OxOa)week = (week & OxfO) + 0 x10;iffweek = 0 x08)week = 1;if(key_can = 4) 減if(week = 0 x01)week = 0 x08;if (week & OxOf) = 0 x00)week = (week | 0 x0a) 0 x10; week-;if(menu_2 = 5)設(shè)置年if(key_can = 3)/加(nian+=0 x01;if(nian & OxOf) = 0 x0a)nian = (nian & OxfO) + 0 x10;if(nian = 0 x9a)nian = 1

19、;if(key_can = 4) 減if (nian = 0 x01)nian = 0 x9a;if(nian&OxOf) = 0 x00)nian = (nian | 0 x0a) -0 x10;nian -;if(key_can = 3) 加yue+=0 x01;if(yue & OxOf) = 0 x0a)yue = (yue & OxfO) + OxlO;if(yue = 0 x13)yue = 1;if(key_can = 4) 減if(yue = 0 x01)yue = 0 x13;if(yue & OxOf) = 0 x00)yue = (yue | 0 x0a) 0 x10;

20、yue-;if(menu_2 = 7)設(shè)置口if(key_can = 3) 加(ri+=0 x01;if(ri & OxOf) = 0 x0a)ri = (ri& OxfO) + 0 x10;if(ri = 0 x32)ri = O;if(key_can = 4) 減if(ri = 0 x01)ri = 0 x32;if(ri & OxOf) = OxOO)ri = (ri | 0 x0a) - 0 x10;write_sfm2_dsl3O2(l/2/shi);顯示時(shí)write_sfm2_dsl302(L5,fen);顯示分顯示秒write_sfm2_dsl302(l/8,miao);顯示秒顯

21、示年write_sfml(l,14,week); 顯示星期顯示年write_sfm2_dsl302(2,3,nian);write_sfm2_dsl302(2/6,yue);顯刁月write_sfm2_dsl302(2/9/ri); 顯示日switch(menu_2) 光標(biāo)顯示case 1:write_guanbiao( 1,2,1);break;case 2:write_guanbiao(l,5,l);break;case 3:write_guanbiao(l,8,l);break;case 4: write_guanbiao(l/14,l); break;case 5:write_guan

22、biao(2,3,l);break;case 6:write_guanbiao(2,6,l);break;case 7:write_guanbiao(2/9,l);break;write Jime();把時(shí)間寫進(jìn)去設(shè)置鬧仲if(menu_l = 2)if(menu_2 = 1)/設(shè)置鬧鐘開(kāi)關(guān)if(key_can = 3)openl = 1;鬧鐘開(kāi)if(key_can = 4)openl = 0;openl = 0;鬧鐘關(guān)if(menu_2 = 2)if(menu_2 = 2)設(shè)置鬧鐘時(shí)if(key_can = 3)if(key_can = 3)加shil+=0 x01;if(shil&OxOf

23、) = 0 x0a)shil = (shil&OxfO) + OxlO;if(shil= 0 x24)shil = O;if(key_can = 4) 減shil = 0 x5a;if(shil & OxOf) = 0 x00)shil = (shil I 0 x0a) - 0 x10;if(menu_2 = 3)設(shè)置杪if(key_can = 3)加fenl+=0 x01;if(fenl & OxOf) = 0 x0a)fenl = (fenl & OxfO) + 0 x10;ifffenl = 0 x60)fenl = 0;if(key_can = 4) 減if(fenl = 0 x00)

24、fenl = 0 x5a;if(fenl & OxOf) = 0 x00)fenl = (fenl | 0 x0a) - 0 x10;fenl-;if(openl = 1)write_string(2,4/Y”);elsewrite_string(2ANH);write_sfm2_dsl302(2,shil);顯示鬧鐘時(shí)write_sfm2_dsl302(2/10,fenl);顯示鬧鐘分switch(menu_2) / 光標(biāo)顯示(case 1: write_guanbiao(2/4,l); break;case 2: write_guanbiao(2,7,l); break;case 3: write_guanbiao(2,10,l); break;write_eeprom(); 保存鬧鐘時(shí)間/*,*“* 主函數(shù)void main()開(kāi)機(jī)叫一聲beep = 0; delay

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論