循跡小車課程設計報告_第1頁
已閱讀1頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  智能循跡小車設計與制作</p><p><b>  課程設計報告</b></p><p><b>  系 別:</b></p><p><b>  專 業(yè):</b></p><p><b>  班 級:</b><

2、;/p><p><b>  成 員:</b></p><p><b>  指導老師:</b></p><p>  時 間: 二〇一一年6月30日</p><p><b>  一、設計目的:</b></p><p>  1、學會智能電子產品的功能設

3、計與任務分析,能進行小型電子產品方案設計;</p><p>  2、掌握基于51單片機、FPGA模數(shù)混合硬件系統(tǒng)設計和程序設計;</p><p>  3、熟悉電子信息類企業(yè)項目完整的運作過程及管理規(guī)范,培養(yǎng)團隊協(xié)作能力、溝通能力、創(chuàng)新能力和組織能力。</p><p>  二、智能循跡小車任務分析</p><p>  這是一種基于STC89C5

4、1單片機的小車尋跡系統(tǒng)。該系統(tǒng)采用兩組高靈敏度的光電對管,對路面黑色(白色)軌跡進行檢測,并利用單片機產生PWM波,控制小車速度。測試結果表明,該系統(tǒng)能夠平穩(wěn)跟蹤給定的路徑。</p><p>  整個系統(tǒng)基于普通玩具小車的機械結構,并利用了小車的底盤、前后輪電機及其自動復原裝置,能夠平穩(wěn)跟蹤路面黑色軌跡運行</p><p>  三、智能循跡小車循跡原理</p><p&g

5、t;  該智能小車在畫有黑線的白紙 “路面”上行駛,由于黑線和白紙對光線的反射系數(shù)不同,可根據(jù)接收到的反射光的強弱來判斷“道路”—黑線。利用了簡單、應用比較普遍的檢測方法—發(fā)光二極管+光敏電阻。</p><p>  發(fā)光二極管+光敏電阻,即利用光線在不同顏色的物理表面具有不同的反射性質的特點。在小車行駛過程中不斷地向地面發(fā)射白光,當白光遇到白色地面時發(fā)生漫發(fā)射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光

6、被吸收,則小車上的接收管接收不到信號。</p><p>  四、智能循跡小車總體方案</p><p>  整個電路系統(tǒng)分為檢測、控制、顯示、驅動四個模塊。首先利用光電對管對路面信號進行檢測,經過比較器處理之后,送給軟件控制模塊進行實時控制,然后顯示小車的運行狀態(tài),輸出相應的信號給驅動芯片驅動電機轉動,從而控制整個小車的運動。系統(tǒng)方案方框圖如圖1所示。</p><p>

7、;  圖1 智能小車尋跡系統(tǒng)框圖</p><p>  五、智能循跡小車各模塊方案</p><p><b>  1、循跡模塊設計</b></p><p><b>  方案1:</b></p><p>  用紅外發(fā)射管:接收管自己制作光電對管循跡傳感器。紅外發(fā)射管發(fā)出紅外線,當發(fā)出的紅外線照射到白色的平

8、面后反射,若紅外接收管能接收到反射回的光線則檢測出白線繼而輸出低電平,若接收不到發(fā)射出的光線則測出黑線繼而輸出高電平。這樣自己制作組裝的尋跡傳感器基本能夠滿足要求,但是工作不夠穩(wěn)定,且容易受外界光線的影響,因此我們放棄了這個方案。</p><p><b>  方案2:</b></p><p>  發(fā)光二極管+光敏電阻組成光敏探測器,光敏電阻的阻值可以根跟隨周圍環(huán)境光線

9、的變化而變化。當光線照射到白線上面時,光線發(fā)射強烈,光線照射到黑線上面時,光線發(fā)射較弱 。因此光敏電阻在白線和黑線上方時,阻值會發(fā)生明顯的變化。將阻值的變化值經過比較器就可以輸出高低電平。該方案雖然有明顯的光線的車前但靈敏度好。因此我們采用這種方案。</p><p><b>  如理圖如下:</b></p><p>  R61限制發(fā)射二極管的電流,發(fā)射管的電流和發(fā)射功

