單片機課程設計-雙機通信 交通燈_第1頁
單片機課程設計-雙機通信 交通燈_第2頁
單片機課程設計-雙機通信 交通燈_第3頁
單片機課程設計-雙機通信 交通燈_第4頁
單片機課程設計-雙機通信 交通燈_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 14/14單片機課程設計設計報告題目: 雙機通信 專業(yè): 電子信息工程 班級: 班 學號: 631 姓名: 指導老師: 重慶交通大學信息科學與工程學院設計時間:年 1 月 1 日到 年 1 月 9 號1設計任務說明 在課程實驗(交通燈)的基礎上,實現(xiàn)雙機通信:1、可以是PC機與單片機的通信,通過PC機上的軟件(如串口調試助手等)控制單片機交通燈的設置(如改變不同路口紅綠燈時間等參數(shù)的設置);2、也可通過一個單片機系統(tǒng)控制另一個單片機系統(tǒng)交通燈的設置(如改變不同路口紅綠燈時間等參數(shù)的設置)。3、也可完成經指導老師批準的其它題目,如: (1)用單片機及A/D轉換芯片實現(xiàn)的數(shù)字電壓表 (2)用單片

2、機及D/A轉換芯片實現(xiàn)的波形發(fā)生器2. 總體設計本人選擇做雙機通信交通燈,通過兩個按鍵分別設置紅燈、綠燈的時間參數(shù)。當然,設置時間參數(shù)的是其中一塊單片機,控制數(shù)碼管和紅綠燈亮暗的的變化又是另外一塊單片機。3. 詳細設計總設計圖如下:4程序及說明流程圖:開始開始乙單片機循環(huán)運行紅綠燈乙單片機循環(huán)運行紅綠燈,分別對應60秒,30秒等待中斷等待中斷結束結束進入中斷中斷處理:進入中斷甲機按鍵按下,對應的紅綠燈時間自動減一甲機按鍵按下,對應的紅綠燈時間自動減一甲機將數(shù)據(jù)通過串行端口傳送給乙單片機甲機將數(shù)據(jù)通過串行端口傳送給乙單片機乙單片機短暫地顯示剛設置好的紅綠燈時間參數(shù)乙單片機短暫地顯示剛設置好的紅綠

3、燈時間參數(shù)乙單片機進入下一次循環(huán)顯示的時候,重新取新的時間參數(shù)乙單片機進入下一次循環(huán)顯示的時候,重新取新的時間參數(shù)中斷結束中斷結束甲單片機程序代碼如下:#include #define uchar unsigned char#define uint unsigned intuchar x=100;/紅燈最長時間設置為99秒uchar y=51;/綠燈最長時間設置為50秒uchar t;/*串行口發(fā)送與接收中斷處理函數(shù)*/void init() IP=0 x02; /中斷優(yōu)先級設置(T0中斷為最高優(yōu)先級,然后是INT0,最后是INT1)TMOD=0X21; /T1定時計數(shù)器工作于方式2,作為波特

4、率發(fā)生器,SMOD此處默認取0/T0工作方式1,16位計數(shù)TH1=0Xe6;TL1=0Xe6; /8位自動重裝,波特率設置為1200TR1=1; /啟動T1定時計數(shù)器SCON=0 x40; /串行方式1,串行接收禁止EX0=1; /打開外部中斷0EX1=1; /打開外部中斷1IT0=1; /INT0,外部中斷0,下降沿觸發(fā)IT1=1; /INT1,外部中斷1,下降沿觸發(fā)EA=1; /開總中斷/*定時器0函數(shù)*/void timer1() interrupt 1/TMOD=0 x01; /工作方式1,16位計數(shù) TR0=0;TH0=(65536-10000)/256; /對于12MHz的晶振,此

5、處定時50ms,賦值0X3cb0TL0=(65536-10000)%256; /若定時10ms,賦值0XD8F0;5ms,賦值0Xec78TR0=1;/啟動定時器T0工作t-;/*外部中斷0函數(shù)*/void int0() interrupt 0 /對應紅燈時間參數(shù)設置 TH0=(65536-10000)/256; /對于12MHz的晶振,此處定時50ms,賦值0X3cb0TL0=(65536-10000)%256; /若定時10ms,賦值0XD8F0;5ms,賦值0Xec78ET0=1;/開T0中斷請求t=6;/設定延時長短TR0=1;/啟動定時器T0工作while(t);/延時消抖TR0=0

