單片機(jī)課程設(shè)計(jì)(論文)校園作息時(shí)間控制系統(tǒng)(_第1頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)校園作息時(shí)間控制系統(tǒng)(_第2頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)校園作息時(shí)間控制系統(tǒng)(_第3頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)校園作息時(shí)間控制系統(tǒng)(_第4頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)校園作息時(shí)間控制系統(tǒng)(_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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、目錄1 系統(tǒng)設(shè)計(jì)方案與論證321設(shè)計(jì)要求322系統(tǒng)設(shè)計(jì)總體方案.32系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn).4211時(shí)鐘芯片ds12887性能簡(jiǎn)介.4212時(shí)鐘芯片讀寫(xiě)時(shí)序.6213 時(shí)間寄存器地址6214 特殊控制寄存器功能7221 液晶syb12864介紹8222 液晶與單片機(jī)的接口8223 液晶寫(xiě)操作時(shí)序9231 紅外發(fā)送與接收10232 遙控碼數(shù)據(jù)分析10233 接收電路11241電源部分電路圖 113程序設(shè)計(jì) 123 主程序流程圖122 按鍵識(shí)別.1333 課表計(jì)算1334 遙控解碼144系統(tǒng)測(cè)試與總結(jié) 16附錄1主要元器件清單.17附錄2程序清單.18附錄3原理圖與印制板圖. 35附錄4系統(tǒng)使用說(shuō)明

2、. 36附錄5系統(tǒng)實(shí)物圖片. 371系統(tǒng)設(shè)計(jì)方案與比較設(shè)計(jì)要求一、時(shí)鐘功能:能顯示年、月、日、星期、時(shí)、分、秒 二、調(diào)整功能:能校正年份、日期、時(shí)間等三、打鈴功能:按指定時(shí)間表播放音樂(lè)、現(xiàn)場(chǎng)修改作息時(shí)間表四、設(shè)置的作息時(shí)間表數(shù)據(jù)在單片機(jī)掉電后不會(huì)丟失2系統(tǒng)設(shè)計(jì)總體方案 根據(jù)設(shè)計(jì)要求實(shí)現(xiàn)的功能,可以采用不同的設(shè)計(jì)系統(tǒng)方案如下:方案一:采用單片機(jī)自帶定時(shí)器進(jìn)行計(jì)時(shí),外加存儲(chǔ)器保存課表數(shù)據(jù),普通鍵盤(pán)輸入。由于單片機(jī)進(jìn)行軟件計(jì)時(shí),硬件成本比較低,但是誤差比較大,需要校準(zhǔn),日后的維護(hù)工作量比較大。可用廉價(jià)的at24c04等存儲(chǔ)器保存數(shù)據(jù),讀寫(xiě)比較容易。對(duì)于普通的獨(dú)鍵盤(pán),設(shè)置量比較大,改用矩陣鍵盤(pán)又會(huì)占用

3、較大的電路板空間。方案二:采用實(shí)時(shí)時(shí)鐘芯片計(jì)時(shí),紅外數(shù)據(jù)輸入。時(shí)鐘芯片常見(jiàn)的有美信公司的ds1302、ds12887等前者與后者的最大區(qū)別在于有沒(méi)有自帶的備份電池。前者需要增加額外的電池以及相關(guān)的充電電路,后者ds12887本身已經(jīng)集成了鋰電池,而且掉電后相當(dāng)長(zhǎng)一段時(shí)間還可以正常走時(shí),最重要的是它還剩下114字節(jié)的非易失ram,由于有備份電池供電,相當(dāng)于一個(gè)存儲(chǔ)器,可以充分利用,而不需要增加另外的存儲(chǔ)器,減少了外圍電路。電視紅外遙控比較常見(jiàn),只要解碼出來(lái),可以充分利用面板上的多個(gè)數(shù)字鍵,接收電路也相當(dāng)簡(jiǎn)單,另外由于是非接觸式按鍵,避免了普通機(jī)械按鍵的磨損弊端。故本設(shè)計(jì)選用第二種方案總體方框圖如

