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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

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

3、signed char#define uint unsigned intuchar x=100;/紅燈最長時(shí)間設(shè)置為99秒uchar y=51;/綠燈最長時(shí)間設(shè)置為50秒uchar t;/*串行口發(fā)送與接收中斷處理函數(shù)*/void init() IP=0x02; /中斷優(yōu)先級設(shè)置(T0中斷為最高優(yōu)先級,然后是INT0,最后是INT1)TMOD=0X21; /T1定時(shí)計(jì)數(shù)器工作于方式2,作為波特率發(fā)生器,SMOD此處默認(rèn)取0/T0工作方式1,16位計(jì)數(shù)TH1=0Xe6;TL1=0Xe6; /8位自動重裝,波特率設(shè)置為1200TR1=1; /啟動T1定時(shí)計(jì)數(shù)器SCON=0x40; /串行方式1,串

4、行接收禁止EX0=1; /打開外部中斷0EX1=1; /打開外部中斷1IT0=1; /INT0,外部中斷0,下降沿觸發(fā)IT1=1; /INT1,外部中斷1,下降沿觸發(fā)EA=1; /開總中斷/*定時(shí)器0函數(shù)*/void timer1() interrupt 1/TMOD=0x01; /工作方式1,16位計(jì)數(shù) TR0=0;TH0=(65536-10000)/256; /對于12MHz的晶振,此處定時(shí)50ms,賦值0X3cb0TL0=(65536-10000)%256; /若定時(shí)10ms,賦值0XD8F0;5ms,賦值0Xec78TR0=1;/啟動定時(shí)器T0工作t-;/*外部中斷0函數(shù)*/void

5、int0() interrupt 0 /對應(yīng)紅燈時(shí)間參數(shù)設(shè)置 TH0=(65536-10000)/256; /對于12MHz的晶振,此處定時(shí)50ms,賦值0X3cb0TL0=(65536-10000)%256; /若定時(shí)10ms,賦值0XD8F0;5ms,賦值0Xec78ET0=1;/開T0中斷請求t=6;/設(shè)定延時(shí)長短TR0=1;/啟動定時(shí)器T0工作while(t);/延時(shí)消抖TR0=0;/禁止T0定時(shí)器工作,防止后面程序運(yùn)行時(shí)被中斷IE0=0;/再次清外部中斷0請求標(biāo)志x-;if(x=10) x=99;TI=0; /清發(fā)送中斷請求標(biāo)志,先發(fā)再查SBUF=1;/作為標(biāo)識標(biāo)志,發(fā)送給乙機(jī)whi

6、le(!TI);/查詢方式TI=0;SBUF=x;/*外部中斷1函數(shù)*/void int1() interrupt 2 /對應(yīng)綠燈時(shí)間參數(shù)設(shè)置 TH0=(65536-10000)/256; /對于12MHz的晶振,此處定時(shí)50ms,賦值0X3cb0TL0=(65536-10000)%256; /若定時(shí)10ms,賦值0XD8F0;5ms,賦值0Xec78ET0=1;/開T0中斷請求TR0=1;/啟動定時(shí)器T0工作t=6;while(t);/延時(shí)消抖TR0=0;IE1=0; /再次清外部中斷1請求標(biāo)志y-; if(y=10) y=50;TI=0; SBUF=0;while(!TI);/查詢方式TI

7、=0;SBUF=y;/*主函數(shù)*/main()init();while(1);乙單片機(jī)代碼如下:#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar t=0; /用于timer0函數(shù),設(shè)置數(shù)碼管顯示的數(shù)字跳變的時(shí)間間隔uchar w=0; /切換紅綠燈標(biāo)志位uchar k=255; /用于串口中斷處理,甲機(jī)的按鍵按一次,則向乙機(jī)發(fā)送兩個(gè)單字節(jié)數(shù)據(jù) /前一個(gè)數(shù)據(jù)用于辨識將要設(shè)置的時(shí)間參數(shù)屬于紅燈還是綠燈 /后一個(gè)數(shù)據(jù)是想要設(shè)置的時(shí)間參數(shù),直接賦值給相應(yīng)的色燈uchar f1; /用于串口

