版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)</p><p> 學(xué)院: 信息電子學(xué)院 </p><p> 班級(jí): 08電子信息工程 </p><p> 學(xué)號(hào): </p><p> 姓名: </p><p>
2、 指導(dǎo)老師: </p><p> 日期: 2010\01\14 </p><p><b> 任務(wù)書(shū)</b></p><p><b> 目錄</b></p><p> 1、課程設(shè)計(jì)目的………………………………………………………………4&
3、lt;/p><p> 2、課程設(shè)計(jì)工具及題目………………………………………………………4</p><p> 2.1、課程設(shè)計(jì)工具…………………………………………………...……4</p><p> 2.2、課程設(shè)計(jì)題目……………………………………………...…………4</p><p> 3、課程設(shè)計(jì)內(nèi)容、步驟及電路原理圖………………………
4、………………4</p><p> 3.1、課程設(shè)計(jì)內(nèi)容………………………………………………………..4</p><p> 3.2、課程設(shè)計(jì)步驟………………………………………………………..4</p><p> 3.3、整個(gè)系統(tǒng)的電路原理圖……………………………………………..5</p><p> 4、課程設(shè)計(jì)各模塊工作原理………………
5、…………………………………5</p><p> 4.1、溫度采集模塊.………………………………………………………...5</p><p> 4.1.1、 LM20經(jīng)AD1674轉(zhuǎn)換為12位數(shù)據(jù)給從機(jī)……………….6</p><p> 4.1.2、從機(jī)接收主機(jī)發(fā)送的波特率并且設(shè)置自己的波特率……....8</p><p> 4.1.3、
6、撥碼開(kāi)關(guān)實(shí)現(xiàn)地址的變換…………………………………....8</p><p> 4.1.4、定時(shí)器實(shí)現(xiàn)5秒間隔…………………………………………8</p><p> 4.1.5、發(fā)送溫度和地址,及其通信協(xié)議……………………………9</p><p> 4.2、溫度接收模塊……………………………………………………….10</p><p> 4
7、.2.1、波特率設(shè)定及發(fā)送…………………………………………...11</p><p> 4.2.2、波特率顯示并且延時(shí)3s……………………………………...11</p><p> 4.2.3、溫度、地址的接收和判斷……………………………………11</p><p> 4.2.4、數(shù)碼管顯示…….……………………………………………...12</p>
8、<p> 4.2.5、系統(tǒng)報(bào)警………………………………………………………12</p><p> 5、課程設(shè)計(jì)成果………………………………………………………………13</p><p> 5.1、顯示波特率…………………………………………………………..13</p><p> 5.2、顯示溫度與地址……………………………………………………..14<
9、;/p><p> 5.3、改變溫度地址后重新顯示…………………………………………..14</p><p> 5.4、報(bào)警…………………………………………………………………..14</p><p> 6、課程設(shè)計(jì)心得……………………………………………………………....15</p><p> 7、參考文獻(xiàn)………………………………………………
10、…………………....16</p><p> 8、附錄:源程序代碼及注釋…………………………………………………17</p><p> 8.1、從機(jī)源代碼…………………………………………………………..17</p><p> 8.2、主機(jī)源代碼…………………………………………………………..20</p><p> 課程設(shè)計(jì)目的:?jiǎn)纹瑱C(jī)具
11、有體積小、功能強(qiáng)、成本低、應(yīng)用面廣等優(yōu)點(diǎn),可以說(shuō),智能控制與自動(dòng)控制的核心就是單片機(jī)。目前,一個(gè)學(xué)習(xí)與應(yīng)用單片機(jī)的高潮在全社會(huì)大規(guī)模地興起。學(xué)習(xí)單片機(jī)的最有效方法就是理論與實(shí)踐并重。系統(tǒng)地運(yùn)用已學(xué)的理論知識(shí)解決實(shí)際問(wèn)題的能力和查閱資料的能力。培養(yǎng)一定的自學(xué)能力和獨(dú)立分析問(wèn)題、解決問(wèn)題的能力,能通過(guò)獨(dú)立思考、查閱工具書(shū)、參考文獻(xiàn),尋找解決方案;</p><p> 課程設(shè)計(jì)工具及題目: </p>&l
12、t;p> 1、課程設(shè)計(jì)工具:PC機(jī)、Keil uVision4、Protues7.64</p><p> 2、課程設(shè)計(jì)題目:遠(yuǎn)程溫度采集系統(tǒng)</p><p><b> 課程設(shè)計(jì)內(nèi)容及步驟</b></p><p> 使用proteus作為開(kāi)發(fā)工具,完成雙機(jī)通訊的溫度采集功能:</p><p> 使用LM20
13、溫度傳感器、AD1674模數(shù)轉(zhuǎn)換器、AT89C51單片機(jī)、4位撥碼開(kāi)關(guān)組成溫度采集模塊(從機(jī)),撥碼開(kāi)關(guān)用于設(shè)定模塊的地址(00-15),從機(jī)在采集完溫度信號(hào)(間隔5S)后通過(guò)串口發(fā)送到主機(jī);</p><p> 使用AT89C51單片機(jī)、4位撥碼開(kāi)關(guān)、LED顯示組成溫度接收模塊(主機(jī)),4位撥碼開(kāi)關(guān)用于設(shè)定通訊波特率(1200,2400,4800,9600)當(dāng)主機(jī)波特率改變后,從機(jī)波特率也自動(dòng)改變,上電運(yùn)行顯示
14、波特率信息(停3S),之后顯示接收地址與溫度信息,當(dāng)接收時(shí)間間隔超過(guò)6S未收到數(shù)據(jù),系統(tǒng)報(bào)警;</p><p> 單片機(jī)一次只能發(fā)送一個(gè)字節(jié)的信息,使用多字節(jié)數(shù)據(jù)組成一幀數(shù)據(jù),自定義一套通信協(xié)議來(lái)完成一、二的功能;</p><p><b> 擴(kuò)展要求:</b></p><p> 將雙機(jī)通信改成多機(jī)通訊(一個(gè)接收器,多個(gè)發(fā)送器)</p
15、><p> 各功能模塊的工作原理:</p><p><b> 溫度采集模塊</b></p><p> 使用LM20溫度傳感器、AD1674模數(shù)轉(zhuǎn)換器、AT89C51單片機(jī)、4位撥碼開(kāi)關(guān)組成溫度采集模塊(從機(jī)),撥碼開(kāi)關(guān)用于設(shè)定模塊的地址(00-15),從機(jī)在采集完溫度信號(hào)(間隔5S)后通過(guò)串口發(fā)送到主機(jī);</p><p&g
16、t; (1)LM20經(jīng)AD1674轉(zhuǎn)換為12位數(shù)據(jù)給從機(jī)</p><p> LM20溫度傳感器經(jīng)過(guò)電壓跟隨器后輸入到AD1674的10VIN口,AD1674組成雙峰。STS、CS、A0、CE、RC分別接到從機(jī)的P0-P4口實(shí)現(xiàn)AD1674的控制作用。一開(kāi)始CE=1,CS=0,RC=0,A0=0啟動(dòng)12位溫度轉(zhuǎn)換,然后等待數(shù)據(jù)采集結(jié)束while(STS==1); 接著CE=1,CS=0,RC=1,12/8=1,
17、A0=0允許高八位數(shù)據(jù)并行輸出,最后CE=1,CS=0,RC=1,12/8=0,A0=1允許低四位數(shù)據(jù)并行輸出。讀出的12位數(shù)據(jù)存放在變量temp中。經(jīng)過(guò)AD1674轉(zhuǎn)換后輸出的結(jié)果精確到(10.0/4095.0)。若LM20溫度轉(zhuǎn)換為電壓值是1.13598v時(shí),經(jīng)過(guò)AD1674轉(zhuǎn)換后輸出的12位數(shù)為1.13598*4095/10=465轉(zhuǎn)換為2進(jìn)制為000111010001。12位數(shù)據(jù)經(jīng)過(guò)公式轉(zhuǎn)換T = (1.8525-temp*10
18、/4095.0)*10000/11.79.然后把低位小數(shù)位給temp1,temp就為整數(shù)部分,接著就是等待發(fā)送給主機(jī)。</p><p> /*讀取AD1674轉(zhuǎn)換結(jié)果*/</p><p> uint AD1674_Read(void)</p><p><b> {</b></p><p> uint temp;&
19、lt;/p><p> uchar temp1,temp2;</p><p><b> CS = 1;</b></p><p> CE = 0; //初始化,關(guān)閉數(shù)據(jù)采集</p><p><b> CS = 0; </b></p><p><b> A0 = 0
20、; </b></p><p><b> RC = 0; </b></p><p> CE = 1; //CE=1,CS1=0,RC=0,A0=0啟動(dòng)12位溫度轉(zhuǎn)換</p><p><b> _nop_();</b></p><p> while(STS==1);//等待數(shù)據(jù)采集結(jié)
21、束</p><p> CE = 0; //芯片使能關(guān)閉</p><p><b> RC = 1; </b></p><p><b> A0 = 0; </b></p><p> CE = 1; //CE=1,CS1=0,RC=1,12/8=1,A0=0允許高八位數(shù)據(jù)并行輸出</p>
22、;<p><b> _nop_();</b></p><p> temp1 = P0;//讀取轉(zhuǎn)換結(jié)果的高八位</p><p> CE = 0;//芯片使能關(guān)閉</p><p><b> RC = 1;</b></p><p><b> A0 = 1; </b
23、></p><p> CE = 1;//CE=1,CS1=0,RC=1,12/8=0,A0=1允許低四位數(shù)據(jù)并行輸出</p><p><b> _nop_();</b></p><p> temp2 = P0;//讀取轉(zhuǎn)換結(jié)果的低四位</p><p> temp = (temp1<<8)|tem
24、p2;//高位和低位合成實(shí)際溫度,temp2為P0口的高四位</p><p> return (temp>>4);//返回轉(zhuǎn)換結(jié)果,右移四位是因?yàn)閠emp2為P0口的高四位</p><p><b> }</b></p><p> ?。?)從機(jī)接收主機(jī)發(fā)送的波特率并且設(shè)置自己的波特率</p><p> 主
25、機(jī)發(fā)送波特率給從機(jī),從機(jī)查詢法判斷是否接收到主機(jī)發(fā)送的波特率,如果接收到主機(jī)發(fā)送的波特率則改變自己的波特率,跳出循環(huán)來(lái)實(shí)現(xiàn)發(fā)送溫度地址的發(fā)送,否則一直循環(huán)判斷是否接收到主機(jī)發(fā)送的波特率。</p><p> /*查詢法接收波特率*/</p><p><b> while(1)</b></p><p><b> {</b>
26、;</p><p> if(RI == 1)</p><p><b> {</b></p><p> temp = SBUF;</p><p> set_bote(temp);//設(shè)置波特率</p><p><b> break;</b></p>&l
27、t;p><b> }</b></p><p><b> }</b></p><p> ?。?)撥碼開(kāi)關(guān)實(shí)現(xiàn)地址的變換</p><p> 撥碼開(kāi)關(guān)接從機(jī)的P1口,然后改變撥碼開(kāi)關(guān)的值,P1口的數(shù)據(jù)變換,等待傳送給主機(jī)。</p><p> ?。?)定時(shí)器實(shí)現(xiàn)5秒間隔</p>&
28、lt;p> 定時(shí)器0工作方式1,初值裝(65536-50000)實(shí)現(xiàn)50ms的定時(shí),num為定時(shí)次數(shù),當(dāng)num=100時(shí),定時(shí)為5s的間隔。</p><p> ?。?)發(fā)送溫度和地址,及其通信協(xié)議</p><p> 由于溫度經(jīng)過(guò)轉(zhuǎn)換后發(fā)送給主機(jī)要保留一位小數(shù)的話大于255(即8位),還有溫度有正負(fù)要判斷,所以要發(fā)送多次數(shù)據(jù)給主機(jī),主機(jī)經(jīng)過(guò)判斷才能確認(rèn)從機(jī)發(fā)送的溫度是整數(shù)部分、小數(shù)
29、部分還是地址。</p><p><b> 通信協(xié)議如下:</b></p><p> 因?yàn)椴杉降臏囟扔姓?fù),所以定義j表示溫度的正負(fù),j=0表示正,j=1表示負(fù)。j = 0;//溫度正負(fù)標(biāo)志位</p><p> temp = AD1674_Read();//讀取轉(zhuǎn)換后的12位溫度值</p><p> te
30、mp = (int)((1.8528-temp*addo)*10000/11.79); //實(shí)現(xiàn)實(shí)際溫度的轉(zhuǎn)換其中add=10.0/4095</p><p> if(temp < 0) {temp = - temp;j = 0x20;} //溫度若為負(fù),則標(biāo)志位00100000</p><p> temp2 = temp % 10;//溫度小數(shù)位存放在temp2中</p&
31、gt;<p> temp = temp / 10;</p><p><b> 小數(shù)部分</b></p><p> temp2 = temp2+132;//溫度小數(shù)位+132用于接收時(shí)的判斷</p><p><b> 溫度正負(fù)標(biāo)志和地址</b></p><p> temp =
32、P1;</p><p> temp = temp & 0x0f; //地址為P1口的低4位</p><p> temp1 = temp1 << 4;</p><p> temp1 = temp1 | 0xc0; //地址高位置1即11000000用于接收判斷</p><p> temp = temp | tem
33、p1; </p><p> temp = temp | j; //正負(fù)標(biāo)志位存于temp中</p><p> 因?yàn)闇囟戎凳?-130之間的由于精度在1.41所以是0-132之間。所以溫度值是小于132的。小數(shù)部分是0-9,所以小數(shù)部分+133即133-142之間的。而地址低4位0-15,高位直接置為1100,即大于192。所以主機(jī)只要判斷在0-132之間就為溫度的整數(shù)部分,1
34、33-142之間的就為溫度的小數(shù)部分。剩下的就是地址、溫度正負(fù)標(biāo)志位的組合了。</p><p><b> 溫度接收模塊</b></p><p> 使用AT89C51單片機(jī)、4位撥碼開(kāi)關(guān)、LED顯示組成溫度接收模塊(主機(jī)),4位撥碼開(kāi)關(guān)用于設(shè)定通訊波特率(1200,2400,4800,9600)當(dāng)主機(jī)波特率改變后,從機(jī)波特率也自動(dòng)改變,上電運(yùn)行顯示波特率信息(停3S
35、),之后顯示接收地址與溫度信息,當(dāng)接收時(shí)間間隔超過(guò)6S未收到數(shù)據(jù),系統(tǒng)報(bào)警;</p><p> ?。?)波特率設(shè)定及發(fā)送</p><p> 撥碼開(kāi)關(guān)接主機(jī)的P1口,用于設(shè)定主機(jī)的波特率。P1口的數(shù)據(jù)分別為1、2、4、8時(shí)的波特率為1200、2400、4800、9600。然后發(fā)送給從機(jī)波特率,接著自己的波特率也隨之改變。</p><p> ?。?)波特率顯示并且延時(shí)
36、3s</p><p> 由P1口可以得到不同的值,從而用軟件設(shè)定波特率(即設(shè)定定時(shí)器1的初值),不同的值存放在bote[]數(shù)組中用以數(shù)碼管的顯示。定時(shí)器T0實(shí)現(xiàn)定時(shí)功能,初值裝(65536-50000)實(shí)現(xiàn)50ms的定時(shí),num為定時(shí)次數(shù),當(dāng)num為60的時(shí)候定時(shí)到了3s,以后就不用顯示波特率了,所以用m變量為1表示波特率顯示結(jié)束,不再顯示波特率。</p><p> ?。?)溫度、地址的
37、接收和判斷</p><p> 溫度地址接收是用串口中斷實(shí)現(xiàn)的。RI為1的時(shí)候表示一幀數(shù)據(jù)已經(jīng)接收完了,所以就開(kāi)始判斷是溫度的整數(shù)部分、小數(shù)部分、還是地址和正負(fù)標(biāo)志位組成的數(shù)據(jù)。通信協(xié)議如上:</p><p> if(temp < 132)// 若所接收到的數(shù)小于132則是溫度正數(shù)部分值</p><p><b> {</b>
38、</p><p> HEXTOBCD(temp, aa, cc); //轉(zhuǎn)換為溫度值</p><p><b> }</b></p><p> else if(temp < 143)//若小于143,則為溫度的小數(shù)部分值</p><p><b> {</b></p>
39、<p> cc = temp - 132; //小數(shù)部分還原</p><p><b> } </b></p><p><b> else </b></p><p><b> {</b></p><p> bb = temp & 0x0f;
40、 //溫度為低4位</p><p> disnum[6] = bb / 10; //存于數(shù)組中用于顯示中</p><p> disnum[7] = bb % 10;</p><p> aa = temp & 0x20; //溫度正負(fù)標(biāo)志位</p><p> if(aa == 0) aa = 0;</p>
41、<p> else aa = 1;</p><p><b> }</b></p><p> ?。?)數(shù)碼管顯示模塊</p><p> 數(shù)據(jù)存于disnum數(shù)組中,用8位數(shù)碼管來(lái)顯示溫度、地址以及波特率。段選接主機(jī)的P0口,片選接主機(jī)的P2口。一開(kāi)始顯示波特率,就選中最后4位。</p><p> 然后
42、就是要顯示溫度和地址的信息了。溫度為-55—130所以前面4位顯示溫度后2位顯示地址即:XXX.XC-XX。由于數(shù)碼管是動(dòng)態(tài)掃描的,所以要一定速度才可以實(shí)現(xiàn)視覺(jué)殘留??瓷先ズ孟袷且恢秉c(diǎn)亮一樣的。</p><p> void display_led()</p><p><b> {</b></p><p><b> uchar i
43、;</b></p><p> for(i = 0; i < 8; i++) </p><p><b> {</b></p><p> P2 = disbit[i]; //使用查表法進(jìn)行位選 </p><p> if(i != 2)</p><p> P0 = t
44、able[disnum[i]]; </p><p><b> else </b></p><p> P0 = table1[disnum[i]];</p><p> delay(150); //掃描間隔時(shí)間 太長(zhǎng)會(huì)數(shù)碼管會(huì)有閃爍感</p><p><b> }</b></p&
45、gt;<p><b> }</b></p><p><b> ?。?)系統(tǒng)報(bào)警</b></p><p> 定時(shí)器0實(shí)現(xiàn)定時(shí)功能,num1為報(bào)警的時(shí)間的計(jì)算,定時(shí)器是實(shí)現(xiàn)50ms的,所以要120才能實(shí)現(xiàn)6s。num1 = 120,那么判斷一下flag(是否接收到傳送過(guò)來(lái)的數(shù)據(jù))如果flag = 0;說(shuō)明沒(méi)有接收到采集的數(shù)據(jù),接著就
46、報(bào)警,還要把num1和flag重新清0,實(shí)現(xiàn)下次的報(bào)警功能。 </p><p><b> {</b></p><p> m = 0; //波特率顯示結(jié)束</p><p> if(num1 == 120) //若已經(jīng)計(jì)時(shí)6s</p><p><b> {</b></p&g
47、t;<p> if(flag == 0) //若沒(méi)有接收到數(shù)據(jù)</p><p><b> {</b></p><p> uchar t = 8;</p><p> while(t--) //報(bào)警</p><p><b> BEEP();</b></p>&l
48、t;p><b> }</b></p><p><b> else </b></p><p> flag = 0; //否則接收到數(shù)據(jù)標(biāo)志位清0</p><p> num1 = 0; //計(jì)數(shù)次數(shù)清0</p><p><b> } </b></p>
49、;<p> display_led();//顯示溫度和地址</p><p><b> }</b></p><p><b> 課程設(shè)計(jì)成果</b></p><p><b> 顯示波特率</b></p><p><b> 2、顯示溫度與地址&l
50、t;/b></p><p> 3、改變溫度地址后重新顯示</p><p><b> 4、報(bào)警</b></p><p><b> 課程設(shè)計(jì)心得</b></p><p> 通過(guò)本次課程設(shè)計(jì)我學(xué)到了很多很多,雖然一開(kāi)始的時(shí)候已經(jīng)學(xué)過(guò)了C語(yǔ)言。并且自認(rèn)為學(xué)得不錯(cuò)。但是到了實(shí)際的單片機(jī)還是有點(diǎn)區(qū)
51、別的。不是再控制臺(tái)下直接運(yùn)行的,他還有他的一個(gè)方式,一個(gè)功能來(lái)實(shí)現(xiàn)的。還好開(kāi)學(xué)的時(shí)候?qū)W過(guò)單片的C語(yǔ)言。并且也買(mǎi)了很好的郭天祥的單片機(jī)C語(yǔ)言教程,還買(mǎi)了實(shí)際的開(kāi)發(fā)板來(lái)做很多很多的實(shí)驗(yàn)?;旧蠁纹瑱C(jī)C語(yǔ)言已經(jīng)入門(mén)了。但是那個(gè)開(kāi)發(fā)板是已經(jīng)焊好了的。不知道怎么連AD1674,不知道怎么連數(shù)碼管。用protues仿真也是一開(kāi)始用那個(gè)匯編編的。所以還是要慢慢地學(xué)習(xí)。</p><p> 第一天、看到題目覺(jué)得一片茫然。不知道從
52、何下手。慢慢地一點(diǎn)一點(diǎn)地來(lái)。首先是LM20。查看它的功能和作用。知道了他的轉(zhuǎn)換公式。接著要用單片機(jī)采集的話,必須經(jīng)過(guò)模數(shù)轉(zhuǎn)換才可以實(shí)現(xiàn)。于是便開(kāi)始AD1674芯片的學(xué)習(xí)了。被這個(gè)芯片搞得頭都大了。花了1天時(shí)間總算弄好了采集那個(gè)部分。不過(guò)只是用了8位采集,還沒(méi)有12位的,精度不夠。因?yàn)橐婚_(kāi)始用了12位的一直是出錯(cuò)的,后來(lái)8位居然是對(duì)的。就用了8位。</p><p> 第二天、開(kāi)始了從機(jī)采集到的數(shù)據(jù)發(fā)給主機(jī)。還得學(xué)
53、習(xí)下串口怎么發(fā)送,怎么接收,怎么初始化,怎么設(shè)定波特率,好多好多問(wèn)題。迎面而來(lái)。此時(shí)又找不到任何一個(gè)人幫幫忙。于是便自己找資料,看書(shū),圖書(shū)館。上網(wǎng)。最后終于興奮地完成了從機(jī)發(fā)送采集到的數(shù)據(jù)給主機(jī)。</p><p> 第三天、那便是怎么把接收到的數(shù)據(jù)用數(shù)碼管顯示出來(lái),這個(gè)倒是很容易。很快地,一個(gè)顯示模塊搞定了。此時(shí)整個(gè)系統(tǒng)基本上已經(jīng)形成了。看著這一天天學(xué)到的,遠(yuǎn)遠(yuǎn)比課堂學(xué)到的多多了,所以理論聯(lián)系實(shí)際才是最最重要的
54、。接著便是改變地址,改變波特率,報(bào)警等等功能。也很快得到了解決。</p><p> 第四天、通過(guò)了微機(jī)的課程設(shè)計(jì),于是便是單片機(jī)的了,早上很早就到了,心想得用12位的,于是便開(kāi)始改了,居然人品爆了,改了以后一次性通過(guò)。所有的功能都實(shí)現(xiàn)了。真是太開(kāi)心了。最后便交給老師檢查,通過(guò)了。好開(kāi)心?。?lt;/p><p> 不僅學(xué)到了這么多,對(duì)于單片機(jī)還興趣更加濃厚了。相信再努力點(diǎn),以后會(huì)得到很多很多
55、。</p><p> 此次課程設(shè)計(jì),我知道了,做事不能猶豫,不能害怕,遇到困難就想辦法解決。不要總是等著別人去完成,自信的自己才是最最好的。相信自己肯定可以完成一切。可以戰(zhàn)勝困難,最后得到成功!</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 郭天祥。新概念51單片機(jī)C語(yǔ)言教程[M] 2009.12</p>
56、;<p> 附錄:源程序代碼及注釋</p><p><b> 從機(jī)代碼:</b></p><p> #include<reg51.h></p><p> #include<intrins.h></p><p> #define uchar unsigned char <
57、;/p><p> #define uint unsigned int</p><p> #define addo (10.0/4095.0)//轉(zhuǎn)換進(jìn)率,12位精度(2^12-1=4095),滿量程為10V</p><p> uint num; //計(jì)數(shù)次數(shù)</p><p><b> /*管腳定義*/</b><
58、/p><p> sbit STS = P2^0;</p><p> sbit CS = P2^1;</p><p> sbit A0 = P2^2;</p><p> sbit CE = P2^3;</p><p> sbit RC = P2^4;</p><p> /*毫秒延時(shí)函數(shù)*/
59、</p><p> void delay_ms(uint n)</p><p><b> {</b></p><p><b> uint i;</b></p><p> while(n--)</p><p><b> {</b></p&g
60、t;<p> for(i=0;i<110;i++);</p><p><b> }</b></p><p><b> }</b></p><p> /*讀取AD1674轉(zhuǎn)換結(jié)果*/</p><p> uint AD1674_Read(void)</p>&
61、lt;p><b> {</b></p><p> uint temp;</p><p> uchar temp1,temp2;</p><p><b> CS = 1;</b></p><p> CE = 0; //初始化,關(guān)閉數(shù)據(jù)采集</p><p><
62、;b> CS = 0; </b></p><p><b> A0 = 0; </b></p><p><b> RC = 0; </b></p><p> CE = 1; //CE=1,CS1=0,RC=0,A0=0啟動(dòng)12位溫度轉(zhuǎn)換</p><p><b>
63、_nop_();</b></p><p> while(STS==1);//等待數(shù)據(jù)采集結(jié)束</p><p> CE = 0; //芯片使能關(guān)閉</p><p><b> RC = 1; </b></p><p><b> A0 = 0; </b></p><
64、p> CE = 1; //CE=1,CS1=0,RC=1,12/8=1,A0=0允許高八位數(shù)據(jù)并行輸出</p><p><b> _nop_();</b></p><p> temp1 = P0;//讀取轉(zhuǎn)換結(jié)果的高八位</p><p> CE = 0;//芯片使能關(guān)閉</p><p><b>
65、 RC = 1;</b></p><p><b> A0 = 1; </b></p><p> CE = 1;//CE=1,CS1=0,RC=1,12/8=0,A0=1允許低四位數(shù)據(jù)并行輸出</p><p><b> _nop_();</b></p><p> temp2 = P
66、0;//讀取轉(zhuǎn)換結(jié)果的低四位</p><p> temp = (temp1<<8)|temp2;//高位和低位合成實(shí)際溫度,temp2為P0口的高四位</p><p> return (temp>>4);//返回轉(zhuǎn)換結(jié)果,右移四位是因?yàn)閠emp2為P0口的高四位</p><p><b> }</b></p&g
67、t;<p><b> /*數(shù)據(jù)發(fā)送*/</b></p><p> void putbyte(uchar byte)// 利用硬件串口方式2 發(fā)送一個(gè)字節(jié)數(shù)據(jù)</p><p><b> {</b></p><p> SBUF = byte;//將要發(fā)送的數(shù)據(jù)送到發(fā)送緩沖區(qū)域,系統(tǒng)自動(dòng)發(fā)送</p&g
68、t;<p> while(!TI);//查詢是否發(fā)送結(jié)束 當(dāng)TI=1 代表發(fā)送結(jié)束</p><p> TI = 0;//清發(fā)送結(jié)束位方便下一次發(fā)送</p><p><b> }</b></p><p> void init()</p><p><b> {</b><
69、/p><p> TMOD=0x21;//定時(shí)器為方式2</p><p><b> TL1=0xFD;</b></p><p> TH1=0xFD;//波特率為9.6K</p><p> TH0 = (65536 - 50000) / 256; //裝初值實(shí)現(xiàn)50ms</p><p>
70、TL0 = (65526 - 50000) % 256;</p><p> TR0 = 1; //啟動(dòng)定時(shí)器0</p><p> TR1 = 1; //啟動(dòng)定時(shí)器1</p><p> ET0 = 1; //開(kāi)定時(shí)器0</p><p> SM0 = 0; //方式2<
71、/p><p><b> SM1 = 1;</b></p><p><b> RI = 0;</b></p><p><b> TI = 0;</b></p><p><b> REN = 1;</b></p><p> EA
72、= 1; //開(kāi)總中斷</p><p> ES = 1; //開(kāi)串口中斷 </p><p><b> }</b></p><p><b> //設(shè)置波特率</b></p><p> void set_bote(uchar temp)</p><p>
73、;<b> {</b></p><p> if(temp==1)</p><p><b> {</b></p><p><b> TL1=0xE8;</b></p><p> TH1=0xE8;//波特率為1.2k</p><p><b&
74、gt; }</b></p><p> else if(temp==2)</p><p><b> {</b></p><p><b> TL1=0xF4;</b></p><p> TH1=0xF4;//波特率為2.4K</p><p><b>
75、; }</b></p><p> else if(temp==4)</p><p><b> {</b></p><p><b> TL1=0xFA;</b></p><p> TH1=0xFA;//波特率為4.8K</p><p><b>
76、 }</b></p><p> else if(temp==8)</p><p><b> {</b></p><p><b> TL1=0xFD;</b></p><p> TH1=0xFD;//波特率為9.6K</p><p><b> }
77、</b></p><p><b> }</b></p><p><b> /*主函數(shù)*/</b></p><p> void main(void)</p><p><b> {</b></p><p> int temp,temp
78、1; </p><p> uchar a, temp2;</p><p><b> uchar j; </b></p><p><b> init();</b></p><p> /*查詢法接收波特率*/</p><p><b> while(1)<
79、/b></p><p><b> {</b></p><p> if(RI == 1)</p><p><b> {</b></p><p> temp = SBUF;</p><p> set_bote(temp);//設(shè)置波特率</p>&l
80、t;p><b> break;</b></p><p><b> }</b></p><p><b> } </b></p><p> while(1) </p><p><b> {</b></p><p>
81、 while(num==100); //num計(jì)數(shù)100實(shí)現(xiàn)5秒的延時(shí)</p><p><b> num = 0;</b></p><p> j = 0;//溫度正負(fù)標(biāo)志位</p><p> temp = AD1674_Read();//讀取轉(zhuǎn)換后的12位溫度值</p><p> temp = (in
82、t)((1.8528-temp*addo)*10000/11.79); //實(shí)現(xiàn)實(shí)際溫度的轉(zhuǎn)換</p><p> if(temp < 0) {temp = - temp;j = 0x20;} //溫度若為負(fù),則標(biāo)志位00100000</p><p> temp2 = temp % 10;//溫度小數(shù)位存放在temp2中</p><p> temp =
83、temp / 10;</p><p> a = (uchar)temp; </p><p> putbyte(a); //發(fā)送溫度</p><p> delay_ms(10);//延時(shí)一段時(shí)間</p><p> temp2 = temp2+132;//溫度小數(shù)位+132用于接收時(shí)的判斷</p><p> pu
84、tbyte(temp2);</p><p> delay_ms(10); //發(fā)送溫度小數(shù)位</p><p> temp = P1;</p><p> temp = temp & 0x0f; //地址為P1口的低4位</p><p> temp1 = temp1 << 4;</p><p
85、> temp1 = temp1 | 0xc0; //地址高位置1即11000000用于接收判斷</p><p> temp = temp | temp1; </p><p> temp = temp | j; //正負(fù)標(biāo)志位存于temp中</p><p> putbyte(temp); //發(fā)送地址</p><p>
86、<b> }</b></p><p><b> }</b></p><p> /*定時(shí)器0中斷*/</p><p> void t0() interrupt 1</p><p><b> {</b></p><p> TH0 = (65536
87、 - 50000) / 256;//裝初值50000實(shí)現(xiàn)50ms</p><p> TL0 = (65526 - 50000) % 256;</p><p> num++; //計(jì)數(shù)次數(shù)</p><p><b> }</b></p><p><b> 主機(jī)代碼:</b></
88、p><p> #include <reg51.h></p><p> #include <intrins.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> /*數(shù)碼管顯示’
89、0‘-’9‘,‘-’,’C‘無(wú)小數(shù)點(diǎn)*/</p><p> uchar code table[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,</p><p> 0x92, 0x82, 0xf8, 0x80, 0x90,0xbf, 0xc6};</p><p> /*數(shù)碼管顯示’0‘-’9‘有小數(shù)點(diǎn)*/</p><p>
90、 uchar code table1[]={0x40, 0x79, 0x24, 0x30, 0x19,</p><p> 0x12, 0x02, 0x78, 0x00, 0x10,0x3f};</p><p> /*位選信號(hào)選中數(shù)碼管*/</p><p> uchar disbit[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x
91、20,0x40,0x80};</p><p> uchar disnum[8],bote[4];//存放要顯示的數(shù)據(jù)</p><p> uchar flag, num, num1, m, aa, cc;</p><p> sbit beep = P1^7; //蜂鳴器報(bào)警</p><p> sbit led = P1^6;//紅燈
92、亮報(bào)警</p><p><b> /*延時(shí)子程序*/</b></p><p> void delay(uint i)</p><p><b> {</b></p><p><b> char j;</b></p><p> for(i; i &
93、gt; 0; i--)</p><p> for(j = 200; j > 0; j--);</p><p><b> }</b></p><p> /*向緩沖器中寫(xiě)入要顯示的數(shù)據(jù)*/</p><p> void HEXTOBCD(uint temp, uchar a,uchar cc)</p>
94、<p><b> {</b></p><p> temp = temp * 10 + cc;</p><p> /*若為正數(shù)即0-130*/</p><p> if(a == 0)</p><p><b> {</b></p><p> disnum
95、[0] = temp/1000; //百位</p><p> disnum[1] = temp%1000/100; //十位</p><p> disnum[2] = temp%100/10; //各位</p><p> disnum[3] = temp%10; //小數(shù)位</p><p> disnum[4] = 1
96、1; //顯示C</p><p> disnum[5] = 10; //顯示-</p><p><b> } </b></p><p> /*若為負(fù)數(shù)即-55-0*/</p><p> else if (a == 1) </p><p><b> {<
97、/b></p><p> disnum[0] = 10; //顯示-</p><p> disnum[1] = temp/100; //十位</p><p> disnum[2] = temp%100/10; //個(gè)位</p><p> disnum[3] = temp%10; //小數(shù)位</p&
98、gt;<p> disnum[4] = 11; //顯示C</p><p> disnum[5] = 10; //顯示-</p><p><b> }</b></p><p><b> }</b></p><p> void init()</p>
99、;<p><b> {</b></p><p> SCON = 0x50; </p><p> TMOD=0x21;//定時(shí)器為方式2</p><p><b> TL1=0xFD;</b></p><p> TH1=0xFD;//波特率為9.6K</p><
100、;p> TH0 = (65536 - 50000) / 256; //裝初值實(shí)現(xiàn)50ms</p><p> TL0 = (65526 - 50000) % 256;</p><p> TR0 = 1; //開(kāi)定時(shí)器0</p><p> TR1 = 1; //開(kāi)定時(shí)器1</p><p> ET0 = 1;
101、 //開(kāi)定時(shí)器0</p><p> REN= 1; //允許接收</p><p> SM0 = 0; //方式2</p><p><b> SM1 = 1;</b></p><p> EA = 1; //開(kāi)總中斷</p><p> ES = 1;
102、 //開(kāi)串口中斷</p><p><b> }</b></p><p><b> /*數(shù)據(jù)發(fā)送*/</b></p><p> void putbyte(uchar byte)// 利用硬件串口方式2 發(fā)送一個(gè)字節(jié)數(shù)據(jù)</p><p><b> {</b></p&
103、gt;<p> SBUF = byte;//將要發(fā)送的數(shù)據(jù)送到發(fā)送緩沖區(qū)域,系統(tǒng)自動(dòng)發(fā)送</p><p> while(!TI);//查詢是否發(fā)送結(jié)束 當(dāng)TI=1 代表發(fā)送結(jié)束</p><p> TI = 0;//清發(fā)送結(jié)束位方便下一次發(fā)送</p><p><b> }</b></p><p>
104、 /*設(shè)置波特率 */</p><p> void set_bote()</p><p><b> {</b></p><p> uint temp=P1;</p><p> temp=temp&0x0f;</p><p> putbyte(temp);</p>
105、<p> if(temp==1)</p><p><b> {</b></p><p><b> TL1=0xE8;</b></p><p> TH1=0xE8;//波特率為1.2K</p><p><b> }</b></p><p&g
106、t; else if(temp==2)</p><p><b> {</b></p><p><b> TL1=0xF4;</b></p><p> TH1=0xF4;//波特率為2.4K</p><p><b> }</b></p><p>
107、 else if(temp==4)</p><p><b> {</b></p><p><b> TL1=0xFA;</b></p><p> TH1=0xFA;//波特率為4.8K</p><p><b> }</b></p><p>
108、else if(temp==8)</p><p><b> {</b></p><p><b> TL1=0xFD;</b></p><p> TH1=0xFD;//波特率為9.6K</p><p><b> }</b></p><p><
109、b> }</b></p><p> void display_led()</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i = 0; i < 8; i++) </p><p&g
110、t;<b> {</b></p><p> P2 = disbit[i]; //使用查表法進(jìn)行位選 </p><p> if(i != 2)</p><p> P0 = table[disnum[i]]; </p><p><b> else </b></p>&l
111、t;p> P0 = table1[disnum[i]];</p><p> delay(150); //掃描間隔時(shí)間 太長(zhǎng)會(huì)數(shù)碼管會(huì)有閃爍感</p><p><b> }</b></p><p><b> }</b></p><p> void BEEP()</p>
112、;<p><b> {</b></p><p> uchar i , j;</p><p><b> led = 1;</b></p><p> for (i = 0; i < 100; i++)</p><p><b> { </b></
113、p><p> beep = !beep; //beep取反</p><p> for(j = 0; j < 250 ; j++) //需要產(chǎn)生方波</p><p><b> _nop_();</b></p><p><b> } </b></p&g
114、t;<p> beep = 1; //關(guān)閉蜂鳴器</p><p><b> }</b></p><p> void main(void)</p><p><b> {</b></p><p><b> uchar i;<
115、;/b></p><p> init(); //初始化</p><p> set_bote(); //設(shè)置波特率并且發(fā)送給從機(jī)</p><p> num = 0; //計(jì)數(shù)次數(shù)清0</p><p> num1 = 0; //報(bào)警計(jì)數(shù)次數(shù)清0</p><p> m
116、 = 1; //波特率顯示結(jié)束標(biāo)志</p><p> flag = 1; //是否接收到從機(jī)發(fā)送的數(shù)據(jù)標(biāo)志</p><p><b> while(1)</b></p><p><b> {</b></p><p> led = 0;</p><p
117、> if(num <= 60 && m == 1)</p><p><b> {</b></p><p> uchar temp = P1 & 0x0f; </p><p> if(temp==1) //顯示波特率1200</p><p><b> {<
118、/b></p><p> bote[0] = 1;bote[1] = 2;bote[2] = 0;bote[3] = 0;</p><p><b> }</b></p><p> else if(temp==2) //顯示波特率2400</p><p><b> {</b></p
119、><p> bote[0] = 2;bote[1] = 4;bote[2] = 0;bote[3] = 0;</p><p><b> }</b></p><p> else if(temp==4) //顯示波特率4800</p><p><b> {</b></p><p
120、> bote[0] = 4;bote[1] = 8;bote[2] = 0;bote[3] = 0;</p><p><b> } </b></p><p> else if(temp==8) //顯示波特率9600</p><p><b> {</b></p><p>
121、 bote[0] = 9;bote[1] = 6;bote[2] = 0;bote[3] = 0;</p><p><b> }</b></p><p> for(i = 0; i < 4; i++) </p><p><b> {</b></p><p> P2 = disbit[
122、i+4];//使用查表法進(jìn)行位選 </p><p> P0 = table[bote[i]]; </p><p> delay(150); //掃描間隔時(shí)間 太長(zhǎng)會(huì)數(shù)碼管會(huì)有閃爍感</p><p><b> }</b></p><p><b> } </b></p
123、><p><b> else </b></p><p><b> {</b></p><p> m = 0; //波特率顯示結(jié)束</p><p> if(num1 == 120) //若已經(jīng)計(jì)時(shí)6s</p><p><b> {</b&g
124、t;</p><p> if(flag == 0) //若沒(méi)有接收到數(shù)據(jù)</p><p><b> {</b></p><p> uchar t = 8;</p><p> while(t--) //報(bào)警</p><p><b> BEEP();</b><
125、/p><p><b> }</b></p><p><b> else </b></p><p> flag = 0; //否則接收到數(shù)據(jù)標(biāo)志位清0</p><p> num1 = 0; //計(jì)數(shù)次數(shù)清0</p><p><b> } </b>
126、;</p><p> display_led();//顯示溫度和地址</p><p><b> } </b></p><p><b> } </b></p><p><b> }</b></p><p> void t0() inte
127、rrupt 1</p><p><b> {</b></p><p> TH0 = (65536 - 50000) / 256; //裝初值實(shí)現(xiàn)50ms </p><p> TL0 = (65526 - 50000) % 256;</p><p><b> num++;</b></p&
128、gt;<p><b> num1++;</b></p><p><b> }</b></p><p> void recieve() interrupt 4</p><p><b> {</b></p><p> uchar temp, bb;</
129、p><p> if(RI) //RI=1,表示一楨數(shù)據(jù)接收完</p><p><b> {</b></p><p> flag = 1; </p><p> temp = SBUF;</p><p> if(temp <
130、; 132)// 若所接收到的數(shù)小于132則是溫度正數(shù)部分值</p><p><b> {</b></p><p> HEXTOBCD(temp, aa, cc); //轉(zhuǎn)換為溫度值</p><p><b> }</b></p><p> else if(temp < 1
131、43)//若小于143,則為溫度的小數(shù)部分值</p><p><b> {</b></p><p> cc = temp - 132; //小數(shù)部分還原</p><p><b> } </b></p><p><b> else </b></p>
132、<p><b> {</b></p><p> bb = temp & 0x0f; //溫度為低4位</p><p> disnum[6] = bb / 10; //存于顯示中</p><p> disnum[7] = bb % 10;</p><p> aa = temp &a
133、mp; 0x20; //溫度正負(fù)標(biāo)志位</p><p> if(aa == 0) aa = 0;</p><p> else aa = 1;</p><p><b> }</b></p><p><b> }</b></p><p> RI=0; //RI清0
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)報(bào)告--遠(yuǎn)程溫度采集系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)--遠(yuǎn)程溫度采集系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)報(bào)--遠(yuǎn)程溫度采集系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)--遠(yuǎn)程溫度監(jiān)控系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)--基于單片機(jī)的溫度數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)---基于單片機(jī)的溫度采集系統(tǒng)設(shè)計(jì)
- 基于單片機(jī)的多路溫度采集系統(tǒng)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于mcs-51單片機(jī)的溫度采集系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---溫度監(jiān)控系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)溫度測(cè)量系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告單片機(jī)的多路溫度測(cè)量系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字時(shí)鐘及溫度采集系統(tǒng)的設(shè)計(jì)
- 遠(yuǎn)程溫度控制課程設(shè)計(jì)--單片機(jī)的溫度遠(yuǎn)程檢測(cè)與顯示設(shè)計(jì)
- 課程設(shè)計(jì)---單片機(jī)數(shù)據(jù)采集系統(tǒng)
- msp430單片機(jī)溫度單片機(jī)課程設(shè)計(jì)--溫度測(cè)試系統(tǒng)設(shè)計(jì)
- 溫度計(jì)課程設(shè)計(jì)---單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)---溫度測(cè)試系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)秒表系統(tǒng)設(shè)計(jì)
- 單片機(jī)溫度控制系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)--單片機(jī)溫度控制系統(tǒng)
評(píng)論
0/150
提交評(píng)論