版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 單片機原理及應用課程設計</p><p> 專 業(yè): 自動化 </p><p> 設計題目: 尋跡小車設計 </p><p> 班級: 0941 學生姓名: 董玉凱 學號: 14 </p><p> 指導教師:
2、 </p><p><b> 分院院長: </b></p><p> 教研室主任: </p><p><b> 電氣工程學院</b></p><p><b> 目錄</b></p><p> 第一章 課程設計內(nèi)容與要求分析
3、3</p><p> 1.1課程設計內(nèi)容3</p><p> 1.2課程設計要求分析3</p><p> 1.2.1系統(tǒng)單元電路組成3</p><p> 1.2.2尋跡小車原理4</p><p> 1.2.3電源管理4</p><p> 1.2.4電機驅(qū)動管理4</
4、p><p> 第二章C語言編程5</p><p> 第三章 軟件系統(tǒng)的實現(xiàn)9</p><p> 3.1主程序設計9</p><p> 3.2 程序思路9</p><p> 第四章 結(jié)論及感想10</p><p><b> 附錄11</b></p&
5、gt;<p><b> 參考文獻17</b></p><p> 第一章 課程設計內(nèi)容與要求分析</p><p><b> 1.1課程設計內(nèi)容</b></p><p> 本題目以STC10F04XE.h單片機為核心器件。小車完成的主要功能就是能夠自主識別賽道上的黑線并根據(jù)黑線的位置與距離來實現(xiàn)相應的變
6、速與變向操作。</p><p> 1.2課程設計要求分析</p><p> 電動車能夠自動尋跡,按設定好的軌跡從區(qū)域1進至區(qū)域3,并在黑線末端停車,小車前進的路線圖如1-1所示。在區(qū)域1和區(qū)域3內(nèi),小車緩緩前進,在區(qū)域2內(nèi)小車全速前進。當小車未進入任何區(qū)域時,小車上的數(shù)碼顯示管顯示為0000,當小車第一次碰見賽道上的黑線時,小車上的顯示管顯示為0001;當小車碰到區(qū)域1與區(qū)域2的交界,
7、也就是碰見黑線時,小車上的顯示管顯示為0002;小車行駛到區(qū)域2與區(qū)域3的交界處碰上黑線時,小車上的顯示管顯示為0003;小車行駛到區(qū)域3的末端時,碰上黑線時,小車顯示管顯示為0004并停止。小車前段的兩個燈全部亮的時候,小車前進;全部滅的時候,小車停止;左側(cè)的燈亮的時候,向左拐;右側(cè)的燈亮時,向右拐。尋跡用的小車前端左右兩個光電開關完成,通過調(diào)整RW2和RW4可以改變光電開關的靈敏度。</p><p> 圖1
8、-1尋跡小車路線</p><p> 1.2.1系統(tǒng)單元電路組成</p><p> STC10F04XE采用宏晶最新第六代加密技術,超強抗干擾,超強抗靜電,整機可輕松經(jīng)過2萬伏靜電測試。速度快,1個時鐘/機器周期,可用低頻晶振,大幅降低EMI。輸入/輸出口多,最多有40個I/O,復位腳如當I/O口使用,可省去外部復位電路。超低功耗。在系統(tǒng)可編程,無需編程器,無需仿真器,可遠程升級。內(nèi)部集
9、成高可靠復位電路,復位腳設置為I/O口使用時,復位腳可懸空。</p><p> 尋跡檢測原理如圖1-2所示,由光電開關和比較器組成,漫反射式光電開關能反應反射光的強弱,用比較器進行分辨,從而實現(xiàn)尋跡。</p><p> 電機控制用L293D實現(xiàn),L293D是電機控制專用芯片,接口簡單如圖1-3所示。用P0.0---P0.5進行控制。P0.0---EN3 P0.1---IN1 P0.
10、2---IN2 P0.3---IN4 P0.4---IN3 P0.5---EN4</p><p> 傳感器信號輸入分別為P0.6---S1 P0.7---S2</p><p> 圖1-2 尋跡檢測電路原理圖</p><p> 圖1-3 電機驅(qū)動原理圖</p><p> 1.2.2尋跡小車原理</p><p&
11、gt; 由于賽道存在黑線,落在黑色區(qū)域內(nèi)的光電開關與比較器收到反射的光線與白色的賽道而不同,進而在管兩端產(chǎn)生了不同的電壓值,由此來判斷路線的走向,并將當前的采集到的一組電壓值傳遞給單片機,進而通過單片機的輸出指令來得到相應的控制指令,使小車自動尋跡行走。</p><p><b> 1.2.3電源管理</b></p><p> 系統(tǒng)電源采用220V交流電源,對單片
12、機,電動機,比較器等供電。</p><p> 1.2.4電機驅(qū)動管理</p><p> 電機的電源由上可知,由220V電源直接供給,輸入的信號為PWM波,通過輸出的PWM的波的占空比可以達到控制電機轉(zhuǎn)速的效果。</p><p><b> 第二章C語言編程</b></p><p> 在編寫程序之前,先安裝數(shù)據(jù)線驅(qū)動
13、和stc-isp-v4.79-setup軟件。以下的C語言程序分別是電機測速程序和PWM調(diào)速程序</p><p><b> 電機測速程序:</b></p><p> #include"STC10F04XE.h"</p><p> #define uchar unsigned char</p><
14、p> #define uint unsigned int</p><p> sbit IN1=P0^1;</p><p> sbit IN2=P0^2;</p><p> sbit IN3=P0^4;</p><p> sbit IN4=P0^3;</p><p> sbit en1=P0^0;<
15、;/p><p> sbit en2=P0^5; </p><p> void go();</p><p> void stop();</p><p> void left();</p><p> void right();</p><p> void delay_ms(uint t);
16、</p><p> void main()</p><p><b> {</b></p><p><b> en1=1;</b></p><p><b> en2=2;</b></p><p><b> while(1)</b&
17、gt;</p><p><b> {</b></p><p><b> go();</b></p><p> delay_ms(1000);</p><p><b> stop();</b></p><p> delay_ms(1000);&l
18、t;/p><p><b> left();</b></p><p> delay_ms(1000);</p><p><b> right();</b></p><p> delay_ms(1000);</p><p><b> }</b><
19、/p><p><b> }</b></p><p><b> void go()</b></p><p><b> {</b></p><p><b> IN1=0;</b></p><p><b> IN2=1;&
20、lt;/b></p><p><b> IN3=0;</b></p><p><b> IN4=1;</b></p><p><b> }</b></p><p> void stop()</p><p><b> {</
21、b></p><p><b> IN1=0;</b></p><p><b> IN2=0;</b></p><p><b> IN3=0;</b></p><p><b> IN4=0;</b></p><p>&l
22、t;b> }</b></p><p> void left()</p><p><b> { </b></p><p><b> IN1=0;</b></p><p><b> IN2=1;</b></p><p>&l
23、t;b> IN3=0;</b></p><p><b> IN4=0;</b></p><p><b> }</b></p><p> void right()</p><p><b> { </b></p><p>&
24、lt;b> IN1=0;</b></p><p><b> IN2=0;</b></p><p><b> IN3=0;</b></p><p><b> IN4=1;</b></p><p><b> }</b></p&
25、gt;<p> void delay_ms(uint t)</p><p><b> {</b></p><p><b> uchar f;</b></p><p> while(t--)</p><p><b> {</b></p>&l
26、t;p> for(f=1;f<125;f++)</p><p><b> {</b></p><p><b> ;</b></p><p><b> }</b></p><p><b> }</b></p><p
27、><b> }</b></p><p><b> PWM調(diào)速程序:</b></p><p> #include"STC10F04XE.h"</p><p> #define uint unsigned int</p><p> #define uchar unsi
28、gned char</p><p> sbit en1=P0^0;</p><p> sbit en2=P0^5;</p><p> sbit IN1=P0^1;</p><p> sbit IN2=P0^2;</p><p> sbit IN3=P0^4;</p><p> sbi
29、t IN4=P0^3;</p><p> uint flag1,flag2,pwm1,pwm2;</p><p> void pwm_init();</p><p> void go();</p><p> void pwm_init()</p><p><b> {</b></p
30、><p> TMOD=0X01;</p><p> TH0=(65536-200)/256;</p><p> TL0=(65536-200)%256;</p><p><b> EA=1;</b></p><p><b> ET0=1;</b></p>
31、<p><b> TR0=1;</b></p><p><b> en1=1;</b></p><p><b> en2=1;</b></p><p><b> }</b></p><p> void TO_Ser()interrupt
32、 1 using 1</p><p><b> {</b></p><p> TH0=(65536-200)/256;</p><p> TL0=(65536-200)%256;</p><p><b> flag1++;</b></p><p><b>
33、 flag2++;</b></p><p> if (flag1<=pwm1)</p><p><b> {</b></p><p><b> en1=1;</b></p><p><b> }</b></p><p> if
34、 (flag1>pwm1)</p><p><b> {</b></p><p><b> en1=0;</b></p><p><b> }</b></p><p> if (flag1==100)</p><p><b>
35、{</b></p><p><b> flag1=0;</b></p><p><b> }</b></p><p> if (flag2<=pwm2)</p><p><b> {</b></p><p><b>
36、 en2=1;</b></p><p><b> }</b></p><p> if (flag2>pwm2)</p><p><b> {</b></p><p><b> en2=0;</b></p><p><b&g
37、t; }</b></p><p> if (flag2==100)</p><p><b> {</b></p><p><b> flag2=0;</b></p><p><b> }</b></p><p><b>
38、 }</b></p><p><b> void go()</b></p><p><b> {</b></p><p><b> IN1=0;</b></p><p><b> IN2=1;</b></p><p&
39、gt;<b> IN3=0;</b></p><p><b> IN4=1;</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p>
40、 pwm_init();</p><p><b> P1=0x00;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p><b> go();</b></p><p&
41、gt;<b> pwm1=60;</b></p><p><b> pwm2=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> 第三章 軟件系統(tǒng)的實現(xiàn)</p><p&g
42、t;<b> 3.1主程序設計</b></p><p> 單片機系統(tǒng)需要接收路徑識別電路的信號,采用某種路徑搜索算法進行尋線判斷,進而控制舵機和直流驅(qū)動電機的工作。小車系統(tǒng)的軟件使用C語言實現(xiàn)。</p><p><b> 主體控制框架:</b></p><p> 模型車采用的控制方法是根據(jù)傳感器采集到的路況信息,通
43、過計算得到具體的方向偏移量和速度,控制小車的行走狀態(tài)。</p><p><b> 3.2 程序思路</b></p><p> 智能車利用了一字形排布的8個傳感器來探測道路,并將每個傳感器采集到的信息轉(zhuǎn)換成了數(shù)字電平。因此8個傳感器的數(shù)據(jù)正好構(gòu)成一個字節(jié),由單片機P2口讀入。</p><p> 由于讀入的數(shù)據(jù)并不方便直接參與控制計算,因此
44、先將該數(shù)據(jù)集分成16類,分別對應于小車不同的位置信息,由0-15表示,其中0表示引導線位于小車最左側(cè),7表示引導線位于小車中部,14表示引導線位于小車最右側(cè),15表示未檢測到引導線或其他錯誤情況。</p><p> 將上面的轉(zhuǎn)換后的數(shù)據(jù)作為控制計算的反饋輸入,與7相減即得到小車偏差信息,然后通過增量型pid算法計算出舵機的控制信息。</p><p> 將小車偏差信息的微分作為速度pid
45、的輸入,依然通過增量型pid算法得到電機的控制信息。至此小車完成一次控制周期??梢允褂靡粋€定時器來作為一路PWM波的計時器。先將I/O口置位,設定高電平時間及定時器的初值,當定時器產(chǎn)生中斷時,再將I/O口清零,并設定低電平時間,由此循環(huán)即可產(chǎn)生PWM波。其中,高電平時間有控制計算得出,低電平時間有PWM周期減去高電平時間得到。</p><p><b> 第四章 結(jié)論及感想</b></
46、p><p> 本設計主要用到了單片機的通用IO口的讀寫,定時器,中斷等基本功能,通過實際操作進一步掌握了單片機的使用。同時,通過單片機外圍電路的設計,更深入學習了單片機在嵌入式系統(tǒng)中的應用。通過實際焊接電路,編寫程序,也進一步提高了我的動手能力以及分析解決錯誤的能力,是我能夠更好的將所學知識應用到實際中來。</p><p> 很感想方老師在課設過程中對一些重點處的指點與幫助,通過一次次編程
47、與調(diào)試,加強了我對單片機軟件的認識,以及增強了對成功的渴望,也增強了我的團隊意識與配合能力。</p><p><b> 附錄</b></p><p> 我們小組的尋跡小車的c語言編程:</p><p> #include"STC10F04XE.h"</p><p> #include"
48、;intrins.h"</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit IN1=P0^1;</p><p> sbit IN2=P0^2;</p><p> sbit IN
49、3=P0^4;</p><p> sbit IN4=P0^3;</p><p> sbit en1=P0^0;</p><p> sbit en2=P0^5; </p><p> sbit C1=P0^6;</p><p> sbit C2=P0^7;</p><p> void
50、go();</p><p> void stop();</p><p> void left();</p><p> void right();</p><p> void delay_ms(uint t);</p><p> uchar count,flag1,flag2,pwm1,pwm2;</p&
51、gt;<p> void quyu();</p><p> void system_init();</p><p> uchar T,second,minite,sum,a;</p><p> uchar code LED_Val[] = {0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x82,0xf8,0x
52、80,0x98};</p><p> uchar data num[4];</p><p> uchar data led_point[4]={0xef,0xdf,0xbf,0x7f};</p><p> void disp(uint disp_value);</p><p> void bcd(uint bcd_value);<
53、;/p><p> void pwm_init();</p><p> void main()</p><p><b> {</b></p><p> // system_init();</p><p> pwm_init();</p><p><b>
54、P1=0x00;</b></p><p><b> T=0;</b></p><p><b> en1=1;</b></p><p><b> en2=1;</b></p><p><b> while(1)</b></p>
55、<p><b> {</b></p><p> disp(sum);</p><p> delay_ms(100);</p><p><b> quyu();</b></p><p><b> }</b></p><p><
56、b> }</b></p><p><b> void go()</b></p><p><b> {</b></p><p><b> IN1=0;</b></p><p><b> IN2=1;</b></p>
57、<p><b> IN3=0;</b></p><p><b> IN4=1;</b></p><p><b> }</b></p><p> void stop()</p><p><b> {</b></p><
58、p><b> IN1=0;</b></p><p><b> IN2=0;</b></p><p><b> IN3=0;</b></p><p><b> IN4=0;</b></p><p><b> }</b>&
59、lt;/p><p> void left()</p><p><b> { </b></p><p><b> IN1=0;</b></p><p><b> IN2=1;</b></p><p><b> IN3=0;</b
60、></p><p><b> IN4=0;</b></p><p><b> }</b></p><p> void right()</p><p><b> { </b></p><p><b> IN1=0;</
61、b></p><p><b> IN2=0;</b></p><p><b> IN3=0;</b></p><p><b> IN4=1;</b></p><p><b> }</b></p><p> void
62、delay_ms(uint t)</p><p><b> {</b></p><p><b> uchar f;</b></p><p> while(t--)</p><p><b> {</b></p><p> for(f=1;f<
63、;125;f++)</p><p><b> {</b></p><p><b> ;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</
64、b></p><p> void quyu()</p><p><b> {</b></p><p> if((C1==0)&&(C2==0))</p><p><b> {</b></p><p> while(C1==0&&am
65、p;C2==0);</p><p><b> {</b></p><p><b> go();</b></p><p><b> }</b></p><p> delay_ms(1500);</p><p><b> T++;<
66、/b></p><p><b> go();</b></p><p> ///delay_ms(1000);</p><p><b> }</b></p><p> if((C1==1)&&(C2==1))</p><p><b>
67、{</b></p><p><b> go();</b></p><p><b> if(T<=1)</b></p><p><b> {</b></p><p><b> go();</b></p><p&g
68、t;<b> pwm1=30;</b></p><p><b> pwm2=30;</b></p><p><b> }</b></p><p><b> if(T==2)</b></p><p><b> {</b><
69、;/p><p><b> go();</b></p><p><b> pwm1=90;</b></p><p><b> pwm2=90;</b></p><p><b> }</b></p><p><b>
70、if(T==3)</b></p><p><b> {</b></p><p><b> go();</b></p><p><b> pwm1=30;</b></p><p><b> pwm2=30;</b></p>
71、<p><b> }</b></p><p><b> }</b></p><p> if((C1==1)&&(C2==0))</p><p><b> {</b></p><p><b> left();</b>&
72、lt;/p><p><b> }</b></p><p> if((C1==0)&&(C2==1))</p><p><b> {</b></p><p><b> right();</b></p><p><b> }&
73、lt;/b></p><p><b> if(T>=4)</b></p><p><b> {</b></p><p><b> stop();</b></p><p><b> } </b></p><p>&
74、lt;b> }</b></p><p> void pwm_init()</p><p><b> {</b></p><p> TMOD=0X01;</p><p> TH0=(65536-200)/256;</p><p> TL0=(65536-200)%25
75、6;</p><p><b> EA=1;</b></p><p><b> ET0=1;</b></p><p><b> TR0=1;</b></p><p><b> en1=1;</b></p><p><b&
76、gt; en2=1;</b></p><p><b> } </b></p><p> void bcd(uint bcd_value)</p><p><b> {</b></p><p><b> num[0]=T;</b></p>&l
77、t;p> num[1]=(bcd_value%1000)/100;</p><p> num[2]=((bcd_value%1000)%1000)/10;</p><p> num[3]=((bcd_value%1000)%1000)%10;</p><p><b> }</b></p><p> voi
78、d disp(uint disp_value)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> bcd(disp_value);</p><p> for(i=0;i<4;i++)</p><p>&l
79、t;b> {</b></p><p> P1=led_point[i];</p><p> SBUF=LED_Val[num[i]];</p><p> delay_ms(50);</p><p><b> P1=0XFF;</b></p><p><b>
80、 }</b></p><p><b> }</b></p><p> /*void system_init()</p><p><b> {</b></p><p> TMOD=0X11;</p><p> TH0=(65536-50000)/256;&
81、lt;/p><p> TL0=(65536-50000)%256;</p><p> TH1=(65536-10000)/256;</p><p> TL1=(65536-10000)%256;</p><p><b> EA=1;</b></p><p><b> ET0=1;&
82、lt;/b></p><p><b> ET1=1;</b></p><p><b> TR0=1;</b></p><p><b> TR1=1;</b></p><p><b> } */</b></p><p>
83、 void T1_Ser() interrupt 1</p><p><b> {</b></p><p> TH0=(65536-1000)/256;</p><p> TL0=(65536-1000)%256; </p><p><b> flag1++;</b></p>
84、<p><b> flag2++;</b></p><p> if(flag1<=pwm1)</p><p><b> {</b></p><p><b> en1=1;</b></p><p><b> }</b>&l
85、t;/p><p> if(flag1>pwm1)</p><p><b> {</b></p><p><b> en1=0;</b></p><p><b> }</b></p><p> if(flag1==100)
86、</p><p><b> {</b></p><p><b> flag1=0;</b></p><p><b> }</b></p><p> if(flag2<=pwm2) </p><p><b> {</b
87、></p><p><b> en2=1;</b></p><p><b> }</b></p><p> if(flag2>pwm2) </p><p><b> {</b></p><p><b> en2=0;
88、</b></p><p><b> }</b></p><p> if(flag2==100) </p><p><b> {</b></p><p><b> flag2=0;</b></p><p><b>
89、}</b></p><p><b> } </b></p><p><b> 參考文獻</b></p><p> [1]李廣弟,朱月秀,王秀山編著.單片機基礎. 北京:北京航空航天大學出版社,2001</p><p> [2]何立民編著.MCS-51系列單片機應用系統(tǒng)設計系
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論