10、率成正比,但受其極限輸入正向電流50mA的影響,用R1=150的電阻作為限流電阻,Vcc=5V作為電源電壓,測試發(fā)現(xiàn)發(fā)射功率完全能滿足檢測需要;可變電阻RP61可限制接收電路的電流,一方面保護接收紅外管;另一方面可調節(jié)檢測電路的靈敏度。因為傳感器輸出端得到的是模擬電壓信號,所以在輸出端增加了比較器,先將LM339輸出電壓與2.5V進行比較,再送給單片機處理和控制。</p><p><b>  傳感器的安

11、裝</b></p><p>  正確選擇檢測方法和傳感器件是決定循跡效果的重要因素,而且正確的器件安裝方法也是循跡電路好壞的一個重要因素。從簡單、方便、可靠等角度出發(fā),同時在底盤裝設5個光敏二極管,進行兩級方向糾正控制,將大大提高其循跡的可靠性,具體位置分布如圖3所示。</p><p>  圖3 光敏電阻的分布圖</p><p>  圖中循跡傳感器全部在

12、一條直線上。其中X1與Y1為第一級方向控制傳感器,X2與Y2為第二級方向控制傳感器,并且黑線同一邊的兩個傳感器之間的寬度不得大于黑線的寬度。小車前進時,始終保持(如圖3中所示的行走軌跡黑線)在X1和Y1這兩個第一級傳感器之間,當小車偏離黑線時,第一級傳感器就能檢測到黑線,把檢測的信號送給小車的處理、控制系統(tǒng),控制系統(tǒng)發(fā)出信號對小車軌跡予以糾正。第二級方向探測器實際是第一級的后備保護,它的存在是考慮到小車由于慣性過大會依舊偏離軌道,再次對

13、小車的運動進行糾正,從而提高了小車循跡的可靠性。</p><p><b>  2、控制模塊設計</b></p><p>  此部分是整個小車運行的核心部件,起著控制小車所有的運行狀態(tài)作用。控制方法很多,大部分都采用單片機控制。這里選擇了ATMEL公司的AT89C52作為控制芯片,在芯片體積小、集成度高、可靠性好、容量足夠、驅動能力強、運用方便、經濟廉價。</p&

14、gt;<p><b>  3、電機驅動模塊</b></p><p>  從單片機輸出信號功率很弱,即使在沒有其它外在負載是也無法帶動電機,所以在實際電路中我們加入了電機驅動芯片提高輸入電機信號的功率,從而能夠根據(jù)需要控制電機轉動。根據(jù)驅動功率大小以及連接電路的簡單化要求選擇L298為直流電機驅動芯片。</p><p><b>  電路圖如下:&

15、lt;/b></p><p>  4、FPGA系統(tǒng)軟件設計</p><p><b>  原理圖:</b></p><p><b>  4.1尋跡模塊</b></p><p>  尋跡板送過來的4路檢測信號送到FPGA板,F(xiàn)PGA將此4路信號送出至4個LED燈顯示狀態(tài)(檢測至黑線亮,否則滅);同

16、時將此4路信號送到單片機。</p><p>  顯示模塊及要求(采用1602)</p><p>  小車啟動:小車啟動時,顯示“Start”。</p><p>  小車左拐:小車左拐時,顯示“Left”。</p><p>  小車右拐:小車右拐時,顯示“Right”。</p><p>  小車前進:小車前進時,顯示“R

17、unning”。</p><p>  小車后退:小車后退時,顯示“Back”。</p><p>  停車:小車停車時,顯示“Stop”。</p><p><b>  4.2提示音模塊</b></p><p><b>  (1) 小車啟動</b></p><p>  小車啟動前

18、發(fā)出3聲“嘟、嘟、嘟”的聲音,提示音結束后,F(xiàn)PGA發(fā)出一個啟動信號給單片機,從而啟動小車。</p><p><b> ?。?)停車</b></p><p>  小車停車時,F(xiàn)PGA播放一首音樂,音樂播放結束即表示小車完成了任務。</p><p>  4.3 FPGA設計總原理圖如下:</p><p><b>