4、下:?jiǎn)纹瑱C(jī)89s52時(shí)鐘芯片ds12887紅外接收頭遙控液晶顯示蜂鳴器系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)1時(shí)鐘芯片ds12887性能簡(jiǎn)介11 時(shí)鐘芯片特點(diǎn)功能簡(jiǎn)介及引腳分布如圖: 12讀寫(xiě)時(shí)序13時(shí)間寄存器地址值得注意的是上表中最后的寄存器地址0eh-7fh,這里就是剩余的144字節(jié)ram,在本設(shè)計(jì)中實(shí)際使用的是10h13h四個(gè)字節(jié),用于保存課表上午和下午的起始數(shù)據(jù)。214 特殊控制寄存器功能22液晶顯示塊部分電路221液晶syb12864功能與技術(shù)參數(shù)簡(jiǎn)介 syb12864是一種圖形點(diǎn)陣液晶顯示器,它主要由行驅(qū)動(dòng)器/ 列驅(qū)動(dòng)器及12864全點(diǎn)陣液晶顯示器組成.可完成圖形顯示,內(nèi)置漢字庫(kù),可以顯示84個(gè)(1

5、616點(diǎn)陣)漢字.主要技術(shù)參數(shù)和性能:1.電源:vdd:+5v;lcd外接驅(qū)動(dòng)電壓為 3.08.0v 2.顯示內(nèi)容:128(列)64(行)點(diǎn)3.全屏幕點(diǎn)陣4.七種指令5.與cpu接口采用8位數(shù)據(jù)總線并行輸入輸出和8條控制線.222液晶與單片機(jī)接口 外部接口信號(hào)如下表所示:管腳號(hào)管腳名稱(chēng)lever管腳功能描述1vss0v電源地2vdd5.0v電源電壓3v0-液晶顯示器驅(qū)動(dòng)電壓4rsh/lrs=“h”,表示db7db0為顯示數(shù)據(jù)rs=“l(fā)”,表示db7db0為顯示指令數(shù)據(jù)5r/wh/lr/w=“h”,e=“h”,數(shù)據(jù)被讀到db7db0r/w=“l(fā)”,e=“hl”, db7db0的數(shù)據(jù)被寫(xiě)到ir或d

6、r6eh/l使能信號(hào):r/w=“l(fā)”,e信號(hào)下降沿鎖存db7db0 r/w=“h”,e=“h” dram數(shù)據(jù)讀到 db7db0 7db0h/l數(shù)據(jù)線8db1h/l數(shù)據(jù)線9db2h/l數(shù)據(jù)線10db3h/l數(shù)據(jù)線11db4h/l數(shù)據(jù)線12db5h/l數(shù)據(jù)線13db6h/l數(shù)據(jù)線14db7h/l數(shù)據(jù)線15psbh/lh:8或4位并口,l串口(本設(shè)計(jì)中硬件置高電平)16nc17reth/l復(fù)位信號(hào),低電平復(fù)位(如不需要經(jīng)常復(fù)位可以懸空)18vout10vlcd驅(qū)動(dòng)電壓19led+-led背光板電源20led-led背光板電源數(shù)據(jù)線d0d7與單片機(jī)p0口相連,完成數(shù)據(jù)傳送。單片機(jī)p1.0與液晶rs相連

7、,控制顯示數(shù)據(jù)和顯示指令數(shù)據(jù). 單片機(jī)p1.1與液晶rw相連,控制數(shù)據(jù)讀寫(xiě). 單片機(jī)p1.2與液晶e相連,液晶rest與電源相連,控制液晶復(fù)位信號(hào)。18腳是液晶背光驅(qū)動(dòng)端,通過(guò)限流可變電阻調(diào)節(jié)對(duì)比度,由于經(jīng)過(guò)試驗(yàn)測(cè)量可變電阻大概是16k,為了方便電路布局,用15k的固定電阻。液晶與單片機(jī)接口圖223液晶寫(xiě)操作時(shí)序?qū)懖僮鲿r(shí)序r/w為低電平,cs為低電平寫(xiě)入指令,r/w為低電平,cs為高電平寫(xiě)入數(shù)據(jù)23紅外遙控231 發(fā)送與接收通用紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成。應(yīng)用編/解碼專(zhuān)用集成電路芯片來(lái)進(jìn)行控制操作,如圖 所示。發(fā)射部分包括鍵盤(pán)矩陣、編碼調(diào)制、led 紅外發(fā)送器;接收部分包括光、電轉(zhuǎn)換

