




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
電子教案教學實施方案課題名稱單片機技術及應用實訓部審批任務名稱項目6綜合實訓年月日學時10學時授課時間授課班級授課教師一、教學目標知識目標掌握較復雜的電路設計與C51編程調試技能目標掌握單片機項目開發的基本流程情感目標培養團隊合作意識二、重點難點教學重點單片機項目開發案例教學難點復雜項目的開發思維三、學習內容一、設計任務導入使用YL-236裝置中的相關模塊及元件,構建一套虛擬“智能往返小車”系統。二、設計任務分析由項目說明及控制要求可知,本項目主要的功能為:控制、顯示、按鍵、小車運動、報警。首先根據這些功能來選擇模塊:選用主機模塊作為系統的控制核心及報警裝置;選用顯示模塊完成TG12864及“LEDO?LED5”的顯示功能;選用指令模塊實現系統所需的獨立按鍵功能;根據第五單元講的電氣控制系統,選用直流電機模塊和繼電器模塊來模擬實現對小車運動方向的控制;最后選用電源模塊對系統進行供電。三、任務信息學習(一)硬件電路的設計系統所需模塊和I/O口的分配,接下來就開始搭建系統的硬件電路。系統模塊接線圖如圖6-1所示。圖6-1智能往返小車的模塊接線圖(二)程序的設計1.各狀態描述系統狀態:系統有開機狀態、設置狀態、運行狀態,暫停狀態,用全局變量function表達,方便各中斷服務函數、主函數訪問。對應上述狀態,function分別為0、1.2.3。運行模式:往返小車有自動模式與手動模式,用全局位變量MS表達。電機狀態:用全局變量mm表達電機3種狀態,0—暫停、1—前進,2—后退。電機方向:用全局變量direction表達電機運動方向,0—前進,1—后退。電機位置:用全局變量place表達,其范圍為0?5,分別對應LED0~LED5。3s計時標志及計時變量:當全局位變量JS1置1時,啟動3s計時,全局變量ii毎10ms計數;當ii計數到300時,3s計時完成,JS1清零。電機全程計時標志及計時變量:當全局位變量JS2置1時,啟動20s計時,全局變量time每10ms計數;當ii計數到2000時,20s計時完成,JS2清零。2.部分程序流程圖整個系統程序由三部分組成:T0中斷服務函數、T1中斷服務函數、主函數。各部分主要承擔如下功能。TO中斷服務函數:主要完成定時掃描鍵盤、設置狀態時按鍵功能、運行狀態時暫停按鍵與暫停中恢復運行等功能。T1中斷服務函數:3s計時、20s計時。主函數:硬件初始化、定時器初始化、變量初始化;開機界面、設置界面、運行界面的顯示;自動模式下電機運行控制、手動模式下按鍵處理等。對于較復雜系統,一般需要將系統功能進行適當分解,由各函數承擔一部分任務。具體做法不一,可以靈活處理,基本原則是:不能讓一些函數承擔太多任務,否則該函數過分復雜;中斷函數不能承擔太多任務,執行時間不能太長,否則會影響主函數運行。如圖6-2圖6-3所示為3個函數的程序流程圖。圖6-2TI中斷服務函數的程序流程圖圖6_3TO中斷服務函數的程序流程圖3.智能往返小車的程序清單:①car.c文件的程序清單#include"tg12864.h"#include"geykey.h"sbitK1=P1^6; //電機控制sbitK2=P1^7; //電機控制sbitFM=P3^7; //蜂鳴器sbitLED0=P2^0; //站臺燈LED0-LED5sbitLED1=P2^1;sbitLED2=P2^2;sbitLED3=P2^3;sbitLED4=P2^4;sbitLED5=P2^5;sbitLED7=P2^7; //電源燈ucharmm; //電機運行狀態標志#defineMzK1=0,K2=1,mm=1//電機正轉時繼電器狀態,mm:電機運行狀態1:正轉#defineMfK1=1,K2=0,mm=2//電機反轉時繼電器狀態,mm:電機運行狀態2:反轉#definetingK1=K2=1,mm=0//電機停轉時繼電器狀態,mm:電機運行狀態0:停轉uinttime; //電機運行時間總長度20suintii; //普通計時externucharkeynum;ucharplace; //目地點站點ucharstop;uchardirection; //系統運行方向(去,回)ucharfunction; //系統運行狀態/////////0////:系統初始化狀態/////////1////:系統設置狀態/////////2////:系統運行狀態/////////3////:系統暫停狀態bitMS; //模式標志bitBACK; //運行返回標志bitJS1,JS2;//JS1:自動時啟動和返回時的3秒計時標志//JS2:系統電機整個的運行時間標志//#defineDEBUG //根據蜂鳴器驅動電平選擇//亞龍YL-236主機模塊中蜂鳴器高電平鳴叫,不定義DEBUGvoiddidi(ucharx)//蜂鳴器函數x:鳴叫時間{ #ifdefDEBUG//若低電平時,蜂鳴器叫 FM=1;//先自激蜂鳴器(安全措施,可去掉) _nop_(); FM=0; delayms(100*x);//叫的時間 FM=1; #else//若高電平時,蜂鳴器叫 FM=0;//先自激蜂鳴器(安全措施,可去掉) _nop_(); FM=1; delayms(100*x);//叫的時間 FM=0; #endif}voidmsDisplay(ucharx)//模式顯示x:在那頁顯示{ if(MS==0)//手動 { writeHan(x,84,0,hanzi_ZM[15]); } else//自動 { writeHan(x,84,0,hanzi_ZM[14]); }}voiddjDisplay()//電機狀態顯示{ if(mm==0)//電機停時顯示"暫停" { writeHan(5,84,0,hanzi_ZM[21]); writeHan(5,100,0,hanzi_ZM[22]); } if(mm==1)//電機正轉時顯示"前進" { writeHan(5,84,0,hanzi_ZM[17]); writeHan(5,100,0,hanzi_ZM[18]); } if(mm==2)//電機反轉時顯示"后退" { writeHan(5,84,0,hanzi_ZM[19]); writeHan(5,100,0,hanzi_ZM[20]); }}voidweiDisplay()//運行中小車位置顯示{ if(mm==1)//電機正轉 { writeAscii(3,84,0,shuzi_ZM[place]); writeAscii(3,92,0,shuzi_ZM[12]); writeAscii(3,100,0,shuzi_ZM[place+1]); } if(mm==2)//電機反轉 { writeAscii(3,84,0,shuzi_ZM[place]); writeAscii(3,92,0,shuzi_ZM[12]); writeAscii(3,100,0,shuzi_ZM[place-1]); }}voidStartDisplay()//到了起始站顯示{ writeAscii(3,84,0,shuzi_ZM[place]); writeAscii(3,92,0,shuzi_ZM[10]); writeAscii(3,100,0,shuzi_ZM[10]);}voidPauseDisplay(){ writeHan(5,84,0,hanzi_ZM[21]);//系統暫停時顯示"暫停" writeHan(5,100,0,hanzi_ZM[22]);}voidLedDisplay(ucharx)//LED燈顯示函數{ //x:讓LED0-LED5中的一個燈亮 uchary,i; y=0xfe;//y為LED亮的2進制碼 for(i=0;i<x;i++) y=y<<1|0x01; //0xfe:LED0亮 //0xfd:LED1亮 //0xfb:LED2亮 //0xf7:LED3亮 //0xef:LED4亮 //0xdf:LED5亮 P2=y&(P2|0x3f);//P2=y輸出LED碼,&(P2|0x3f)不影響P2.6,P2.7輸出 //正常輸出不影響電機狀態}voidmenu1()//界面1"歡迎使用往返小車",系統初始化界面{ write_24x24(0,16,0,hanzi24[0]); write_24x24(0,40,0,hanzi24[1]); write_24x24(0,64,0,hanzi24[2]); write_24x24(0,88,0,hanzi24[3]); write_24x24(4,16,0,hanzi24[4]); write_24x24(4,40,0,hanzi24[5]); write_24x24(4,64,0,hanzi24[6]); write_24x24(4,88,0,hanzi24[7]);}voidmenu2()//設置界面{ writeHan(2,32,0,hanzi_ZM[0]); writeHan(2,48,0,hanzi_ZM[1]); writeHan(2,64,0,hanzi_ZM[2]); writeHan(2,80,0,hanzi_ZM[3]); writeHan(4,12,0,hanzi_ZM[4]); writeHan(4,28,0,hanzi_ZM[5]); writeHan(4,44,0,hanzi_ZM[6]); writeHan(4,60,0,hanzi_ZM[7]); writeAscii(4,76,0,shuzi_ZM[11]); writeHan(4,100,0,hanzi_ZM[16]); msDisplay(4);//模式顯示}voidmenu3(){ writeHan(1,12,0,hanzi_ZM[4]); writeHan(1,28,0,hanzi_ZM[5]); writeHan(1,44,0,hanzi_ZM[6]); writeHan(1,60,0,hanzi_ZM[7]); writeAscii(1,76,0,shuzi_ZM[11]); writeHan(1,100,0,hanzi_ZM[16]); msDisplay(1);//模式顯示 writeHan(3,12,0,hanzi_ZM[8]); writeHan(3,28,0,hanzi_ZM[9]); writeHan(3,44,0,hanzi_ZM[10]); writeHan(3,60,0,hanzi_ZM[11]); writeAscii(3,76,0,shuzi_ZM[11]); writeAscii(3,84,0,shuzi_ZM[place]); weiDisplay(); writeHan(5,12,0,hanzi_ZM[8]); writeHan(5,28,0,hanzi_ZM[9]); writeHan(5,44,0,hanzi_ZM[12]); writeHan(5,60,0,hanzi_ZM[13]); writeAscii(5,76,0,shuzi_ZM[11]); djDisplay();//電機狀態顯示}voidtime_0(void)interrupt1//鍵盤處理{ TL0=(uint)(-110592/12)%256;//T0定時10ms TH1=(uint)(-110592/12)/256; scanKey();//掃鍵盤 if(function==1)//設置狀態 { if(keynum==0)//切換鍵 { MS=!MS;//模式切換 msDisplay(4);//模式顯示 } if(keynum==4)//運行鍵 { function=2;//進入運行狀態 } return; } if(function==2)//運行狀態 { if(MS==1) { if(keynum==2)//暫停 { K1=K2=1;//關電機 TR1=0;//計數暫停 PauseDisplay();//暫停顯示 function=3; } } if(keynum==5)//返回 BACK=1; return; } if(function==3)//暫停狀態 { if(keynum==4) { if(mm==0)ting; if(mm==1)Mz; if(mm==2)Mf; TR1=1;//計數恢復 djDisplay();//電機狀態顯示 function=2; } if(keynum==5)//返回 BACK=1; }}voidtime_1(void)interrupt3//運行時間計時{ TL1=(uint)(-110592/12)%256;//T1定時10ms TH1=(uint)(-110592/12)/256;//time每10ms增加 if(JS1==1)//3秒計時 { ii++; if(ii>=300) { ii=0;//3秒計時到,標志清0 JS1=0; } } if(JS2==1) { if(direction==0)//從起點站開往終點站 { if(time<2000) time++;//時間增加 } else//從終點站開往起點站 { if(time>0) time--;//時間減少 } }}voidmain(){ /*開機準備工作*/ keynum=0xff;//鍵值無效 P2=0xff;//所有LED熄滅,電機停,可不寫單片機復位所有端口為1 mm=0;//電機處于停狀態 LED7=LED0=0;//對應的LED亮LED7:電源LED0:在起點站 direction=0;//系統運行方向 function=0;//系統初始化 initTG12864(); clrscr(); TMOD=0x11;//T0,T1工作在模式1,16為定時計數方式 TL0=(uint)(-110592/12)%256;//T0定時10ms TH0=(uint)(-110592/12)/256; TL1=(uint)(-110592/12)%256;//T1定時10ms TH1=(uint)(-110592/12)/256; ET0=TR0=1;//打開T0 ET1=TR1=0;//T1關閉 PT1=1; EA=1;//開啟中斷控制總開關 /*初始化階段*/ menu1();//初始化界面顯示 didi(5);//蜂鳴器叫0.5s delayms(922*10);//延時10s /*--等待設置階段(中斷設置參數)*/loop: K1=K2=1;//電機停止轉動 BACK=0;//返回標志清0 JS1=JS2=0;//設置時不計時 /**/ function=1;//系統設置狀態 clrscr(); menu2();//設置界面顯示 while(function==1);//等待運行 ///function=2;//系統運行狀態 clrscr(); menu3(); ET1=TR1=1;//T1計數中斷開啟 /*運行階段*/ while(1) { while(MS==1) { if(direction==0)//從起點站開往終點站 { for(;place<5;place++)//開往終點站 { LedDisplay(place);//LED處理函數 if((place==0)&&(time==0))//出發時延時3s { ting;//電機停止轉動 StartDisplay();//起始站位置顯示 djDisplay();//顯示電機狀態"暫停" JS1=1;ii=0;//開啟3s計時 while(JS1)//等待計時完成 if(BACK==1)//運行時按下返回鍵 gotoloop;//lopp:到設置狀態 } JS2=1;//電機運行計數開啟 Mz;//電機正轉 weiDisplay();//顯示當前位置->目的位置 djDisplay();//顯示電機狀態"前進" while((time%400)!=0)//等待計時4s if(BACK==1)//運行時按下返回鍵 gotoloop;//lopp:到設置狀態 } direction=1;//已到切換方向 JS2=0;//關閉總運行時間計數 } else//從終點站開往起點站 { for(;place>0;place--)//開往起始站 { LedDisplay(place);//LED處理函數 if((place==5)&&(time>=2000))//回去時延時3s { ting;//電機停止轉動 StartDisplay();//起始站位置顯示 djDisplay();//顯示電機狀態"暫停" JS1=1;ii=0;//開啟3s計時 while(JS1)//等待計時完成 if(BACK==1)//運行時按下返回鍵 gotoloop;//loop:到設置狀態 } JS2=1;//電機運行計數開啟 Mf;//電機反轉 weiDisplay();//顯示當前位置->目的位置 djDisplay();//顯示電機狀態"后退" while((time%400)!=0)//等待計時4s if(BACK==1)//運行時按下返回鍵 gotoloop;//loop:到設置狀態 } direction=0;//已到切換方向 JS2=0;//關閉總運行時間計數 time=0;//啟動定時時間清0 } } while(MS==0) { delayms(3);//以3ms為周期,判斷相關變量 if(JS2==1) //在計時開啟時,判斷時間 { if(time%400==0)//如果到了4秒鐘 { place=time/400;//站點位置變化 LedDisplay(place);//站點燈亮 weiDisplay();//顯示當前位置->目的位置 } } //mm=0;表示電機停了 //mm=1;表示電機在運行,(正轉) //mm=2;表示電機在運行,(反轉) if(keynum==1)//前進鍵 { if(time!=2000)//如果不在終點站 { if(mm==0)//如果前一狀態為停(可以認為是第一次按下) { Mz;//電機正轉 JS2=1;//開啟計時 direction=0;//從起點站開往終點站 djDisplay();//顯示電機狀態"前進" LedDisplay(place);//站點燈亮 if(place==5)StartDisplay();//如果正在終點站顯示 elseweiDisplay();//運行中位置顯示 }//(這樣寫是不想因為按鍵連按,造成平凡顯示) } else//如果在終點站 { if(mm==1)//如果前進鍵還按著在(已到終點站此時要停下來) { ting;//電機停 JS2=0;//計時停止 LedDisplay(place);//站點燈亮 StartDisplay();//在終點站顯示 djDisplay();//顯示電機狀態"暫停" } FM=1;//蜂鳴器報警提示 } } if(keynum==3)//后退鍵 { if(time!=0)//如果不在起點站 { if(mm==0)//如果前一狀態為停(可以認為是第一次按下) { Mf;//電機反轉 JS2=1;//開啟計時 direction=1;//從終點站開往起點站 djDisplay();//顯示電機狀態"后退" LedDisplay(place);//站點燈亮 if(place==0)StartDisplay();//如果正在起點站顯示 elseweiDisplay();//運行中位置顯示 }//(這樣是寫不想應為按鍵連按,造成平凡顯示) } else//如果在起點站 { if(mm==2)//如果后退鍵還按著在(已到終起點站此時要停下來) { ting;//電機停 JS2=0;//計時停止 LedDisplay(place);//站點燈亮 StartDisplay();//在終點站顯示 djDisplay();//顯示電機狀態"暫停" } FM=1;//蜂鳴器報警提示 } } if(keynum==0xff)//無鍵按下 { if((time!=0)&&(time!=2000))//如果不在起點站,不再終點站(運行中) { if(mm!=0)//如果前一狀態為不為停(可以認為是第一次按下) { JS2=0;//計時停止 FM=0;//蜂鳴器不叫 ting;//電機停 djDisplay();//顯示電機狀態"暫停" } } elseFM=0;//(解出在起點站和終點站的報警) } if(BACK==1)///如果返回標志有效 gotoloop;//goto到設置界面 } }} tg12864.h文件的程序清單#include<at89x52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar#include"zimo.h"http://包含自編字模數據的相關頭文件#include"delay.h"http://包含自編延時函數頭文件#defineout0P0#definekeyP3sbitLCD_RST=P1^0; //TG12864復位端sbitLCD_CS2=P1^1; //TG12864右半屏片選sbitLCD_CS1=P1^2; //TG12864左半屏片選sbitLCD_E=P1^3; //TG12864使能端sbitLCD_WR=P1^4; //TG12864讀(1)/寫(0)信號選擇端sbitLCD_RS=P1^5; //TG12864數據(1)/指令(0)選擇端voidwrite_24x24(ucharx,y,z,ucharcode*p)//顯示1個24*24點陣漢字{ uintt=0; uchari,j; for(i=x;i<x+3;i++) { for(j=y;j<y+24;j++) //顯示一個字符占24列 { lcd_xy(i,j); if(z==0) writeData(p[t++]); else writeData(~p[t++]); } } LCD_CS1=LCD_CS2=0;}//下面為TG12864的其他相關函數,請參考2-4-1delay.h文件的延時函數程序清單請參考任務2-1-2.4-1-1相關部分,這里省略。zimo.h文件的程序清單ucharcodehanzi24[][72]={ /*--文字:歡--*//*--宋體18;此字體下對應的點陣為:寬x高=24x24--*/0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x70,0x00,0x00,0x80,0xF8,0x9C,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x01,0x02,0x04,0xC8,0x30,0xEE,0xC3,0x00,0x18,0x04,0x03,0x00,0xE0,0x3E,0x7E,0x80,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x03,0x00,0x00,0x00,0x43,0x27,0x20,0x10,0x0C,0x06,0x01,0x00,0x00,0x03,0x0E,0x18,0x30,0x20,0x20,0x00,//“迎、使、用、往、返、小、車”的字模省略};ucharcodeshuzi_ZM[][16]={ /*--文字:0--*//*--宋體12;此字體下對應的點陣為:寬x高=8x16--*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//“1.2.3.4.5.6.7.8.9”的字模省略};ucharcodehanzi_ZM[][32]={/*--0文字:預--*//*--宋體12;此字體下對應的點陣為:寬x高=16x16--*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 離婚協議補充條款法律咨詢合同
- 商業綜合體車位使用權轉讓與商業運營協議
- 拆遷安置補償與社區安全合同模板
- 生態草場承包租賃管理合同范本
- 車輛保險理賠與購銷合作合同范本
- 綜合性離婚財產分配及子女撫養協議標準范本
- 水產養殖魚塘承包合同范本
- 高級采購談判技巧與合同簽訂培訓協議
- 高端餐廳廚師聘用與廚藝競賽合作協議
- 能源采購與法務碳排放管理合同
- 連續箱梁裂縫處治方案
- 2022年河南項城市事業單位引進緊缺高層次人才16名筆試備考題庫及答案解析
- 2023年無錫宜興市小升初英語考試模擬試題及答案解析
- 沃爾瑪收貨規定
- 2022年丹東市元寶區社區工作者招聘筆試題庫及答案解析
- 小學道德與法治人教五年級上冊(統編)第三單元我們的國土我們的家園-愛國教案
- 藝術欣賞完整版課件全套ppt教程(最新)
- GB∕T 2518-2019 連續熱鍍鋅和鋅合金鍍層鋼板及鋼帶
- 土地項目測算表_模板
- 教育培訓機構輔導老師月度績效考核表(KPI)
- 立式水輪機組軸線調整及導軸承的間隙分配ppt課件
評論
0/150
提交評論