19、  5、單片機控制模塊</b></p><p><b>  5.1 啟動小車</b></p><p>  小車在接收到FPGA送過來的啟動指令后,讀取尋跡信號,根據(jù)尋跡信號確定小車的運行狀態(tài),將小車的運行狀態(tài)送至FPGA,同時根據(jù)相應算法,驅動小車的左右電機前進。由于其實跑道與正常跑道有一段路程不好處理,所以需要沖一段路程才能使跑到正常軌道。</p&

20、gt;<p><b>  5.2 正常前進</b></p><p>  當尋跡板中間兩個傳感器檢測到黑線,小車都正常前進。</p><p><b>  5.3 左拐彎</b></p><p>  當最左端的兩個傳感器同時檢測到黑線,或只有一個檢測到黑線時,右端其它傳感器檢測到白色時,小車應左拐彎。但是根據(jù)跑道

21、要求,當循跡板第一次檢測到全黑時,小車應左轉。</p><p><b>  5.4 右拐彎</b></p><p>  當最右端的兩個傳感器檢同時測到黑線,或只有一個檢測到黑線時,左端其它傳感器檢測到白色時,小車應右拐彎。</p><p><b>  5.5 后退</b></p><p>  當4個

22、傳感器都檢測到白色,小車后退。</p><p><b>  5.6 停車</b></p><p>  當4個傳感器同時第六次檢測到黑線,小車停車。小車停車后,發(fā)出一個停車標志信號送給FPGA,使FPGA播放音樂。</p><p><b>  5.7中斷模塊</b></p><p>  5.8 電機控

23、制模塊</p><p>  5.9 小車速度的PWM調制</p><p><b>  PWM基本原理</b></p><p>  PWM是通過控制固定電壓的直流電源開關頻率,從而改變負載兩端的電壓,進而達到控制要求的一種電壓調整方法。</p><p>  在PWM驅動控制的調整系統(tǒng)中,按一個固定的頻率來接通和斷開電源,并

24、根據(jù)需要改變一個周期內“接通”和“斷開”時間的長短。通過改變直流電機電樞上電壓的“占空比”來改變平均電壓的大小,從而控制電動機的轉速。</p><p><b>  六、心得體會</b></p><p>  這次循跡小車課程設計不得不說是個大工程,讓我們從中學會了許多東西,特別是分工與合作。從最開始的買元器件,到焊接、調試循跡板,再到FGPA的VHDL程序和C語言程序的

25、編寫,都不簡單。我們的循跡板在第一次焊接完畢,經過調試后,能正常工作。但是,當我們把它裝在小車上讓它去跑時,問題就來了,有個燈就不亮了。后來經過檢測后,終于又弄好了。然后在寫C語言時,主要就是調節(jié)小車的速度和轉彎時的角度。而最難的是FPGA程序的編寫,特別是音樂的編程,真的很復雜,花了我們很多時間才把它寫好。而1602液晶的編寫,用到了我們沒有學過的狀態(tài)機,經過查找資料后,才弄清楚狀態(tài)機到底是什么回事。</p><p

26、>  由于這次課程設計的工作量很大,所以我們組這次的分工非常明確。一個人寫C語言程序,一個人寫VHDL程序,一個人負責循跡板的焊接與調試,還有一個負責資料的收集和報告的書寫。最后,經過我們組的分工協(xié)作,終于把循跡小車的制作完成了。這次課程設計,收獲最大的,還是告訴了我們要主動去學習新的知識。</p><p>  附錄一:循跡板原理圖</p><p>  附錄二:單片機C 語言程序&l

27、t;/p><p>  #include<reg52.h></p><p>  /*********************第一部分 ***************************************/</p><p>  //以下是點擊驅動芯片 L298 管腳位聲明</p><p>  sbit PWM1=P1^0;

28、//電機使能端</p><p>  sbit PWM2=P1^1;</p><p>  sbit IN1=P1^2; //電機控制端</p><p>  sbit IN2=P1^3;</p><p>  sbit IN3=P1^4;</p><p>  sbit IN4=P1^5;</p><p

29、>  sbit start=P0^0;//小車啟動信號</p><p>  sbit stop=P0^1;//小車停止信號</p><p>  sbit RP1=P2^3;//此處是傳感器 管腳位聲明</p><p>  sbit RP2=P2^2;</p><p>  sbit RP3=P2^1;</p>&l