6、;/禁止T0定時器工作,防止后面程序運行時被中斷IE0=0;/再次清外部中斷0請求標志x-;if(x=10) x=99;TI=0; /清發(fā)送中斷請求標志,先發(fā)再查SBUF=1;/作為標識標志,發(fā)送給乙機while(!TI);/查詢方式TI=0;SBUF=x;/*外部中斷1函數(shù)*/void int1() interrupt 2 /對應綠燈時間參數(shù)設置 TH0=(65536-10000)/256; /對于12MHz的晶振,此處定時50ms,賦值0X3cb0TL0=(65536-10000)%256; /若定時10ms,賦值0XD8F0;5ms,賦值0Xec78ET0=1;/開T0中斷請求TR0=1

7、;/啟動定時器T0工作t=6;while(t);/延時消抖TR0=0;IE1=0; /再次清外部中斷1請求標志y-; if(y=10) y=50;TI=0; SBUF=0;while(!TI);/查詢方式TI=0;SBUF=y;/*主函數(shù)*/main()init();while(1);乙單片機代碼如下:#include #define uchar unsigned char#define uint unsigned intuchar t=0; /用于timer0函數(shù),設置數(shù)碼管顯示的數(shù)字跳變的時間間隔uchar w=0; /切換紅綠燈標志位uchar k=255; /用于串口中斷處理,甲機的按

8、鍵按一次,則向乙機發(fā)送兩個單字節(jié)數(shù)據(jù) /前一個數(shù)據(jù)用于辨識將要設置的時間參數(shù)屬于紅燈還是綠燈 /后一個數(shù)據(jù)是想要設置的時間參數(shù),直接賦值給相應的色燈uchar f1; /用于串口中斷處理,辨識設置的時間參數(shù)屬于紅燈還是綠燈uchar f2=0; /標志位,表示有串行中斷發(fā)生時,要將已設置好的時間參數(shù)顯示出來,1有效uint n;/用于設定要設置的時間參數(shù)在數(shù)碼管上顯示停留的時間長短code uchar tab=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/數(shù)碼管共陰/code uchar tab=0 xC0,0 xF9

9、,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;/數(shù)碼管共陽sbit d1=P20; /d1作為高位數(shù)碼管的公共端sbit d2=P21; /d2作為低位數(shù)碼管sbit red=P22; /紅燈數(shù)據(jù)輸出位設置sbit green=P23;sbit yellow=P24;/sbit r_ed=P05;/sbit g_reen=P06;/sbit y_ellow=P07;/uchar r_g_y;uchar a=60; /直接賦值給數(shù)碼管的數(shù)據(jù)uchar data_2=60,30;/數(shù)組的第一個數(shù)據(jù)是紅燈的時長參數(shù),第二個是綠燈的時長參數(shù)uchar

10、 g;/作為數(shù)組的下標,如data_2guint i;/用于動態(tài)顯示字符uint j;/用于動態(tài)顯示字符/*初始化函數(shù)*/void init() IP=0 x10; /中斷優(yōu)先級設置(串口中斷為最高優(yōu)先級) TMOD=0X21; /T1定時計數(shù)器工作于方式2,作為波特率發(fā)生器,SMOD此處默認取0/T0定時計數(shù)器工作于方式1,用于定時TH1=0Xe6;TL1=0Xe6; /8位自動重裝TR1=1; /啟動T1定時計數(shù)器SCON=0 x50; /串行方式1,串行接收允許TH0=(65536-50000)/256; /定時50msTL0=(65536-50000)%256;EA=1; /開總中斷E

