第一篇:計算機RS232和C51單片機收發(fā)程序
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RS232串口通訊,由計算機或MCU發(fā)送C51單片機
通訊程序:發(fā)送3A 30 31 ** ** ** **(起始字符3A,地址為01,**代表數(shù)據(jù),無結束字符,無和校驗)接收超時時間:50ms 波特率:4800bps 接收到的數(shù)據(jù)用數(shù)碼管顯示出來
管腳定義:P0控制每位數(shù)碼管顯示,P2^2,P2^3,P2^4控制譯碼器,譯碼器控制哪一位顯示 支持0~F的ASCII碼數(shù)據(jù)接收
例如:發(fā)送 3A 30 31 42 43 44 45 后顯示數(shù)碼管顯示 BCDE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/******************************************************************************* * 實驗名
: 動態(tài)顯示數(shù)碼管實驗 * 使用的IO
: 數(shù)碼管使用P0,P2.2,P2.3,P2.4 * 實驗效果
: 數(shù)碼管顯示
******************************************************************************/ #include
/******************************************************************************* * 函數(shù)名
: main * 函數(shù)功能
: 主函數(shù) * 輸入
: 無 * 輸出
: 無
*******************************************************************************/ void main(void){ SCON=0X50;//設置為工作方式1 TMOD=0X20;
//設置計數(shù)器工作方式2 PCON=0X80;//波特率加倍
TH1=0XF3;
//計數(shù)器初始值設置,注意波特率是4800的TL1=0XF3;ES=1;
//打開接收中斷
EA=1;
//打開總中斷
TR1=1;
//打開計數(shù)器
for(n=0;n<8;n++){
DisplayData[n]=DIG_CODE[n];
} while(1){
DigDisplay();}
} /******************************************************************************* * 函數(shù)名
: DigDisplay * 函數(shù)功能
: 使用數(shù)碼管顯示 * 輸入
: 無 * 輸出
: 無
*******************************************************************************/ void DigDisplay(){ unsigned char a;unsigned int j;
if(RECEIV_DATA_USART[0]==0x3A&&RECEIV_DATA_USART[1]==0x30&&RECEIV_DATA_USART[2]==0x31)
for(a=0;a<16;a++)
RECEIV_DATA[a]=RECEIV_DATA_USART[a];
p=0x00;//小數(shù)點判斷
for(a=1;a<=8;a++)
{
if(RECEIV_DATA[a+2+p]==0x2E)
{
GPIO_DIG=0x80|GPIO_DIG;
p++;
j=10;
//掃描間隔時間設定
while(j--);
GPIO_DIG=0x00;//消隱 }
switch(a)//位選,選擇點亮的數(shù)碼管,{ case(1):
LSA=0;LSB=0;LSC=0;break;//顯示第0位
case(2):
LSA=1;LSB=0;LSC=0;break;//顯示第1位
case(3):
LSA=0;LSB=1;LSC=0;break;//顯示第2位
case(4):
LSA=1;LSB=1;LSC=0;break;//顯示第3位
case(5):
LSA=0;LSB=0;LSC=1;break;//顯示第4位
case(6):
LSA=1;LSB=0;LSC=1;break;//顯示第5位
case(7):
LSA=0;LSB=1;LSC=1;break;//顯示第6位
case(8):
LSA=1;LSB=1;LSC=1;break;//顯示第7位
} for(s=0;s<10;s++)
}
if(RECEIV_DATA[a+2+p]==0x30+s)
GPIO_DIG=DIG_CODE[s];
for(s=0;s<6;s++)
if(RECEIV_DATA[a+2+p]==0x41+s)
GPIO_DIG=DIG_CODE[0x0A+s];
j=10;
//停留時間設定
while(j--);
GPIO_DIG=0x00;//消隱
}
if(i>0)m++;//接收超時計時器
if(m>10&&RECEIV_DATA_USART[0]==0x3A)
{
for(n=i;n<=15;n++)RECEIV_DATA_USART[n]=0x00;
RECEIV_DATA_USART[0]=0x00;
m=0;
i=0;
}
void Usart()interrupt 4 {
if(SBUF==0x3A)//判斷起始字符是否為0x3A
{
RECEIV_DATA_USART[0]=SBUF;
}
if(RECEIV_DATA_USART[0]==0x3A)
{
RECEIV_DATA_USART[i]=SBUF;//出去接收到的數(shù)據(jù)
i++;
}
RI = 0;//清除接收中斷標志位 /* 以下代碼為將接收到的數(shù)據(jù)返回給發(fā)送方,便于調試
SBUF=RECEIV_DATA[i];
while(!TI);
//等待發(fā)送數(shù)據(jù)完成TI=0;//清除發(fā)送完成標志位 */ }
第二篇:C51單片機自學第一課
第一課 了解單片機及單片機的控制原理,控制一個LED 燈的亮和滅
本章學習內容:
單片機基本原理,如何仿真器,如何編程點亮和滅掉一個LED 燈,如何進入KEILC51uV調試環(huán)境,如何使用單步,斷點,全速,停止的調試方法
單片機現(xiàn)在是越來越普及了,學習單片機的熱潮也一陣陣趕來,許多人因為工作需要或者個人興趣需要學習單片機??梢哉f,掌握了單片機開發(fā),就多了一個飯碗。
單片機已經(jīng)有30 多年的歷史了,在中國,高校的單片機課程大多數(shù)都是51,而51 經(jīng)過這么多年的發(fā)展,也增長了許多的系列,功能上有了許多改進,也擴展出了不少分支。而國內書店的單片機專架上,也大多數(shù)都是51 系列??梢灶A見,51 單片機在市場上只會越來越多,功能只會越來越豐富,在可以預見的數(shù)十年內是不可能會消失的。
下面以51 為例來了解一下單片機是什么東西,控制原理又是什么?
在數(shù)字電路中,電壓信號只有兩種情況,高電平和低電平,用數(shù)字來記錄就是1 和0。單片機內部的CPU,寄存器,總線等等結構都是通過1 和0 兩種信號來運作的,數(shù)據(jù)也是以1 或者0 來保存的。單片機的輸入輸出管腳,也就是IO 口,也是只輸出或識別1 和0 兩種信號,也就是高電平和低電平。當單片機輸出一個或一組電平信號到IO 口后,外部的設備就可以讀到這些信號,并進行相應操作,這就是單片機對外部的控制。當外部一個或一組電平信號送到單片機的IO 口時,單片機也可以讀到這些信號,并進行分析操作,這就是單片機對外部設備信號的讀取。當然實際的操作中,這些信號可能十分復雜,必須嚴格地按照規(guī)定的時間順序(時序)輸入輸出。每種設備也都規(guī)定了自己的時序,只要都嚴格遵守,就可以控制任何設備,做出只要你想象得出的任何事情。
您可能會再問,我如何讓單片機去控制和分析外部設備呢?答案是程序,您可以編寫相關的程序,并且把他們燒寫到單片機內部的程序空間,單片機在上電時,就會一步一步按照您寫的程序去執(zhí)行指令,做您想做的事情。
在51 標準芯片中,有32 個輸入輸出IO,分為4 組,每組8 個,分別為P0 口,P1 口,P2 口,P3 口。P1 口的8 條腳就用P1.0 至P1.7 表示,其余類似。51 就是用這32 個口來完成所有外部操作的。對于51 的內部結構,如果您已經(jīng)了解,那是最好;如果不懂,也可以先放下,在完成了本教程開始的幾個章節(jié)之后,您就會大有興趣,自己去尋找資料閱讀了。當然,如果您希望成為一個優(yōu)秀的單片機開發(fā)程序員,還是必須熟悉單片機的內部結構及工作原理,切不可偷懶!
在這一章,您將用程序去控制一個LED 發(fā)光管的亮和滅。你應該知道,LED 發(fā)光管在通過一定電流時亮,不通電就滅。為了不讓LED 通過太大的電流把它燒壞,我們還要串上限流電阻。51 的IO 是弱上拉的方式,在輸出高電平時,只能輸出幾十微安的電流到地,而在輸出低電平時,VCC 電源可以輸入幾十毫安的電流到IO。一般LED 需要10 毫安左右電流點亮,我們就將LED 接在電源VCC 和IO 口之間,中間串上電阻,當IO 輸出低電平時,燈就亮了,反之,燈就滅了。我們在這個程序里要控制的是P1.0。請參考一下我們將要使用的試驗板的電路圖。
現(xiàn)在可以開始做試驗了,我們打開已經(jīng)建立好的工程和編寫好的程序試驗。順便還會學習一下程序調試的技巧。至于如何建立一個新工程,請參考C51 的幫助文件。請雙擊lessoncode01 目錄下的lesson1.uv2,打開后界面如下:
點一下上圖第三排第2 或者第3 個按鈕(您的編譯器按鈕位置不一定在那個位置,自己找找),就可以看到編譯結果了。上面顯示是0errrs,0warnings,這是最佳的編譯結果,如果有error,則無法進行下一步仿真,如果有warning,一定要盡量消除,確實無法消除的,也要確認不會對程序造成影響,才進行下一步的仿真。在編譯結果中,我們還可以看到有data,xdata,code 等用了多少字節(jié)的報告,要注意您的單片機中是否有這么多的資源,如果不夠,將來燒片運行時就可能出現(xiàn)問題。比如AT89C51 的程序空間是4K,xdata 如果沒有外擴就是0 個,data 是128 個。超出這些范圍,程序就不能在AT89c51 中運行。不同的芯片有不同的容量,如SST89E516RD 就有64K 程序,內部768 字節(jié)XDATA,還有256 個字節(jié)的data。我們的例程中肯定都考慮了這些了,肯定不會超出,將來自己開發(fā)時就要注意了。
下面我們故意把第9 行的P10 寫成P11,點編譯,因為沒有預先定義P11,所以就報告錯誤了,如下圖:
雙擊一下錯誤報告的那一行,窗口就也會跳到這一行,方便您進行修改。好了,現(xiàn)在請把錯誤改回去,再編譯一次,出現(xiàn)報告正確了以后,下面開始仿真了。點一下第二行第5 個一個放大鏡里面一個d 字母的按鈕,就可以進入仿真了,仿真器要事先連接好喲。進入仿真后要退出仿真環(huán)境也是點這個按鈕。注意,等會如果程序在正在全速運行時,仿真環(huán)境是不能直接退出的,得先點停止運行后,再點仿真按鈕才可以退出。點進入仿真按鈕,程序開始裝載,PC 自動運行到了main()停下,并指向了main()函數(shù)的第一行。
進入仿真窗口后,如果出現(xiàn)的不是前面的源代碼窗口,而是夾有反匯編代碼的窗口,直接關掉這個窗口就會恢復到代碼窗口。下次進入也會直接進入到源代碼窗口。
現(xiàn)在先試驗單步,點單步(兩個單步都可以,一般點單步跨過)??梢钥吹綗袅亮?。PC 指針也指向了下一個
程序行。再點一下單步,PC 又走下一步,燈滅了。再點一次,PC 走到掛起的程序行了,繼續(xù)點仍然在這一行。這句指令其實就是使程序不斷地跳到自己這一行,別的什么也不做。一般稱作程序掛起。
一般的實際應用中的程序是不會掛起的,一般是在main 函數(shù)里做一個大循環(huán),程序如下:
void main(void)// 主程序 { while(1){ P11=0;//亮燈 P10=1;//滅燈 } } 請將main 函數(shù)程序改為上面的代碼,我們下一步將試驗斷點的操作。
在第15 行雙擊一下,可以看到程序行左邊出現(xiàn)了一個紅方塊,這就是設置斷點,再雙擊一次,斷點就取消了。如果程序在全速運行的過程中遇到斷點,就會自動停下來給你分析。注意在進入仿真后,并且程序是停止狀態(tài)時,才可以設置或者取消斷點。
現(xiàn)在點全速運行,可以看到程序在斷點處停了下來,并且由于前一句指令剛剛執(zhí)行了點燈,所以這時燈是亮著的。
現(xiàn)在在第14 行設置斷點,并且取消上一個斷點。
現(xiàn)在點全速運行,可以看到程序在斷點處停了下來,并且由于剛剛執(zhí)行了滅燈,燈是滅著的。好,現(xiàn)在試驗全速運行和停止。把斷點取消,再點全速運行,可以看到燈是亮著的,但是不是很亮,這是由于程序是循環(huán)的,亮滅交替進行,亮的時間并不是全部的時間?,F(xiàn)在點停止,可以看到程序停止了,重復幾次進行全速和停止,可以發(fā)現(xiàn)每次停止的地方不一定是同一位置。
演講稿
尊敬的老師們,同學們下午好:
我是來自10級經(jīng)濟學(2)班的學習委,我叫張盼盼,很榮幸有這次機會和大家一起交流擔任學習委員這一職務的經(jīng)驗。
轉眼間大學生活已經(jīng)過了一年多,在這一年多的時間里,我一直擔任著學習委員這一職務?;赝@一年多,自己走過的路,留下的或深或淺的足跡,不僅充滿了歡愉,也充滿了淡淡的苦澀。一年多的工作,讓我學到了很多很多,下面將自己的工作經(jīng)驗和大家一起分享。
學習委員是班上的一個重要職位,在我當初當上它的時候,我就在想一定不要辜負老師及同學們我的信任和支持,一定要把工作做好。要認真負責,態(tài)度踏實,要有一定的組織,領導,執(zhí)行能力,并且做事情要公平,公正,公開,積極落實學校學院的具體工作。作為一名合格的學習委員,要收集學生對老師的意見和老師的教學動態(tài)。在很多情況下,老師無法和那么多學生直接打交道,很多老師也無暇顧及那么多的學生,特別是大家剛進入大學,很多人一時還不適應老師的教學模式。學習委員是老師與學生之間溝通的一個橋梁,學習委員要及時地向老師提出同學們的建議和疑問,熟悉老師對學生的基本要求。再次,學習委員在學習上要做好模范帶頭作用,要有優(yōu)異的成績,當同學們向我提出問題時,基本上給同學一個正確的回復。
總之,在一學年的工作之中,我懂得如何落實各項工作,如何和班委有效地分工合作,如何和同學溝通交流并且提高大家的學習積極性。當然,我的工作還存在著很多不足之處。比日:有的時候得不到同學們的響應,同學們不積極主動支持我的工作;在收集同學們對自己工作意見方面做得不夠,有些事情做錯了,沒有周圍同學的提醒,自己也沒有發(fā)覺等等。最嚴重的一次是,我沒有把英語四六級報名的時間,地點通知到位,導致我們班有4名同學錯過報名的時間。這次事使我懂得了做事要腳踏實地,不能馬虎。
在這次的交流會中,我希望大家可以從中吸取一些好的經(jīng)驗,帶動本班級的學習風氣,同時也相信大家在大學畢業(yè)后找到好的工作。謝謝大家!
第三篇:c51單片機實習報告
基于單片機實現(xiàn)短距離無線通信設計 引言
短距離無線傳輸具有抗干擾性能強、可靠性高、安全性好、受地理條件限制少、安裝靈活等優(yōu)點,在許多領域有著廣泛的應用前景。低功耗、微型化是用戶對當前無線通信產(chǎn)品尤其是便攜產(chǎn)品的實際需求,短距離無線通信逐漸引起廣泛關注。常見的短距離無線通信有基于802.11的無線局域網(wǎng)WLAN、藍牙(blueTooth)、HomeRF及歐洲的HiperLAN(高性能無線局域網(wǎng)),但其硬件設計、接口方式、通信協(xié)議及軟件堆棧復雜,需專門的開發(fā)系統(tǒng),開發(fā)成本高、周期長,最終產(chǎn)品成本也高。因此這些技術在嵌入式系統(tǒng)中并未得到廣泛應用。普通RF產(chǎn)品不存在這些問題,且短距離無線數(shù)據(jù)傳輸技術成熟,功能簡單、攜帶方便,使其在嵌入式短程無線產(chǎn)品中得到了廣泛應用。
PTR2000引腳簡介及設計
2.1 PTR2000器件引腳功能
PTR2000是基于nRF401器件的無線數(shù)據(jù)傳輸模塊,采用低發(fā)射頻率、高靈敏度設計。該器件使用433 MHz頻段,是真正的單片UHF無線收發(fā)一體器件,其工作模式包括工作頻道的設置和發(fā)送、接收、待機狀態(tài),由TXEN、CS、PWM 3個引腳共同決定,其工作模式設置如表1所示。
2.2 PrR2000模塊設計
該器件外圍的主要電路有以下兩個:
(1)與單片機的連接電路單片機AT89C52的RXD和TXD引腳與PTR2000模塊的DO和DI引腳直接相連。PTR2000的模式控制引腳與單片機的控制引腳相連。
(2)與PC機的連接電路采用MAX202器件對PTR2000模塊和計算機串口進行RS-232和TTL電平轉換,將PTR2000與MAX202的輸入和輸出信號連接,轉換后的信號與計算機的串口連接。
硬件設計
在無法使用有線傳輸?shù)膱龊希捎脽o線數(shù)據(jù)傳輸模塊和單片機相結合進行數(shù)據(jù)傳輸是較合理的方案。PTR2000利用串口進行數(shù)據(jù)傳輸,而單片機和PC機均帶有串口,因此,可利用PTR2000作為單片機和PC機之間數(shù)據(jù)傳輸?shù)臒o線接口,其硬件結構框圖如圖1所示。
該采集系統(tǒng)主要以AT89C52單片機為控制處理核心。由它完成對數(shù)據(jù)的采集處理以及控制數(shù)據(jù)的無線傳輸。AT89C52單片機具有快速8051內核、8 KB Flash E2PROM、256字節(jié)RAM。為實現(xiàn)無線數(shù)據(jù)傳輸,采用無限收發(fā)一體數(shù)據(jù)傳送MODEM模塊PTR2000器件,該器件內部集成高頻接收、PLL合成、PSK調制/解調、參量放大、功率放大、頻道切換等功能,完全符合無線數(shù)據(jù)通信的硬件要求。為降低成本,在最小硬件設計的基礎上,利用C51高級C語言編程,系統(tǒng)的功能盡可能用軟件程序實現(xiàn)。
3.1 單片機的時鐘電路和復位電路設計
單片機時鐘電路設計中,選擇晶振頻率11.059 2 MHz,約定PC機和單片機的通信速率為9 600 b/s,并選擇相應電容與單片機的時鐘引腳相連構成時鐘回路。在復位電路設計中,采用復位引腳和相應的電容、電阻構成復位電路。單片機與PTR2000接口原理電路如圖2所示。
3.2 單片機與PTR2000接口電路的設計
在圖2中,AT89C52單片機主要完成數(shù)據(jù)的采集和處理,向PTR2000模塊發(fā)送數(shù)據(jù),并接收由PC機通過PTR2000傳送的數(shù)據(jù)。和單片機相連的PTR2000模塊主要將單片機的待傳數(shù)據(jù)調制成射頻信號,再發(fā)送到PC機端的PTR2000模塊,同時接收PC機端的PTR2000模塊傳送的射頻信號,并調制成單片機可識別的TTL信號送至單片機。單片機的RXD和TXD引腳分別和PTR2000的DO和DI引腳連接,實現(xiàn)串行數(shù)據(jù)傳輸;決定PTR2000模塊工作模式的TXEN、CS、PWR 3個引腳分別和單片機I/O控制口的P2.0~P2.2相連,PTR2000工作時,由單片機中的運行控制程序實時控制其工作模式。
3.3 PC機與PTR2000接口電路的設計
該接口電路設計首先需進行電平轉換。PC機的串口支持RS-232標準,而PTR2000模塊支持TTL電平,選擇MAX232器件進行兩者間的電平轉換,接口電路如圖3所示。PTR2000模塊進行串行輸入、輸出,引腳DI、DO通過電平轉換器件和PC機串口相連;PTR2000的低功耗控制引腳。PWR接高電平VCC,即PTR2000固定工作在正常工作狀態(tài);頻道選擇引腳CS接GND低電平,即采用固定通信頻道1,固定工作在433.92 MHz;PC機串口的RTS信號控制TXEN引腳,以決定PTR2000模塊何時為接收和發(fā)射狀態(tài)。PC機和串口的傳輸速率設定為9 600 b/s,和單片機保持一致。軟件設計
無線通信系統(tǒng)的軟件設計包括單片機端和PC機端兩部分,兩部分軟件相互配合,設置各自的PTR2000模塊的工作狀態(tài)。
4.1 PTR2000模塊程序設計
單片機和PC機端軟件配合設置PTR2000的狀態(tài)(發(fā)射或接收),選擇固定的通信頻道1(CS=0),并讓PTR2000模塊一直處于正常工作狀態(tài)(PWM=1)。無線通信實現(xiàn)過程如下:
(1)發(fā)送在發(fā)送數(shù)據(jù)之前,應將PTR2000模塊置于發(fā)射模式,即TXEN=1。然后等待至少5 ms后(接收到發(fā)射的切換時間)才可發(fā)射數(shù)據(jù)。發(fā)送結束后,應將模塊置于接收狀態(tài),即TXEN=0。
(2)接收應將PTR2000置于接收模式,即TXEN=0。單片機不發(fā)送的絕大部分時間都處于接收狀態(tài)。當單片機端發(fā)送時,PC機端應為接收;當PC機端發(fā)送時,單片機端應為接收。
4.2 串行無線通信協(xié)議設計
無線通信中,由于外部環(huán)境的干擾,通常誤碼率較高,因此通信協(xié)議的設計對保證通信的可靠性十分重要。協(xié)議的設計主要是幀結構的設計,在該無線通信系統(tǒng)中,存在指令幀和數(shù)據(jù)幀。數(shù)據(jù)幀的內容包括起始字節(jié)、數(shù)據(jù)長度字節(jié)、數(shù)據(jù)字節(jié)、結束字節(jié)和校驗和字節(jié),如表2所示。
起始字節(jié)定義為“$”字符,其數(shù)值為0x24;結束字節(jié)定義為“*”字符,其數(shù)值為0x2A。
采用校驗和的方法進行幀的校驗,將所有字節(jié)相加,然后將結果截短到所需的位長。發(fā)送端對待發(fā)送的數(shù)據(jù)進行校驗和計算,將校驗和值放在數(shù)據(jù)后一起發(fā)送;在接收端,對接收到的數(shù)據(jù)進行校驗和計算,然后與收到的校驗和字節(jié)比較,進行誤碼判斷。
對于單片機,指令幀主要有3種:PC機發(fā)送給單片機的請求發(fā)送指令、錯誤/超時重發(fā)指令、單片機發(fā)給PC機的發(fā)送完畢指令。在該系統(tǒng)設計中指令幀采用數(shù)據(jù)幀的格式,將其中的。數(shù)據(jù)字節(jié)固定為一個字節(jié),根據(jù)定義的字節(jié)判斷數(shù)據(jù)狀態(tài)。
4.3 程序流程
單片機開始需將無線數(shù)據(jù)傳輸模塊PTR2000設置處于接收狀態(tài),通過串口中斷識別由PC機通過無線信道傳輸來的指令,根據(jù)接收指令的內容采集數(shù)據(jù)并啟動發(fā)送。發(fā)送前需將PTR2000模塊設置為發(fā)射狀態(tài),且等待5 ms才可發(fā)送,發(fā)送完畢后,向PC機端發(fā)送“發(fā)送結束指令”,并將PTR2000模塊重設為接收狀態(tài)。圖4為系統(tǒng)軟件設計流程圖。結束語
單片機無線通信系統(tǒng)設計基于PTR2000無線數(shù)據(jù)傳輸解決方案,可實現(xiàn)小于300 m的短距離通信,通過實驗驗證該無線數(shù)據(jù)傳輸系統(tǒng)運行良好,單片機控制得相當準確。在應用時將系統(tǒng)作為一個模塊可方便地移植,以便構建更為復雜的無線通信網(wǎng)絡,可應用于小型無線網(wǎng)絡、無線抄表、小區(qū)傳呼、工業(yè)數(shù)據(jù)采集系統(tǒng)、安全防火系統(tǒng)等領域,具有一定實用價值。
第四篇:C51單片機實訓論文
上海第二工業(yè)大學
實訓課程
課 程: 二級項目(電子設計)
學生姓名:
許奇峰
學 號:
104827477
學院名稱:
電子與電氣工程學院
專業(yè)班級:
10測控C1
摘要
近年來隨著科技的飛速發(fā)展,單片機的應用正在不斷深入,同時帶動傳統(tǒng)控制檢測技術日益更新。在實時檢測和自動控制的單片機應用系統(tǒng)中,單片機往往作為一個核心部件來使用,僅單片機方面知識是不夠的,還應根據(jù)具體硬件結構軟硬件結合,加以完善。
本實驗采用的單片機為C51,以C語言為程序設計的基礎,通過4*4的矩陣鍵盤上的特定的按鍵來控制1602液晶顯示屏,以顯示設計人的姓名、學號,還有時鐘來顯示時、分、秒、日期,并且顯示當時的溫度,PWM和A/D轉換等功能。
一. 實驗目的
通過此次實訓,讓我們掌握了單片機基本原理的基礎、單片機的編程知識以及初步掌握單片機應用系統(tǒng)開發(fā)實用技術,了解單總線的讀/寫控制方法。同時培養(yǎng)學生理論與實踐相結合的能力,提高分析問題和解決問題的能力,增強學生獨立工作能力;培養(yǎng)了我們團結合作、共同探討、共同前進的精神與嚴謹?shù)目茖W作風。本次實驗的目的主要有以下幾點:
1、熟悉51單片機的基本構造和原理基礎;
2、能運用51單片機進行簡單的單片機應用系統(tǒng)的硬件設計;
3、掌握單片機應用系統(tǒng)的硬件、軟件調試方法; 4、4*4矩陣鍵盤的應用,1602液晶顯示屏幕的應用等;
5、運用C51單片機來設計顯示時鐘、溫度、PWM、A/D轉換。
二.硬件組成
·51單片機最小系統(tǒng)
1、震蕩器
單片機系統(tǒng)正常工作的保證,如果振蕩器不起振,系統(tǒng)將會不能工作;假如振蕩器運行不規(guī)律,系統(tǒng)執(zhí)行程序的時候就會出現(xiàn)時間上的誤差,這在通信中會體現(xiàn)的很明顯:電路將無法通信。他是由一個晶振和兩個瓷片電容組成的,x1和x2分別接單片機的x1和x2,晶振的瓷片電容是沒有正負的,注意兩個瓷片電容相連的那端一定要接地。
2、復位端 復位電路
給單片機一個復位信號(一個一定時間的低電平)使程序從頭開始執(zhí)行;一般有兩中復位方式:上電復位,在系統(tǒng)一上電時利用電容兩端電壓不能突變的原理給系統(tǒng)一個短時的低電平;手動復位,同過按鈕接通低電平給系統(tǒng)復位,時如果手按著一直不放,系統(tǒng)將一直復位,不能正常
·AT89C51 1)簡介
A89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS 8位微處理器,俗稱單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器。AT89C51單片機為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。外形及引腳排列如圖所示。2)功能特性 ·與MCS-51 兼容
·4K字節(jié)可編程閃爍存儲器
·壽命:1000寫/擦循環(huán)
·數(shù)據(jù)保留時間:10年
·全靜態(tài)工作:0Hz-24MHz
·三級程序存儲器鎖定
·128×8位內部RAM
·32可編程I/O線
·兩個16位定時器/計數(shù)器
·5個中斷源
·可編程串行通道
·低功耗的閑置和掉電模式
·片內振蕩器和時鐘電路
·矩陣鍵盤(如附錄2,圖2)
在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。
矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。
·蜂鳴器
通過加一個低電壓,大電流,小信號的PNP型硅三極管Q8550來放大電流達到驅動蜂鳴器的作用,蜂鳴器的正極接到Q的集電極C上,蜂鳴器的負極接地,三極管的發(fā)射極E接電源VCC,基極B經(jīng)過限流電阻R9后與單片機P1.3的引腳相連,當單片機P1.3引腳輸出高電平時,三極管截止,沒有電流通過線圈,蜂鳴器不發(fā)聲;當單片機P1.3引腳輸出低電平時,三極管導通,電流形成回路,蜂鳴器發(fā)聲。
·LED1602液晶屏
1602液晶也叫1602字符型液晶它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊它有若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符。每位之間有一個點距的間隔每行之間也有間隔起到了字符間距和行間距的作用,正因為如此所以他不能顯示圖形。引腳定義:
1腳:VSS為電源地;
2腳:VDD接5V電源正極;
LED1602引腳圖
3腳:V0為對比度調整端,接正電源時對比度最弱,接地電源時最高;
4腳:RS為寄存器選擇,高電平時數(shù)據(jù)寄存器、低電平時指令寄存器;
5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作;
6腳:E(或EN)端為使能(enable)端;
7~14腳:D0~D7為8位雙向數(shù)據(jù)端;
15~16腳:空腳或背燈電源;15腳背光正極,16腳背光負極。
二.實驗過程
1.啟動KEIL,使用自己做的含C51芯片的單片機電路板。2.在main.c中編寫主程序代碼
3.選用build target 生成目標,然后編譯連接工程
4.打開STC-ISP-V4.86-NOT-SETUP-CHINESE,選擇com口,將編譯的文件下載到電路板上
5.按鍵操作,顯示,觀察。。
開始初始化While 1NN有鍵盤按下Y再次從新掃描延時一段時間真的有鍵盤按下嗎Y鍵盤掃描處理根據(jù)不同的掃描值賦值于Key根據(jù)Key值做相應程序處理結束
實驗流程圖
四. 實驗總結
隨著電子技術的日益進步,微型計算機取得了突飛猛進的發(fā)展。作為微型計算機的一個重要分支,單片機以其體積小、功能齊全、價格低廉、可靠性高等特殊優(yōu)點,在工業(yè)測控、智能儀表器、機電一體化產(chǎn)品、家電等領域取得了快速的發(fā)展。
通過幾天的實習,深有體會,學習單片機只有對著電腦,反復敲打鍵盤,不斷編寫、修改、做記錄,才能很好了解單片機、學好單片機。相信捉住這條思維,在以后學習中,能給予很大的幫助。幾天下來,在我個人方面,學到的東西還是挺多的。
經(jīng)過一個學期的單片機學習,使我們收獲不少,在這個設計中,也學到了不少東西,從找設計開始,各種元件的選擇,和同學一起分享畫圖,敲程序,學到了制作的過程,對數(shù)字電子鐘也有了一定的認識。十分感謝老師和同學們一學期以來的幫助。這次實驗,不僅學會了電子鐘的制作,也對單片機的知道有了更加深入的了解,對自己幫助非常大,擴展了自己的視野。一.實驗附錄
附錄一(效果圖)
圖一.菜單顯示 圖二.菜單顯示
圖三.菜單顯示 圖四.時間顯示
圖五.A/D轉換顯示 圖四.溫度顯示
附錄二(參考程序):
#include
//延時程序 { uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);} void wr_com(unsigned char com)
//寫命令 { delay1ms(5);EN=0;
//使能端給一個高脈沖,因為初始化函數(shù)中已經(jīng)將lcden置為0 RS=0;
//選擇寫命令模式
RW=0;
//P0=com;
//將要寫的命令送到數(shù)據(jù)總線上
EN=1;
//將使能端置0以完成高脈沖
} void wr_dat(unsigned char dat)
//寫數(shù)據(jù) { delay1ms(5);EN=0;RS=1;RW=0;
P0=dat;EN=1;} void init()
//清屏
{wr_com(0x38);
//設置16*2,顯示5*7點陣,8位數(shù)據(jù)接口
wr_com(0x0C);
//設置開顯示,不顯示光標
wr_com(0x06);
//寫一個符號地址指針自動加一
wr_com(0x01);
//顯示清0,數(shù)據(jù)指針清0} void MoveKey(uchar Num){ lcd_clr();
wirte_str(0,0,Anum[Num]);
wirte_str(1,0,Anum[Num+1]);
lcd_wcmd(0x0f);} void keypress(uchar key)
//顯示
keypress
功能
{ if(key==12)
//下
{ MoveKey(num);
keyboard=num+1;
num--;if(num<0)num=5;delay(10);}
if(key==16)
//上
{
MoveKey(num);
keyboard=num+1;
num++;
if(num>5)num=0;delay(10);}
if(key==11)
//退出
{ lcd_clr();
wirte_str(0,0,“Xu Qifeng”);
wirte_str(1,0,“104827477”);}} void getKey(){ uchar temp,readRow;P2=0xFE;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
readRow=~temp>>4;switch(readRow){case 1:key=10;break;
//enter 進入
case 2:key=11;break;
//esc
退出
case 4:key=12;break;
//下
case 8:key=16;break;
//上
default:break;}
while(temp!=0xf0)
{temp=P2;
temp=temp&0xf0;} delay(10);
keypress(key);} P2=0xFD;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
readRow=~temp>>4;switch(readRow){case 1:{key=14;m++;if(m==10)m=0;};break;//右
case 2:key=3;break;case 4:key=6;break;
case 8:key=9;break;}
while(temp!=0xf0)
{temp=P2;
temp=temp&0xf0;}
delay(10);
keypress(key);} P2=0xFB;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
readRow=~temp>>4;switch(readRow){case 1:{key=13;m--;if(m==0)m=10;};break;//左
case 2:key=2;break;case 4:key=5;break;case 8:key=8;break;}
while(temp!=0xf0)
{temp=P2;
temp=temp&0xf0;}
delay(10);
keypress(key);} P2=0xF7;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{delay(10);
readRow=~temp>>4;switch(readRow){case 1:key=0;break;case 2:key=1;break;case 4:key=4;break;case 8:key=7;break;}
while(temp!=0xf0)
{temp=P2;temp=temp&0xf0;} delay(10);keypress(key);}} voidtime1()interrupt3
//顯示
Time
功能
{ TH1=0xdc;TL1=0x00;
count_10ms++;}
void time1_init(){ TMOD=0x10;TH1=0xdc;TL1=0x00;EA=1;ET1=1;TR1=1} uchar disp_buf[6]={0x00,0x00,0x00,0x00,0x00,0x00};void lcd_dat(uchar h,m,s)
//讀取時間
{disp_buf[0]=h/10+0x30;disp_buf[1]=h%10+0x30;
disp_buf[2]=m/10+0x30;disp_buf[3]=m%10+0x30;
disp_buf[4]=s/10+0x30;disp_buf[5]=s%10+0x30;} void lcd_display()
//顯示時間 { lcd_wcmd(0x44|0x80);lcd_wdat(disp_buf[0]);lcd_wdat(disp_buf[1]);
lcd_wdat(0x3a);lcd_wdat(disp_buf[2]);lcd_wdat(disp_buf[3]);
lcd_wdat(0x3a);lcd_wdat(disp_buf[4]);lcd_wdat(disp_buf[5]);} void Time()
{keyboard=0;
time1_init();
lcd_init();
wirte_str(0,0,“Time”);
while(1)
{ if(count_10ms>=100)
{ count_10ms=0;
sec++;} if(sec>=60)
{sec=0;min++;
if(min>=60)
{ min=0;hour++;
if(hour>=24)
{ hour=0;min=0;sec=0;} } } lcd_dat(hour,min,sec);
lcd_display();
getKey();
if(key==11)break;}}} voidTempture()
//顯示
Temp
功能
{ void display()
{ unsigned long temp;
temp=Temp*100;
disdata[0]=temp/1000+0x30;//十位數(shù)
disdata[1]=temp%1000/100+0x30;// 個位數(shù)
disdata[2]=temp%100/10+0x30;//小數(shù)
disdata[3]=temp%10+0x30;
if(disdata[0]==0x30)
{ disdata[0]=0x20;//如果十位為 0,不顯示
if(disdata[1]==0x30)
//如果十位為 0,個位為 0 也不顯示
{ disdata[1]=0x20;} }
lcd_wcmd(0xc1);
lcd_wdat(disdata[0]);//顯示十位
lcd_wdat(disdata[1]);//顯示個位
lcd_wdat(0x2e);//顯示小數(shù)點
lcd_wdat(disdata[2]);//顯示小數(shù)
lcd_wdat(disdata[3]);} uchar disdata[5];float Temp;
void delayms(uint xms){ uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);}} voidAD_Init()
// 顯示
A/D
功能
{ P1M0=0x0f;
//設置P1口低4位為開漏模式,AD采集
P1M1=0x0f;
P1ASF=0x0f;
//P1口模擬功能控制位,ADC_CONTR=0xe0;
//開啟AD轉換并選擇最高轉換速度
AUXR1=0x00;
//數(shù)據(jù)格式設置
高八位在ADC_RES 低二位在ADC_RESL
delayms(100);} int GetAD(uchar channel)//選擇通道號
并獲取數(shù)據(jù) {uchar AD_finished=0;
int result;
ADC_CONTR|=channel;
//選擇通道號
ADC_CONTR|=0x08;
//啟動AD轉換
while(AD_finished=0)
{ AD_finished=(ADC_CONTR&0x10);//查詢ADC_FLAG是否置1} result=ADC_RES*4+ADC_RESL;ADC_CONTR&=0xef;//清除轉換結束標志
return(result);} float Ad_Av(uchar channel)//對獲取的數(shù)據(jù)進行處理 {float Val_Av=0;
uchar num;
for(num=100;num>0;num--)
{Val_Av+=GetAD(channel);}
Val_Av/=100.0;
Val_Av=Val_Av*5/1024;
return(Val_Av);} void AD()
{ keyboard=0;
AD_Init();
lcd_init();
lcd_wcmd(0x80);//顯示字符
AD
lcd_wdat(0x41);
lcd_wdat(0x44);
while(1)
{delayms(500);
Temp=Ad_Av(0);
//通道0進行數(shù)據(jù)采集
display();getKey();if(key==11)break;}} sbitPwm=P1^0;
//顯示
PWM
功能 uchar n=0,m=0;void delayms(uint xms);void Timer0_init();void PWM(){ keyboard=0;
time1_init();
lcd_init();
lcd_clr();
wirte_str(0,0,“PWM”);
while(1)
{ if(count_10ms>=10){ count_10ms=0;
if(n<=m)
Pwm=1;
else
Pwm=0;
n++;
if(n==10)n=0;}
getKey();
if(key==11)break;}} voidElse()
{lcd_clr();wirte_str(0,0,“That's all”);wirte_str(1,0,“Thank you”);delay(100);keyboard=0;} void main()
{ lcd_init();
wirte_str(0,0,“Xu Qifeng”);
wirte_str(1,0,“104827277”);
while(1)
{getKey();
if(key==10)
//enter
{switch(keyboard)
{ case 1:Time()break;
case 2:Tempture();break;
case 3:AD();break;
case 4:PWM();break;
case 5:Else();break;
default:break;}}}
//顯示
Else 功能
//主函數(shù)
第五篇:基于C51單片機的交通燈控制系統(tǒng)
基于C51單片機的交通燈控制系統(tǒng)
1、實驗方案論證:
進行十字路口的交通信號燈控制電路設計,畫出電路原理圖及實驗電路圖,進行軟件編程、以及使用說明文檔的建立等一整套工作任務。進行十字路口的交通信號燈控制程序設計,提交一個符合上述功能要求的十字路口的交通信號燈控制系統(tǒng)設計。
2、控制流程分析:
對設計要求進行分析后可得出以下交通工作狀態(tài)表:
3、硬件設計概要:
根據(jù)設計要求,可用6個LED燈分別模擬東西、南北的交通燈。具體接法如下: AT89C51的P1口接LED燈,P1.0、P1.1、P1.2分別接東西方向紅、綠、黃交通燈,P1.3、P1.4、P1.5分別接南北方向的紅、綠、黃交通燈。P1口和LED燈之間要接限流保護電阻。兩位數(shù)碼管段選接P2口,位選接P0口低兩位,P0口低兩位接上拉電阻使其可以輸出高電平。緊急情況按鈕一端接地,另一端與外中斷1引腳相連;恢復正常按鈕一端接地,另一端與外中斷0引腳相連。
三、原理圖設計
1、LED顯示部分電路設計:
把單片機AT89C51的P1口作為紅黃綠燈顯示部分,用6個LED燈分別模擬東西、南北的交通燈。P1.0、P1.1、P1.2各通過一個300Ω的限流保護電阻接東西方向的紅、綠、黃LED燈;P1.3、P1.4、P1.5各通過一個300Ω的限流保護電阻接南北方向的紅、綠、黃LED燈。LED燈的一端接電源,另一端經(jīng)電阻接P1口,因此當P1口引腳輸出低電平時LED燈發(fā)光,即此方案采取低電平驅動方式。具體電路如下:
2、緊急情況處理電路設計:
緊急情況按鈕一端接地,另一端與外中斷1引腳相連;恢復正常按鈕一端接地,另一端與外中斷0引腳相連。在程序設計時,我會將其設置為下降沿觸發(fā)方式。具體電路如下:
3、數(shù)字顯示電路設計: 選用共陰極兩位數(shù)碼管。兩位數(shù)碼管A~G引腳各通過一個300Ω的限流保護電阻分別接P2.0~P2.6,位選1引腳和2引腳分別接P0.0口低兩位,P0口低兩位接5kΩ的上拉電阻使其可以輸出高電平。
4、其他部分電路:
XTAL1端和XTAL2端之間接一個12M Hz的晶振,再各接一個30pF的普通電容后接地;RST復位端一端經(jīng)10uF的電解電容接+5V電源,一端經(jīng)一個10K的電阻接地。具體電路如下:
4、系統(tǒng)電路總圖:
四、程序設計:
1、定時器初值的計算:
由于要求定時時間相當精確,我用定時器T0進行定時。根據(jù)公式可知若已知要求的定時時間為t,則定時器的初值為x(其中fosc=12M Hz)
: 需要定時器的定時時間為50ms,根據(jù)公式計算得出X=15536,因此定時器初值的低位TL0=(0B0H),高位TH0=(3CH)。
2、程序流程圖: 2.1主程序流程
主程序主要是對單片機進行初始化。初始化首先要開放總中斷、定時器T0中斷以及外部中斷0和外部中斷1。其次是設置中斷優(yōu)先級,把外中斷0設置為高優(yōu)先級,外中斷1設置為低優(yōu)先級。再次是給定時器T0裝頂初值,然后后是啟動定時器,是使定時器開始定時。最后是等待中斷。
2.2緊急情況中斷處理流程
緊急情況中斷處理包括兩部分,第一部分是出現(xiàn)緊急情況可以手動使東西、南北方向紅燈全亮,而且直到緊急狀況解除后才能恢復正常通車。這就要求緊急狀況解除前不能退出外中斷1處理程序,因此要在外中斷1處理程序處設置一無限循環(huán)。第二部分是緊急狀況解除。為了使外中斷1處理程序退出無限循環(huán),可用中斷嵌套使機器轉去執(zhí)行外中斷0處理程序,而外中斷0處理程序修改了寄存器R2的值,中斷返回后由于寄存器R2的值的改變使外中斷1處理程序跳循環(huán)。2.2.1外中斷1處理程序(低優(yōu)先級)2.2.2外中斷0處理程序(高優(yōu)先級)
1.3定時器中斷處理流程
Y Y
3、程序源代碼: ORG 0000H AJMP START ORG 0003H;外中斷0入口 AJMP SERV0 ORG 000BH AJMP SERV1 ORG 0013H AJMP SERV2 ORG 0030H START:MOV IE,#87H MOV IP,#01H MOV TMOD,#01H MOV TCON,#05H MOV TH0,#3CH MOV TL0,#0B0H MOV DPTR,#TAB MOV P1,#0F6H MOV R0,#20 MOV R5,#00H MOV R6,#00H SETB TR0 LOOP1:MOV P0,#02H MOV A,R6 MOVC A,@A+DPTR MOV P2,A ACALL D10MS MOV P0,#01H MOV A,R5 MOVC A,@A+DPTR MOV P2,A ACALL D10MS AJMP LOOP1;外中斷1入口;定時器中斷入口 設置中斷優(yōu)先級;裝定時器初值;裝表首地址;啟動定時器;循環(huán)動態(tài)顯示,由10秒開始倒計時
SERV0:MOV R2,#0FFH;正常狀態(tài)恢復程序,使R0的值不為0 RETI SERV1:DJNZ R0,NEXT;未到1秒,則轉到NEXT CJNE R5,#01,DHE0 AJMP DHE3 DHE0: CJNE R5,#00H,DHE1 CJNE R6,#00H,DHE2 MOV R5,#00H MOV R6,#01H MOV P1,#0F5H AJMP OUT0 DHE1: DEC R5 AJMP OUT0 DHE2: MOV R6,#00H MOV R5,#09H OUT0: MOV R0,#20 RETI DHE3: MOV P0,#00H MOV P2,#3FH MOV A,P1 MOV R1,#05H JNB ACC.0,CHE0 YELL0:SETB P1.0 SETB P1.1 CLR P1.2 ACALL DMS SETB P1.2 ACALL DMS DJNZ R1,YELL0 MOV P1,#0EEH SJMP NEXT1 CHE0: JNB ACC.3,CHE1 YELL1:SETB P1.3 SETB P1.4 CLR P1.5;減1秒;顯示為0;東西方向紅燈亮,則轉到CHE0;東西方向綠燈滅;東西方向黃燈閃爍5次;東西方向紅燈亮,南北方向綠燈亮;南北方向綠燈滅 ACALL DMS SETB P1.5 ACALL DMS DJNZ R1,YELL1;南北方向黃燈閃爍5次 CHE1: MOV P1,#0F5H;南北方向紅燈亮,東西方向綠燈亮 NEXT1:MOV R0,#20 MOV R5,#00H MOV R6,#01H;重置顯示為10秒 NEXT: MOV TH0,#3CH;重裝定時器初值 MOV TL0,#0B0H RETI SERV2:MOV P0,#00H MOV P2,#3FH;顯示為0 MOV R5,#00H MOV R6,#00H MOV R2,#00H;緊急狀況服務程序,使R2的值為0 MOV P1,#0F6H LOOP3:CJNE R2,#00H,OUT1;R2的值為0,則無限循環(huán),直到執(zhí)行SERV0狀 MOV R3,#02H;態(tài)恢復程序,使R0的值不為0才返回 DJNZ R3,LOOP3 OUT1: RETI DMS: MOV 32H,#4;延時子程序,延時0.4秒 DL0: MOV 31H,#200 DL1: MOV 30H,#250 DL2: DJNZ 30H,DL2 DJNZ 31H,DL1 DJNZ 32H,DL0 RET D10MS:MOV 33H,#50;延時子程序,延時10毫秒 DL3: MOV 34H,#100 DL4: DJNZ 34H,DL4 DJNZ 33H,DL3 RET TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
五、仿真結果與分析
在PROTEUS軟件仿真中的結果如下:
1、初始狀態(tài)
2、東西路口的綠燈亮,南北路口的紅燈亮
3、東西路口綠燈滅,黃燈閃爍
4、東西路口紅燈亮,南北路口的綠燈亮
5、南北路口綠燈滅,黃燈閃爍
由以上仿真結果可以看出,電路圖和源程序設計完全滿足設計要求。
六、課程設計總結與體會
通過這次課程設計我鞏固和加深課堂所學知識;掌握一般軟硬件的設計方法和查詢、運用資料的能力;掌握通過定時器進行定時的基本方法、中斷控制的原理和方法以及LED控制的方法。
這次課程設計,我將課本上的理論知識和實際的應用有機的結合起來,提高分析和解決問題的實際能力,通過對匯編語言程序代碼的設計、編寫、修改以提高自己實際編程能力。
總的來說,這次課程設計的難度不算大,整個設計、調試任務都有我獨立完成。而在PROTEUS軟件仿真中的結果可以看到我的設計完全符合要求。在設計過程中我還認識到,遇到問題時應回到書本,查找實際問題所需的理論知識,將理論和實際結合起來。這樣,在解決問題的同時還能提高我對理論知識的理解。