30、t;p>  sbit RP4=P2^0;</p><p>  int count1,count2;//用于中斷計數(shù)</p><p>  //延時函數(shù),延時z秒</p><p>  void delay(int z)</p><p><b>  {</b></p><p><b>

31、;  int x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=124;y>0;y--);</p><p><b>  }</b></p><p>  /*********************第二部分 電機控制子函數(shù)************

32、****************/</p><p>  void forward1()//電機 1 前進</p><p><b>  {</b></p><p><b>  IN1=0;</b></p><p><b>  IN2=1;</b></p><p

33、><b>  }</b></p><p>  void forward2()//電機 2 前進</p><p><b>  {</b></p><p><b>  IN3=0;</b></p><p><b>  IN4=1;</b></p&g

34、t;<p><b>  }</b></p><p>  void back1()//電機 1 后退</p><p><b>  {</b></p><p><b>  IN1=1;</b></p><p><b>  IN2=0;</b>&l

35、t;/p><p><b>  }</b></p><p>  void back2()//電機 2 后退</p><p><b>  {</b></p><p><b>  IN3=1;</b></p><p><b>  IN4=0;</b

36、></p><p><b>  }</b></p><p>  /***************電機的速度控制 用PWM調速************************/</p><p>  void speed(int cnt1,int sd1,int cnt2,int sd2) </p><p><b

37、>  {</b></p><p>  if(cnt1<sd1) //電機1 PWM調速</p><p><b>  PWM1=1;</b></p><p><b>  else</b></p><p><b>  PWM1=0;</b></p

38、><p>  if(cnt2<sd2)//電機2 PWM調速</p><p><b>  PWM2=1;</b></p><p><b>  else </b></p><p><b>  PWM2=0;</b></p><p><b&g

39、t;  }</b></p><p>  /***************電機的前進、左轉、右轉控制************************/</p><p>  void turn(int cnt1,int sd1,int cnt2,int sd2)</p><p><b>  {</b></p><p&

40、gt;  forward1();</p><p>  forward2();</p><p>  speed(cnt1,sd1,cnt2,sd2);</p><p><b>  }</b></p><p>  /***************電機的后退控制************************/</p&g

41、t;<p>  void back(int cnt1,int sd1,int cnt2,int sd2)</p><p><b>  {</b></p><p><b>  back1();</b></p><p><b>  back2();</b></p><p&

42、gt;  speed(cnt1,sd1,cnt2,sd2);</p><p><b>  }</b></p><p>  /*********************第三部分 主函數(shù)****************************/</p><p>  void main()</p><p><b> 

43、 {</b></p><p>  int num=0;</p><p><b>  stop=0;</b></p><p>  TMOD=0x01;//中斷模式設置</p><p><b>  EA=1;</b></p><p>  TH0=(65536-

44、1000)/256;//定時1ms</p><p>  TL0=(65536-1000)%256;</p><p><b>  ET0=1;</b></p><p>  TR0=1; </p><p>  start=1; //給FPGA發(fā)送START信號</p><p>

45、  delay(3000);//等待FPGA發(fā)送循跡信號 delay(3000);等待FPGA發(fā)送循跡信號</p><p>  start=0; </p><p>  turn(count1,250,count2,250); //使小車沖上黑色軌道</p><p>  delay(350); //延時等待小車沖上黑色軌道</p>

46、;<p><b>  while(1)</b></p><p><b>  {</b></p><p>  if(RP1==1&&RP2==1&&RP3==1&&RP4==1) </p><p>  back(count1,50,count2,50); //

47、 1111 當四個LED檢測到黑線時,小車后退</p><p>  if(RP1==1&&RP2==0&&RP3==0&&RP4==1) </p><p>  turn(count1,200,count2,200); //1001當?shù)诙馤ED檢測到黑線時,小車前進</p><p>  if(RP1==0&

48、;&RP2==1&&RP3==1&&RP4==0) </p><p>  turn(count1,150,count2,150); // 0110 當?shù)谝?、三個LED檢測到黑線時,小車減速前進</p><p>  /**********************小車左轉*****************************/</p>