8、放大器、解調(diào)、解碼電路。232 遙控碼數(shù)據(jù)分析遙控發(fā)射器專(zhuān)用芯片很多,這里我們以運(yùn)用比較廣泛,解碼比較容易的一類(lèi)來(lái)加以說(shuō)明,以東芝公司的tc9012組成發(fā)射電路為例說(shuō)明編碼原理。當(dāng)發(fā)射器按鍵按下后,即有遙控碼發(fā)出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:采用脈寬調(diào)制的串行碼,以脈寬為 0.565ms、間隔0.56ms、周期為1.125ms 的組合表示二進(jìn)制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms 的組合表示二進(jìn)制的“1”,其波形如圖 所示。遙控碼的“0”和“1” 上述“0”和“1”組成的32位二進(jìn)制碼經(jīng)38khz的載頻進(jìn)行二次調(diào)制,然后再通過(guò)紅外發(fā)射

9、二極管產(chǎn)生紅外線向空間發(fā)射。一般電視遙控器的遙控編碼是連續(xù)的32位二進(jìn)制碼組,其中前16位為用戶識(shí)別碼,能區(qū)別不同的紅外遙控設(shè)備,防止不同機(jī)種遙控碼互相干擾。后16位為8位的操作碼和8位的操作反碼,用于核對(duì)數(shù)據(jù)是否接收準(zhǔn)確。根據(jù)紅外編碼的格式,發(fā)送數(shù)據(jù)前需要先發(fā)送4.5ms的起始碼和4.5ms的結(jié)果碼作為引導(dǎo)碼。遙控串行數(shù)據(jù)編碼波形如下圖所示:233接收電路接收電路較為簡(jiǎn)單,采用一體化接收頭hs0038,濾波電容在這里可以減少電源帶來(lái)的干擾。如圖:24電源233接收電路241電源部分電路圖為達(dá)到提供穩(wěn)定5v供電電壓,變壓器采用了玩具車(chē)電池充電適配器,由于此電源只包含了全波整流電路,在此加上濾波

10、電路和穩(wěn)壓電路,如圖。3系統(tǒng)的軟件設(shè)計(jì)31主程序流程圖主程序流程圖:讀取課表數(shù)據(jù)并計(jì)算讀取時(shí)間歡迎界面時(shí)鐘與液晶復(fù)位上電顯示時(shí)間比較課表true顯示課次,播放音樂(lè)falsetrue鍵掃退出菜單選擇修改課表選擇查看課表選擇調(diào)整時(shí)間調(diào)整時(shí)間上午課表修改課表保存設(shè)置下午課表保存設(shè)置32按鍵識(shí)別為了輸入簡(jiǎn)單,用數(shù)字鍵直接輸入要設(shè)置的數(shù)字,而且沒(méi)有另外設(shè)置專(zhuān)門(mén)的光標(biāo)移位鍵,即輸入一個(gè)數(shù)字后自動(dòng)換到一個(gè)位置,如果有現(xiàn)成的不需要修改的數(shù)字,可以直接按任意非數(shù)字鍵跳過(guò)。由于進(jìn)行年月日等數(shù)據(jù)的保存時(shí)是以兩個(gè)鍵為一個(gè)單位(比如23),由此將產(chǎn)生一個(gè)問(wèn)題,怎樣保存無(wú)效的鍵值,即如果第一個(gè)鍵是無(wú)效鍵或者第二個(gè)鍵是無(wú)效

11、鍵,這個(gè)數(shù)據(jù)怎么保存。具體解決辦法如下:從遙控按鍵解碼結(jié)果可知,鍵值和數(shù)字鍵的數(shù)字對(duì)應(yīng)關(guān)系為:如果鍵值小于9(0x09),按鍵數(shù)字就是鍵值加上1,而鍵值9對(duì)應(yīng)按鍵“0”。所以兩個(gè)按鍵的要分九種情況,第一個(gè)按鍵有三種情況,無(wú)效鍵,19鍵,0鍵,第二個(gè)鍵也有三種情況,考慮到第二個(gè)鍵有可能是無(wú)效鍵,所以按第一個(gè)鍵(十位)時(shí)候要保存?zhèn)€位數(shù)字,具體賦值如下:(以年為例,year0,year1,year2分別是原值、第一次按鍵后賦值、第二次按鍵后賦值)第一個(gè)按鍵后賦值如下表:key 9(無(wú)效鍵)year1 = year0key 9(19鍵)year1 = 10*( key +1)+year0%10key

