Part1 晶振
晶振,也就是晶體振蕩器,主要作用是產生穩定的振動頻率用于單片機時鐘電路。
一、晶振的工作原理
壓電效應:
如圖所示,晶體振蕩器主要由引線構成的電極和晶體片構成。
當我們在晶體兩電極外加電壓后,晶體會發生形變,反過來,如果外力使得晶體變形,兩極上又會產生電壓。
因此當我們在晶體兩端施加一個交變電壓時,隨著電壓正負的改變,晶體交替形變,進而以一定的頻率發生諧振–單頻振蕩(振蕩頻率固定不變)。
二、晶體單頻振蕩產生時鐘脈沖
我們知道,脈沖信號是一個按一定電壓幅度、一定時間間隔連續發出的信號。
而我們的晶體振蕩器,既有電壓幅度–晶體兩端施加的電壓,又有時間間隔–振蕩頻率 f 的倒數作為周期。因此我們可以通過我們的晶體振蕩器產生一個穩定的時鐘脈沖信號來為我們的單片機提供精準計時。
三、單片機的時間單位
現在我們有了由晶體振蕩器產生的精準時鐘脈沖,可以給我們的單片機計時了。但對于單片機來講,用我們所熟知的時分秒等計時單位來計時,并不合適。因此我們根據單片機的工作特性和原理,引入了時鐘周期、狀態周期、機器周期、指令周期幾個概念來作為我們單片機的時間單位。
1、時鐘周期
也叫振蕩周期或者晶振周期,即晶振的單位時間發出的脈沖數。如12Mhz晶振的時鐘周期為1/ f =1/12Mhz,也就是1/12微秒。
時鐘周期是計算機中最基本、最小的時間單位。
在8051單片機中把一個時鐘周期定義為一個節拍(用P表示),二個節拍定義為一個狀態周期(用S表示)
2、機器周期
計算機中,為了便于管理,常把一條指令的執行過程劃分為若干個階段,每一階段完成一項工作。例如,取指令、存儲器讀、存儲器寫等,這每一項工作稱為一個基本操作。完成一個基本操作所需要的時間稱為機器周期。51單片機中一個機器周期等于12個時鐘周期。
在標準的51單片機中,一般情況下,一個機器周期等于12個時鐘周期,也就是機器周期=12*時鐘周期,(上面講到的原因)如果是12MHZ,那么機器周期=1微秒。單片機工作時,是一條一條地從RoM中取指令,然后一步一步地執行。單片機訪問一次存儲器的時間,稱之為一個機器周期,這是一個時間基準。
機器周期不僅對于指令執行有著重要的意義,而且機器周期也是單片機定時器和計數器的時間基準。例如一個單片機選擇了12MHZ晶振,那么當定時器的數值加1時,實際經過的時間就是1us,這就是單片機的定時原理。
3、指令周期
指令周期是執行一條指令所需要的時間,一般由若干個機器周期組成。指令不同,所需的機器周期數也不同。
對于一些簡單的的單字節指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執行,不再需要其它的機器周期。
對于一些比較復雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器周期
Part2 定時計數器
在我們的單片機中,說到時間就離不開上面所提的時鐘脈沖。而我們的定時計數器就是對這些脈沖進行計數,來進行時間計算的,本質上我們的定時計數器是一個加1計數器,也就是每輸入一個脈沖,計數加一。
但要注意的一點是,定時器和計數器是兩個不同的功能單元。
定時器是由單片機自身提供的一個非常穩定的計數器(晶振),接受的是內部脈沖;
而計數器則不同,記錄的是單片機外部發生的事情,接受的是外部脈沖。
舉一個計數器的例子,方便大家理解,我現在讓我的計數器記錄我的一個獨立按鍵按下的次數,那它所接受的脈沖便是我們按鍵按下過程中產生外部脈沖。
這里需要注意的是,計數器自動加1需要檢測從1到0的下降沿,因此需要兩個計數周期,最高計數頻率為24晶振頻率。
由于不同型號的51單片機的定時器個數不同,下面以最基礎的8951單片機為例進行闡述
一、定時計數器的寄存器
說了這么多,那單片機具體應該怎么使用呢,別急,咱們還得從最基本的寄存器開始看起。
首先我們來看一下定時計數器的定時方式寄存器–TMOD
GATE :定時操作開關控制位,當GATE=1時,INT0或INT1引腳為高電平,同時TCON中的TR0或TR1控制位為1時,計時/計數器0或1才開始工作。若GATE=0,則只要將TR0或TR1控制位設為1,計時/計數器0或1就開始工作。
C/T :定時器或計數器功能的選擇位。C/T=1為計數器,通過外部引腳T0或T1輸入計數脈沖。C/T=0時為定時器,由內部系統時鐘提供計時工作脈沖。
M1 M0:T0、T1工作模式選擇位
設置好方式,當然還有具體的定時器控制寄存器–TCON
TF1:定時器T1溢出標志,可由程序查詢和清零,TF1也是中斷請求源,當CPU響應T1中斷時由硬件清零。
TF0:定時器T0溢出標志,可由程序查詢和清零,TF0也是中斷請求源,當CPU響應T0中斷時由硬件清零。
TR1:T1充許計數控制位,為1時充許T1計數(定時)。
TR0:T0充許計數控制位,為1時充許T0計數(定時)。
下面四個屬于中斷部分,這里不多做闡述。
IE1:外部中斷1請示源(INT1,P3.3)標志。IE1=1,外部中斷1正在向CPU請求中斷,當CPU響應該中斷時由硬件清“0”。
IT1:外部中斷源1觸發方式控制位。此位為1設置為底電平觸發,為0設置為下降沿觸發。
IE0:外部中斷0請示源(INT0,P3.2)標志。IE0=1,外部中斷1正在向CPU請求中斷,當CPU響應該中斷時由硬件清“0”。
IT0:外部中斷源0觸發方式控制位。此位為1設置為底電平觸發,為0設置為下降沿觸發。
二、我們來看一下定時器的4種工作模式
1、工作模式0:
由TL0的低5位和TH0的全部8位共同構成一個13位的定時器/計數器,定時器/計數器啟動后,定時或計數脈沖個數加到TL0上,從預先設置的初值(時間常數)開始累加,不斷遞增1,當 TL0計滿后,向TH0進位,直到13位寄存器計滿溢出,TH0溢出時,置位TCON中的TF0標志,向CPU發出中斷請求。并且定時器/計數器硬件會自動地把13位的寄存器值清0,如果需要進一步定時/計數,需要使用相關指令重置時間常數,并把定時器/計數器的中斷標記TF0置0。
2、工作模式1:最常用的定時器工作模式
模式1與模式0幾乎完全相同,唯一的區別就是,模式1中的寄存器TH0和TL0共同構成的是一個16位定時器/計數器來參與操作,因此比模式0中的定時/計數范圍更大
3、工作模式2: 工作方式2特別適合于用作較精確的脈沖信號發生器。
這種模式又稱為自動再裝入預置數模式。有時候,我們的定時/計數操作是需要多次重復定時/計數的,如果溢出時不做任何處理,那么,在第二輪定時/計數時就是從0開始定時/計數了,而這并不是我們想要的。所以,要保證每次溢出之后,再重新開始定時/計數的操作是我們想要的,那就要把預置數(時間常數)重新裝入某個地方,而重新裝入預置數的操作是硬件設備自動完成的,不需要人工干預,所以這種工作模式就叫自動再裝入預置數方式。在工作模式2中,把自動重裝入的預置數存放在定時器/計數器的寄存器的高8位中,也就是存放在TH0中,而只留下TL0參與定時/計數操作。
這個工作模式常用于波特率發生器(串口通信),T1工作在串口模式2;用于這種方式時,定時器就是為了提供一個時間基準;計數溢出之后,不需要做太多的事情,只做一件事就可以,就是重新裝入預置數,再開始重新計數,而且中間不需要任何延時。
4、工作模式3:
方式3只適用于定時/計數器T0,定時器T1處于方式3時相當于TR1=0,停止計數由于定時器/計數器T1沒有工作模式3,如果把定時器/計數器T0設置為工作模式3,那么TL0和TH0將被分割成兩個相互獨立的8位定時器/計數器。
三、定時計數器初值的確定
1、計數器計數初值確定
計數初值C=模-X
注:模為選用定時方式的最大數值,如方式一的模為65536
2、定時器定時初值
定時初值C=[t/MC] 注: MC-- 機器周期,t預定時間
3、定時器不同方式初值
工作方式0:13位定時器/計數器工作模式,最多可計數2的13次方次,即:8192次
工作方式1:16位定時器/計數器工作模式,最多可計數2的16次方次,即:65536次
工作方式2:8位定時器/計數器工作模式,最多可計數2的8次方次,即:256次,
工作方式3:8位定時器/計數器工作模式,最多可計數2的8次方次,即:256次
4、定時計數器初值載入寄存器
TH0=(65536-9216)/256
TL0=(65536-9216)%256
四、定時計數器的具體使用
定時:定時計數器作為定時器使用,配置步驟如下:
1.模式設置,配置TMOD寄存器
2.定時器初值設置 假設10ms中斷
3.開定時器中斷
4.開總中斷
5.打開定時器
#include sbit led=P1^0; unsigned int flag; void main() { TMOD=0x01;//1.模式設置,00000001,采用的是定時器0,工作與式1(M1=0,M0=1)。 TH0=(65536-10000)/256; //2.定時器設置,每隔10毫秒發起一次中斷。 TL0=(65536-10000)%256; ET0=1; //3.開定時器0中斷 EA = 1; //4.開總中斷 TR0=1; //5.打開定時器 while(1) { if(flag==100) { led=~led; flag=0; } } } void TIM0() interrupt 1 //中斷服務程序 { TH0=(65536-10000)/256; //進入中斷要重新設置定時器處置,要注意。 TL0=(65536-10000)%256; flag++; } 計數:定時計數器作為計數器使用,配置步驟如下: 1.模式設置,配置TMOD寄存器。 2.開計數器中斷 3.開總中斷 4.打開計數器 通過這簡單的四步,我們就打開了一個計數器,可以對P3.4或者P3.5進行下降沿的脈沖計數,這里有一點要注意就是計數器可以不開中斷,這樣溢出時只是不會進去中斷服務程序。 計數器示例程序 #include sbit led=P1^0; sbit s=P3^4; unsigned int count; void main() { TMOD=0x05; //1.模式設置,00000101,采用的是計數器0,工作模式1(M1=0,M0=1)。 TH0=0; //計數器清零 TL0=0; ET0=1; //2.開計數器0中斷 EA=1; //3.開總中斷 TR0=1; //4.打開計數器 led=1; while(1) { count=(TH0<<8)|TL0; if((count*10000)==50000)//按5下按鍵led狀態取反 { led=0; TH0=0XFF; TL0=0XFF; //人為的讓計數器進入中斷 } } } void TIM0() interrupt 1 //中斷服務程序 { led=1; TH0=0; TL0=0; }
上一篇:51驅動兩相四線步進電機
下一篇:51單片機之串口通信詳解
推薦閱讀
史海拾趣
Amphenol Nexus Technologies深知,在電子行業中,合作與共贏是實現持續發展的重要途徑。因此,公司積極與產業鏈上下游的合作伙伴建立緊密的合作關系,共同推動行業的發展。通過與供應商、客戶以及同行業企業的合作,Amphenol Nexus Technologies不斷提升自身的競爭力,實現了業務的快速增長和市場的持續擴張。
以上便是關于Amphenol Nexus公司在電子行業發展的五個故事。這些故事展示了公司在不同歷史階段的發展軌跡、領導層的智慧和決策、技術創新的努力以及合作共贏的理念。正是這些因素的共同作用,使得Amphenol Nexus Technologies能夠在激烈的市場競爭中脫穎而出,成為電子連接器行業的佼佼者。
自1983年成立以來,GISMA Steckverbinder GmbH便專注于水下連接器的開發、設計和生產。作為一家由所有者直接管理的獨立公司,GISMA從一開始就確立了為海洋工業、船舶及海洋技術提供高質量電氣和光纖連接器的目標。這一明確的市場定位使得GISMA能夠迅速在競爭激烈的電子行業中脫穎而出,逐步建立起自己的市場地位。
Eurotechnique公司成立于XXXX年,由幾位具有遠見卓識的電子工程師和企業家共同創立。他們看到了當時電子行業快速發展的趨勢,尤其是數字電路和微控制器領域的巨大潛力。因此,公司決定專注于這兩個領域的技術研發和產品生產。在創立初期,Eurotechnique通過不斷的技術創新和產品優化,逐漸在市場上樹立了良好的口碑。
在埃派克森微電子的發展過程中,著名投資機構多爾基金和華登國際的風險投資起到了重要的推動作用。這些投資不僅為公司提供了資金支持,還帶來了寶貴的市場資源和管理經驗。借助這些資源,埃派克森加快了國際化步伐,積極拓展海外市場,與全球范圍內的客戶和合作伙伴建立了緊密的合作關系。
在快速發展的過程中,光大芯業始終重視人才的培養和團隊的建設。公司擁有一支來自國內外頂尖半導體設計公司的資深專家組成的核心技術團隊,他們具備豐富的產品開發經驗和創新理念。同時,公司還注重本地優秀設計人才的培養和引進,為公司的長遠發展提供了堅實的人才保障。
我剛接觸msp430單片機,最近要用ADC12的單通道多次轉換模式,請教大家轉換的次數怎么設置?比如說我要轉換10次,然后求平均值。先謝謝各位了。… 查看全部問答∨ |
#include <includes.h> #define TASK_STK_SIZE 128 //定義任務堆棧的大小 OS_STK TaskOneStack[TASK_STK_SIZE]; //為任務TaskOne建立一個堆棧OS_STK TaskTwoStack[TASK_STK_SIZE]; //為任務TaskTwo建立一個堆棧OS_ST ...… 查看全部問答∨ |
我從ucos官網上下載了ucos-ii在IAR下的5d3x移植好的版本,但是我無論是在在線仿真還是實際的使用過程都村子問題。我在線仿真的時候,程序會在初始化的停留在prefetch interrupt,也就是中斷向量表的第四條;但是我如果在cstartup.s中將MMU初始化相 ...… 查看全部問答∨ |
四年前貌似30多買的吧,最近發現外皮裂了,雖說用了這么久也可以了, 不過窮的還是拆開重新焊接一下繼續用吧 可惡的三角螺絲,不過還是很輕松的拆了,誰讓平時愛拆呢,工具還是有的,雖然沒你們那么多 質量還行吧,1800W的水壺一直用 ...… 查看全部問答∨ |