49、<p>  if(RP1==0&&RP2==1&&RP3==1&&RP4==1)</p><p>  turn(count1,0,count2,150); // 0111 當最右邊的LED檢測到黑線時,小車左轉</p><p>  if(RP1==1&&RP2==0&&RP3==1&&

50、RP4==1) </p><p>  turn(count1,80,count2,150); // 1011 當?shù)诙€LED檢測到黑線時,小車偏左轉</p><p>  if(RP1==0&&RP2==0&&RP3==1&&RP4==1)</p><p>  turn(count1,0,count2

51、,100); // 0011 當?shù)谝?、二個LED檢測到黑線時,小車左轉</p><p>  if(RP1==0&&RP2==0&&RP3==0&&RP4==1)</p><p>  turn(count1,0,count2,200); // 0001 當?shù)谝?、二、三個LED檢測到黑線時,小車左大轉</p><p>  

52、/***********************小車右轉*******************************/</p><p>  if(RP1==1&&RP2==1&&RP3==0&&RP4==1) </p><p>  turn(count1,150,count2,80); // 1101 當?shù)谌齻€LED檢測到黑線時,小車偏右轉

53、</p><p>  if(RP1==1&&RP2==1&&RP3==1&&RP4==0) </p><p>  turn(count1,180,count2,0); // 1110 當?shù)谒膫€LED檢測到黑線時,小車右轉</p><p>  if(RP1==1&&RP2==1&&RP3=

54、=0&&RP4==0) </p><p>  turn(count1,100,count2,0); //1100 當?shù)谌母馤ED檢測到黑線時,小車右轉</p><p>  if(RP1==1&&RP2==0&&RP3==0&&RP4==0)</p><p>  turn(count1,200,co

55、unt2,0); // 1000 當?shù)诙?、三、四個LED檢測到黑線時,小車右大轉</p><p>  /**************小車檢測到全黑情況的處理----停車與左轉----*************/</p><p>  if(RP1==0&&RP2==0&&RP3==0&&RP4==0)</p><p>

