版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、什么是單片機?◆單片機在一片集成電路芯片上集成微處理器、存儲器、I/O接口電路,從而構(gòu)成了單芯片微型計算機,即單片機。第一部分:單片機基礎(chǔ)
2、單片機能做什么凡是與控制或簡單計算有關(guān)的電子設(shè)備都可以用單片機來實現(xiàn),再根據(jù)具體實際情況選擇不同性能的單片機,如:atmel,stc,pic,avr,凌陽,80C51,arm等工業(yè)自動化:數(shù)據(jù)采集、測控技術(shù)。智能儀器儀表:數(shù)字示波器、數(shù)字信號源、數(shù)字萬用表、感應(yīng)電流表等。消費類電子產(chǎn)品:電冰箱、空調(diào)機、電視機、微波爐、手機、IC卡、汽車電子設(shè)備等。通訊方面:調(diào)制解調(diào)器、程控交換技術(shù)、手機、小靈通等。武器裝備:飛機、軍艦、坦克、導彈、航天飛機、魚雷制導、智能武器等。等等…..第二部分單片機C語言入門1、C51簡介C語言是一種編譯型程序設(shè)計語言,它兼顧了多種高級語言的特點,并具備匯編語言的功能。目前,使用C語言進行程序設(shè)計已經(jīng)成為軟件開發(fā)的一個主流。用C語言開發(fā)系統(tǒng)可以大大縮短開發(fā)周期,明顯增強程序的可讀性,便于改進、擴充和移植。而針對8051的C語言日趨成熟,成為了專業(yè)化的實用高級語言。
C語言作為一種非常方便的語言而得到廣泛的支持,很多硬件開發(fā)都用C語言編程,如:各種單片機、DSP、ARM等.C語言程序本身不依賴于機器硬件系統(tǒng),基本上不作修改就可將程序從不同的單片機中移植過來。
C提供了很多數(shù)學函數(shù)并支持浮點運算,開發(fā)效率高,故可縮短開發(fā)時間,增加程序可讀性和可維護性。
C-51的特點2、單片機C程序設(shè)計的一般格式幾個基本概念(1)函數(shù):C語言程序由一個主函數(shù)和若干個其它函數(shù)構(gòu)成,程序中由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)之間也可以相互調(diào)用。(2)指針與指針變量:若定義變量x,&x即為x的指針,指針變量是指針的指針,若xp=&x,利用*xp即可訪問變量x。(3)#include(包含處理命令):把一個源文件將另外一個源文件的全部內(nèi)容包含進來,或者說把一個外部文件包含到本文件之中。(4)#define(宏定義):在C程序中,可以指定一標志符去定義一個常量或字符串。單片機C程序的基本結(jié)構(gòu)(1)主函數(shù)名必須為main()。C程序通過函數(shù)調(diào)用去執(zhí)行指定的工作。(2)一個函數(shù)由說明部分和函數(shù)體兩部分組成。函數(shù)說明部分是對函數(shù)名、函數(shù)類型、形參名和形參類型等所做的說明。(3)C程序的執(zhí)行總是從main()函數(shù)開始,而對該函數(shù)的位置無特殊規(guī)定。(4)在源程序文件需要包含其它源程序文件時,應(yīng)在本程序文件頭部用包含命令#include處理。(5)C程序中的一個函數(shù)需要調(diào)用另一個子函數(shù)時,另一個函數(shù)應(yīng)寫在前面,否則應(yīng)聲明。(6)C程序書寫格式自由,一行可寫一個語句或幾個語句。每個語句結(jié)尾用;結(jié)束。3、單片機C程序的數(shù)據(jù)類型常量和符號常量例:#definePARL3.14159(PARL即為符號常量)(1)整型常量,如11,o11,0xff等。(2)實型常量,如0.12,1.55e5等。(3)字符常量,如‘a(chǎn)’、‘A’等。(4)字符串常量,如“a”、“CHINA”等。變量(1)位變量:bit和sbit(2)字符變量:singedchar和unsignedchar(3)整型變量:singedint和unsignedint(4)長整型變量:unsignedlong和signedlong4、單片機C程序的運算符和表達式(3)實型變量:float和double(4)寄存器變量:sfr和sfr16(1)算術(shù)運算符13個:+、-、*、/、%、=、+=、-=、*=、/=、%=、++、--(2)關(guān)系運算符6個:>、<、==、>=、<=、!=(3)邏輯運算符3個:&&、||、?。?)位操作運算符7個:>>、<<、|、&(相與)、^、~、&(變量取地址)(5)指針運算符:*5、單片機C程序的一般語法結(jié)構(gòu)順序結(jié)構(gòu)例:main(){P0=0xff;P2=0x30;P1=0xff;P3=0xff;scan();test();}分支結(jié)構(gòu)(1)單分支結(jié)構(gòu)形式:if(條件表達式){執(zhí)行語句;}例:(2)雙分支結(jié)構(gòu):形式:if(條件表達式){語句1;}else{語句2;}例:(3)由雙分支結(jié)構(gòu)變化而成的多分支結(jié)構(gòu)形式:
if(表達式1)語句1;
elseif(表達式2)語句2;.
.elseif(表達式n)語句n;else語句n+1;例:(4)switch…case多分支轉(zhuǎn)移結(jié)構(gòu)語句形式:
switch(條件表達式)
{case常量表達式1:{語句1;break;}case常量表達式2:{語句2;break;}.
..case常量表達式n:{語句n;break;}default:{語句n+1;break;}}例:循環(huán)結(jié)構(gòu)(1)while(表達式){循環(huán)體語句;}例:voiddelay(unsignedchartimes){unsignedcharI;i=250;while(--times){while(--i);}}(2)do{循環(huán)體語句;}while(表達式);(3)for(表達式1;表達式2;表達式3){循環(huán)體語句;}例:6、C51區(qū)別于標準C語言的特點(1)使用文件包含命令#include應(yīng)注意對應(yīng)頭文件的名稱,要與規(guī)定名稱相符。(2)單片機中,一個變量可放在片內(nèi)存儲單元,也可放在片外存儲單元,放在片內(nèi)存儲單元還要區(qū)分是否可位尋址,或放在間接尋址區(qū)。例:intdatax,y;//表示整型變量指定在片內(nèi)數(shù)據(jù)存儲區(qū)
charxdatam,n;//表示字符變量指定在片外數(shù)據(jù)存儲區(qū)C51存儲類型存儲類型尋址空間數(shù)據(jù)長度值域范圍data片內(nèi)直接尋址RAM800H~7FHidata片內(nèi)間接尋址RAM880H~FFHpdata分頁尋址片外RAM800H~FFH存儲類型尋址空間數(shù)據(jù)長度值域范圍xdata片外數(shù)據(jù)存儲(64K)160000H~FFFFHcode片內(nèi)統(tǒng)一編址ROM(64K)160000H~FFFFHbdata片內(nèi)可位尋址的RAM(16byet)120H~2FH(3)21個SFR只能直接尋址,一般在頭文件中用字節(jié)定義方式定義。如:sfrTMOD=0x89;
(4)C51編譯器編譯源程序時,數(shù)據(jù)類型和存儲類型都可預先定義,但數(shù)據(jù)具體放在哪一個單元不由用戶指定。(5)單片機C程序的中斷程序與匯編語言程序不同,中斷過程通過使用interrupt關(guān)鍵字和中斷號(0~31)來實現(xiàn)。中斷號告訴編譯器中斷程序的入口地址。單片機中斷源與C中斷程序中中斷號對照表C中的中斷號對應(yīng)單片機中的中斷源C中的中斷號對應(yīng)單片機中的中斷源0外部中斷03定時器1中斷1定時器0中斷4串行口中斷2外部中斷15定時器2中斷一個定時器0中斷程序編寫格式如下:Voidtimer0(void)interrupt1{TR0=0;TH0=0xff;TL0=0x30;TR0=0;tick_count++;}用戶不必關(guān)心現(xiàn)場保護及恢復現(xiàn)場的問題,編譯器會自動完成。中斷程序的入口地址被編譯器放在中斷向量中,無需用戶指定。(6)片外擴展的I/O接口,可用#define進行定義。如:#include"absacc.h"#defineADC0804XBYTE[0x7ffe]例1:清零程序(將2000H—20FFH的內(nèi)容清零)
★匯編語言程序
ORG0000HSE01:MOVR0,#00HMOVDPTR,#2000H;(0000H)送DPTRLOO1:CLRAMOVX@DPTR,A;0送(DPTR)INCDPTR;DPTR+1INCR0;字節(jié)數(shù)加1CJNER0,#00H,LOO1;不到FF個字節(jié)再清LOOP:SJMPLOOP程序示例清零程序(將2000H—20FFH的內(nèi)容清零)
★C-51程序
#include<reg51.h>main(){inti;unsignedcharxdata*p=0x2000;
/*指針指向2000H單元*/for(i=0;i<256;i++){*p=0;p++;}/*清零2000H-20FFH單元*/}★匯編語言程序
ORG0000HL00:MOVR0,#10H;查找16個字節(jié)
MOVR1,#00HMOVDPTR,#2000HL11:MOVXA,@DPTRCJNEA,#00H,L16;取出內(nèi)容與00H相等嗎?INCR1;取出個數(shù)加1L16:INCDPTRDJNZR0,L11;未完繼續(xù)
MOVDPTR,#2100HMOVA,R1MOVX@DPTR,A;相同數(shù)個數(shù)送2100HL1E:SJMPL1E例2:查找零的個數(shù)(在2000H--200FH中查出有幾個字節(jié)是零,把個數(shù)放在2100H單元中)★查找零的個數(shù)C-51程序#include<reg51.h>main(){unsignedcharxdata*p=0x2000;/*指針p指向2000H單元*/intn=0,i;for(i=0;i<16;i++){if(*p==0)n++;/*若該單元內(nèi)容為零,則n+1*/p++;/*指針指向下一單元*/}p=0x2100;/*指針p指向2100H單元*/*p=n;/*把個數(shù)放在2100H單元中*/}第三部分單片機簡單的硬件知識1、單片機最小系統(tǒng)2、復位電路及其原理3、晶振電路4、蜂鳴器電路5、流水燈6、常用元器件識別51單片機最小系統(tǒng)介紹單片機要工作必須具備以下條件:(1)+5V電源;(2)起振電路;(3)復位電路;(4)一塊正常的單片機。注意:另外P0口要加上拉電阻,才有足夠的驅(qū)動能力驅(qū)動外圍器件工作;EA接高電平,表示單片機使用的是片內(nèi)FLASHROM。復位電路及其原理晶振電路蜂鳴器電路流水燈如果要求:做廣告燈的左移右移,八個發(fā)光二極管分別接在單片機的P3.0-P3.7接口上,輸出“0”時,發(fā)光二極管亮,左移右移按D1→D2→D3→D4→┅→D8→D7→D6→┅→D1亮,重復循環(huán)??梢跃帉懭缦滤镜某绦騺韺崿F(xiàn)這個流水燈的功能:程序:#include<AT89X52.H>unsignedchari;unsignedchartemp;voiddelay(void)//延時子程序{ unsignedcharm,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--);}voidmain(void)//主程序{ while(1)//循環(huán)條件永遠為真,以下程序一直執(zhí)行下去。
{
續(xù)前頁:temp=0x7f; P3=temp;//直接對I/O口P3賦值,使P3.0輸出低點平。
delay();//延時
for(i=1;i<8;i++)//實現(xiàn)廣告燈的從D1到D7移動
{ temp=(temp>>1)|0x80;
P3=temp; delay(); } temp=0xfe; P3=temp; delay(); for(i=1;i<8;i++)//實現(xiàn)廣告燈的從D7到D1移動
{ temp=(temp<<1)|0x01;
P3=temp; delay(); } }}
常用電子元器件識別:1、電阻(排阻)色環(huán)電阻分為4色環(huán)和5色環(huán),4色環(huán)就是用4種顏色來表示阻值,5色環(huán)就是用5種顏色來表示阻值4色環(huán):每種顏色代表不同的數(shù)字,如下:棕1紅2橙3黃4綠5藍6紫7灰8白9黑0,金、銀表示誤差第一條色環(huán):阻值的第一位數(shù)字第二條色環(huán):阻值的第二位數(shù)字第三條色環(huán):10的冪數(shù)第四條色環(huán):誤差表示。例如:電阻色環(huán):棕綠紅金,第一位是1,第二位是5,第三位是10的冪數(shù)2,即為100,第四位是誤差為5%,即阻值為:15*100=1500歐=1.5K歐精確度更高的5色環(huán):第一條色環(huán):阻值的第一位數(shù)字第二條色環(huán),阻值的第二位數(shù)字第三條色環(huán),阻值的第三位數(shù)字第四條色環(huán),10的冪數(shù)第五條色環(huán),誤差(常見為棕色,誤差為1%)有些五色環(huán)電阻兩頭金屬帽上都有色環(huán),遠離相對集中的四道色環(huán)的那道色環(huán)表示誤差,是第五條色環(huán),與之對應(yīng)的另一頭金屬帽上的是第一道色環(huán),讀數(shù)時從它讀起,之后的第二道、第三道色環(huán)是次高位、次次高位,第四道環(huán)表示10的多少次方,例如某電阻色環(huán)電阻順序為:紅(2)-黑(0)-黑(0)-黑-棕,則它表示該電阻阻值為:200Ω。再如棕-黑-黑-紅-棕,表示該電阻阻值為:10KΩ??梢姡纳h(huán)電阻誤差為5-10%,五色環(huán)常為1%,精度提高。2、三極管
最常見的小的,半圓有一平面的那種,平面對著自己管腳朝下,從坐到右依次是EBC,不過也有特殊的情況,圖上已顯示,不過大多數(shù)都是采用這種排列方式,比如9011.9012.9013.9014。
根據(jù)三極管的型號,到網(wǎng)上下載該型號三極管的pdf文檔,對照文檔中提供的三極管外觀圖片和手頭實物,直接確定管腳。大功率金屬封裝的三極管經(jīng)常采用這種方法確定管腳3、電容1)電解電容:多數(shù)在1μF以上,直接用數(shù)字表示。如:4.7μF、100μF、220μF等等。這種電容的兩極有正負之分,長腳是正極。2)瓷片電容:多數(shù)在1μF以下,直接用數(shù)字表示。如:10、22、0.047、0.1等等,這里要注意的是單位。凡用整數(shù)表示的,單位默認pF;凡用小數(shù)表示的,單位默認μF。如以上例子中,分別是10P、22P、0.047μF、220μF等。
現(xiàn)在國際上流行另一種類似色環(huán)電阻的表示方法(單位默認pF):
如:
“473”即47000pF=0.047μF
,“103”即10000pF=0.01μF等等,“XXX”第一、二個數(shù)字是有效數(shù)字,第三個數(shù)字代表后面添加0的個數(shù)。這種表示法已經(jīng)相當普遍。3)相關(guān)知識:
常見貼片電容如何判斷容量現(xiàn)代電路中常見的情況是,整個電路板布滿貼片電容,大小形狀相同(或兩三種形狀),且都無字標。貼片電容很多由于體積所限,不能標注其容量。所以一般都是在貼片生產(chǎn)時的整盤上有標注。如果是單個的貼片電容,要用電容測試儀可以測出它的容量.第四部分中斷和定時一、C51的中斷系統(tǒng)1、中斷的概念
CPU在處理某一事件A時,發(fā)生了另一事件B請求CPU迅速去處理(中斷發(fā)生);
CPU暫時中斷當前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過程稱為中斷。引起CPU中斷的根源,稱為中斷源。中斷源向CPU提出的中斷請求。CPU暫時中斷原來的事務(wù)A,轉(zhuǎn)去處理事件B。對事件B處理完畢后,再回到原來被中斷的地方(即斷點),稱為中斷返回。實現(xiàn)上述中斷功能的部件稱為中斷系統(tǒng)(中斷機構(gòu))。2、MCS-51單片機的中斷系統(tǒng)結(jié)構(gòu)中斷技術(shù)不僅解決了快速主機與慢速I/O設(shè)備的數(shù)據(jù)傳送問題,而且還具有如下優(yōu)點:
分時操作。CPU可以分時為多個I/O設(shè)備服務(wù),提高了計算機的利用率;實時響應(yīng)。CPU能夠及時處理應(yīng)用系統(tǒng)的隨機事件,系統(tǒng)的實時性大大增強;可靠性高。CPU具有處理設(shè)備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。
80C51的中斷系統(tǒng)有5個中斷源(8052有6個),2個優(yōu)先級,可實現(xiàn)二級中斷嵌套。
1、(P3.2)可由IT0(TCON.0)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.2引腳上出現(xiàn)有效的中斷信號時,中斷標志IE0(TCON.1)置1,向CPU申請中斷。
2、(P3.3)可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.3引腳上出現(xiàn)有效的中斷信號時,中斷標志IE1(TCON.3)置1,向CPU申請中斷。
3、TF0(TCON.5),片內(nèi)定時/計數(shù)器T0溢出中斷請求標志。當定時/計數(shù)器T0發(fā)生溢出時,置位TF0,并向CPU申請中斷。
4、TF1(TCON.7),片內(nèi)定時/計數(shù)器T1溢出中斷請求標志。當定時/計數(shù)器T1發(fā)生溢出時,置位TF1,并向CPU申請中斷。
5、RI(SCON.0)或TI(SCON.1),串行口中斷請求標志。當串行口接收完一幀串行數(shù)據(jù)時置位RI或當串行口發(fā)送完一幀串行數(shù)據(jù)時置位TI,向CPU申請中斷。
二、中斷請求標志1、TCON的中斷標志IT0(TCON.0),外部中斷0觸發(fā)方式控制位。當IT0=0時,為電平觸發(fā)方式。當IT0=1時,為邊沿觸發(fā)方式(下降沿有效)。IE0(TCON.1),外部中斷0中斷請求標志位。IT1(TCON.2),外部中斷1觸發(fā)方式控制位。IE1(TCON.3),外部中斷1中斷請求標志位。TF0(TCON.5),定時/計數(shù)器T0溢出中斷請求標志位。TF1(TCON.7),定時/計數(shù)器T1溢出中斷請求標志位。
2、SCON的中斷標志RI(SCON.0),串行口接收中斷標志位。當允許串行口接收數(shù)據(jù)時,每接收完一個串行幀,由硬件置位RI。注意,RI必須由軟件清除。TI(SCON.1),串行口發(fā)送中斷標志位。當CPU將一個發(fā)送數(shù)據(jù)寫入串行口發(fā)送緩沖器時,就啟動了發(fā)送過程。每發(fā)送完一個串行幀,由硬件置位TI。CPU響應(yīng)中斷時,不能自動清除TI,TI必須由軟件清除。
一、中斷允許控制
CPU對中斷系統(tǒng)所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。3、C51中斷的控制
EX0(IE.0),外部中斷0允許位;ET0(IE.1),定時/計數(shù)器T0中斷允許位;EX1(IE.2),外部中斷0允許位;ET1(IE.3),定時/計數(shù)器T1中斷允許位;ES(IE.4),串行口中斷允許位;EA(IE.7),CPU中斷允許(總允許)位。二、中斷優(yōu)先級控制
80C51單片機有兩個中斷優(yōu)先級,即可實現(xiàn)二級中斷服務(wù)嵌套。每個中斷源的中斷優(yōu)先級都是由中斷優(yōu)先級寄存器IP中的相應(yīng)位的狀態(tài)來規(guī)定的。PX0(IP.0),外部中斷0優(yōu)先級設(shè)定位;PT0(IP.1),定時/計數(shù)器T0優(yōu)先級設(shè)定位;PX1(IP.2),外部中斷0優(yōu)先級設(shè)定位;PT1(IP.3),定時/計數(shù)器T1優(yōu)先級設(shè)定位;PS
(IP.4),串行口優(yōu)先級設(shè)定位;PT2(IP.5),定時/計數(shù)器T2優(yōu)先級設(shè)定位。80C51單片機的中斷優(yōu)先級有三條原則:CPU同時接收到幾個中斷時,首先響應(yīng)優(yōu)先級別最高的中斷請求。正在進行的中斷過程不能被新的同級或低優(yōu)先級的中斷請求所中斷。正在進行的低優(yōu)先級中斷服務(wù),能被高優(yōu)先級中斷請求所中斷。為了實現(xiàn)上述后兩條原則,中斷系統(tǒng)內(nèi)部設(shè)有兩個用戶不能尋址的優(yōu)先級狀態(tài)觸發(fā)器。其中一個置1,表示正在響應(yīng)高優(yōu)先級的中斷,它將阻斷后來所有的中斷請求;另一個置1,表示正在響應(yīng)低優(yōu)先級中斷,它將阻斷后來所有的低優(yōu)先級中斷請求。4、80C51單片機中斷處理過程中斷響應(yīng)條件中斷源有中斷請求;此中斷源的中斷允許位為1;
CPU開中斷(即EA=1)。以上三條同時滿足時,CPU才有可能響應(yīng)中斷。中斷響應(yīng)條件和時間
二、定時器1、機器周期和指令周期(1)振蕩周期:也稱時鐘周期,是指為單片機提供時鐘脈沖信號的振蕩源的周期,TX實驗板上為11.0592MHZ。(2)狀態(tài)周期:每個狀態(tài)周期為時鐘周期的2倍,是振蕩周期經(jīng)二分頻后得到的。(3)機器周期:一個機器周期包含6個狀態(tài)周期S1~S6,也就是12個時鐘周期。在一個機器周期內(nèi),CPU可以完成一個獨立的操作。(4)指令周期:它是指CPU完成一條操作所需的全部時間。每條指令執(zhí)行時間都是有一個或幾個機器周期組成。MCS-51系統(tǒng)中,有單周期指令、雙周期指令和四周期指令。
2、80C51的定時/計數(shù)器實現(xiàn)定時功能,比較方便的辦法是利用單片機內(nèi)部的定時/計數(shù)器。也可以采用下面三種方法:軟件定時:軟件定時不占用硬件資源,但占用了CPU時間,降低了CPU的利用率。采用時基電路定時:例如采用555電路,外接必要的元器件(電阻和電容),即可構(gòu)成硬件定時電路。但在硬件連接好以后,定時值與定時范圍不能由軟件進行控制和修改,即不可編程。采用可編程芯片定時:這種定時芯片的定時值及定時范圍很容易用軟件來確定和修改,此種芯片定時功能強,使用靈活。在單片機的定時/計數(shù)器不夠用時,可以考慮進行擴展。一、定時/計數(shù)器的結(jié)構(gòu)定時/計數(shù)器的實質(zhì)是加1計數(shù)器(16位),由高8位和低8位兩個寄存器組成。TMOD是定時/計數(shù)器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0、T1的啟動和停止及設(shè)置溢出標志。二、定時/計數(shù)器的工作原理
加1計數(shù)器輸入的計數(shù)脈沖有兩個來源,一個是由系統(tǒng)的時鐘振蕩器輸出脈沖經(jīng)12分頻后送來;一個是T0或T1引腳輸入的外部脈沖源。每來一個脈沖計數(shù)器加1,當加到計數(shù)器為全1時,再輸入一個脈沖就使計數(shù)器回零,且計數(shù)器的溢出使TCON中TF0或TF1置1,向CPU發(fā)出中斷請求(定時/計數(shù)器中斷允許時)。如果定時/計數(shù)器工作于定時模式,則表示定時時間已到;如果工作于計數(shù)模式,則表示計數(shù)值已滿??梢?,由溢出時計數(shù)器的值減去計數(shù)初值才是加1計數(shù)器的計數(shù)值。
設(shè)置為定時器模式時,加1計數(shù)器是對內(nèi)部機器周期計數(shù)(1個機器周期等于12個振蕩周期,即計數(shù)頻率為晶振頻率的1/12)。計數(shù)值N乘以機器周期Tcy就是定時時間t
。設(shè)置為計數(shù)器模式時,外部事件計數(shù)脈沖由T0或T1引腳輸入到計數(shù)器。在每個機器周期的期間采樣T0、T1引腳電平。當某周期采樣到一高電平輸入,而下一周期又采樣到一低電平時,則計數(shù)器加1,更新的計數(shù)值在下一個機器周期的期間裝入計數(shù)器。由于檢測一個從1到0的下降沿需要2個機器周期,因此要求被采樣的電平至少要維持一個機器周期。當晶振頻率為12MHz時,最高計數(shù)頻率不超過1/2MHz,即計數(shù)脈沖的周期要大于2s。
三、定時/計數(shù)器的控制
80C51單片機定時/計數(shù)器的工作由兩個特殊功能寄存器控制。TMOD用于設(shè)置其工作方式;TCON用于控制其啟動和中斷申請。一、工作方式寄存器TMOD
工作方式寄存器TMOD用于設(shè)置定時/計數(shù)器的工作方式,低四位用于T0,高四位用于T1。其格式如下:GATE:門控位。GATE=0時,只要用軟件使TCON中的TR0或TR1為1,就可以啟動定時/計數(shù)器工作;GATA=1時,要用軟件使TR0或TR1為1,同時外部中斷引腳或也為高電平時,才能啟動定時/計數(shù)器工作。即此時定時器的啟動多了一條件。
:定時/計數(shù)模式選擇位。=0為定時模式;=1為計數(shù)模式。M1M0:工作方式設(shè)置位。定時/計數(shù)器有四種工作方式,由M1M0進行設(shè)置。
二、控制寄存器TCON
TCON的低4位用于控制外部中斷,已在前面介紹。TCON的高4位用于控制定時/計數(shù)器的啟動和中斷申請。其格式如下:TF1(TCON.7):T1溢出中斷請求標志位。T1計數(shù)溢出時由硬件自動置TF1為1。CPU響應(yīng)中斷后TF1由硬件自動清0。T1工作時,CPU可隨時查詢TF1的狀態(tài)。所以,TF1可用作查詢測試的標志。TF1也可以用軟件置1或清0,同硬件置1或清0的效果一樣。TR1(TCON.6):T1運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時/計數(shù)器的啟動與停止。TF0(TCON.5):T0溢出中斷請求標志位,其功能與TF1類同。TR0(TCON.4):T0運行控制位,其功能與TR1類同。
3.3.3定時/計數(shù)器的工作方式
一、方式0
方式0為13位計數(shù),由TL0的低5位(高3位未用)和TH0的8位組成。TL0的低5位溢出時向TH0進位,TH0溢出時,置位TCON中的TF0標志,向CPU發(fā)出中斷請求。定時器模式時有:N=t/Tcy計數(shù)初值計算的公式為:定時器的初值還可以采用計數(shù)個數(shù)直接取補法獲得。計數(shù)模式時,計數(shù)脈沖是T0引腳上的外部脈沖。門控位GATE具有特殊的作用。當GATE=0時,經(jīng)反相后使或門輸出為1,此時僅由TR0控制與門的開啟,與門輸出1時,控制開關(guān)接通,計數(shù)開始;當GATE=1時,由外中斷引腳信號控制或門的輸出,此時控制與門的開啟由外中斷引腳信號和TR0共同控制。當TR0=1時,外中斷引腳信號引腳的高電平啟動計數(shù),外中斷引腳信號引腳的低電平停止計數(shù)。這種方式常用來測量外中斷引腳上正脈沖的寬度。
二、方式1方式1的計數(shù)位數(shù)是16位,由TL0作為低8位、TH0作為高8位,組成了16位加1計數(shù)器。計數(shù)個數(shù)與計數(shù)初值的關(guān)系為:
三、方式2方式2為自動重裝初值的8位計數(shù)方式。
工作方式2特別適合于用作較精確的脈沖信號發(fā)生器。
計數(shù)個數(shù)與計數(shù)初值的關(guān)系為:
四、方式3方式3只適用于定時/計數(shù)器T0,定時器T1處于方式3時相當于TR1=0,停止計數(shù)。
工作方式3將T0分成為兩個獨立的8位計數(shù)器TL0和TH0
。
第五部分基本單片機C程序分析1、任務(wù):點亮LED燈在Keil軟件編輯窗口輸入以下程序:#include<reg51.h>sbitP3_0=P3^0;voidmain(void){while(1){P3_0=0;}}2、任務(wù):閃爍燈#include<reg51.h>voiddelay02s(void){unsignedchari,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}voidmain(void){while(1){P3_0=0;delay02s();P3_0=1;delay02s();}}要求:前面例子是讓LED燈亮,現(xiàn)在實現(xiàn)LED燈的閃爍。3、任務(wù):按鍵識別要求:通過按下一次按鍵INT0,使小燈D1亮滅交替變換。實驗原理:只要判斷P3.2的電平就可以知道按鍵是否被按下;而在按鍵按下的過程中,由于機械抖動,將產(chǎn)生干擾,電平高低變化。可以采用軟件濾波的方法去除這些干擾信號,在程序設(shè)計時,一旦發(fā)現(xiàn)P3.2為低電平,進入按鍵判斷狀態(tài),軟件延時10-20ms,從而避開了干擾信號區(qū)域,再重新檢測P3.2狀態(tài),看按鍵是否真的已經(jīng)按下。參考程序(傳統(tǒng)的延時消抖按鍵程序)include<AT89X52.H>sbitINT_0=P3^2;//定義按鍵的輸入端sbitD1=P3^0;
//D1小燈定義voiddelay10ms(void)//延時程序{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);}key(
)
//按鍵判斷程序{ if(INT_0==0)//判斷是否按下鍵盤 { delay10ms(
);//延時,軟件去干擾 if(INT_0==0)//確認按鍵按下 {
D1=!D1;//D1亮滅交替變化 }
while(INT_0==0);//按鍵鎖定,每按一次D1只變化一次 }續(xù)前頁:}main(){while(1)
//永遠循環(huán),掃描判斷按鍵是否按下 { key();
//對于此處CPU只按鍵判斷一直掃描; }}
課后請實踐:1.用兩個按鍵來控制D1的亮滅;2.使用一個按鍵,控制小燈亮的順序D1→D2→D3→D4→┅→D8→D7→→┅D0亮重復循環(huán);4、任務(wù):數(shù)碼管靜態(tài)顯示要求:用數(shù)碼管LED的個位,靜態(tài)顯示數(shù)字“4”字樣;注意:因采用共陰數(shù)碼顯示管,故此圖P0口還應(yīng)接1K或10K的排阻作為上拉電阻。參考程序:#include<AT89X52.H>sbitGE=P1^3;codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//顯示段碼main(){ unsignedchardisplay_date=4;//定義并賦值要顯示的數(shù)據(jù) while(1) { P0=seg7code[display_date];
//查表,輸出 GE=0;//P1^3為低電平,相當于把數(shù)碼管的4H端接地 }}課后請實踐:1.讓顯示的數(shù)據(jù)動起來,比如做一個0到9的秒表(用軟件延時);2.和按鍵判斷程序結(jié)合,用按鍵控制數(shù)字變化;5、任務(wù):數(shù)碼管動態(tài)顯示要求:用數(shù)碼管LED的顯示四位數(shù)據(jù),比如顯示數(shù)字“1234”;參考程序:#include<AT89X52.H>sbitqian=P1^0;sbitbai=P1^1;sbitshi=P1^2;sbitge=P1^3;codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示段碼voidDelay(unsignedinttc)//延時程序{ while(tc!=0) //如果tc為0則終止延時 { unsignedinti; //局部正整數(shù)變量i for(i=0;i<100;i++); //執(zhí)行400次將耗時1毫秒 tc--; //tc計數(shù)減一 }}續(xù)前頁:voidLed(intdate)//顯示函數(shù){ qian=0;//P1.0輸出低電平,選通千位數(shù) P0=seg7code[date/1000];//取出千位數(shù),查表,輸出。 Delay(10);//延時 qian=1;//銷隱 bai=0;//P1.1輸出低電平,選通百位數(shù) P0=seg7code[date%1000/100];//取出百位數(shù),查表,輸出。 Delay(10);//延時 bai=1;//銷隱 shi=0;//P1.2輸出低電平,選通十位數(shù) P0=seg7code[date%100/10];//取出十位數(shù),查表,輸出。 Delay(10);//延時 shi=1;//銷隱 ge=0; //P1.3輸出低電平,選通十位數(shù) P0=seg7code[date%10];//取出個位數(shù),查表,輸出。 Delay(10); ge=1;}
續(xù)前頁:main(){intdisplay_date=1234;//定義并賦值要顯示的數(shù)據(jù)while(1){Led(display_date);//調(diào)用顯示函數(shù)顯示數(shù)據(jù)display_date}}
上述數(shù)碼管動態(tài)顯示程序的另一種寫法參考程序:#include<AT89X51.H>unsignedchardatebit[]={0xfe,0xfd,0xfb,0xf7};//存儲數(shù)碼管的位選值unsignedchartvdate[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,};unsignedintdisdata;//定義要顯示的數(shù)據(jù)unsignedchardisdat[4];//存儲要顯示的四位數(shù)據(jù)voiddelay(time){unsignedchari,j;for(j=0;j<time;j++)for(i=0;i<250;i++);}display(void){ unsignedchark; disdata=1234;//顯示1234
續(xù)前頁:
disdat[0]=disdat/1000; //取出千位 disdat[1]=disdat%1000/100;
//取出百位 disdat[2]=disdat%100/10; //取出十位 disdat[3]=disdat%10; //取出個位 for(k=0;k<4;k++)
//顯示四位數(shù)據(jù) { P0=tvdate[disdat[k]];
//送出要顯示數(shù)據(jù)的段碼 P1=datebit[k]; //P2位選 delay(10); //延時 }}main(){while(1){display();}}
這種寫法比上一種復雜,占用空間要多一些.但是使用方便,可以在此基礎(chǔ)上方便的加上比如顯示小數(shù)點,指定某位數(shù)碼管閃爍等。課后思考:如何用軟件延時來做一個0到60秒的計數(shù)器嗎?6、任務(wù):4X4矩陣鍵盤識別要求:用AT89S51的并行口P2接4×4矩陣鍵盤,以P3.0-P3.3作輸入線,以P3.4-P3.7作輸出線;在每一個數(shù)碼管上顯示每個按鍵的“0-F”序號。[實驗原理]每個按鍵有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地,另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。鍵盤識別的兩種方法逐行掃描法:(1)首先判斷有無鍵按下:令矩陣行線輸出全0信號,檢測列線狀態(tài),若有一列電平為低,則有鍵按下。(2)確定閉合鍵位置:依次將各行線置為低電平,逐行檢測各列線的電平狀態(tài),若某列為低,則該行線和列線交叉處按鍵就是閉合鍵。線反轉(zhuǎn)法:(1)令矩陣鍵盤列線輸出全0信號,行線作為輸入接口接收信號,可判斷按鍵處于哪一行。(2)令矩陣鍵盤行線輸出全0信號,列線作為輸入接口接收信號,可判斷按鍵處于哪一列。(3)將輸入信號相或后形成鍵盤的唯一鍵碼。程序:(線反轉(zhuǎn)法)#include<reg52.h>unsignedcharcodeseg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchark;voiddelay10ms(void)//延時程序{ unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--);}voidGetch(){ unsignedcharX,Y,Z;
P2=0xff;
P2=0x0f;
//先對P2置數(shù)行掃描 if(P2!=0x0f)//判斷是否有鍵按下 {
delay10ms();//延時,軟件去干擾
if(P2!=0x0f)
//確認按鍵按下X=P2;
{
續(xù)前頁:
X=P2;//保存行掃描時有鍵按下時狀態(tài) P2=0xf0;//列掃描 Y=P2;//保存列掃描時有鍵按下時狀態(tài) Z=X|Y;//取出鍵值 switch(Z)//判斷鍵值(那一個鍵按下) { case0x77:k=0;break;//對鍵值賦值 case0x7b:k=1;break; case0x7d:k=2;break; case0x7e:k=3;break; case0xb7:k=4;break; case0xbb:k=5;break; case0xbd:k=6;break; case0xbe:k=7;break; case0xd7:k=8;break; case0xdb:k=9;break; case0xdd:k=10;break; case0xde:k=11;break; case0xe7:k=12;break; case0xeb:k=13;break; 續(xù)前頁:
case0xed:k=14;break;
case0xee:
k=15;break; } } }}voidmain(void){while(1){P2=0xff;Getch(
);P0=seg7code[k];//查表LED輸出P1=0xf0;//輸出相同的四位數(shù)據(jù)。}}
該程序的缺陷:1、雖然線反轉(zhuǎn)法識別鍵盤的思路正確,但本程序按鍵掃描中消除按鍵抖動采用了傳統(tǒng)的延時方法,這種辦法會使CPU陷入無謂的等待,在延時的過程中CPU無法并行處理其它事件。采用定時掃描法(比如采用定時中斷每隔100ms掃描1次鍵盤),可以解決這一問題;2、如果要求實現(xiàn)“短促”按鍵和“長按”按鍵的區(qū)分,使程序能應(yīng)用在功能要求更為復雜的場合,繼續(xù)編制該程序則有繁瑣和可讀性變差的缺點。因此有必要采用更為便捷和高效的鍵值識別算法以實現(xiàn)本程序的功能。
新型鍵盤識別程序基本思想:unsignedcharTrg;unsignedcharCont;voidKeyRead(void){unsignedcharReadData=P3^0xff;//1
Trg=ReadData&(ReadData^Cont);//2
Cont=ReadData;//3
}分析:(1)沒有按鍵的時候ReadData=0x00;Trg=0x00;Cont=0x00;(2)第一次按下按鍵的情況
(假設(shè)按鍵接在P3.0上面)ReadData=0x01;Trg=0x01;Cont=0x01;(3)按鍵按著不松(長按鍵)的情況ReadData=0x01;Trg=0x00;Cont=0x01;
(4)按鍵松開的情況ReadData=0x00;Trg=0x00;Cont=0x00;
Trg表示的就是觸發(fā)的意思,也就是跳變,只要有按鍵按下,Trg在對應(yīng)按鍵的位上面會置1;最關(guān)鍵的地方,Trg的值每次按下只會出現(xiàn)一次,然后立刻被清除,完全不需要人工去干預。所以按鍵功能處理程序不會重復執(zhí)行,省下了一大堆的條件判斷,所謂精粹即此!!Cont代表的是長按鍵,如果按鍵按著不放,那么Cont的值就為0x01。應(yīng)用一:一次觸發(fā)的按鍵處理——假設(shè)為蜂鳴器按鍵,按一下,蜂鳴器beep的響一聲
#defineKEY_BEEP0x01voidKeyProc(void){if(Trg&KEY_BEEP)//如果按下的是KEY_BEEP
{Beep();//執(zhí)行蜂鳴器處理函數(shù)
}}應(yīng)用二:長按鍵的處理
#defineKEY_MODE0x01//此模式按鍵也
#defineKEY_PLUS0x02//此加鍵也
voidKeyProc(void){if(Trg&KEY_MODE)//若KEY_MODE鍵按之,雖常按亦無益
{//無執(zhí)行再,必先松再按可矣
Mode++;//模式寄存器加1
}if(Cont&KEY_PLUS)//若“加”鍵按之不放
{cnt_plus++;//則計時
if(cnt_plus>100)//20ms*100=2S若計時到
{Func();//則執(zhí)行所需執(zhí)行之功能程序也
}}}延時消抖問題?真正的單片機入門,是從學會處理多任務(wù)開始的。
加入延時消抖程序的架構(gòu)如下:volatileunsignedcharIntrcnt;voidInterruptHandle()//中斷服務(wù)程序
{Intrcnt++;}//1ms中斷1次,可變
voidmain(void){SysInit();while(1)//每20ms執(zhí)行一次大循環(huán)
{KeyRead();//將每個子程序都掃描一遍
KeyProc();Func1();Funt2();……while(1){if(Intrcnt>20)//一直在等,直到20ms時間到
{Intrcnt="0";break;}//返回主循環(huán)
}}}怎么判斷按鍵釋放?再增加一個按鍵釋放檢測功能,程序如下:
volatileunsignedcharTrg;volatileunsignedcharCont;volatileunsignedcharRelease;//再增加新功能!
voidKeyRead(void){unsignedcharReadData=PINB^0xff;//1讀鍵值
Trg=ReadData&(ReadData^Cont);//2得到按下觸發(fā)值
Release=(ReadData^Trg^Cont);//3得到釋放觸發(fā)值
Cont=ReadData;//4得到所有未釋放的鍵值
}7、任務(wù):按鍵中斷識別要求:采用中斷技術(shù),每按一下按鍵,計數(shù)器加1,并用LED顯示出來,注意只顯示2位十進制數(shù)。原理:以上的兩個舊式按鍵識別的實驗的程序都是采用掃描的方式來實現(xiàn)的,CPU的利用率比較低;按鍵判斷還可以用中斷方式來判斷。中斷方式可以滿足快速響應(yīng)的要求。程序:#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchardispcount=0;//計數(shù)sbitgewei=P1^3;//個位選通定義sbitshiwei=P1^2;//十位選通定義voidDelay(unsignedinttc)//延時程序{while(tc!=0){unsignedinti;for(i=0;i<100;i++);tc--;}}voidExtInt0()interrupt0//中斷服務(wù)程序{續(xù)前頁:dispcount++;//每按一次中斷按鍵,計數(shù)加一if(dispcount==100)//計數(shù)范圍0-99{dispcount=0;}}voidLED()//LED顯示函數(shù){if(dispcount>=10)//顯示兩位數(shù){shiwei=0;P0=table[dispcount/10];Delay(8);shiwei=1;gewei=0;P0=table[dispcount%10];Delay(5);gewei=1;}else//顯示一位數(shù){
續(xù)前頁:shiwei=1;gewei=0;P0=table[dispcount];Delay(8);}}
voidmain(){TCON=0x01;
//下降沿觸發(fā)
IE=0x81;
//開總中斷和允許外部中斷
while(1)
//循環(huán)執(zhí)行{LED(
);}
//調(diào)用顯示函數(shù)}/*******************************************************************課后思考:在程序在硬件運行過程中,有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025園林綠化合同
- 2025建設(shè)工程施工合同(VIII)
- 2025企業(yè)代培訓合同范文
- 2025合同模板健身俱樂部會員入會協(xié)議 范本
- 沙盤模型制作合同
- 醫(yī)療科技在小兒發(fā)熱治療中的應(yīng)用
- 課題申報參考:馬克思隱喻敘事的唯物史觀原理研究
- 課題申報參考:禮俗互動視域下明清江南婚嫁刺繡裝飾研究
- 課題申報參考:科學教育教學體系研究
- 綠色能源在校園電力供應(yīng)中的應(yīng)用與展望
- 2024年蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 人教版初中語文2022-2024年三年中考真題匯編-學生版-專題08 古詩詞名篇名句默寫
- 2024-2025學年人教版(2024)七年級(上)數(shù)學寒假作業(yè)(十二)
- 山西粵電能源有限公司招聘筆試沖刺題2025
- ESG表現(xiàn)對企業(yè)財務(wù)績效的影響研究
- 旅游活動碳排放管理評價指標體系構(gòu)建及實證研究
- 2022年全國職業(yè)院校技能大賽-電氣安裝與維修賽項規(guī)程
- 小學德育養(yǎng)成教育工作分層實施方案
- 2024年湖南高速鐵路職業(yè)技術(shù)學院單招職業(yè)技能測試題庫附答案
- 2024年4月浙江省00015英語二試題及答案含評分參考
- 黑枸杞生物原液應(yīng)用及產(chǎn)業(yè)化項目可行性研究報告
評論
0/150
提交評論