版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 智能裝置課程設(shè)計(jì)報(bào)告</p><p> 一、設(shè)計(jì)題目 空調(diào)控制系統(tǒng)</p><p><b> 二、設(shè)計(jì)目的</b></p><p> 1. 深入了解PIC16F877單片機(jī)的工作原理,熟練掌握匯編語(yǔ)言程序設(shè)計(jì)方法,熟練使用MPLAB-ICD仿真器及MPLAB-IDE仿真調(diào)試軟件。</p><p
2、> 通過該課程設(shè)計(jì)使學(xué)生初步掌握以單片機(jī)為核心的智能裝置設(shè)計(jì)的簡(jiǎn)單原則、步驟和方法。</p><p> 熟悉智能裝置設(shè)計(jì)中有關(guān)的硬件設(shè)計(jì)調(diào)試,如人機(jī)界面等。</p><p> 熟悉智能裝置設(shè)計(jì)中相關(guān)軟件的設(shè)計(jì)、編程和調(diào)試。</p><p><b> 三、設(shè)計(jì)內(nèi)容</b></p><p> 以16F877單
3、片機(jī)為核心,結(jié)合給出的其他原器件和智能裝置實(shí)驗(yàn)系統(tǒng)原有的內(nèi)容設(shè)計(jì)空調(diào)遙控系統(tǒng)硬件電路。</p><p> 利用實(shí)驗(yàn)系統(tǒng)提供的電機(jī)模擬空調(diào)的壓縮機(jī),按鍵及LED顯示模擬遙控器,可調(diào)電阻模擬溫度傳感器(可調(diào)電阻輸出電壓1-3V代表10-30℃)。</p><p> 編制軟件實(shí)現(xiàn)設(shè)置溫度、起??照{(diào)、溫度控制、風(fēng)速控制等功能。</p><p> 利用MAX515實(shí)現(xiàn)低
4、、中、高3檔風(fēng)速調(diào)整。</p><p> 實(shí)現(xiàn)空調(diào)溫度自動(dòng)控制,溫度高于設(shè)定溫度2度啟動(dòng)低風(fēng),高于4度啟動(dòng)中風(fēng),4度以上啟動(dòng)高風(fēng)。(選做)</p><p><b> 四、設(shè)計(jì)要求</b></p><p> 根據(jù)實(shí)驗(yàn)指導(dǎo)書的設(shè)計(jì)內(nèi)容及所給出的元件,設(shè)計(jì)空調(diào)系統(tǒng)硬件原理圖。</p><p> 按照設(shè)計(jì)好的硬件原理圖在
5、實(shí)驗(yàn)板上用導(dǎo)線搭建硬件電路。</p><p> 用萬用表檢查硬件電路連接是否正確,檢查無誤后上電并編制簡(jiǎn)單的測(cè)試程 序分步調(diào)試各部分功能。</p><p> 在各部分功能實(shí)現(xiàn)后,編制完整的空調(diào)系統(tǒng)軟件,并進(jìn)行軟硬件聯(lián)調(diào),直到達(dá)到設(shè)計(jì)要求。</p><p> 按照設(shè)計(jì)內(nèi)容要求測(cè)試儀表誤差并做分析,給出儀表精度,完成后由教師進(jìn)行驗(yàn)收檢查。</p>&
6、lt;p><b> 五、實(shí)驗(yàn)設(shè)備</b></p><p> 1. MPLAB-ICD模塊與仿真頭</p><p> 2. 智能裝置實(shí)驗(yàn)系統(tǒng)</p><p> 3. 安裝了MPLAB-IDE開發(fā)軟件的計(jì)算機(jī)</p><p><b> 4. 數(shù)字萬用表</b></p>
7、<p><b> 5. 導(dǎo)線若干</b></p><p><b> 六、實(shí)驗(yàn)項(xiàng)目</b></p><p> 1. 設(shè)計(jì)空調(diào)系統(tǒng)硬件電路</p><p> ?、?采用16F877單片機(jī),利用實(shí)驗(yàn)板上提供的電機(jī)、MAX515構(gòu)成空調(diào)系統(tǒng),利用按鍵及LED構(gòu)成控制器,可調(diào)電阻模擬溫度(可調(diào)電阻輸出電壓1-3
8、V代表10-30℃)。</p><p> ?。?)將設(shè)置的溫度值、空調(diào)工作狀態(tài)通過LED顯示</p><p> ?。?)利用MAX515輸出調(diào)整電壓,控制轉(zhuǎn)速。</p><p><b> 硬件電路連接與檢查</b></p><p> ?、艑⒃O(shè)計(jì)好的電路由指導(dǎo)老師檢查完畢后,在實(shí)驗(yàn)系統(tǒng)上用導(dǎo)線將實(shí)際的電路連接出來。<
9、;/p><p> ?、平泳€完成后對(duì)照原理圖用萬用表逐根連線檢查電路連接是否正確,特別是電源VCC和VDD有無短路。</p><p> ?、菣z查無誤后連接仿真頭后通電。</p><p> 編制軟件對(duì)硬件電路分步調(diào)試</p><p> 對(duì)數(shù)碼管顯示電路進(jìn)行調(diào)試,編制簡(jiǎn)單程序?qū)崿F(xiàn)將數(shù)據(jù)在數(shù)碼管上顯示</p><p> #i
10、nclude <pic.h></p><p> #include "temperature_header_file.h"</p><p> #define DECODE_MODE 0x09 //譯碼控制寄存器</p><p> #define INTENSITY 0x0A //亮度控制寄存器</p><
11、;p> #define SCAN_LIMIT 0x0B //掃描界限寄存器</p><p> #define SHUT_DOWN 0x0C //關(guān)斷模式寄存器</p><p> #define DISPLAY_TEST 0x0F //測(cè)試控制寄存器</p><p> #define DIG0 0x02 //DIG0</p>
12、<p> void max7219_write(unsigned char address,unsigned char dat);</p><p> void max7219_init(void);</p><p> void delay1();</p><p> void delay();</p><p> void
13、init();</p><p> int get_ad();</p><p> unsigned char a=0;</p><p> void max7219_write(unsigned char address,unsigned char dat)</p><p><b> { </b></p>
14、<p> unsigned char i;</p><p> MAX7219_LOAD=0; //拉低片選線,選中器件</p><p><b> //發(fā)送地址</b></p><p> for (i=0;i<8;i++) //移位循環(huán)8次,最高頻率為10MHz</p><p
15、><b> { </b></p><p> MAX7219_CLK=0; //清零時(shí)鐘總線</p><p> if(address&(1<<7-i))</p><p> MAX7219_DIN=1;//每次取高字節(jié)</p><p><b> else&
16、lt;/b></p><p> MAX7219_DIN=0;</p><p> MAX7219_CLK=1;//時(shí)鐘上升沿,發(fā)送地址</p><p><b> }</b></p><p><b> //發(fā)送數(shù)據(jù)</b></p><p> for
17、 (i=0;i<8;i++)</p><p><b> {</b></p><p> MAX7219_CLK=0;</p><p> if(dat&(1<<7-i))</p><p> MAX7219_DIN=1;//(bit)(data&0x80); //每次取高字節(jié)&
18、lt;/p><p><b> else</b></p><p> MAX7219_DIN=0;</p><p> MAX7219_CLK=1;//時(shí)鐘上升沿,發(fā)送數(shù)據(jù)</p><p><b> }</b></p><p> MAX7219_LOAD=1;
19、//發(fā)送結(jié)束,上升沿鎖存數(shù)據(jù)</p><p><b> }</b></p><p> void max7219_init(void)</p><p><b> {</b></p><p> TRISD=0x00;</p><p> PORTD=0x00;&
20、lt;/p><p> MAX7219_LOAD=1;</p><p> max7219_write(SHUT_DOWN,0x01); //開啟正常工作模式(0xX1)</p><p> max7219_write(DISPLAY_TEST,0x00); //選擇工作模式(0xX0)</p><p> max7219_write(DE
21、CODE_MODE,0xFF); //選用全譯碼模式</p><p> max7219_write(SCAN_LIMIT,0x03); //只用前4只LED ;這里沒問題</p><p> max7219_write(INTENSITY,0x04); //設(shè)置初始亮度</p><p><b> }</b></p>
22、;<p> void main(void)</p><p><b> {</b></p><p> unsigned char i; </p><p> max7219_init();//MAX7219初始化</p><p><b> init();</b><
23、/p><p><b> while(1)</b></p><p><b> {</b></p><p> a=get_ad();</p><p> max7219_write(0x02,a);//數(shù)碼管顯示</p><p> max7219_write(0x04,a)
24、;//數(shù)碼管顯示</p><p><b> delay1();</b></p><p><b> } </b></p><p><b> }</b></p><p> void delay1()</p><p><b> {<
25、/b></p><p> for(int i=20000;i>0;i--);</p><p><b> }</b></p><p> void init()</p><p><b> {</b></p><p> TRISA=0x01;//A口RA0輸入
26、</p><p> TRISC=0x00;</p><p> PORTA=0x00;</p><p> PORTC=0x00;</p><p> ADCON0=0x41;//0100 0001 8倍fosc 0通道 開ad</p><p> ADCON1=0x0e;//0000 1110 adfm=0 直
27、接讀低8位 1110 選擇RA0</p><p><b> delay();</b></p><p><b> }</b></p><p> int get_ad()</p><p><b> {</b></p><p> int adval;
28、</p><p><b> ADGO=1;</b></p><p> while(ADGO)</p><p><b> {;}</b></p><p> adval=ADRESH;</p><p> return adval;</p><p>
29、;<b> }</b></p><p> void delay()</p><p><b> {</b></p><p> for(int i=500;i>0;i--);</p><p><b> }</b></p><p> 編制
30、MAX515程序,驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)。</p><p> #include <pic.h></p><p> #include "temperature_header_file.h"</p><p> void max515_write(unsigned char data)</p><p><b>
31、 { </b></p><p> unsigned char i;</p><p> MAX515_CS=0; //拉低片選線,選中器件</p><p><b> //發(fā)送地址</b></p><p> for (i=0;i<8;i++) //移位循環(huán)8次,最高頻率為10
32、MHz</p><p><b> { </b></p><p> MAX515_SCLK=0; //清零時(shí)鐘總線</p><p> if(data&(1<<11-i))</p><p> MAX515_DIN=1;//每次取高字節(jié)</p><p>&
33、lt;b> else</b></p><p> MAX515_DIN=0;</p><p> MAX515_SCLK=1;//時(shí)鐘上升沿,發(fā)送地址</p><p><b> }</b></p><p> MAX515_CS=1;//發(fā)送結(jié)束,上升沿鎖存數(shù)據(jù)</p&g
34、t;<p><b> }</b></p><p> void max515_init(void)</p><p><b> {</b></p><p> TRISD=0x00;</p><p> PORTD=0x00;</p><p> MAX515
35、_CS=1;</p><p> MAX515_SCLK=0;</p><p><b> }</b></p><p> void main(void)</p><p><b> {</b></p><p> max515_init();
36、 //MAX515初始化</p><p><b> while(1)</b></p><p><b> {</b></p><p> max515_write(0x00AF);//0x00FF--4.69V,0x00CF--2.53V,0x00AF--1.27V,0x00--0V</p>
37、<p><b> } </b></p><p><b> }</b></p><p> 編制按鍵程序,控制顯示和電機(jī)的起停。</p><p> #include <pic.h></p><p> #include "temperature_header_f
38、ile.h"</p><p> int ONOFF=0;//0--off,1--on</p><p> int MANAUTO=0;//0--manual,1--auto</p><p> int SPEEDCTRL=0;</p><p> int TEMPCTRL=20;</p><p>
39、; void key_init();</p><p> void key_onoff();</p><p> void key_ctrl();</p><p> void key_manauto();</p><p> void delay();</p><p> void main(void)</p
40、><p><b> {</b></p><p><b> while(1)</b></p><p><b> {;}</b></p><p><b> }</b></p><p> void key_onoff()</p
41、><p><b> {</b></p><p> if(RC3==1 && ONOFF==0)//按下開</p><p><b> {</b></p><p><b> delay();</b></p><p> if(RC3=
42、=1)</p><p> {ONOFF=1;} </p><p><b> }</b></p><p> if(RC3==1 && ONOFF==1)//再按下關(guān)</p><p><b> {</b></p><p><b> del
43、ay();</b></p><p> if(RC3==1)</p><p> {ONOFF=0;}</p><p><b> }</b></p><p><b> }</b></p><p> void key_manauto()</p>
44、<p><b> {</b></p><p> if(ONOFF==1)</p><p><b> {</b></p><p> if(RC2==0 && MANAUTO==0)//手動(dòng)切自動(dòng)</p><p><b> {</b><
45、;/p><p><b> delay();</b></p><p> if(RC2==0)</p><p> {MANAUTO==1;}</p><p><b> }</b></p><p> if(RC2==0 && MANAUTO==1)//自動(dòng)
46、切手動(dòng)</p><p><b> {</b></p><p><b> delay();</b></p><p> if(RC2==0)</p><p> {MANAUTO==0;}</p><p><b> }</b></p>
47、<p><b> }</b></p><p><b> }</b></p><p> void key_ctrl()</p><p><b> {</b></p><p> if(ONOFF==1 && MANAUTO==0)//開
48、且為手動(dòng),上下鍵調(diào)整風(fēng)速</p><p><b> {</b></p><p> if(RC0==0 && SPEEDCTRL>=0)</p><p><b> {</b></p><p><b> delay();</b></p>
49、<p> if(RC0==0)</p><p><b> {</b></p><p> SPEEDCTRL=SPEEDCTRL-1;</p><p><b> }</b></p><p><b> }</b></p><p> i
50、f(RC1==0 && SPEEDCTRL<=3)</p><p><b> {</b></p><p><b> delay();</b></p><p> if(RC1==0)</p><p><b> {</b></p><
51、;p> SPEEDCTRL=SPEEDCTRL+1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(ONOFF==1 && MANAUTO==1)/
52、/開且為自動(dòng),上下鍵調(diào)整溫度</p><p><b> {</b></p><p> if(RC0==0 && SPEEDCTRL>=10)</p><p><b> {</b></p><p><b> delay();</b></p&g
53、t;<p> if(RC0==0)</p><p><b> {</b></p><p> TEMPCTRL=TEMPCTRL-1;</p><p><b> }</b></p><p><b> }</b></p><p>
54、if(RC1==0 && SPEEDCTRL<=30)</p><p><b> {</b></p><p><b> delay();</b></p><p> if(RC1==0)</p><p><b> {</b></p>&
55、lt;p> TEMPCTRL=TEMPCTRL+1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>&
56、lt;p> void key_init()</p><p><b> {</b></p><p> TRISC=0x00;</p><p> PORTC=0xFF;</p><p> TRISC=0xFF;</p><p><b> }</b></p&
57、gt;<p> void delay()</p><p><b> {</b></p><p> for(int i=2000;i>0;i--);</p><p><b> }</b></p><p> ?、?每部分編制結(jié)束并調(diào)試通過后,與前面的程序依次連接成大程序并調(diào)
58、試出結(jié)果,最終完成整個(gè)程序的編制與調(diào)試。</p><p> 該部分程序?qū)⒃诘诰挪糠殖绦蚯鍐沃谐尸F(xiàn)。</p><p> 儀表軟硬件聯(lián)調(diào)實(shí)現(xiàn)要求的功能</p><p> ⑴ 將各部分程序進(jìn)行組合,逐項(xiàng)實(shí)現(xiàn)設(shè)計(jì)要求的功能。</p><p> 我們編寫程序的順序與上述步驟不完全相同。首先,我們實(shí)現(xiàn)了四個(gè)按鍵的所有邏輯功能,并在按鍵子程序中提供
59、了其他模塊接入的接口。再按照先調(diào)試輸入部分、后調(diào)試輸出部分的順序進(jìn)行程序的編寫,第二步實(shí)現(xiàn)了電壓信號(hào)的A/D轉(zhuǎn)換并將數(shù)字信號(hào)輸入PIC單片機(jī),接下來實(shí)現(xiàn)了按鍵通過MAX515芯片及驅(qū)動(dòng)電路對(duì)電機(jī)的轉(zhuǎn)速有級(jí)調(diào)節(jié),最后實(shí)現(xiàn)了將溫度LED數(shù)碼管顯示的功能。</p><p> ⑵ 功能完成后用萬用表對(duì)可調(diào)電阻輸出和溫度顯示對(duì)應(yīng)取若干個(gè)點(diǎn)記錄實(shí)驗(yàn)結(jié)果。</p><p> 利用MATLAB對(duì)以上數(shù)
60、據(jù)進(jìn)行分析,可以看出電壓與溫度采集的A/D信號(hào)呈線性關(guān)系。</p><p><b> ⑶ 編制使用說明</b></p><p> 我組設(shè)計(jì)的溫度自動(dòng)控制空調(diào)裝置由以下幾部分組成:溫度傳感器(用電壓信號(hào)模擬)、溫度顯示、空調(diào)壓縮機(jī)(用電機(jī)模擬)、遙控器(用按鍵模擬)等幾部分組成。下面簡(jiǎn)要介紹遙控器(按鍵)部分的使用方法,并簡(jiǎn)要說明數(shù)碼管顯示功能。</p>
61、<p> 按鍵共有四個(gè),分別為開關(guān)鍵、自動(dòng)/手動(dòng)切換鍵、加溫度鍵(自動(dòng)模式)/加風(fēng)速鍵(手動(dòng)模式)、減溫度鍵(自動(dòng)模式)/減網(wǎng)速鍵(手動(dòng)模式)。初始狀態(tài)空調(diào)為關(guān),電機(jī)停轉(zhuǎn)。按下開關(guān)鍵一次,空調(diào)處于ON狀態(tài),再按開關(guān)鍵一次,空調(diào)處于OFF狀態(tài)。在空調(diào)處于ON狀態(tài)時(shí),默認(rèn)空調(diào)處于手動(dòng)模式,且風(fēng)速為最小。風(fēng)速分為0、1、2、3四個(gè)控制檔,0為停止,3為最大。當(dāng)空調(diào)處于手動(dòng)模式時(shí),每按下一次加風(fēng)速鍵,風(fēng)速增大一檔,達(dá)到3以后再按
62、下該鍵,風(fēng)速不再增大;每按下一次減風(fēng)速鍵,風(fēng)速減小一檔,達(dá)到0以后再按下該鍵,風(fēng)速不再減小。若在手動(dòng)模式時(shí)按下自動(dòng)/手動(dòng)切換鍵,則空調(diào)進(jìn)入自動(dòng)溫控工作模式,系統(tǒng)初始設(shè)定溫度為20度。每按下一次加溫度鍵,設(shè)定溫度增加一度,達(dá)到30度后不再增加;每按下一次減速溫度鍵,設(shè)定溫度減小一度,達(dá)到10度后不再減小。自動(dòng)溫控的方式為:當(dāng)環(huán)境溫度低于設(shè)定溫度時(shí),風(fēng)速置為0檔;當(dāng)環(huán)境溫度高于設(shè)定溫度2度以內(nèi)時(shí),風(fēng)速置為1檔;當(dāng)環(huán)境溫度高于設(shè)定溫度2度至4
63、度時(shí),風(fēng)速置為2檔;當(dāng)環(huán)境溫度高于設(shè)定溫度4度以上時(shí),風(fēng)速置為3檔。當(dāng)空調(diào)處于ON狀態(tài)時(shí),不論處于哪種工作狀態(tài),一旦按下開關(guān)鍵,系統(tǒng)停止運(yùn)行,并且</p><p> 數(shù)碼管顯示部分:左邊的兩個(gè)數(shù)碼管不論空調(diào)處于開/關(guān)狀態(tài),始終顯示環(huán)境溫度(10度~30度),起到溫度計(jì)的作用。右邊的兩個(gè)數(shù)碼管當(dāng)處于手動(dòng)模式時(shí),左側(cè)的數(shù)碼管將顯示風(fēng)速檔位,右側(cè)的始終顯示0;當(dāng)處于自動(dòng)模式時(shí),顯示設(shè)定溫度。</p>&
64、lt;p><b> ?、?誤差分析</b></p><p> 本套智能空調(diào)設(shè)置我們采用0~5V電壓信號(hào)作為模擬輸入信號(hào),經(jīng)PIC單片機(jī)的片內(nèi)集成A/D轉(zhuǎn)換后變?yōu)?位的數(shù)字信號(hào),相當(dāng)于0V對(duì)應(yīng)數(shù)字量0x00,5V對(duì)應(yīng)數(shù)字量0xFF。我們將數(shù)字量信號(hào)除以5,使得數(shù)字量變?yōu)?~50(51只對(duì)應(yīng)0xFF一個(gè)數(shù)字量,故忽略),正好對(duì)應(yīng)0℃至50℃溫度,即0V對(duì)應(yīng)0℃,5V對(duì)應(yīng)5℃,A/D轉(zhuǎn)換是
65、線性變換,故取一部分轉(zhuǎn)換結(jié)果,其對(duì)應(yīng)關(guān)系也為線性,即1V對(duì)應(yīng)10℃,3V對(duì)應(yīng)30℃,即符合設(shè)計(jì)要求。</p><p> 誤差分析:由于對(duì)數(shù)字信號(hào)除5取整,故顯示的溫度值為向下取整,損失了部分精度。最大測(cè)量誤差為:</p><p> 調(diào)試的步驟及調(diào)試過程中出現(xiàn)的問題和解決的方法</p><p> 調(diào)試步驟已經(jīng)在上一部分進(jìn)行過介紹,故不贅述。下面說明在調(diào)試過程中出
66、現(xiàn)的問題和解決的方法。這一次課程設(shè)計(jì)遇到的最大問題就是MAX7219的寫入問題。7219的寫入順序?yàn)椋合壤虲S片選信號(hào),在每個(gè)時(shí)鐘信號(hào)上升沿發(fā)送一位數(shù)據(jù),并將數(shù)據(jù)移位,循環(huán)16次。為使程序清晰易讀,對(duì)輸出端口采用宏定義方式,然而在調(diào)試中我們發(fā)現(xiàn)PICC編譯器無法識(shí)別該宏定義,導(dǎo)致MAX7219的控制時(shí)序邏輯錯(cuò)誤,浪費(fèi)了我們很多的時(shí)間。將宏定義去掉,改用實(shí)際端口表示后,該問題解決。</p><p> 八、軟件設(shè)
67、計(jì)流程圖及帶注釋的全部程序的清單</p><p> ///////////////temperature_header_file.h///////////////</p><p> #include <pic.h></p><p> //Define MAX7219</p><p> #define MAX7219_DIN
68、 RD2</p><p> #define MAX7219_LOAD RD0</p><p> #define MAX7219_CLK RD1</p><p> //Define MAX515</p><p> #define MAX515_DIN RD5</p><p> #define MAX515_SC
69、LK RD4</p><p> #define MAX515_CS RD3</p><p> //Define Analog Input</p><p> #define AINPUT RA0</p><p> ///////////////ad.c///////////////</p><p> #incl
70、ude <pic.h></p><p> #include "temperature_header_file.h"</p><p> char get_ad()</p><p><b> {</b></p><p> char adval;</p><p>
71、<b> ADGO=1;</b></p><p> while(ADGO)</p><p><b> {;}</b></p><p> adval=ADRESH;</p><p> return adval;</p><p><b> }</b&
72、gt;</p><p> ///////////////delay.c///////////////</p><p> void delay_short(int x)</p><p><b> {</b></p><p><b> int i;</b></p><p>
73、; for(;x>0;x--)</p><p><b> {</b></p><p> for(i=100;i>0;i--)</p><p><b> {;}</b></p><p><b> }</b></p><p><b
74、> }</b></p><p> void delay_long(int x)</p><p><b> {</b></p><p><b> int i;</b></p><p> for(;x>0;x--)</p><p><b&g
75、t; {</b></p><p> for(i=1000;i>0;i--)</p><p><b> {;}</b></p><p><b> }</b></p><p><b> }</b></p><p> /////
76、//////////init.c///////////////</p><p> #include <pic.h></p><p> #include "temperature_header_file.h"</p><p> void init()</p><p><b> {</b&g
77、t;</p><p> //AD輸入、按鍵輸入、LED顯示輸出 初始化</p><p> TRISA=0x01;//RA0作為模擬量輸入接口</p><p> PORTA=0x00;</p><p> TRISC=0x0F;//RC0~RC3為四個(gè)按鍵輸入,RC4~RC7為四個(gè)LED燈顯示</p><p&g
78、t; PORTC=0x00;</p><p> ADCON0=0x41;//0100 0001 8倍fosc 0通道 開ad</p><p> ADCON1=0x0e;//0000 1110 adfm=0 直接讀低8位 1110 選擇RA0</p><p> //MAX515,MAX7219接口初始化</p><p> TRIS
79、D=0x00;//RD0~RD2為MAX7219接口,RD3~RD5為MAX515接口</p><p> PORTD=0x1B;//0b xx 011 011//要檢查!!!</p><p><b> }</b></p><p> ///////////////key.c///////////////</p>
80、<p> #include <pic.h></p><p> #include "temperature_header_file.h"</p><p> extern char ONOFF;//0--off,1--on</p><p> extern char MANAUTO;//0--manual,1--
81、auto</p><p> extern char SPEEDCTRL;//風(fēng)速控制,初始值為0檔(停轉(zhuǎn))</p><p> extern char TEMPCTRL;//設(shè)定溫度值,初始值為20度</p><p> extern char BTEMP;</p><p> void delay_short(int x);<
82、;/p><p> void delay_long(int x);</p><p> /*void main(void)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {;}</b>
83、;</p><p><b> }*/</b></p><p> void key_onoff()</p><p><b> {</b></p><p> if(RC3==0 && ONOFF==0)//按下開</p><p><b>
84、{</b></p><p> delay_short(2);</p><p> if(RC3==0 && ONOFF==0)</p><p><b> {</b></p><p><b> ONOFF=1;</b></p><p> de
85、lay_long(20);//會(huì)不會(huì)延時(shí)太長(zhǎng)?</p><p><b> }</b></p><p><b> }</b></p><p> if(RC3==0 && ONOFF==1)//再按下關(guān)</p><p><b> {</b><
86、/p><p> delay_short(2);</p><p> if(RC3==0 && ONOFF==1)</p><p><b> {</b></p><p><b> ONOFF=0;</b></p><p> delay_long(20);&l
87、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void key_manauto()</p><p><b> {</b></p&
88、gt;<p> if(ONOFF==1)</p><p><b> {</b></p><p> if(RC2==0 && MANAUTO==0)//手動(dòng)切自動(dòng)</p><p><b> {</b></p><p> delay_short(2);<
89、/p><p> if(RC2==0 && MANAUTO==0)</p><p><b> {</b></p><p> MANAUTO=1;</p><p> delay_long(20);</p><p><b> }</b></p>
90、<p><b> }</b></p><p> if(RC2==0 && MANAUTO==1)//自動(dòng)切手動(dòng)</p><p><b> {</b></p><p> delay_short(2);</p><p> if(RC2==0 &&
91、 MANAUTO==1)</p><p><b> {</b></p><p> MANAUTO=0;</p><p> delay_long(20);</p><p><b> }</b></p><p><b> }</b></
92、p><p><b> }</b></p><p><b> }</b></p><p> void key_ctrl()</p><p><b> {</b></p><p> if(ONOFF==1 && MANAUTO==0
93、)//開且為手動(dòng),上下鍵調(diào)整風(fēng)速</p><p><b> {</b></p><p> if(RC0==0 && SPEEDCTRL>0)//原來為大于等于0,貌似不對(duì),因?yàn)榈扔?時(shí)不能再減1了</p><p><b> {</b></p><p> dela
94、y_short(2);</p><p> if(RC0==0 && SPEEDCTRL>0)</p><p><b> {</b></p><p> SPEEDCTRL=SPEEDCTRL-1;</p><p> delay_long(20);</p><p><
95、;b> }</b></p><p><b> }</b></p><p> if(RC1==0 && SPEEDCTRL<3)//原來為小于等于3,貌似不對(duì),因?yàn)榈扔?時(shí)不能再加1了</p><p><b> {</b></p><p> de
96、lay_short(2);</p><p> if(RC1==0 && SPEEDCTRL<3)</p><p><b> {</b></p><p> SPEEDCTRL=SPEEDCTRL+1;</p><p> delay_long(20);</p><p>&
97、lt;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(ONOFF==1 && MANAUTO==1)//開且為自動(dòng),上下鍵調(diào)整溫度</p><p><b> {<
98、;/b></p><p> if(RC0==0 && TEMPCTRL>10)//判斷條件改動(dòng)同上</p><p><b> {</b></p><p> delay_short(2);</p><p> if(RC0==0 && TEMPCTRL>10)&l
99、t;/p><p><b> {</b></p><p> TEMPCTRL=TEMPCTRL-1;</p><p> delay_long(20);</p><p><b> }</b></p><p><b> }</b></p>
100、<p> if(RC1==0 && TEMPCTRL<30)//判斷條件改動(dòng)同上</p><p><b> {</b></p><p> delay_short(2);</p><p> if(RC1==0 && TEMPCTRL<30)</p><p>
101、;<b> {</b></p><p> TEMPCTRL=TEMPCTRL+1;</p><p> delay_long(20);</p><p><b> }</b></p><p><b> }</b></p><p><b>
102、; }</b></p><p><b> }</b></p><p> ///////////////max515.c///////////////</p><p> #include <pic.h></p><p> #include "temperature_head
103、er_file.h"</p><p> void max515_write(unsigned char data)</p><p><b> { </b></p><p> unsigned char i;</p><p> MAX515_CS=0; //拉低片選線,選中器件</p&g
104、t;<p><b> //發(fā)送地址</b></p><p> for (i=0;i<8;i++) //移位循環(huán)8次,最高頻率為10MHz</p><p><b> { </b></p><p> MAX515_SCLK=0; //清零時(shí)鐘總線</p><p
105、> if(data&(1<<11-i))</p><p> MAX515_DIN=1;//每次取高字節(jié)</p><p><b> else</b></p><p> MAX515_DIN=0;</p><p> MAX515_SCLK=1;//時(shí)鐘上升沿,發(fā)送地址&
106、lt;/p><p><b> }</b></p><p> MAX515_CS=1;//發(fā)送結(jié)束,上升沿鎖存數(shù)據(jù)</p><p><b> }</b></p><p> ///////////////max7219.c///////////////</p><p&
107、gt; #include <pic.h></p><p> #include "temperature_header_file.h"</p><p> #define DECODE_MODE 0x09 //譯碼控制寄存器</p><p> #define INTENSITY 0x0A //亮度控制寄存器</p&g
108、t;<p> #define SCAN_LIMIT 0x0B //掃描界限寄存器</p><p> #define SHUT_DOWN 0x0C //關(guān)斷模式寄存器</p><p> #define DISPLAY_TEST 0x0F //測(cè)試控制寄存器</p><p> void max7219_write(unsigned cha
109、r address,unsigned char dat)</p><p><b> { </b></p><p> unsigned char i;</p><p> RD0=0; //拉低片選線,選中器件</p><p><b> //發(fā)送地址</b></p>&
110、lt;p> for (i=0;i<8;i++) //移位循環(huán)8次,最高頻率為10MHz</p><p><b> { </b></p><p> RD1=0; //清零時(shí)鐘總線</p><p> if(address&(1<<7-i))</p><p>
111、RD2=1;//(bit)(data&0x80); //每次取高字節(jié) ??????</p><p><b> else</b></p><p><b> RD2=0;</b></p><p> RD1=1;//時(shí)鐘上升沿,發(fā)送地址</p><p><b
112、> }</b></p><p><b> //發(fā)送數(shù)據(jù)</b></p><p> for (i=0;i<8;i++)</p><p><b> {</b></p><p><b> RD1=0;</b></p><p>
113、 if(dat&(1<<7-i))</p><p> RD2=1;//(bit)(data&0x80); //每次取高字節(jié) ??????</p><p><b> else</b></p><p><b> RD2=0;</b></p><p> R
114、D1=1;//時(shí)鐘上升沿,發(fā)送數(shù)據(jù)</p><p><b> }</b></p><p> RD0=1;//發(fā)送結(jié)束,上升沿鎖存數(shù)據(jù)</p><p><b> }</b></p><p> //MAX7219初始化</p><p> vo
115、id max7219_init()</p><p><b> {</b></p><p> max7219_write(SHUT_DOWN,0x01); //開啟正常工作模式(0xX1)</p><p> max7219_write(DISPLAY_TEST,0x00); //選擇工作模式(0xX0)</p><
116、p> max7219_write(DECODE_MODE,0xFF); //選用全譯碼模式</p><p> max7219_write(SCAN_LIMIT,0x03); //只用前4只LED ;這里沒問題</p><p> max7219_write(INTENSITY,0x04); //設(shè)置初始亮度</p><p> max721
117、9_write(0x04,0xF8);</p><p> max7219_write(0x03,0xF8);</p><p> max7219_write(0x02,0xF8);</p><p> max7219_write(0x01,0xF8);</p><p><b> }</b></p>
118、<p> ///////////////////main.c//////////////////</p><p> #include <pic.h></p><p> #include "temperature_header_file.h"</p><p> void init();</p><
119、;p> void max7219_init();</p><p> void delay_long(int x);</p><p> void delay_short();</p><p> void key_onoff();</p><p> void key_manauto();</p><p>
120、 void key_ctrl();</p><p> void max515_write(unsigned char data);</p><p> void max7219_write(unsigned char address,unsigned char dat);</p><p> char get_ad();</p><p>
121、 //這里的靜態(tài)變量定義有些問題!待解決!</p><p> char ONOFF=0;//0--off,1--on</p><p> char MANAUTO=0;//0--manual,1--auto</p><p> char SPEEDCTRL=0;//風(fēng)速控制,初始值為0檔(停轉(zhuǎn))</p><p> char
122、TEMPCTRL=20;//設(shè)定溫度值,初始值為20度(實(shí)際溫度)</p><p> char TEMPOBSV=20;//實(shí)際檢測(cè)溫度,在ad.c中引用</p><p> char oa=0;//存放環(huán)境溫度十位</p><p> char ob=0;//存放環(huán)境溫度個(gè)位</p><p> char ca=0
123、;//存放設(shè)定溫度十位</p><p> char cb=0;//存放設(shè)定溫度個(gè)位</p><p> void main()</p><p><b> {</b></p><p><b> init();</b></p><p> max7219_i
124、nit();</p><p><b> while(1)</b></p><p><b> {</b></p><p> key_onoff();</p><p> key_manauto();</p><p> key_ctrl();</p><
125、;p> ////////////溫度檢測(cè)及顯示轉(zhuǎn)換</p><p> TEMPOBSV=get_ad();</p><p> TEMPOBSV=TEMPOBSV/5;//測(cè)量環(huán)境溫度</p><p> if(TEMPOBSV > 0x1D)</p><p> {TEMPOBSV=30;}</p>&
126、lt;p> if(TEMPOBSV < 0x0A)//使環(huán)境溫度測(cè)量范圍為10度至30度</p><p> {TEMPOBSV=10;}</p><p> oa=TEMPOBSV/10;//取環(huán)境溫度十位</p><p> ob=TEMPOBSV%10;//取環(huán)境溫度個(gè)位</p><p> ca=TE
127、MPCTRL/10;//取設(shè)定溫度十位</p><p> cb=TEMPCTRL%10;//取設(shè)定溫度個(gè)位</p><p> ////////////手動(dòng)模式控制風(fēng)速</p><p> if(ONOFF==0)</p><p><b> {</b></p><p> max5
128、15_write(0x0000);</p><p> max7219_write(0x04,0x0F);</p><p> max7219_write(0x03,0x0F);</p><p> max7219_write(0x02,0x0F);</p><p> max7219_write(0x01,0x0F);</p&g
129、t;<p> MANAUTO=0;</p><p> SPEEDCTRL=0;</p><p><b> }</b></p><p> if(ONOFF==1 && MANAUTO==0)</p><p><b> {</b></p><p
130、> if(SPEEDCTRL==0)</p><p><b> {</b></p><p> max515_write(0x0000);</p><p> max7219_write(0x02,0x00);//寫入DIG1</p><p> max7219_write(0x01,0x00);//寫入
131、DIG0</p><p><b> }</b></p><p> if(SPEEDCTRL==1)</p><p><b> {</b></p><p> max515_write(0x00AF);</p><p> max7219_write(0x
132、02,0x01);//寫入DIG1</p><p> max7219_write(0x01,0x00);//寫入DIG0</p><p><b> }</b></p><p> if(SPEEDCTRL==2)</p><p><b> {</b></p>&l
133、t;p> max515_write(0x00CF);</p><p> max7219_write(0x02,0x02);//寫入DIG1</p><p> max7219_write(0x01,0x00);//寫入DIG0</p><p><b> }</b></p><p> if(SPEED
134、CTRL==3)</p><p><b> {</b></p><p> max515_write(0x00FF);</p><p> max7219_write(0x02,0x03);//寫入DIG1</p><p> max7219_write(0x01,0x00);//寫入DIG0</p>
135、;<p><b> }</b></p><p><b> }</b></p><p> ///////////自動(dòng)模式控制溫度</p><p> if(ONOFF==1 && MANAUTO==1)</p><p><b> {</b>&
136、lt;/p><p> if(TEMPOBSV-TEMPCTRL <= 0)</p><p> {max515_write(0x0000);}</p><p> else if(TEMPOBSV-TEMPCTRL < 2) </p><p> {max515_write(0x00AF);}</p><
137、p> else if(TEMPOBSV-TEMPCTRL < 4) </p><p> {max515_write(0x00CF);}</p><p><b> else </b></p><p> {max515_write(0x00FF);}</p><p> max7219_write
138、(0x02,ca);//寫入DIG1</p><p> max7219_write(0x01,cb);//寫入DIG0</p><p><b> }</b></p><p> max7219_write(0x04,oa);//寫入DIG3</p><p> max7219_write(0x03,ob);
139、//寫入DIG2</p><p> ////////////////////////////////</p><p> if(TEMPOBSV==30)</p><p><b> {</b></p><p> RC5=0;RC7=0;</p><p> RC4=1;RC6=1;&l
140、t;/p><p> delay_long(10);</p><p> RC5=1;RC7=1;</p><p> RC4=0;RC6=0;</p><p> delay_long(10);</p><p><b> }</b></p><p> if(TEMPOBS
141、V<30)</p><p><b> {</b></p><p> RC4=0;RC5=0;RC6=0;RC7=0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
142、t;/b></p><p> 九、課程設(shè)計(jì)中的心得體會(huì)、收獲</p><p> 這次智能裝置課程設(shè)計(jì)使我們學(xué)到了很多,收獲了很多。首先,我們重新復(fù)習(xí)了上學(xué)期智能裝置課程中的所學(xué)知識(shí),并對(duì)其有了更深層次的理解。其次,我們接觸了一些上學(xué)期實(shí)驗(yàn)沒有接觸過的裝置,比如MAX7219和MAX515,雖然難度并不大,但在短短的一周時(shí)間內(nèi)實(shí)現(xiàn)其功能對(duì)我們來說也是一個(gè)挑戰(zhàn)。再次,這次智能裝置課程
143、設(shè)計(jì)需要將多種功能整合起來,這就需要對(duì)PIC單片機(jī)的I/O端口和存儲(chǔ)空間進(jìn)行合理的分配。實(shí)驗(yàn)中,一開始我們將MAX7219的三個(gè)端口接到了RA口,但其功能無法實(shí)現(xiàn),后來才了解RA口是與到AD轉(zhuǎn)換功能復(fù)用的端口,如果使用了AD轉(zhuǎn)換功能,其I/O功能會(huì)受到影響。另外,由于這次課程設(shè)計(jì)我們使用C語(yǔ)言進(jìn)行編程,PICC編譯器的規(guī)則和ANSI-C有一定的區(qū)別,使用過程中我們有時(shí)只能根據(jù)出現(xiàn)的現(xiàn)象來推測(cè)遇到的問題,從而進(jìn)行程序的改進(jìn)。</p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能空調(diào)控制系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)報(bào)告--智能電梯控制系統(tǒng)
- 空調(diào)控制系統(tǒng)單片機(jī)原理課程設(shè)計(jì)
- 空調(diào)控制系統(tǒng)單片機(jī)原理課程設(shè)計(jì)
- 課程設(shè)計(jì)報(bào)告---智能照明控制系統(tǒng)設(shè)計(jì)
- 單片機(jī)原理課程設(shè)計(jì)空調(diào)控制系統(tǒng).doc
- 單片機(jī)原理課程設(shè)計(jì)空調(diào)控制系統(tǒng).doc
- 課程設(shè)計(jì)----液體混合裝置控制系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)-- 智能小車循跡控制系統(tǒng)
- 智能家電控制系統(tǒng)課程設(shè)計(jì)
- 智能家居控制系統(tǒng)課程設(shè)計(jì)
- 建筑智能溫度控制系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)---衛(wèi)生間智能燈光控制系統(tǒng)設(shè)計(jì)報(bào)告
- 彩燈控制系統(tǒng)課程設(shè)計(jì)報(bào)告
- 控制系統(tǒng)課程設(shè)計(jì)報(bào)告--- 控制系統(tǒng)設(shè)計(jì)與仿真
- 課程設(shè)計(jì)--智能汽車雨刷控制系統(tǒng)設(shè)計(jì)
- 智能交通燈控制系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)
- 變頻空調(diào)控制系統(tǒng)設(shè)計(jì)機(jī)電一體化課程設(shè)計(jì)
- 交通控制系統(tǒng)課程設(shè)計(jì)報(bào)告
- 暖通空調(diào)控制系統(tǒng)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論