12、= 9(0鍵)year1 = year0%10第二個(gè)按鍵后賦值如下表:第一個(gè)鍵第二個(gè)鍵賦值無(wú)效鍵0鍵year2= year1/10*1019鍵0鍵year2= year1/10*100鍵0鍵year2= year1/10*10 為方便編程沒(méi)有用year2= 0無(wú)效鍵19鍵year2= year1/10*10 + key+119鍵19鍵year2= year1/10*10 + key+1 0鍵19鍵year2= key+1無(wú)效鍵無(wú)效鍵year2= year119鍵無(wú)效鍵year2= year10鍵無(wú)效鍵year2= year1事實(shí)上第二個(gè)鍵是無(wú)效鍵的情況在剛開(kāi)始已經(jīng)考慮,所以鍵值不變,可以不做處

13、理。33課表計(jì)算以上午為例,當(dāng)設(shè)定好第一節(jié)課上課時(shí)間,以后的時(shí)間在此基礎(chǔ)上往上加。第一節(jié)課下課第二節(jié)課上課第二節(jié)課下課第三節(jié)課上課第三節(jié)課下課第四節(jié)課上課第四節(jié)課下課小時(shí)增量0012223分鐘增量4555400455540實(shí)際編寫(xiě)程序計(jì)算時(shí),為了對(duì)齊,插入了無(wú)效的0值,當(dāng)然如果schedule1表同樣采用二維數(shù)組可避免此弊端,這也是當(dāng)時(shí)編程時(shí)候總體設(shè)計(jì)考慮不周造成的,以至于要修改就要改動(dòng)其很多的數(shù)據(jù)。34 遙控解碼具體解碼過(guò)程如下:通過(guò)定時(shí)器讀出相應(yīng)的高低電平,先讀出低電平,再讀出高電平,如果中間有非正常的值則重新接收。每八個(gè)位為一個(gè)字節(jié)數(shù)據(jù),總共四個(gè)有效數(shù)據(jù),最后在數(shù)碼管上顯示。#inclu

14、de #define c(x) (x*110592/120000)/便于數(shù)據(jù)分析sbit ir_pin=p36;/接收管腳unsigned char code led_tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e; /共陽(yáng)極數(shù)碼顯示碼0-f.unsigned char code led_sel=0xfe,0xfd,0xfb,0xf7; /顯示位控unsigned char led_buf4; /顯示緩沖區(qū)unsigned char led; /位選unsigned char

15、 ir_buf4; /用于保存解碼結(jié)果/=timer0() interrupt 1 using 1 /防止按鍵時(shí) led顯示閃爍 tl0=(65536-1000)%256; th0=(65536-1000)/256; /定時(shí)器0設(shè)定約1000us中斷一次,用于數(shù)碼管掃描 p0=0xff; p2=led_selled; /位選 p0=led_tabled_bufled; /段選 if(+led 3) led =0; /四個(gè)掃描完了,到第一個(gè)數(shù)碼管/=unsigned int ir_get_low() /獲取低電平時(shí)間 tl1=0; th1=0; tr1=1; while(!ir_pin ); /

16、當(dāng)p3.6為低 等待 tr1=0; return th1*256+tl1;/=unsigned int ir_get_high() /獲取高電平時(shí)間 tl1=0; th1=0; tr1=1; while(ir_pin ); /當(dāng)p3.6為高 等待 tr1=0; return th1*256+tl1;/=main()unsigned int temp;char i,j;tmod=0x11;tl0=(65536-1000)%256;th0=(65536-1000)/256; /定時(shí)器0設(shè)定約1000us中斷一次,用于數(shù)碼管掃描ea=1;et0=1;tr0=1;while(1) restart: w

