版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 爐溫控制課程設(shè)計(jì)報(bào)告</p><p><b> 目 錄</b></p><p><b> 目 錄1</b></p><p><b> 引言3</b></p><p> 第1章 技術(shù)指標(biāo)4</p><p> 1.1基本
2、功能要求:4</p><p> 1.2 提高功能要求:4</p><p><b> 1.3設(shè)計(jì)條件4</b></p><p> 第2章 系統(tǒng)設(shè)計(jì)方案6</p><p> 2.1原理圖設(shè)計(jì)6</p><p><b> 2.2硬件設(shè)計(jì)6</b></p&
3、gt;<p><b> 7</b></p><p><b> 2.3軟件設(shè)計(jì)7</b></p><p> 2.3.1軟件設(shè)計(jì)方案7</p><p> 2.3.2程序清單(含必要的注釋)8</p><p> 第3章 單元電路設(shè)計(jì)26</p><p&g
4、t; 3.1控制部分電路設(shè)計(jì)26</p><p> 3.2矩陣鍵盤電路設(shè)計(jì)26</p><p> 3.3顯示部分電路設(shè)計(jì)28</p><p> 3.3.1數(shù)碼管內(nèi)部原理圖29</p><p> 3.4溫度采集模塊電路設(shè)計(jì)31</p><p> 3.4.1 DS18B20通信程序37</p&
5、gt;<p> 3.5繼電器電路設(shè)計(jì)39</p><p> 第4章 測試與調(diào)整40</p><p> 4.1電源電路檢測40</p><p> 4.2顯示電路測試40</p><p> 4.3單片機(jī)控制電路測試40</p><p> 4.4矩陣鍵盤電路檢測40</p>
6、<p> 4.5 控制信號輸出電路檢測40</p><p> 4.6溫度采集電路檢測40</p><p> 4.7控制電路檢測41</p><p> 4.7總體電路測試41</p><p> 第5章 加熱爐溫控系統(tǒng)使用方法42</p><p> 5.1系統(tǒng)連接方法42</p&g
7、t;<p> 5.2系統(tǒng)使用方法42</p><p> 第6章 設(shè)計(jì)小節(jié)43</p><p> 6.1 設(shè)計(jì)任務(wù)完成情況43</p><p> 6.2 問題及改進(jìn)43</p><p> 6.3 心得體會43</p><p><b> 參考文獻(xiàn)44</b><
8、;/p><p><b> 引言</b></p><p> 隨著計(jì)算機(jī)技術(shù)的發(fā)展和普及,以單片機(jī)為核心的小型嵌入式設(shè)備,已經(jīng)在工業(yè)自動化、辦公自動化等領(lǐng)域得到了日益廣泛的應(yīng)用 本課題對工業(yè)對象中主要的被控參數(shù)電阻爐爐溫進(jìn)行研究,設(shè)計(jì)了硬件電路和軟件程序。硬件電路選用STC12C5A60S2單片機(jī)及DS18B20, 以STC12C5A60S2單片機(jī)為主體,構(gòu)成一個(gè)
9、能進(jìn)行較復(fù)雜的數(shù)據(jù)處理和復(fù)雜控制功能的智能控制器,使其既可與微機(jī)配合構(gòu)成兩級控制系統(tǒng),又可作為一個(gè)獨(dú)立的單片機(jī)控制系統(tǒng),具有較高的靈活性和可靠性。單片機(jī)根據(jù)輸入的各種命令,進(jìn)行智能算法得到控制值,輸出控制和脈沖信號,從而加熱電阻爐。軟件程序脈沖采用中斷方式。</p><p> 關(guān)鍵詞 單片機(jī);溫度控制;計(jì)算機(jī)仿真;</p><p><b> 第1章 技術(shù)指標(biāo)</b>
10、;</p><p> 1.1基本功能要求:</p><p> 內(nèi)容:應(yīng)用計(jì)算機(jī)的實(shí)時(shí)監(jiān)控和溫度測量技術(shù),采用單片機(jī)、溫度檢測電路、溫度控制電路等,實(shí)現(xiàn)電阻爐爐溫的實(shí)時(shí)監(jiān)控。</p><p><b> 要求:</b></p><p> 1.1.1采用單片機(jī)及相應(yīng)的組成部件完成電阻爐溫度控制系統(tǒng)設(shè)計(jì),包括硬件電路和軟
11、件程序設(shè)計(jì);</p><p> 1.1.2測溫范圍0~100℃,使其系統(tǒng)控制的溫度保溫值的變化范圍為30~60℃;</p><p> 1.1.3可根據(jù)按鍵設(shè)定目標(biāo)溫度,能夠顯示控溫時(shí)的實(shí)際爐溫和恒溫時(shí)間等信息。 </p><p> 1.2 提高功能要求:</p><p> 1.2.1 對其主電路和控制電路設(shè)計(jì)相應(yīng)的保護(hù)電路,使其安全可
12、靠地工作;</p><p> 1.2.2對影響溫度控制時(shí)間和精度的因素進(jìn)行分析,改進(jìn)相應(yīng)的計(jì)算機(jī)控制算法,完成計(jì)算機(jī)控制高效的算法設(shè)計(jì)。</p><p><b> 1.3設(shè)計(jì)條件</b></p><p> 1.3.1電源條件:穩(wěn)壓電源5V可調(diào),220V直流電源</p><p> 1.3.2測試條件:萬用表<
13、/p><p> 1.3.2元件清單:如表1.1示。</p><p><b> 元件清單</b></p><p> 另有剪刀、鑷子等工具</p><p><b> 表1-1</b></p><p> 第2章 系統(tǒng)設(shè)計(jì)方案</p><p><b
14、> 2.1原理圖設(shè)計(jì)</b></p><p> 根據(jù)設(shè)計(jì)要求設(shè)計(jì)原理圖如2-1所示。</p><p><b> 圖2-1原理圖</b></p><p><b> 圖2-1</b></p><p><b> 2.2硬件設(shè)計(jì)</b></p>
15、<p> 該設(shè)計(jì)本系統(tǒng)由STC12C5A60S 單片機(jī)最小系統(tǒng)及其外圍電路組成,單片機(jī)系統(tǒng)有自己的電源模塊、顯示模塊、溫度采集模塊,如圖2-1所示。根據(jù)實(shí)驗(yàn)箱設(shè)計(jì)電路圖如圖2-2所示。</p><p> 圖2-2硬件電路方框圖</p><p><b> 2.3軟件設(shè)計(jì)</b></p><p> 2.3.1軟件設(shè)計(jì)方案<
16、/p><p> 為了更簡單的完成溫度控制的任務(wù),采用如下算法控制繼電器,程序的軟件流程圖如下:</p><p><b> 圖2-3軟件流程圖</b></p><p> 首先在程序的開頭先讀取用戶的按鍵命令,當(dāng)沒有按鍵時(shí),數(shù)碼管僅顯示實(shí)際溫度;若按下“b”鍵,則數(shù)碼管顯示用戶的設(shè)定溫度;按下“c”鍵,則進(jìn)入設(shè)置溫度子程序,用戶通過1~9數(shù)字鍵就
17、可以設(shè)置用戶所需溫度,這樣就完成了用戶的操作。接下來讀取DS18B20的數(shù)據(jù),并按格式裝配成數(shù)碼管可以顯示的類型。最后根據(jù)當(dāng)前的溫度值控制繼電器的通斷。</p><p> 主程序就是以上述流程往復(fù)運(yùn)行。</p><p> 2.3.2程序清單(含必要的注釋)</p><p> #include<STC12C5A60S2.h></p>&
18、lt;p> #include<intrins.h></p><p> #define uchar unsigned char</p><p> #define DELAY_TIME1 8</p><p> #define uint unsigned int</p><p> extern unsigned char
19、 KeyCounter;</p><p> extern bit KeyFlag;</p><p> extern bit SetFlag;</p><p> extern bit DisFlag;</p><p> extern bit ShowTimeFlag;</p><p> unsigned cha
20、r data DisData[2]; //溫度顯示值</p><p> unsigned char data SetData[2]; //溫度設(shè)定值</p><p> unsigned char KeyCounter; //設(shè)置溫度位數(shù)計(jì)數(shù)器</p><p> float RTValue; //實(shí)際溫度值</p
21、><p> unsigned char STValue=50; //設(shè)置溫度值</p><p> unsigned char ShowTime[3]={0};//恒溫時(shí)間值 </p><p> unsigned int m;//定義粗略延遲變量</p><p> unsigned int cc;//計(jì)數(shù)次數(shù)<
22、/p><p> unsigned int CountFlag;</p><p> unsigned int TimeCounter=0;//設(shè)置恒溫時(shí)間計(jì)數(shù)器</p><p> unsigned char code keycode[16]={</p><p> 0x77,0x7b,0x7d,0x7e, //1,2,3,A<
23、;/p><p> 0xb7,0xbb,0xbd,0xbe, //4,5,6,B</p><p> 0xd7,0xdb,0xdd,0xde, //7,8,9,C</p><p> 0xe7,0xeb,0xed,0xee, //*,0,#,D</p><p><b> };</b></p&g
24、t;<p> unsigned char code Seg_Table[13] = {</p><p> 0xC0,/*0*/</p><p> 0xF9,/*1*/</p><p> 0xA4,/*2*/</p><p> 0xB0,/*3*/</p><p> 0x99,/*4*/<
25、/p><p> 0x92,/*5*/</p><p> 0x82,/*6*/</p><p> 0xF8,/*7*/</p><p> 0x80,/*8*/</p><p> 0x90,/*9*/</p><p> 0x9c,/*10*/ //上框 代表實(shí)際溫度</p>
26、<p> 0xa3,/*11*/ //下框 代表設(shè)定溫度 </p><p> 0xff//all off</p><p><b> };</b></p><p> unsigned char code Pos_Dis_Buf[5] = {0xef,0xdf,0xbf,0x7f,0xf
27、f};</p><p> unsigned char Digit[3] = {0};</p><p> bit ShowTimeFlag=0;//是否顯示恒溫時(shí)間</p><p> bit KeyFlag=0;//是否接收到有用鍵值 1有</p><p> bit SetFlag=0;//是否設(shè)定鍵按下 1按下</p&g
28、t;<p> bit DisFlag=0; //1顯示設(shè)定值 0顯示實(shí)際值</p><p> sbit Beep = P3^5;</p><p> sbit Heat = P3^0;</p><p> sbit DQ=P3^1; //改成P3^0</p><p> sbit SegDin=P3^6; //顯示數(shù)據(jù)高地
29、位</p><p> sbit SegClk=P3^7; //數(shù)據(jù)顯示時(shí)鐘</p><p> void InitSys()</p><p><b> {</b></p><p> TMOD=0X01;//MODE 1</p><p> TH0=(65536-50000)/256;<
30、/p><p> TL0=(65536-50000)%256;</p><p> EA=1; //開中斷</p><p> ET0=1;//開定時(shí)器0中斷</p><p> P4SW=0xf0; </p><p><b> }</b></p><p><b>
31、; /*</b></p><p> 函數(shù):Delay()</p><p><b> 功能:不精確延時(shí)</b></p><p><b> 參數(shù):延時(shí)參數(shù)</b></p><p><b> 返回值:無</b></p><p><b
32、> */</b></p><p> void Delay(unsigned int n)</p><p><b> {</b></p><p> while(--n);</p><p><b> }</b></p><p> void ds18b
33、20_delay(int time)//延時(shí)時(shí)間為(time * 6 us)</p><p><b> {</b></p><p> int i,temp;</p><p> temp=time;</p><p> for(i=0;i<temp;i++)</p><p><b&
34、gt; {</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b><
35、/p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><
36、;b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> }</b></p><p><b> }</b></p><p> //18B20復(fù)位函數(shù)</p><p> v
37、oid Init_DS18B20(void)</p><p><b> {</b></p><p> unsigned char x=1;</p><p> DQ=1;//先將數(shù)據(jù)口拉高</p><p> ds18b20_delay(2);</p><p> while(x)
38、 //進(jìn)行判斷,當(dāng)數(shù)據(jù)口返回一個(gè)0時(shí),跳出循環(huán)。初始化成功</p><p><b> { </b></p><p> DQ=0; //拉低</p><p> ds18b20_delay(140);//延時(shí)大約850us,晶振為11.0592</p><p> DQ=1;//拉高</p&
39、gt;<p> ds18b20_delay(8);//延時(shí)50us</p><p> if(DQ==1) //設(shè)置判斷條件,看ds1820的返回值,0則跳出while循環(huán)</p><p><b> x=1;</b></p><p><b> else</b></p><p&g
40、t;<b> { x=0;</b></p><p> ds18b20_delay(35);//延時(shí)500us</p><p><b> DQ=1;</b></p><p> ds18b20_delay(40);</p><p><b> }</b></p>
41、<p><b> }</b></p><p><b> }</b></p><p> //18B20寫命令函數(shù)</p><p> void WriteOneChar(uchar dat)</p><p><b> {</b></p><
42、;p> uchar i = 0;</p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p> DQ = 0; //拉低總線</p><p> _nop_(); /
43、/至少維持了1us,表示寫時(shí)序(包括寫0時(shí)序或?qū)?時(shí)序)開始</p><p> DQ = dat&0x01; //從字節(jié)的最低位開始傳輸</p><p> //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),</p><p> //因?yàn)?5us后DS18B20會對總線采樣。</p><p&
44、gt; ds18b20_delay(10); //必須讓寫時(shí)序持續(xù)至少60us</p><p> DQ = 1; //寫完后,必須釋放總線,</p><p> dat >>= 1;</p><p> ds18b20_delay(1);</p>&l
45、t;p><b> }</b></p><p><b> }</b></p><p> //18B20讀1個(gè)字節(jié)函數(shù)</p><p> uchar ReadOneChar(void)</p><p><b> {</b></p><p>
46、 uchar i = 0;</p><p> uchar dat = 0;</p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p> DQ = 0; //將總線拉低,要在1us之后釋放總線</p><
47、p> //單片機(jī)要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會有效。</p><p> _nop_(); //至少維持了1us,表示讀時(shí)序開始</p><p><b> _nop_();</b></p><p> dat >>= 1; //讓從總線上讀到的位數(shù)據(jù),依次從
48、高位移動到低位。</p><p> DQ = 1; //釋放總線,此后DS18B20會控制總線,把數(shù)據(jù)傳輸?shù)娇偩€上</p><p> ds18b20_delay(1); //延時(shí)7us,此處參照推薦的讀時(shí)序圖,盡量把控制器采樣時(shí)間放到讀時(shí)序后的15us內(nèi)的最后部分</p><p> if(DQ)
49、 //控制器進(jìn)行采樣</p><p><b> {</b></p><p> dat |= 0x80; //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進(jìn)行處理,保持為0</p><p><b> } </b></p>
50、;<p> ds18b20_delay(8); //此延時(shí)不能少,確保讀時(shí)序的長度60us。</p><p><b> }</b></p><p> return (dat);</p><p><b> }</b></p><p> float R
51、eadTemperature(void)</p><p><b> {</b></p><p> uchar n = 0; //存儲符號</p><p> unsigned int t;</p><p> uchar a,b;</p><p><b> //讀出溫度函&
52、lt;/b></p><p> Init_DS18B20(); //總線復(fù)位</p><p> WriteOneChar(0xCC); // 發(fā)Skip ROM命令</p><p> WriteOneChar(0xBE); // 發(fā)讀命令</p><p> a = ReadOneChar(); //溫度低8位&l
53、t;/p><p> b = ReadOneChar(); //溫度高8位</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // Skip ROM</p><p> WriteOneChar(0x44); // 發(fā)轉(zhuǎn)換命令</p><p> t = (b
54、 << 8) + a;</p><p> return (t*0.0625);</p><p><b> }</b></p><p> unsigned char Key_Scan() //返回的是keycode[]數(shù)組的位數(shù)</p><p><b> {</b></p
55、><p> unsigned char i,X,Y;</p><p> unsigned char KeyCode;</p><p> P2 = 0x0f;</p><p> if(P2 != 0x0f)</p><p><b> {</b></p><p> De
56、lay(500);</p><p> if(P2 != 0x0f)</p><p><b> {</b></p><p><b> X = P2;</b></p><p> P2 = 0xf0;</p><p> if(P2 != 0xf0)</p>
57、<p><b> {</b></p><p><b> Y = P2;</b></p><p> while(P2!=0xf0); //如果不松鍵 則一直停在這邊</p><p><b> }</b></p><p> KeyCode = X|Y;
58、</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> KeyCode = 0xff; </
59、p><p><b> }</b></p><p> for(i=0;i<16;i++)</p><p> if(KeyCode==keycode[i])</p><p><b> return i;</b></p><p> return 255; </
60、p><p><b> }</b></p><p> unsigned char Get_Code()</p><p><b> {</b></p><p> unsigned char i=0xff,j=0xff;</p><p> i=Key_Scan();</
61、p><p><b> switch(i)</b></p><p><b> {</b></p><p> case 0:j=1;KeyFlag=1;break;</p><p> case 1:j=2;KeyFlag=1;break;</p><p> case 2:j
62、=3;KeyFlag=1;break;</p><p> case 3:break; //'A"</p><p> case 4:j=4;KeyFlag=1;break;</p><p> case 5:j=5;KeyFlag=1;break;</p><p> case 6:j=6;KeyFlag=1;bre
63、ak;</p><p> case 7:break; //'B'</p><p> case 8:j=7;KeyFlag=1;break;</p><p> case 9:j=8;KeyFlag=1;break;</p><p> case 10:j=9;KeyFlag=1;break;</p>&
64、lt;p> case 11:break; //'C'</p><p> case 12:j='a';KeyFlag=1;SetFlag=1;KeyCounter=0;break;</p><p> case 13:j=0;KeyFlag=1;break;</p><p> case 14:j='b';
65、KeyFlag=1;DisFlag=~DisFlag;</p><p><b> break;</b></p><p> case 15:j='c';KeyFlag=1;ShowTimeFlag=~ShowTimeFlag;break; //'D' //'D'</p><p> de
66、fault:KeyFlag=0;break;</p><p><b> }</b></p><p><b> return j;</b></p><p><b> }</b></p><p><b> /*</b></p><p
67、> 函數(shù):Seg_Display()</p><p> 功能:數(shù)碼管在指定位置顯示指定的數(shù)</p><p> 參數(shù):Pos 顯示位置(0 1 2 3) ucDATA (0~9)待顯示的數(shù)字 Point 為1則顯示小數(shù)點(diǎn),否則不顯示</p><p><b> 返回值:無</b></p><p><b&g
68、t; */</b></p><p> void Bit_Display(unsigned char Pos, unsigned char ucDATA, bit Point)</p><p><b> {</b></p><p> unsigned char i;</p><p> unsigned
69、 char ucTemp;</p><p> ucTemp = Seg_Table[ucDATA];//查段碼表</p><p><b> if(Point)</b></p><p><b> {</b></p><p> ucTemp &= 0x7f; </p>
70、;<p><b> }</b></p><p> P4 = Pos_Dis_Buf[4];//關(guān)閉所有顯示</p><p> for(i = 0; i < 8; i++)</p><p><b> {</b></p><p> SegDin = ucTemp &
71、 0x80;/*每次取最高位,最高位為1,則SEG_DIN=1;反之亦然*/</p><p> SegClk = 0;</p><p> SegClk = 1; /*產(chǎn)生74164移位時(shí)鐘上升沿*/</p><p> ucTemp <<= 1;</p><p><b> }</b></p&g
72、t;<p> P4 = Pos_Dis_Buf[Pos];//使能位選</p><p><b> }</b></p><p><b> /*</b></p><p> 函數(shù):Seg_Display()</p><p> 功能:數(shù)碼管上顯示指定的數(shù)</p><
73、;p> 參數(shù):uiData (0~9999)待顯示的數(shù)字</p><p><b> 返回值:無</b></p><p><b> */</b></p><p> void Seg_Display(float uiData)</p><p><b> {</b>&
74、lt;/p><p> unsigned char i;</p><p> Digit[0] = (unsigned int)(uiData/10)%10; //十位</p><p> Digit[1] = (unsigned int)uiData%10; //個(gè)位</p><p> Digit[2] = (unsigned int
75、)(uiData*10)%10; //小數(shù)后一位</p><p> for(i = 0; i < 3; i++)</p><p><b> {</b></p><p><b> if(i!=1)</b></p><p> Bit_Display(i,Digit[i],0); /
76、/不顯示小數(shù)點(diǎn)</p><p><b> else</b></p><p> Bit_Display(i,Digit[i],1); //顯示小數(shù)點(diǎn)</p><p> Delay(50);</p><p><b> }</b></p><p><b>
77、 }</b></p><p> void main()</p><p><b> {</b></p><p> unsigned char i,j,num,k;</p><p> unsigned char Counter=0;</p><p> unsigned int
78、htime=0;</p><p> unsigned int stime=0;</p><p> InitSys();</p><p><b> while(1)</b></p><p><b> { </b></p><p> RTValue=ReadTemp
79、erature(); //獲取實(shí)際溫度</p><p> num=Get_Code();</p><p> if(DisFlag==0&&SetFlag==0)//顯示實(shí)際溫度</p><p><b> {</b></p><p> for(j=0;j<50;j++)//每次用循環(huán)顯示
80、 也許可以提高亮度</p><p> for(i=0;i<50;i++)</p><p><b> {</b></p><p> Bit_Display(3,10,0); //上方框 表示實(shí)際溫度</p><p> Seg_Display(RTValue);</p><p>
81、;<b> }</b></p><p><b> }</b></p><p> if(DisFlag==1&&SetFlag==0)//顯示設(shè)定溫度</p><p><b> {</b></p><p> for(j=0;j<50;j++)//
82、每次用循環(huán)顯示 也許可以提高亮度</p><p> for(i=0;i<50;i++)</p><p><b> {</b></p><p> Bit_Display(3,11,0);//下方框 表示設(shè)定溫度</p><p> Seg_Display(STValue);</p><p&
83、gt;<b> }</b></p><p><b> } </b></p><p> if(TimeCounter==1000)</p><p><b> {</b></p><p> TimeCounter=0;</p><p><b&
84、gt; }</b></p><p> if(TimeCounter!=0)</p><p><b> {</b></p><p> stime=TimeCounter;</p><p> ShowTime[0]=stime/100;</p><p> ShowTime[1]
85、=(stime/10)%10;</p><p> ShowTime[2]= stime%10;</p><p><b> }</b></p><p> if(DisFlag==0&&SetFlag==0&&ShowTimeFlag==1)//顯示恒溫時(shí)間</p><p><b
86、> {</b></p><p> for(j=0;j<50;j++)//每次用循環(huán)顯示 也許可以提高亮度</p><p> for(i=0;i<50;i++)</p><p><b> {</b></p><p> Bit_Display(3,19,0); //P表
87、示恒溫時(shí)間</p><p><b> m=50;</b></p><p> while(--m);</p><p> Bit_Display(0,ShowTime[0],0);</p><p><b> m=50;</b></p><p> while(--m);&
88、lt;/p><p> Bit_Display(1,ShowTime[1],0);</p><p><b> m=50;</b></p><p> while(--m);</p><p> Bit_Display(2,ShowTime[2],0);</p><p><b> m=50
89、;</b></p><p> while(--m);</p><p><b> }</b></p><p><b> }</b></p><p> if(SetFlag)</p><p><b> {</b></p>
90、<p> if(KeyFlag&&num!='a')</p><p><b> {</b></p><p> SetData[KeyCounter]=num;</p><p> Bit_Display(KeyCounter+1,num,0);</p><p> KeyC
91、ounter++;</p><p> if(KeyCounter>1)</p><p><b> {</b></p><p> KeyCounter=0;</p><p> SetFlag=0;</p><p> STValue=10*SetData[0]+SetData[1];&
92、lt;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(RTValue<(STValue-5)) </p><p><b> {</b>
93、;</p><p> Beep=1; //不鳴叫</p><p> Heat=0; //加熱</p><p><b> }</b></p><p> if((STValue-5)<=RTValue&&RTValue<(STValue-0.8))</p><p
94、><b> {</b></p><p> //TimeCounter=0;</p><p> if(CountFlag == 1)</p><p><b> {</b></p><p><b> TR0=0;</b></p><p>
95、 TimeCounter=0;</p><p> CountFlag=0;</p><p><b> }</b></p><p> Counter++;</p><p><b> Beep=1;</b></p><p> k=Counter%10;</p&g
96、t;<p><b> if(k>1)</b></p><p><b> k=1;</b></p><p><b> Heat=k;</b></p><p><b> }</b></p><p> if((STValue-0.8
97、)<=RTValue&&RTValue<=(STValue))</p><p><b> {</b></p><p> //TimeCounter++;</p><p> if(CountFlag == 0 )</p><p><b> {</b></p&g
98、t;<p> CountFlag = 1;</p><p><b> TR0=1;</b></p><p><b> }</b></p><p> Counter++;</p><p><b> Beep=1;</b></p><p&
99、gt; k=Counter%20;</p><p><b> if(k>1)</b></p><p><b> k=1;</b></p><p><b> Heat=k;</b></p><p><b> }</b></p>
100、<p> if(STValue<RTValue&&RTValue<=(STValue+0.5))</p><p><b> {</b></p><p> //TimeCounter++;</p><p> if(CountFlag == 0 )</p><p><b&g
101、t; {</b></p><p> CountFlag = 1;</p><p><b> TR0=1;</b></p><p><b> }</b></p><p> Beep=1;//不鳴叫</p><p> Heat=1;//不加熱</p&
102、gt;<p><b> }</b></p><p> if(RTValue>(STValue+0.5))</p><p><b> {</b></p><p> if(CountFlag == 1)</p><p><b> {</b></
103、p><p><b> TR0=0;</b></p><p> TimeCounter=0;</p><p> CountFlag=0;</p><p><b> }</b></p><p> Beep=0;//鳴叫</p><p> He
104、at=1; //不加熱</p><p><b> }</b></p><p><b> }</b></p><p> while(Counter==1000)</p><p> Counter=0; </p><p><b> }</b&g
105、t;</p><p> void timer0() interrupt 1</p><p><b> {</b></p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;</p><p><b> cc++;
106、</b></p><p> if(cc==20)</p><p><b> {</b></p><p><b> cc=0;</b></p><p> TimeCounter++;</p><p><b> }</b></p
107、><p><b> }</b></p><p> 第3章 單元電路設(shè)計(jì)</p><p> 3.1控制部分電路設(shè)計(jì)</p><p> 控制部電路分即一個(gè)單片機(jī)最小系統(tǒng)板,如果需要,可以為單片機(jī)提供外部晶振電路和復(fù)位電路。如圖3-1.</p><p><b> 圖3-1</b&g
108、t;</p><p> 3.2矩陣鍵盤電路設(shè)計(jì)</p><p> 鍵盤用于外部輸入,本設(shè)計(jì)采用4*3矩陣鍵盤。如圖3-2示。</p><p> 彈性按鍵被按下時(shí)閉合,松手后自動斷開。單片機(jī)檢測按鍵的原理是:單片機(jī)的I/O口既可以作為輸出也可作為輸入使用,當(dāng)檢測按鍵時(shí)使用的是它的輸入功能,把按鍵的一端接地,另一端與單片機(jī)的某一個(gè)I/O口相連,開始時(shí)先給I/O口賦
109、一高電平,然后讓單片機(jī)不斷地檢測該I/O口是否變成低電平,當(dāng)按鍵閉合時(shí),即相當(dāng)于該I/O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O口變?yōu)榈碗娖絼t說明按鍵被按下,然后執(zhí)行相應(yīng)的指令。</p><p> 圖4.4 按鍵按下時(shí)電壓的變化</p><p> 從圖4.4可以看出,理想波形與實(shí)際波形之間是有區(qū)別的,實(shí)際波形在按下和釋放的瞬間都有抖動現(xiàn)象,抖動時(shí)間的長短和按鍵的機(jī)械特性有關(guān)
110、,一般為5~10ms。通常我們手動按時(shí)都要加上去抖動操作,有專用的去抖動電路,也有專用的去抖動芯片,但通常我們軟件延時(shí)的方法就能很容易解決抖動問題,而沒有必要再添加多余的硬件電路。</p><p><b> 按鍵檢測流程圖</b></p><p> 無論獨(dú)立鍵盤還是矩陣鍵盤,單片機(jī)檢測其是否被按下的依據(jù)都是一樣的,也就是檢測該鍵對應(yīng)的I/O口是否為低電平。獨(dú)立鍵盤
111、有一端固定為低電平,單片機(jī)寫程序檢測時(shí)比較方便。而矩陣鍵盤兩端都與單片機(jī)I/O口連接,因此在檢測時(shí)需人為通過單片機(jī)I/O口送出低電平。檢測時(shí),先送一列為低電平,其余幾列為高電平,然后然后立即輪流檢測一次各行是否有低電平,若檢測到某一行為低電平,就可以確定當(dāng)前被按下的按鍵是哪一行哪一列的,用同樣的方法輪流各列送一次低電平,再輪流檢測一次各行是否變?yōu)榈碗娖剑@樣既可檢測完所有的按鍵。</p><p><b>
112、; 圖3-2矩陣鍵盤</b></p><p> 3.3顯示部分電路設(shè)計(jì)</p><p> 數(shù)碼管的顯示原理不論是共陰還是共陽,其基本原理是一樣的,都是靠點(diǎn)亮內(nèi)部的LED來發(fā)光。一位數(shù)碼管的引腳是十個(gè),顯示一個(gè)8字需要7個(gè)小段,另外還有一個(gè)小數(shù)點(diǎn)。</p><p> 3.3.1數(shù)碼管內(nèi)部原理圖</p><p> 實(shí)際實(shí)驗(yàn)時(shí)
113、,為了保證編程的方便和通常將數(shù)碼管的數(shù)字所對應(yīng)的八位數(shù)字記錄在數(shù)組中,程序中直接使用查表的方法,可以提高程序的效率,也使程序的編寫更加簡單方便。</p><p> 我們實(shí)驗(yàn)箱中的LED數(shù)碼管是四位數(shù)碼管,因此為了控制方便,四個(gè)數(shù)碼管的“段選端”是連在一起的,他們的GND或VCC端作為“位選端”來輸入控制信號,這樣單片機(jī)就可以通過程序來控制顯示的字符。</p><p> 下圖是實(shí)驗(yàn)箱開發(fā)
114、板中的數(shù)碼管電路圖:</p><p><b> 實(shí)驗(yàn)箱數(shù)碼管電路</b></p><p><b> 數(shù)碼管顯示段選碼:</b></p><p> unsigned char code Seg_Table[13] = {0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/
115、0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/</p><p> 0x9c,/*10*/ //上框 代表實(shí)際溫度 0xa3,/*11*/ //下框 代表設(shè)定溫度 </p><p> 0xff//all off</p>
116、;<p><b> };</b></p><p> 3.4溫度采集模塊電路設(shè)計(jì)</p><p> 溫度采集采用直接輸出數(shù)字量的DS18B20;如圖3-6示</p><p><b> 圖3-6</b></p><p> DS18B20的主要特征: </p><
117、;p> ?全數(shù)字溫度轉(zhuǎn)換及輸出。 </p><p> ?先進(jìn)的單總線數(shù)據(jù)通信。 </p><p> ?最高12位分辨率,精度可達(dá)土0.5攝氏度。 </p><p> ?12位分辨率時(shí)的最大工作周期為750毫秒。 </p><p>
118、8;?可選擇寄生工作方式。 </p><p> ?檢測溫度范圍為–55°C ~+125°C (–67°F ~+257°F) </p><p> ?內(nèi)置EEPROM,限溫報(bào)警功能。 </p><p> ?64位光刻ROM,內(nèi)置產(chǎn)品序列號,方便多機(jī)掛接。 </
119、p><p> ?多樣封裝形式,適應(yīng)不同硬件系統(tǒng)。 </p><p> DS18B20芯片封裝結(jié)構(gòu): </p><p> DS18B20引腳功能: </p><p> ·GND 電壓地 ·DQ 單數(shù)據(jù)總線 ·VDD 電源電壓 ·NC 空引腳 </p><p>
120、; DS18B20工作原理及應(yīng)用: </p><p> DS18B20的溫度檢測與數(shù)字?jǐn)?shù)據(jù)輸出全集成于一個(gè)芯片之上,從而抗干擾力更強(qiáng)。其一個(gè)工作周期可分為兩個(gè)部分,即溫度檢測和數(shù)據(jù)處理。在講解其工作流程之前我們有必要了解18B20的內(nèi)部存儲器資源。18B20共有三種形態(tài)的存儲器資源,它們分別是: </p><p> ROM 只讀存儲器,用于存放DS18B20ID編碼,其前8位是單線系
121、列編碼(DS18B20的編碼是19H),后面48位是芯片唯一的序列號,最后8位是以上56的位的CRC碼(冗余校驗(yàn))。數(shù)據(jù)在出產(chǎn)時(shí)設(shè)置不由用戶更改。DS18B20共64位ROM。 </p><p> RAM 數(shù)據(jù)暫存器,用于內(nèi)部計(jì)算和數(shù)據(jù)存取,數(shù)據(jù)在掉電后丟失,DS18B20共9個(gè)字節(jié)RAM,每個(gè)字節(jié)為8位。第1、2個(gè)字節(jié)是溫度轉(zhuǎn)換后的數(shù)據(jù)值信息,第3、4個(gè)字節(jié)是用戶EEPROM(常用于溫度報(bào)警值儲存)的鏡像。在
122、上電復(fù)位時(shí)其值將被刷新。第5個(gè)字節(jié)則是用戶第3個(gè)EEPROM的鏡像。第6、7、8個(gè)字節(jié)為計(jì)數(shù)寄存器,是為了讓用戶得到更高的溫度分辨率而設(shè)計(jì)的,同樣也是內(nèi)部溫度轉(zhuǎn)換、計(jì)算的暫存單元。第9個(gè)字節(jié)為前8個(gè)字節(jié)的CRC碼。EEPROM 非易失性記憶體,用于存放長期需要保存的數(shù)據(jù),上下限溫度報(bào)警值和校驗(yàn)數(shù)據(jù),DS18B20共3位EEPROM,并在RAM都存在鏡像,以方便用戶操作。 </p><p> RAM及EEPROM
123、結(jié)構(gòu)圖:</p><p><b> 圖2</b></p><p> 我們在每一次讀溫度之前都必須進(jìn)行復(fù)雜的且精準(zhǔn)時(shí)序的處理,因?yàn)镈S18B20的硬件簡單結(jié)果就會導(dǎo)致軟件的巨大開消,也是盡力減少有形資產(chǎn)轉(zhuǎn)化為無形資產(chǎn)的投入,是一種較好的節(jié)約之道。 </p><p> 控制器對18B20操作流程: </p><p>
124、 1, 復(fù)位:首先我們必須對DS18B20芯片進(jìn)行復(fù)位,復(fù)位就是由控制器(單片機(jī))給DS18B20單總線至少480uS的低電平信號。當(dāng)18B20接到此復(fù)位信號后則會在15~60uS后回發(fā)一個(gè)芯片的存在脈沖。 </p><p> 2, 存在脈沖:在復(fù)位電平結(jié)束之后,控制器應(yīng)該將數(shù)據(jù)單總線拉高,以便于在15~60uS后接收存在脈沖,存在脈沖為一個(gè)60~240uS的低電平信號。至此,通信雙方已經(jīng)達(dá)成了基本的協(xié)議,接下
125、來將會是控制器與18B20間的數(shù)據(jù)通信。如果復(fù)位低電平的時(shí)間不足或是單總線的電路斷路都不會接到存在脈沖,在設(shè)計(jì)時(shí)要注意意外情況的處理。 </p><p> 3, 控制器發(fā)送ROM指令:雙方打完了招呼之后最要將進(jìn)行交流了,ROM指令共有5條,每一個(gè)工作周期只能發(fā)一條,ROM指令分別是讀ROM數(shù)據(jù)、指定匹配芯片、跳躍ROM、芯片搜索、報(bào)警芯片搜索。ROM指令為8位長度,功能是對片內(nèi)的64位光刻ROM進(jìn)行操作。其主要
126、目的是為了分辨一條總線上掛接的多個(gè)器件并作處理。誠然,單總線上可以同時(shí)掛接多個(gè)器件,并通過每個(gè)器件上所獨(dú)有的ID號來區(qū)別,一般只掛接單個(gè)18B20芯片時(shí)可以跳過ROM指令(注意:此處指的跳過ROM指令并非不發(fā)送ROM指令,而是用特有的一條“跳過指令”)。ROM指令在下文有詳細(xì)的介紹。 </p><p> 4, 控制器發(fā)送存儲器操作指令:在ROM指令發(fā)送給18B20之后,緊接著(不間斷)就是發(fā)送存儲器操作指令了。
127、操作指令同樣為8位,共6條,存儲器操作指令分別是寫RAM數(shù)據(jù)、讀RAM數(shù)據(jù)、將RAM數(shù)據(jù)復(fù)制到EEPROM、溫度轉(zhuǎn)換、將EEPROM中的報(bào)警值復(fù)制到RAM、工作方式切換。存儲器操作指令的功能是命令18B20作什么樣的工作,是芯片控制的關(guān)鍵。 </p><p> 5, 執(zhí)行或數(shù)據(jù)讀寫:一個(gè)存儲器操作指令結(jié)束后則將進(jìn)行指令執(zhí)行或數(shù)據(jù)的讀寫,這個(gè)操作要視存儲器操作指令而定。如執(zhí)行溫度轉(zhuǎn)換指令則控制器(單片機(jī))必須等待
128、18B20執(zhí)行其指令,一般轉(zhuǎn)換時(shí)間為500uS。如執(zhí)行數(shù)據(jù)讀寫指令則需要嚴(yán)格遵循18B20的讀寫時(shí)序來操作。數(shù)據(jù)的讀寫方法將有下文有詳細(xì)介紹。 </p><p> 若要讀出當(dāng)前的溫度數(shù)據(jù)我們需要執(zhí)行兩次工作周期,第一個(gè)周期為復(fù)位、跳過ROM指令、執(zhí)行溫度轉(zhuǎn)換存儲器操作指令、等待500uS溫度轉(zhuǎn)換時(shí)間。緊接著執(zhí)行第二個(gè)周期為復(fù)位、跳過ROM指令、執(zhí)行讀RAM的存儲器操作指令、讀數(shù)據(jù)(最多為9個(gè)字節(jié),中途可停止,只
129、讀簡單溫度值則讀前2個(gè)字節(jié)即可)。其它的操作流程也大同小異,在此不多介紹。</p><p> DS18B20芯片與單片機(jī)的接口:</p><p><b> 圖3</b></p><p><b> 圖4</b></p><p> 如圖所示,DS18B20只需要接到控制器(單片機(jī))的一個(gè)I/O口
130、上,由于單總線為開漏所以需要外接一個(gè)4.7K的上拉電阻。如要采用寄生工作方式,只要將VDD電源引腳與單總線并聯(lián)即可。但在程序設(shè)計(jì)中,寄生工作方式將會對總線的狀態(tài)有一些特殊的要求。</p><p><b> 圖5</b></p><p> DS28B20芯片ROM指令表: </p><p> Read ROM(讀ROM)[33H] (方括號
131、中的為16進(jìn)制的命令字) </p><p> 這個(gè)命令允許總線控制器讀到DS18B20的64位ROM。只有當(dāng)總線上只存在一個(gè)DS18B20的時(shí)候才可以使用此指令,如果掛接不只一個(gè),當(dāng)通信時(shí)將會發(fā)生數(shù)據(jù)沖突。 </p><p> Match ROM(指定匹配芯片)[55H] </p><p> 這個(gè)指令后面緊跟著由控制器發(fā)出了64位序列號,當(dāng)總線上有多只DS18
132、B20時(shí),只有與控制發(fā)出的序列號相同的芯片才可以做出反應(yīng),其它芯片將等待下一次復(fù)位。這條指令適應(yīng)單芯片和多芯片掛接。 </p><p> Skip ROM(跳躍ROM指令)[CCH] </p><p> 這條指令使芯片不對ROM編碼做出反應(yīng),在單總線的情況之下,為了節(jié)省時(shí)間則可以選用此指令。如果在多芯片掛接時(shí)使用此指令將會出現(xiàn)數(shù)據(jù)沖突,導(dǎo)致錯(cuò)誤出現(xiàn)。 </p><p
133、> Search ROM(搜索芯片)[F0H] </p><p> 在芯片初始化后,搜索指令允許總線上掛接多芯片時(shí)用排除法識別所有器件的64位ROM。 </p><p> Alarm Search(報(bào)警芯片搜索)[ECH] </p><p> 在多芯片掛接的情況下,報(bào)警芯片搜索指令只對附合溫度高于TH或小于TL報(bào)警條件的芯片做出反應(yīng)。只要芯片不掉電,報(bào)
134、警狀態(tài)將被保持,直到再一次測得溫度什達(dá)不到報(bào)警條件為止。 </p><p> DS28B20芯片存儲器操作指令表: </p><p> Write Scratchpad (向RAM中寫數(shù)據(jù))[4EH] </p><p> 這是向RAM中寫入數(shù)據(jù)的指令,隨后寫入的兩個(gè)字節(jié)的數(shù)據(jù)將會被存到地址2(報(bào)警RAM之TH)和地址3(報(bào)警RAM之TL)。寫入過程中可以用復(fù)位
135、信號中止寫入。 </p><p> Read Scratchpad (從RAM中讀數(shù)據(jù))[BEH] </p><p> 此指令將從RAM中讀數(shù)據(jù),讀地址從地址0開始,一直可以讀到地址9,完成整個(gè)RAM數(shù)據(jù)的讀出。芯片允許在讀過程中用復(fù)位信號中止讀取,即可以不讀后面不需要的字節(jié)以減少讀取時(shí)間。 </p><p> Copy Scratchpad (將RAM數(shù)據(jù)復(fù)
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì)--爐溫控制系統(tǒng)的設(shè)計(jì)
- 課程設(shè)計(jì)—電阻爐爐溫控制系統(tǒng)
- 課程設(shè)計(jì)—電阻爐爐溫控制系統(tǒng)
- 自動控制原理課程設(shè)計(jì)---爐溫控制pid的研究
- 基于大林算法的爐溫控制系統(tǒng)設(shè)計(jì)與仿真課程設(shè)計(jì)報(bào)告
- 爐溫控制實(shí)驗(yàn)報(bào)告
- 計(jì)算機(jī)控制課程設(shè)計(jì)---單片機(jī)的爐溫控制設(shè)計(jì)
- 過熱汽溫控制課程設(shè)計(jì)
- 恒溫控制課程設(shè)計(jì)---恒溫控制電路的設(shè)計(jì)
- 溫控課程設(shè)計(jì)--電子電路cad課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)----水溫控制系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)-- 恒溫控制系統(tǒng)設(shè)計(jì)
- 爐溫控制畢業(yè)設(shè)計(jì)畢業(yè)設(shè)計(jì)
- dcs課程設(shè)計(jì)報(bào)告--過熱汽溫控制系統(tǒng)組態(tài)
- 過程控制課程設(shè)計(jì)---加熱爐溫度控制
- 鍋爐溫度課程設(shè)計(jì)--鍋爐溫度串級控制系統(tǒng)設(shè)計(jì)
- 工業(yè)爐溫度串級控制課程設(shè)計(jì)
- 溫控系統(tǒng)課程設(shè)計(jì)
- 溫控系統(tǒng)課程設(shè)計(jì)
- 微機(jī)控制課程設(shè)計(jì)--電阻爐溫度控制系統(tǒng)設(shè)計(jì)
評論
0/150
提交評論