8、中斷處理,辨識設(shè)置的時(shí)間參數(shù)屬于紅燈還是綠燈uchar f2=0; /標(biāo)志位,表示有串行中斷發(fā)生時(shí),要將已設(shè)置好的時(shí)間參數(shù)顯示出來,1有效uint n;/用于設(shè)定要設(shè)置的時(shí)間參數(shù)在數(shù)碼管上顯示停留的時(shí)間長短code uchar tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/數(shù)碼管共陰/code uchar tab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/數(shù)碼管共陽sbit d1=P20; /d1作為高位數(shù)碼管的公共端sbit d2=P21; /d2作為低位數(shù)碼管sbit

9、 red=P22; /紅燈數(shù)據(jù)輸出位設(shè)置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ù)組的第一個(gè)數(shù)據(jù)是紅燈的時(shí)長參數(shù),第二個(gè)是綠燈的時(shí)長參數(shù)uchar g;/作為數(shù)組的下標(biāo),如data_2guint i;/用于動態(tài)顯示字符uint j;/用于動態(tài)顯示字符/*初始化函數(shù)*/void init() IP=0x10; /中斷優(yōu)先級設(shè)置(串口中斷為最高優(yōu)先級) TMOD=0

10、X21; /T1定時(shí)計(jì)數(shù)器工作于方式2,作為波特率發(fā)生器,SMOD此處默認(rèn)取0/T0定時(shí)計(jì)數(shù)器工作于方式1,用于定時(shí)TH1=0Xe6;TL1=0Xe6; /8位自動重裝TR1=1; /啟動T1定時(shí)計(jì)數(shù)器SCON=0x50; /串行方式1,串行接收允許TH0=(65536-50000)/256; /定時(shí)50msTL0=(65536-50000)%256;EA=1; /開總中斷ET0=1; /開T0中斷請求ES=1; /允許串行口中斷TR0=1; /啟動定時(shí)器T0工作/*延時(shí)函數(shù)*/ void delay(uint z) uint i;for(i=0;i<z;i+);/*數(shù)碼管動態(tài)顯示*/

11、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); /*定時(shí)器0*/ 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

12、(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;/暫停定時(shí)器工作,進(jìn)入紅綠燈時(shí)間設(shè)置狀態(tài)/寫接收數(shù)據(jù)的程序f2=1;n=1000; /設(shè)置改變后的時(shí)間參數(shù)在數(shù)碼管上顯示停留的時(shí)間,每次中斷后,n必須重新賦值, /保證其在數(shù)碼管上的顯示數(shù)據(jù)停留一個(gè)固定的時(shí)間段顯示處理程序?qū)懺谥骱瘮?shù)中RI=0; /清接收中斷請求標(biāo)志/r_ed

13、=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è)置的時(shí)間參數(shù)屬于紅燈還是綠燈f1=SBUF;if(f1=1)g=0; /辨識將要設(shè)置的時(shí)間參數(shù)屬于紅燈還是綠燈,此處為紅燈elseg=1; /此處為綠燈。else /模除2,余1,為奇數(shù),則本次中斷的目的是 /把要設(shè)置的時(shí)間參數(shù)賦值給相應(yīng)的色燈。 data_2g=SBUF; /接收數(shù)據(jù),設(shè)置相應(yīng)色燈的時(shí)間參數(shù)/while(n-) /短暫

14、延時(shí),顯示您所設(shè)置的時(shí)間參數(shù),【在串行中斷處理函數(shù)中不要停留太久,如100us】/display(data_2g);/【防止中斷處理中串行數(shù)據(jù)接收出錯(cuò)】 TR0=1;/重新打開定時(shí)器/*主函數(shù)*/ void main() green=0; yellow=0;red=1; init(); while(1) if(f2=1)ET0=0; /作用如下一行/TR0=0;/暫停定時(shí)器工作,(主函數(shù)中怎么將TR0清零無效,?)/*switch(g) /switch語句用來處理發(fā)送給乙單片機(jī)的LED燈變化數(shù)據(jù) case 0:red=1;green=0;yellow=0;break; case 1:red=0

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

溫馨提示

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

評論

0/150

提交評論