17、hile(ir_pin); temp=ir_get_low();/允許有一定的誤差 if(tempc(5000) continue; /引導(dǎo)脈沖低電平4500 temp=ir_get_high(); if(tempc(5000) continue; /引導(dǎo)脈沖高電平4500 for(i=0;i4;i+) /4個(gè)字節(jié) for(j=0;j8;j+) /每個(gè)字節(jié)8位 temp=ir_get_low();/560us 低電平 if(tempc(800) goto restart; temp=ir_get_high();/560us 或 1680us 高電平 if(tempc(2000) goto re

18、start; ir_bufi=1; /先寫(xiě)“0” if(tempc(1120) ir_bufi|=0x80; /再寫(xiě)“1” led_buf0=ir_buf2&0x0f; /低四位數(shù)據(jù)碼 led_buf1=ir_buf24; /高四位數(shù)據(jù)碼 led_buf2=ir_buf0&0x0f; /低四位系統(tǒng)碼 led_buf3=ir_buf04; /高四位系統(tǒng)碼 解碼結(jié)果如下,系統(tǒng)碼為0x0e(由于設(shè)置鍵和屏顯鍵的鍵值相同,故有同樣的功能)4總結(jié)經(jīng)過(guò)各方面的測(cè)試,達(dá)到設(shè)計(jì)的要求。一、在系統(tǒng)硬件的設(shè)計(jì)方面,充分考慮了電路元器件的布局,整個(gè)系統(tǒng)板小巧精致。剛開(kāi)始用萬(wàn)能板做實(shí)驗(yàn)時(shí),紅外接收頭由于沒(méi)有使用濾波電

19、路,抗干擾能力比較弱,單片機(jī)容易進(jìn)入死機(jī)狀態(tài),經(jīng)過(guò)改進(jìn)后,恢復(fù)正常,只有極少數(shù)情況下會(huì)出現(xiàn)死機(jī),可能是電源干擾所致,如果加入看門(mén)狗電路可以避免死機(jī)。在設(shè)計(jì)的過(guò)程中,曾遇到了許多的問(wèn)題,比如內(nèi)存溢出、液晶的判忙、按鍵識(shí)別、菜單設(shè)置等,經(jīng)過(guò)了大量的調(diào)試修改工作,得以解決,在這過(guò)程中積累了寶貴的經(jīng)驗(yàn)。二、本設(shè)計(jì)還可以進(jìn)一步改進(jìn)和添加新的功能1、加入溫度測(cè)量。采用ds18b20,只占用一根單片機(jī)口線,精度也比較高。2、鬧鐘功能。ds12887上自帶鬧鐘功能。如果只是用來(lái)做普通的鬧鐘,實(shí)用性不強(qiáng),其實(shí)在本設(shè)計(jì)中可以用來(lái)打鈴,只要把課表計(jì)算好,每次上課或者下課后由單片機(jī)自動(dòng)把下一個(gè)打鈴點(diǎn)設(shè)置為鬧鐘,這樣就

20、不用單片機(jī)來(lái)比較打鈴點(diǎn)。3、加入液晶屏保功能。在沒(méi)有操作時(shí)把液晶電源關(guān)掉,當(dāng)有按鍵出現(xiàn)時(shí)點(diǎn)亮液晶,可以延長(zhǎng)液晶使用壽命,還可以節(jié)省電能。不過(guò)具體操作時(shí)候必須把液晶的電源和地線全部斷開(kāi)。4、添加任意打鈴點(diǎn),并可以刪除。其實(shí)還有一百多字節(jié)的非易失ram剩余,可以保存數(shù)據(jù)。附錄1:主要元器件清單序號(hào)名稱(chēng)型號(hào),規(guī)格數(shù)量備注1單片機(jī)at89s521at89s522電阻色環(huán)電阻10k1k20015k1211誤差10%3電容0.1uf,470uf10 uf33p,0.01 uf1000 uf221211104470 uf /25v10 uf /10v1031000uf /10v4三極管90121pnp5蜂鳴

21、器16時(shí)鐘芯片ds12cr8871ds12cr8877電視遙控器1tc90128液晶128641128649單片機(jī)插座40座1dip4010插座單排插座1sip2011排阻10k1103j12發(fā)光二極管紅色發(fā)光二極管13直流插座1三腳直流座14晶振112mhz16穩(wěn)壓管lm78051lm7805附錄:程序清單#include #define uchar unsigned char#define uint unsigned intuchar week,key,high;/12864液晶操作口sbit rs = p10; sbit rw = p11;sbit en = p12;/ds12cr887

22、操作口sbit ds = p33; sbit rw = p32;sbit as = p31;sbit cs = p30;sbit ir_pin=p35; /紅外接收uchar ir_buf4; /保存解碼數(shù)據(jù)bit enable = 1;/允許進(jìn)入設(shè)置菜單bit flag;/音樂(lè)開(kāi)關(guān)sbit buzzer = p36;/蜂鳴器uchar code schedule0213= 0, 0, 0 ,0, 1 , 0, 2, 0, 2 , 0, 2 , 0, 3 , /課表小時(shí)增量 45,0, 55,0, 40,0, 0, 0, 45,0, 55,0, 40;/課表分鐘增量uchar table6;/

23、依次為 年月 日 時(shí) 分 秒uchar table14;/依次為設(shè)置課表 上午*時(shí)*分,下午*時(shí)*分uchar idata schedule116;/上午課表uchar idata schedule216; /下午課表uchar idata displayschedule1413;/上午課表 顯示緩沖區(qū)uchar idata displayschedule2413;/下午課表 顯示緩沖區(qū)uchar code ytable=2,4; /顯示 第二行 第四行坐標(biāo)uchar code xtable=1,2,4,5,7,8;/顯示 列設(shè)置時(shí)間顯示位置uchar code xtable1=2,3,5,6

24、;/顯示 列 設(shè)置課表顯示位置/=延時(shí)=void delay(uint m) while( m-);/=/* 液晶 */=判忙= void checkbusy() rs=0; rw=1; p0=0xff; while(1) en = 1;if(p0 0x80)break;/p0的最高位為忙標(biāo)志為,h:忙,l:空閑 en = 0; en=0;/=液晶寫(xiě)指令=void writecommand(uchar command) checkbusy(); rs=0; rw=0; en=1; p0=command; /液晶數(shù)據(jù)線p0 en=0; /=液晶寫(xiě)數(shù)據(jù)=void writedata(uchar d

25、ate) checkbusy(); rs=1; rw=0; en=1; p0=date; en=0; /=液晶設(shè)置= void lcdset(void) writecommand(0x30); /基本指令集 writecommand(0x01); /清屏,ddram的地址歸零 writecommand(0x02); /地址歸位 writecommand(0x0c); /顯示開(kāi),光標(biāo)關(guān),反白關(guān) writecommand(0x06); /ddram地址加1 /=設(shè)置光標(biāo)=void cursor(uchar y,uchar x)uchar command = 0x80;writecommand(0x

26、0f);/開(kāi)光標(biāo) 閃爍 if( y = 2) y = 3; else if(y = 3) y = 2; command |= (y-1) 3; command += (x-1); writecommand(command); /=設(shè)置反白=void convert(uchar yy) /反白一行 uchar x,y,i,j; y=0x80; x=0x80; writecommand(0x36); /繪圖開(kāi) for (i=0;i32;i+) writecommand(y+);writecommand(x); for (j=0;j16;j+) writedata(0x00); y=0x80; x=

27、0x88; for (i=0;i32;i+) writecommand(y+); writecommand(x); for (j=0;j2) x= 0x88; y=( yy-3 )4)+0x80; else x=0x80; y=(yy-1)4)+0x80; writecommand(0x36); for (i=0;i16;i+) writecommand(y+);writecommand(x); for (j=0;j16;j+) /一行寬度是16的點(diǎn) writedata(0xff); writecommand(0x30); /=字符顯示=void display(uchar y, uchar

28、x, uchar *p) switch (y) case 1:writecommand(0x7f+x); break; /液晶第一行 case 2:writecommand(0x8f+x); break; /0x90+(x-1) case 3:writecommand(0x87+x);break; case 4:writecommand(0x97+x);break; default:break;while(*p) writedata(*p+); /=顯示數(shù)字=void displaynumber(uchar y,uchar x,uchar number)switch (number)/引號(hào)內(nèi)數(shù)

29、字為中文全角輸入 占據(jù)一個(gè)漢字位置case 0:display(y,x,);break; case 1:display(y,x,);break; case 2:display(y,x,);break;case 3:display(y,x,);break;case 4:display(y,x,);break;case 5:display(y,x,);break;case 6:display(y,x,);break;case 7:display(y,x,);break;case 8:display(y,x,);break;case 9:display(y,x,);break;default:bre

30、ak; /=顯示星期=void displayweek (uchar week)switch (week)case 1: display(3,3,一);break;case 2:display(3,3,二);break;case 3:display(3,3,三);break;case 4:display(3,3,四);break;case 5:display(3,3,五);break;case 6:display(3,3,六);break;case 7:display(3,3,日);break; default: break;/=顯示課次=void displaylesson (uchar l

31、esson)switch (lesson)case 1: display(3,5,第一節(jié)課);break;case 2:display(3,5,第二節(jié)課);break;case 3:display(3,5,第三節(jié)課);break;case 4:display(3,5,第四節(jié)課);break;case 5:display(3,5,第五節(jié)課);break;case 6:display(3,5,第六節(jié)課);break;case 7:display(3,5,第七節(jié)課);break; case 8:display(3,5,第八節(jié)課);break; default: break;/=顯示菜單=void m

32、enu (void)writecommand(0x01);/清屏 display(1,3,設(shè)置時(shí)間);display(2,3,查看課表);display(3,3,修改課表);display(4,3,退出菜單 ); /=顯示時(shí)間= void displaytime0(void) /靜態(tài)數(shù)據(jù) display(1, 2, 校園作息系統(tǒng));display(2, 3, 年);display(2, 6, 月); display(3, 1, 星期); display(4, 3, ); /全角輸入display(4, 6, ); void displaytime1(void) /動(dòng)態(tài)數(shù)據(jù)displaynumb

33、er(2,1,table0/10);displaynumber(2,2,table0%10);displaynumber(2,4,table1/10);displaynumber(2,5,table1%10);displaynumber(2,7,table2/10);displaynumber(2,8,table2%10);displayweek(week);displaynumber(4,1,table3/10);displaynumber(4,2,table3%10);displaynumber(4,4,table4/10);displaynumber(4,5,table4%10);dis

34、playnumber(4,7,table5/10);displaynumber(4,8,table5%10); /=/* 紅外 */=取回低電平=uint ir_get_low()tl1=0;th1=0;tr1=1;while(!ir_pin );/等待高電平到來(lái)tr1=0;return th1*256+tl1;/=取回高電平=uint ir_get_high()tl1=0;th1=0;tr1=1;while(ir_pin); /等待低電平到來(lái)tr1=0;return th1*256+tl1;/=紅外解碼=uchar ir_decode(void)uint temp; /12m 晶振uchar

35、 i,j;restart:temp=ir_get_low();if(temp5000)goto restart;/引導(dǎo)碼低電平4500ustemp=ir_get_high();if(temp5000) goto restart;/引導(dǎo)碼高電平4500us for(i=0;i4;i+) /4個(gè)字節(jié)for(j=0;j8;j+) /每個(gè)字節(jié)8位temp=ir_get_low(); /560us 低電平if(temp800) goto restart;temp=ir_get_high(); /560us 或 1680us 高電平if(temp2000)goto restart;ir_bufi=1;/右

36、移一位準(zhǔn)備寫(xiě)數(shù)據(jù),相當(dāng)于填 0if(temp1120) ir_bufi|=0x80;/若為1再填 1 return(ir_buf2); /=/* ds12cr887 */=12887寫(xiě)數(shù)據(jù)=void write_ds(uchar address,uchar date)cs = 0;as = 1;ds = 1;rw = 1;p2 = address;as = 0;rw = 0;p2 = date; /ds12cr887數(shù)據(jù)線rw = 1;as = 1;cs = 1;/=12887讀數(shù)據(jù)=uchar read_ds(uchar address) uchar date;as = 1;ds = 1;r

37、w = 1;cs = 0;p2 = address;as = 0;ds = 0;date = p2;ds = 1;as = 1;cs = 1;return date;/=/* 課表處理 */=課表計(jì)算=void schedulecount(void) uchar i; schedule10 = read_ds (0x10); /讀取課表數(shù)據(jù) schedule11 = read_ds (0x11); for(i=0;i= 60) /小時(shí)進(jìn)位 schedule1i+2+; schedule1i+3 = schedule1i+3 - 60; schedule20 = read_ds (0x12);

38、schedule21 = read_ds (0x13); for(i=0;i= 60) schedule2i+2+; schedule2i+3 = schedule2i+3 - 60; /=課表數(shù)據(jù)轉(zhuǎn)換成顯示字符=void scheduletostring(void) uchar i,j;for(i=0,j=0;i4;i+,j=j+4) /上午課表 每次轉(zhuǎn)換一行 displayschedule1i0 = schedule1j/10 + 0; displayschedule1i1 = schedule1j%10 + 0; displayschedule1i2 = :; displayschedu

39、le1i3 = schedule1j+1/10 + 0; displayschedule1i4 = schedule1j+1%10 + 0; displayschedule1i5 = -; displayschedule1i6 = -; displayschedule1i7 = schedule1j+2/10 + 0; displayschedule1i8 = schedule1j+2%10 + 0; displayschedule1i9 = :; displayschedule1i10 = schedule1j+3/10 + 0; displayschedule1i11 = schedule1j+3%10 + 0; displayschedule1i12 = 0; for(i=0,j=0;i4;i+,j

溫馨提示

  • 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)論