蘇州永節(jié)電子科技有限公司
設為首頁 | 收藏本站
新聞詳情

單片機開發(fā)制作流程

瀏覽數(shù):1
  •                        基于STC89C52RD單片機系統(tǒng)實驗板的制作與程序設計?

  • 第1節(jié)?引?言?

  • ????單片微型計算機簡稱單片機,又稱微控制器(MCU),它的出現(xiàn)是計算機發(fā)展史

  • 上的一個重要的里程碑,它以體積小、功能全、性價比高等諸多優(yōu)點獨具特色,在工業(yè)控制、尖端武器、通信設備、信息處理、家用電器等嵌入式應用領域中獨占鰲頭。本次課設采用的STC89C51單片機是51系列單片機的一種代表,目前51系列單片機是國內(nèi)目前應用最廣泛的一種單片機之一。單片機以其系統(tǒng)硬件構架完整、價格低廉、學生能動手等特點,成為工科學生硬件設計的基礎課。?

  • 1.1?本設計任務和主要內(nèi)容?

  • ??本設計以單片機STC89C52RD為控制核心,由八路LED模塊、八路按鈕模塊、四位一體共陽數(shù)顯模塊、語音模塊等部分組成。可實現(xiàn)花樣流水燈、簡易電子琴、外部中斷控制、時間顯示等功能。要求在將硬件電路準確無誤地安裝后進行軟件調(diào)試,至少完成以下三個程序設計及調(diào)試任務?

  • 1?.1.1花樣流水燈:程序循環(huán)輸出到單片機P1口,從左到右依次點亮,每次增加一個,直至全亮;從左到右依次暗滅,每次減少一個,直至全滅;從右向左依次點亮,每次亮一個;從左到右依次點亮,每次亮一個;8個發(fā)光二極管閃爍三次;兩個二極管前后追逐循環(huán)三次;兩個按鍵控制,K1按下停止循環(huán),K2按下繼續(xù)循環(huán)。?1.1.2.簡易時鐘電路:采用動態(tài)掃描技術,四位數(shù)顯實現(xiàn)數(shù)字時鐘,要求顯示時、分,K0調(diào)時、K1調(diào)分;整點報時。?

  • 1.1.3??8*8點陣屏顯示程序設計:動態(tài)輪流顯示數(shù)字0-9,字母A-Z???

  • 1.2?基于89C51單片機系統(tǒng)實驗板概述?

  • 本次課設所使用的單片機最小系統(tǒng)板包括以下器件:電源端子(DC?+5V),可以USB供電,也可獨立電源供電。通用異步串口,采用MAX232做電平轉(zhuǎn)換。STC89C51單片機。各種顏色的LED發(fā)光二極管共9個,其中8個接于P1口做LED顯示,還有一個做電源燈顯示。四位一體共陽數(shù)碼管可以實現(xiàn)時鐘電路及動態(tài)掃描顯示。還有其他電阻電容若干,系統(tǒng)板一個,大按鍵開關兩個,用于中斷控制和通信開關。


  •     利用STC51系列特有的ISP在線編程,方便我們初學者的二次開發(fā),省去大量芯片燒寫時間。USB電源線供電和外接供電并存,方便學生在寢室使用.板上提供ISP?接口并將單片機的全部I/O?引腳引出。51開發(fā)板使用ISP?在線下載技術,?直接把程序?qū)懙絾纹瑱C中,使用當前最流行的KEILC51?軟件,用戶無需再購買任何仿真器或編程器等開發(fā)工具,只要有一臺計算機,就可以實踐學習單片機方面的知識;同時引出的單片機的32個I/O口可全部用于擴展,用戶可把自己設計的電路通過這32?個I/O口與單片機連接,方便用戶開發(fā)自己的產(chǎn)品,最大限度的為用戶節(jié)約學習成本和加快學習速度。?

  • 1.2.1?STC89C52RD單片機開發(fā)板硬件配置情況?1)STC89C52RD?2)MAX232?3)8個LED燈?4)8個按鍵?5)4位8段數(shù)碼管?6)蜂鳴器?7)11.0592M晶振?

  • 1.2.2、STC89C52RD單片機實驗板配套實驗?1)51開發(fā)板預燒程序?2)8*8點陣?3)RS232串口?4)按鍵查詢?5)按鍵中斷?6)蜂鳴器?7)蜂鳴器音樂?8)花樣燈?9)流水燈?10)跑馬燈?11)數(shù)碼管?


  • 第2節(jié)???系統(tǒng)主要硬件電路設計?

  • 2.1?STC89C52RD單片機簡介?

  • MCS-51是美國Intel公司生產(chǎn)的一系列單片機的總稱,包括多個品種,如8031、8051、8751、8032、80C52、8752等。其中8051是最典型的產(chǎn)品,其他單片機都是在其基礎上進行功能增減而來的,所以人們習慣于用8051來稱呼MCS-51系列單片機。Intel公司將MCS-51的核心技術授權給了多家公司,這些廠家生產(chǎn)的單片機在功能上或多或少有些改變,以滿足不同的需求,其中美國的ATMEL公司生產(chǎn)的AT89C51是曾經(jīng)在我國非常流行的51單片機。當前AT89C51/52已經(jīng)停產(chǎn),其替代產(chǎn)品為AT89S51/52。深圳宏晶公司出品的STC89C51可以直接代替?zhèn)鹘y(tǒng)的AT89S51和AT89C51芯片,也可以代替菲利普、華幫等其他公司的89C51,由于時代的發(fā)展,工藝的進步,STC89C51功能更強,壽命更長(4K字節(jié)Flash存儲器、128字節(jié)片內(nèi)RAM、支持ISP下載編程)?

  • 圖2.1?STC89c51單片機?

  • 單片機的時鐘信號用來提供單片機片內(nèi)各種微操作的時間基準,時鐘信號通常用兩種電路形式得到:內(nèi)部振蕩和外部振蕩。MCS-51單片機內(nèi)部有一個用于構成振蕩器的高增益反向放大器,引腳XTALl和XTAL2分別是此放大電器的輸入端和輸出端,由于采用內(nèi)部方式時,電路簡單,所得的時鐘信號比較穩(wěn)定,實際使用中常采用這種方式,如圖2-2所示在其外接晶體振蕩器(簡稱晶振)或陶瓷諧振器就構成了內(nèi)部振蕩方式,片內(nèi)高增益反向放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起可構成一個自激振蕩器并產(chǎn)生振蕩時鐘脈沖。?

  • 圖2-2中外接晶體以及電容C2和C1構成并聯(lián)諧振電路,它們起穩(wěn)定振蕩頻率、快速起振的作用,其值均為30P左右,晶振頻率選11.0592MHz。?

  • 為了初始化單片機內(nèi)部的某些特殊功能寄存器,必須采用復位的方式,復位后


  •            

  •        

  •            

  •                

  •            

  •                

  •            

  •                 可使CPU及系統(tǒng)各部件處于確定的初始狀態(tài),并從初始狀態(tài)開始正常工作。單片機的復位是靠外電路來實現(xiàn)的,在正常運行情況下,只要RST引腳上出現(xiàn)兩個機器周期時間以上的高電平,即可引起系統(tǒng)復位,但如果RST引腳上持續(xù)為高電平,單片機就處于循環(huán)復位狀態(tài)。復位后系統(tǒng)將輸入/輸出(1/0)端口寄存器置為FFH,堆棧指針SP置為07H,?SBUF內(nèi)置為不定值,其余的寄存器全部清0,內(nèi)部RAM的狀態(tài)不受復位的影響,在系統(tǒng)上電時RAM的內(nèi)容是不定的。復位操作有兩種情況,即上電復位和手動(開關)復位。本系統(tǒng)采用上電復位方式。圖2-2中R9和Cl組成上電復位電路,其值R取為10K,?C取為10μF.??

  • 圖2.2?最小系統(tǒng)結(jié)構圖?

  • 2.2電源轉(zhuǎn)換芯片MAX232?

  • Max232產(chǎn)品是由德州儀器公司(TI)推出的一款兼容RS232標準的芯片。該器件包含2驅(qū)動器、2接收器和一個電壓發(fā)生器電路提供TIA/EIA-232-F電平。?


  •            

  •        

  •            

  •                

  •            

  •                 ????該器件符合TIA/EIA-232-F標準,每一個接收器將TIA/EIA-232-F電平轉(zhuǎn)換成5-V?TTL/CMOS電平。每一個發(fā)送器將TTL/CMOS電平轉(zhuǎn)換成TIA/EIA-232-F電平。下圖為MX232雙串口的連接圖,可以分別接單片機的串行通信口或者實驗板的其它串行通信接口:?

  • 圖2.3?max232電平轉(zhuǎn)換電路?

  • 2.3?四位一體共陽LED數(shù)顯?

  • 8?段數(shù)碼管屬于LED?發(fā)光器件的一種,分為8?段:A、B、C、D、E、F、G、DP,其中DP?是小數(shù)點位,還包括一個公共端COM?端。從電氣上,8?段數(shù)碼管又分為共陰和共陽兩種。共陰指數(shù)碼管的公共端接負極,而各段接正極;共陽則正好相反。如果有多個數(shù)碼管,它們的各段輸入一般都分別接在一起,公共端分開。開發(fā)板上采用的是4位一體的共陽數(shù)碼管。數(shù)碼管顯示方法可分為靜態(tài)顯示和動態(tài)顯示兩種。靜態(tài)顯示就是每個數(shù)碼管的8?段輸入各自分開,其COM?口電平一直有效。它的優(yōu)點是控制方便,顯示穩(wěn)定,但要占用較多的I/O口。動態(tài)顯示的原理是,各個數(shù)碼管的段輸入相應位接在一起,共同占用8?位數(shù)據(jù)線;公共端分開,利用掃描和人視覺上的短暫停留性,依次給出各個數(shù)碼管COM?端使能信號,并同時給出各數(shù)碼管的數(shù)據(jù)。它的優(yōu)點是占用I/O?口少,但控制較靜態(tài)顯示復雜。一般在數(shù)碼管較多的情況下都采用動態(tài)顯示。本實驗板使用的是4位一體的共陽數(shù)碼管,共12腳,其中8腳公用是8段顯示,另4腳是對應于4個數(shù)碼管。

  •            

  •                

  •            

  •                 ?


  •            

  •        

  •            

  •                

  •            

  •                

  •            

  •                 ?

  • 圖2.4四位一體共陽數(shù)顯電路?

  • 2.4?LED?燈電路?

  • 一般發(fā)光二極管的工作電流是十幾毫安至幾十毫安,正向壓降為1.3V-2.5V。有一些低電流的發(fā)光二極管的工作電流可以降至2MA,而亮度與正常發(fā)光二極相同,當然價格會高一些。所有發(fā)光二極管在電路中一般都要串一個電阻用來限流。發(fā)光二極管的電流不同,亮度也不同,并且壽命也會受到影響,這個電流通常就是由接入的電阻來調(diào)整。?

  • ??51開發(fā)板的發(fā)光二極管串聯(lián)了一個1kΩ的電阻后接在5V?的電壓上。LED?燈電路接在單片機的P1口上。LED燈的陽極接電源,陰級接單片機的I/0?口,因此是低電平驅(qū)動,只要單片機在相應引腳給出低電平,LED?就會發(fā)光。?


  •            

  •        

  •            

  •                

  •            

  •                 2.5?按鍵電路?

  • 實驗板按鍵電路如下圖,通過電阻接電源正級,并將按鍵所接的單片機的I/O口作為輸出端。這樣,當按鍵沒有按下時,所有的I/O輸出端都是高電平,代表無鍵按下;當按鍵按下時,I/O口輸出就變成低電平。由于按鍵屬于機械開關,按動過程不可避免存在抖動的現(xiàn)象。因此必須去抖動才能避免誤判斷。可以在程序中采用軟件延時的辦法,即每次檢測到有鍵按下時延時20ms?再判斷是否按鍵還是處于按下狀態(tài),是則表示確實有鍵按下,不是則表示是按鍵誤動作。用戶按下按鍵的時間可以稍微長一點。?2.6蜂鳴器?

  • 蜂鳴器俗稱喇叭,是廣泛應用于各種電子產(chǎn)品的一種元器件,它用于提示、報警、音樂等許多應用場合。蜂鳴器與家用電器上面的喇叭在用法上也有相似的地方,通常工作電流比較大,電路上的TTL?電平基本上驅(qū)動不了蜂鳴器,需要增加一個電流放大的電路才可以,這一點與家用電器中的功放有相似之處。蜂鳴器使用很方便,電流通過時蜂鳴器就發(fā)出響聲,只要將蜂鳴器與單片機相連的I/O?口置為低電平,就可以驅(qū)動蜂鳴器發(fā)聲.?2.7?8*8點陣?

  • 根據(jù)LED漢字顯示主要內(nèi)容:點陣顯示原理與應用?LED?點陣顯示屏廣泛應用與汽車報站器,廣告屏等。8×8?LED?點陣是最基本的點陣顯示模塊,?理解?8×8?LED?點陣的工作原理就可以基本掌握?LED?點陣顯示技術。8×8?點陣共需要?64?個發(fā)光二極管組成,且每個發(fā)光二極?管是放置在行線和列線的交叉點上,?當對應的某一列置?1?電平,?某一行置?0?電平,?則相應的二極管就亮;要實現(xiàn)顯示圖形或字體,只需考慮其顯示方式。通過編程控制各顯示點對應?LED?陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。這樣,就可以通過SPCE061A編寫程序顯示要求的漢字。如圖所示:?


  •            

  •        

  •            

  •                

  •            

  •                

  •            

  •                 ?

  • 圖2.5?8*8?點陣電路?

  • ??????????第3節(jié)??實驗系統(tǒng)軟件設計?

  • 3.1?花樣流水燈程序設計:?

  • 序循環(huán)輸出到單片機P1口,從左到右依次點亮,每次增加一個,直至全亮;從左到右依次暗滅,每次減少一個,直至全滅;從右向左依次點亮,每次亮一個;從左到右依次點亮,每次亮一個;8個發(fā)光二極管閃爍三次;兩個二極管前后追逐循環(huán)三次;兩個按鍵控制,K1按下停止循環(huán),K2按下繼續(xù)循環(huán)。????????3.1??流水燈實驗程序??

  • #?include?"reg51.h"?//?包含頭文件?#define?uchar?unsigned?char?

  • void?delay02s(void)?//?延時0.2s子程序?{?

  • unsigned?char?i,j,k;?for?(?i=2;i>0;i--?)?for?(j=200;j>0;j--?)?for?(k=250;k>0;k--?);?}?

  • void?main?(void)?{uchar?i,j;?


  •                 while?(1)?//?死循環(huán)?{?

  • j=0x01;?//?j初始化為0x01,左移初始值?for(i=0;i?{?

  • P1=?~?j;?//?對變量j?中的值按位取反后,從P1口輸出?delay02s(?);?//?延時0.2s?j=?j?}?

  • j=0x80;?//?設置右移初始值j為0x80?for?(i=0;i?{?P1=?~?j;?delay02s(?);?

  • j=?j>>1;?//?右移1位?}?}?}?

  • ????????????3.2.簡易時鐘程序設計:?

  • 四位數(shù)顯實現(xiàn)數(shù)字時鐘,要求顯示時、分,K0調(diào)時、K1調(diào)分;整點報時??

  • #include<reg52.h>??

  • #define?uint?unsigned?int?#define?uchar?unsigned?char??

  • uchar?code?table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};?sbit?d1=P1^0;//定義d1?sbit?d2=P1^7;//定義d1?sbit?key1=P3^2;//按鍵定義?sbit?key2=P3^3;?sbit?key3=P3^4;?sbit?key4=P3^5;?sbit?LED1=P2^3;?sbit?LED2=P2^2;?sbit?LED3=P2^1;?sbit?LED4=P2^0;???

  • uchar?temp,aa,miaos,miaog,qian,bai,shi,ge,fen,sh,bb,mh;?void?display(uchar?qian,uchar?bai,uchar?shi,?char?ge);??

  • void?delay(uint?z)?//uint?z?傳遞的是延時毫秒的數(shù),比如延時10毫秒則為10?{??????????uint?x,y;??

  • ????????for(x=z;x>0;x--)?//這個循環(huán)是毫秒數(shù)??

  • ????????for(y=110;y>0;y--);//這個循環(huán)是1毫秒循環(huán)次數(shù)?}??void?int();?void?main()?{??????????

  • ????????int();//初始化子程序?????????mh=1;?????????

  •               while(1)?????????{??????????


  •      

  •                 ????????????if(key1==0)?????????????????{??delay(200);//延時200ms避開抖動時期?????????????????????????while(key1==0);//等待按鍵釋放?????????????????????????fen++;?????????????????????????if(fen==59)?????????????????????????{??fen=0;?????????????????????????}?????????????????}??if(key2==0)?????????????????{??

  • ????????????????????????delay(200);?????????????????????????while(key2==0);?????????????if(fen!=0)?????????????????????????{??

  • ????????????????????????????????fen--;?????????????????????????}??????????????????????????if(fen==0)????????????????????????

  • {?????????????????????fen=59;?????????????????????????}?????????????????}??

  • ????????????????if(key3==0)?????????????????{??

  • ????????????????????????delay(200);?????????????????????????while(key3==0);?????????????sh++;?????????????????????????if(sh==23)?????????????????????????{??????????????????????????????????

  • sh=0;?????????????????????????}?????????????????}??????????????????if(key4==0)?????????????????{??

  • ????????????????????????delay(200);?????????????????????????while(key4==0);?????????????if(sh!=0)?????????????????????????{??

  • ????????????????????????????????sh--;?????????????????????????}??????????????????????????if(sh==0)?????????????????????????{??????????????????????????????????sh=23;?????????????????????????}???????????????????}??

  • ????????????????if(aa==20)?????????????????{??

  • ????????????????????????bb++;?????????????????????????aa=0;??????????????????????????miaog=bb%10;?????????????????????????miaos=bb/10%6;?????????????????????????mh=~mh;???

  • ????????????????}??

  • ????????????????if(bb==60)?????????????????{??


  •                 ????????????????????????fen++;?????????????????????????bb=0;?????????????????}??

  • ????????????????ge=fen%10;?????????????????shi=fen/10%6;?????????????????if(fen==60)??

  • ????????????????{????????sh++;?????????????????????????fen=0;?????????????????????????fen=0;???

  • ????????????????}??

  • ????????????????bai=sh%10;?????????????????qian=sh/10;?????????????????if(bai==10)?????????????????bai=0;?????????????????if(qian==2)?????????????????{??

  • ????????????????????????if(bai==4)?????????????????????????????????????????qian=0;?????????????????????????????????

  • bai=0;?????????????????????????}?????????????????}??????????????????if(sh==24)?????????????????

  • {?????????????????????????????????sh=0;?????????????????}??????????????????display(qian,bai,shi,ge);?????????}?}?????void?display(uchar?qian,uchar?bai,uchar?shi,?uchar?ge)?{??????????LED1=1;??

  • ????????P0=table[qian];?????????LED1=0;?????????delay(1);?????????LED1=1;????????????????3.3?8*8

  • 點陣屏顯示程序設計:?

  • #include??"reg51.h"?

  • void?delay(unsigned?int?i);????void?main()?????????{?

  • unsigned?char?code?led[]={0x00,0xc3,0xff,0xff,0x7e,0x3c,0x18,0x00};??

  • ???unsigned?char?w;???????????????????????????unsigned?int?i;??????while(1)???{?

  • ??????????????w=0x01;???????????????????for(i=0;i<8;i++)?


  •        

  •                 ??????????????{??

  • ???????????????P1=w;???????????????????????????P0=~led[i];??????????????????????delay(100);??

  • ???????????????w<<=1;??????????????????????}??????}?}??

  • void?????delay(unsigned?int?i)??????{?

  • ??unsigned?int?k;?for(k=0;k<i;k++);?}?

  • ????????????參考文獻?

  • [1]?張偉,《單片機原理及應用》,機械工業(yè)出版社,2005?[2]?張鑫,《單片機原理及應用》,電子工業(yè)出版社,2005?[3]?曹國清,《數(shù)學電路與邏輯設計》,中國礦業(yè)大學出版社,2004?[4]?任致程,《經(jīng)典集成電路400例》,機械工業(yè)出版社,2002?[5]?薛棟梁,《單片機原理及應用》,中國水利水電出版社,2001?

  • [6]?吳金戎,沈慶陽等,《8051單片機實踐與應用》,清華大學出版社,2001?

  • [7]?謝筑森,張輝等,《單片機開發(fā)與典型應用設計》,中國科學技術大學出版社,1997?

  • 附錄