11、T0=1; /開T0中斷請求ES=1; /允許串行口中斷TR0=1; /啟動定時器T0工作/*延時函數(shù)*/ void delay(uint z) uint i;for(i=0;iz;i+);/*數(shù)碼管動態(tài)顯示*/ void display(uchar c) uchar a=c; i=a/10;j=a%10;/以下是動態(tài)顯示, d1=0;d2=1;/若是共陽,位選d1,d2取值相反 P1=tabi; delay(30); P1=0; delay(30); d1=1;d2=0;/若是共陽,位選d1,d2取值相反 P1=tabj; delay(30); P1=0; delay(30); /*定時器0

12、*/ void timer0() interrupt 1 TR0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;t+;if(t=7)a=a-1;t=0;if(a=5 & t%2=0) yellow=yellow;if(a=0)w+;red=red;green=green;yellow=0;if(w%2=1) a=data_21;else a=data_20;/*串行口發(fā)送與接收中斷處理函數(shù)*/void t_r() interrupt 4 TR0=0;/暫停定時器工作,進入紅綠燈時間設置狀態(tài)/寫接收數(shù)據(jù)的程序f2=1;n=1000; /設

13、置改變后的時間參數(shù)在數(shù)碼管上顯示停留的時間,每次中斷后,n必須重新賦值, /保證其在數(shù)碼管上的顯示數(shù)據(jù)停留一個固定的時間段顯示處理程序寫在主函數(shù)中RI=0; /清接收中斷請求標志/r_ed=red;/g_reen=green;/y_ellow=yellow;/r_g_y=P1;k+; /奇數(shù),偶數(shù)次的接收數(shù)據(jù),存放于不同位置if(k%2=0) /全局變量k初值為255,上一條指令自加后,為0;模除2,余0,為偶數(shù), /則本次中斷的目的是辨識將要設置的時間參數(shù)屬于紅燈還是綠燈f1=SBUF;if(f1=1)g=0; /辨識將要設置的時間參數(shù)屬于紅燈還是綠燈,此處為紅燈elseg=1; /此處為綠

14、燈。else /模除2,余1,為奇數(shù),則本次中斷的目的是 /把要設置的時間參數(shù)賦值給相應的色燈。 data_2g=SBUF; /接收數(shù)據(jù),設置相應色燈的時間參數(shù)/while(n-) /短暫延時,顯示您所設置的時間參數(shù),【在串行中斷處理函數(shù)中不要停留太久,如100us】/display(data_2g);/【防止中斷處理中串行數(shù)據(jù)接收出錯】 TR0=1;/重新打開定時器/*主函數(shù)*/ void main() green=0; yellow=0;red=1; init(); while(1) if(f2=1)ET0=0; /作用如下一行/TR0=0;/暫停定時器工作,(主函數(shù)中怎么將TR0清零無效

15、,?)/*switch(g) /switch語句用來處理發(fā)送給乙單片機的LED燈變化數(shù)據(jù) case 0:red=1;green=0;yellow=0;break; case 1:red=0;green=1;yellow=0;break; default: ;*/while(n-)display(data_2g); /短暫延時,顯示您所設置的時間參數(shù)/red=r_ed;green=g_reen;yellow=y_ellow;/P1=r_g_y; 、/單步調試都可以,proteus仿真就不行?whyf2=0;/TR0=1;/重新打開定時器ET0=1;display(a);/始終點亮數(shù)碼管,并等待定時中斷和串行口中斷5系統(tǒng)測試程序初始化紅燈最長顯示時間60秒(圖如上)紅燈最后5秒鐘黃燈閃爍(如上圖)紅燈60秒鐘完后,綠燈顯示30秒鐘(如上圖)綠燈最后5秒鐘時,黃燈閃爍(如上圖)任何時刻,皆可以設置紅燈的時間參數(shù)(如上圖)分析:本程序為了不至于紅燈時間太短時,就直接導致黃燈5秒閃爍,而將紅燈時間參數(shù)設置范圍定位10到99秒鐘,按鍵每按一次時間參數(shù)自動減一,數(shù)碼管顯示剛剛設置好的時間參數(shù)1至2秒鐘,然后回到斷點,繼續(xù)顯示之前的交通燈狀態(tài);等到下一次循環(huán)到來時,顯示新的已設置

溫馨提示

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

評論

0/150

提交評論