56、<b>  { </b></p><p>  if(num==0)</p><p><b>  {</b></p><p>  back1();// 0000 當四個LED第一次檢測到黑線時,左輪后退,右輪前進小車左轉</p><p>  forward2();</p>

57、<p>  delay(100);//延時100ms,等待小車轉過彎道</p><p><b>  }</b></p><p>  if(num>0 && num<6)</p><p><b>  {</b></p><p>  turn(count1,20

58、0,count2,200);// 0000 當四個LED再次檢測到黑線的次數(shù)小于6次時,</p><p>  // 即到達斑馬線時小車前進速度大于后退速度</p><p><b>  }</b></p><p>  if(num>=6)</p><p><b>  {</b></p&g

59、t;<p><b>  PWM1=0;</b></p><p>  PWM2=0;//當四個LED第六次檢測到黑線時,小車停止</p><p>  stop=1; //發(fā)送停止信號給FPGA,使FPGA播放音樂</p><p><b>  }</b></p><p&

60、gt;<b>  num++; </b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*********第四部分 中斷服務函數(shù) **************

61、*****************/</p><p>  void time0()interrupt 1</p><p><b>  {</b></p><p>  TH0=(65536-1000)/256;//定時1ms</p><p>  TL0=(65536-1000)%256;</p><p&

62、gt;<b>  count1++;</b></p><p><b>  count2++;</b></p><p>  if(count1>=500)//周期是 500ms</p><p><b>  count1=0;</b></p><p>  if(count2&

63、gt;=500)//周期是 500ms</p><p><b>  count2=0;</b></p><p><b>  } </b></p><p>  附錄三:FPGA的1602液晶VHDL程序</p><p>  library IEEE;</p><p>  

64、use IEEE.STD_LOGIC_1164.ALL;</p><p>  use IEEE.STD_LOGIC_ARITH.ALL;</p><p>  use IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p>  --------------------------------------------------------------

65、------------</p><p>  entity LCD1602c is</p><p>  port(CLK,RST: in std_logic; --狀態(tài)機時鐘信號,同時也是液晶時鐘信號,其周期應該滿足液晶數(shù)據(jù)的建立時間</p><p>  flag_start,flag_stop:in std_logic; --開始和停止信號,使液晶顯示st

66、art和stop并伴隨音樂</p><p>  text1:in std_logic_vector(3 downto 0);--將FPGA檢測到的數(shù)據(jù)傳給單片機</p><p>  speaker:in std_logic; --音樂的輸入端,開始和停止時才播放音樂</p><p>  dududu:in std_logic ; --開vector(3

67、 downto 0); --尋跡板的四路信號輸入</p><p>  --始的時候響3次嘟嘟聲</p><p>  text1_out:out std_logic_vector(3 downto 0); --將尋跡板的四路信號不做處理直接從FPGA輸出給單片機</p><p>  led:out std_logic_vector(5 downto 0);--設置尋跡

68、板的四路信號對應的四個led燈代表其尋跡狀態(tài) 后兩個表示開始和停止</p><p>  LCD_EN,LCD_RS,LCD_RW : out std_logic;--使能信號、 寄存器選擇信號 液晶讀寫信號 </p><p>  LCD_Data : out std_logic_vector(7 downto 0) ;--液晶數(shù)據(jù)信號</p><p>  spea

69、ker_out:out std_logic); --音樂輸出</p><p>  end LCD1602c;</p><p>  --------------------------------------------------------------------------</p><p>  architecture Behavioral of LCD160

70、2c is</p><p>  type state is (set_cls,set_func,set_DisCon,set_InMode,set_ddram,write_ddram,set_delay); --狀態(tài)機,7種狀態(tài)</p><p>  signal C_ST :state; --定義狀態(tài)信號</p><p>  type ram1 is array

71、(0 to 9) of std_logic_vector(7 downto 0); --</p><p>  type ram2 is array(0 to 9) of std_logic_vector(7 downto 0);</p><p>  type ram3 is array(0 to 9) of std_logic_vector(7 downto 0);</p>

72、<p>  type ram4 is array(0 to 9) of std_logic_vector(7 downto 0);</p><p>  type ram5 is array(0 to 9) of std_logic_vector(7 downto 0);</p><p>  type ram6 is array(0 to 9) of std_logic_vect

73、or(7 downto 0);</p><p>  constant textram1:ram1:=(x"80",x"80",x"62",x"61",x"63",x"6B",x"80",x"80",x"80",x"80&quo

74、t;);--back</p><p>  constant textram2:ram2:=(x"74",x"75",x"72",x"6E",x"80",x"72",x"69",x"67",x"68",x"74");

75、--turn right</p><p>  constant textram3:ram3:=(x"61",x"64",x"76",x"61",x"6E",x"63",x"65",x"80",x"80",x"80")

76、; --advance</p><p>  constant textram4:ram4:=(x"74",x"75",x"72",x"6E",x"80",x"6C",x"65",x"66",x"74",x"80");

77、 --turn left</p><p>  constant textram5:ram5:=(x"80",x"73",x"74",x"61",x"72",x"74",x"80",x"80",x"80",x"80")

78、; --start</p><p>  constant textram6:ram6:=(x"80",x"73",x"74",x"6F",x"70",x"80",x"80",x"80",x"80",x"80"); -

79、-stop</p><p>  signal CLK1 : std_logic; --????</p><p>  signal cnt1: std_logic_vector(3 downto 0); </p><p>  signal a:std_logic_vector(5 downto 0);--檢測信號和開始及停止信號共六位信號</p>

80、<p>  -------------------------------------------------------------------------</p><p><b>  begin</b></p><p>  a<=text1&flag_start&flag_stop;</p><p>  

81、text1_out<=text1;--將四路尋跡板的信號不作處理直接輸出給單片機</p><p>  LCD_EN <= CLK ; --LCD_RW <= '0' ; --</p><p>  process(CLK)</p><p>  variable n2:integer range 0 to 499; --常整常量用

82、于從0到500計數(shù)分頻,可以不要這個進程因為不要循環(huán)顯示</p><p><b>  begin </b></p><p>  if rising_edge(CLK) then --當時鐘上升沿到來時</p><p>  if n2<499 then </p><p><b>  n2:=n2+1;&l

83、t;/b></p><p><b>  else</b></p><p>  n2:=0;Clk1<=not Clk1;--</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p

84、>  end process;</p><p>  ------------------------------------------------------------------------------</p><p>  PROCESS (CLK,RST)</p><p>  variable cnt1: std_logic_vector(3 down

85、to 0);--32</p><p><b>  BEGIN</b></p><p>  if RST='0' then C_ST<=set_cls;LCD_RS<='0';LCD_RW<='0';--rw=0是寫操作</p><p>  LCD_Data<=&quo

86、t;00000001";cnt1:="0000";--清屏指令0x01</p><p>  elsif (CLK'event AND CLK ='1') THEN</p><p>  CASE C_ST IS --判斷狀態(tài)</p><p>  WHEN set_cls =>

87、 --清屏狀態(tài)</p><p>  LCD_RS<='0';LCD_RW<='0';LCD_Data<="00000001";--清屏指令0X01</p><p>  C_ST <= set_func; --將功能設置狀態(tài)給c_st信號</p>

88、<p>  WHEN set_func => --功能設置001DLNF** DL:高電平時為8位總線,低電平時為4位總線 </p><p>  --N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符</p><p>  LCD_RS<='0';LCD_RW<=

89、9;0';LCD_Data<="00111000"; --cnt1<="00000"; --0x38,表示8位寬度,2行 </p><p>  C_ST <=set_DisCon;</p><p>  when set_discon=> --顯示開關控制 </p><p>

90、;  LCD_RS<='0';LCD_RW<='0';LCD_Data<="00001100"; --0x0C,表示開顯示,關光標,關閃爍</p><p>  C_ST<=set_InMode;</p><p>  when set_InMode=> --設置輸入方式</p>&

91、lt;p>  LCD_RS<='0';LCD_RW<='0';LCD_Data<="00000110"; --0x06,AC+1(左移),不移位</p><p>  C_ST<=set_ddram;</p><p>  when set_ddram=> </p><p

92、>  LCD_RS<='0';LCD_RW<='0'; </p><p>  if cnt1<"1001" then cnt1:=cnt1+1; --</p><p>  else cnt1:="0000";end if; --</p><p>  if

93、cnt1<="1001" thenLCD_Data<="10000100"+cnt1; --LCD1602第一行首地址80H+00H</p><p><b>  end if;</b></p><p>  C_ST<=write_ddram;</p><p>  w

94、hen write_ddram=> </p><p>  LCD_RS<='1';LCD_RW<='0'; --</p><p>  if a="111001" then LCD_Data<=textram2(conv_integer(cnt1));led<="111000";

95、 --向右</p><p>  elsif a="110001" then LCD_Data<=textram2(conv_integer(cnt1));led<="011100";--向右</p><p>  elsif a="011101" then LCD_Data<=textram4(conv_int

96、eger(cnt1));led<="001100";--向左</p><p>  elsif a="001101" then LCD_Data<=textram4(conv_integer(cnt1));led<="110000";--向左</p><p>  elsif a="100101"

97、; then LCD_Data<=textram3(conv_integer(cnt1));led<="011000"; --前進</p><p>  elsif a="111101" then LCD_Data<=textram1(conv_integer(cnt1));led<="111100";--后退</p>

98、;<p>  elsif a="100111" then LCD_Data<=textram5(conv_integer(cnt1));led<="011010";--開始</p><p>  elsif a="000001" then LCD_Data<=textram6(conv_integer(cnt1));le

99、d<="111101";--結束</p><p><b>  end if;</b></p><p>  C_ST<=set_delay;</p><p>  when set_delay=> </p><p>  LCD_RS<='0';LCD_RW<

100、='0';LCD_Data<="00000000"; --</p><p>  C_ST<=set_func; --回到功能設置狀態(tài),一直循環(huán)下去</p><p>  when others => null; </p><p>  END CASE; </p>&l

101、t;p><b>  END IF;</b></p><p>  END PROCESS;</p><p>  process(a)</p><p><b>  begin</b></p><p><b>  case(a)is</b></p><p&g

102、t;  when"100110" => speaker_out<=dududu;</p><p>  when"000001"=> speaker_out<=speaker;</p><p>  when others =>speaker_out<='1';</p><p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論