第一部分 常用的幾個(gè)程序模塊
1.1 簡(jiǎn)單延時(shí)子程序
本文引用地址:http://m.butianyuan.cn/article/201611/315469.htm在做單片機(jī)控制時(shí),經(jīng)常要遇到到延時(shí)的問題。比如要讓蜂鳴器響1s,然后停1s,然后再響1s,反復(fù)下去。這個(gè)例子,要求延時(shí)的時(shí)間已經(jīng)很準(zhǔn)確了(1s),一般情況下,如果要求延時(shí)的時(shí)間不需要很精確,那么可以寫一個(gè)簡(jiǎn)單的延時(shí)程序,然后通過調(diào)試,最后達(dá)到延時(shí)的目的。
這種方法適合大概的延時(shí),可以通過while或for循環(huán)實(shí)現(xiàn)。為方便后續(xù)研究,我用for循環(huán)方式。
程序可以這樣寫:
#include
#define uint unsigned int
#define uchar unsigned char //宏定義
void delay()//延時(shí)函數(shù)
{
uint x,y;
for(x=100;x>0;x--)
for(y=5000;y>0;y--);
}
void main()
{
delay();
}
通過調(diào)試循環(huán)次數(shù)x,y值,改變延時(shí)間,最后達(dá)到滿意的數(shù)值為止。
1.2帶參數(shù)的延時(shí)子程序
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)//延時(shí)函數(shù)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
void main()
{
delay(k)//k為常數(shù)
}
在主函數(shù)main中調(diào)整常數(shù)k,方可達(dá)到延時(shí)目的。
1.3中斷程序
中斷:CPU在處理某一事件A時(shí),發(fā)生了另一事件B請(qǐng)求CPU迅速去處理(中斷發(fā)生);CPU暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過程稱為中斷。
理解上述中斷的定義,有兩點(diǎn)需要注意:1,中斷程序執(zhí)行完,又返回中斷前的地方(斷點(diǎn))接著執(zhí)行程序;2,中斷的函數(shù)不需要聲明,且該函數(shù)放在main函數(shù)的外面(附中斷程序)。
附:80C51的中斷系統(tǒng)
80C51的中斷系統(tǒng)有5個(gè)中斷源(見圖1)(8052有6個(gè)),2個(gè)優(yōu)先級(jí),可實(shí)現(xiàn)二級(jí)中斷嵌套。
圖1
圖2
說明:圖1,外部中斷上的橫線表示低電平有效。
1中斷請(qǐng)求標(biāo)志寄存器TCON:
說明:
IT0(TCON.0),外部中斷0觸發(fā)方式控制位。
當(dāng)IT0=0時(shí),為電平觸發(fā)方式。
當(dāng)IT0=1時(shí),為邊沿觸發(fā)方式(下降沿有效)。
IE0(TCON.1),外部中斷0中斷請(qǐng)求標(biāo)志位。
IT1(TCON.2),外部中斷1觸發(fā)方式控制位。
IE1(TCON.3),外部中斷1中斷請(qǐng)求標(biāo)志位。
TF0(TCON.5),定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位。(硬件控制)
TF1(TCON.7),定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位。(硬件控制)
注意:低四位用于控制外部中斷,高四位用于控制和申請(qǐng)定時(shí)/計(jì)數(shù)器中斷;TF0、TF1由硬件自動(dòng)控制;TR0(TR1)為1時(shí),定時(shí)器0(1)啟動(dòng),反之停止(軟件控制)。可直接進(jìn)行位操作。
2中斷標(biāo)志寄存器IE:為1,中斷允許。(可進(jìn)行位操作)
3中斷優(yōu)先級(jí)寄存器IP:
說明:
80C51單片機(jī)有兩個(gè)中斷優(yōu)先級(jí),即可實(shí)現(xiàn)二級(jí)中斷服務(wù)嵌套。每個(gè)中斷源的中斷優(yōu)先級(jí)都是由中斷優(yōu)先級(jí)寄存器IP中的相應(yīng)位的狀態(tài)來規(guī)定的。
§PX0(IP.0),外部中斷0優(yōu)先級(jí)設(shè)定位;
§PT0(IP.1),定時(shí)/計(jì)數(shù)器T0優(yōu)先級(jí)設(shè)定位;
§PX1(IP.2),外部中斷0優(yōu)先級(jí)設(shè)定位;
§PT1(IP.3),定時(shí)/計(jì)數(shù)器T1優(yōu)先級(jí)設(shè)定位;
§PS(IP.4),串行口優(yōu)先級(jí)設(shè)定位;
§PT2(IP.5),定時(shí)/計(jì)數(shù)器T2優(yōu)先級(jí)設(shè)定位。
§CPU同時(shí)接收到幾個(gè)中斷時(shí),首先響應(yīng)優(yōu)先級(jí)別最高的中斷請(qǐng)求。
§正在進(jìn)行的中斷過程不能被新的同級(jí)或低優(yōu)先級(jí)的中斷請(qǐng)求所中斷。
§正在進(jìn)行的低優(yōu)先級(jí)中斷服務(wù),能被高優(yōu)先級(jí)中斷請(qǐng)求所中斷。
總結(jié):
中斷響應(yīng)條件
§中斷源有中斷請(qǐng)求;(TCON)
§此中斷源的中斷允許位為1;(IE)
§CPU開中斷(即EA=1)。(EA)
以上三條同時(shí)滿足時(shí),CPU才有可能響應(yīng)中斷。
中斷子程序(定時(shí)器0(1)中斷響應(yīng)):
void main()
{
EA=1;//開CPU中斷
ET0=1;//開定時(shí)器0(中斷允許)
ET1=1;
TR0=1;//啟動(dòng)定時(shí)器0
TR1=1;
}
void time0() interrupt 1 //中斷函數(shù)time0()不需要聲明,數(shù)字1與優(yōu)先級(jí)有關(guān),如外部中斷0,應(yīng)設(shè)置為0(interrupt 0)。
{}
void time1() interrupt 3
{}
1.4定時(shí)器和計(jì)數(shù)器
前面已經(jīng)介紹了延時(shí),但是那種方法延時(shí)的時(shí)間做不到很精確,今天介紹一種精確的方法,就是定時(shí)器/計(jì)數(shù)器。
1.41 與定時(shí)器/計(jì)數(shù)器有關(guān)的寄存器
lTCON:前面已經(jīng)介紹過,它主要是控制啟動(dòng)和申請(qǐng)中斷。
lTMOD:控制定時(shí)器的控制方式??捎孟聢D描述:
說明:
l高四位與T1操作有關(guān),低四位與T0操作有關(guān);
lM1MO為工作方式設(shè)置位。一般工作在方式1下,此時(shí)M1MO=01;
l在GATE=0時(shí),需用軟件使TCON中的位TRO(TR1)置1,啟動(dòng)定時(shí)器。C/T0=0為定時(shí)模式,C/T0=1為計(jì)數(shù)模式;
1.42定時(shí)器/計(jì)數(shù)器工作原理
定時(shí)/計(jì)數(shù)器的實(shí)質(zhì)是加1計(jì)數(shù)器(16位),由高8位THO(1)和低8位TL(1)兩個(gè)寄存器組成。加1計(jì)數(shù)器輸入的計(jì)數(shù)脈沖有兩個(gè)來源,一個(gè)是由系統(tǒng)的時(shí)鐘振蕩器輸出脈沖經(jīng)12分頻后送來;一個(gè)是T0或T1引腳輸入的外部脈沖源。每來一個(gè)脈沖計(jì)數(shù)器加1,當(dāng)加到計(jì)數(shù)器為全1時(shí),再輸入一個(gè)脈沖就使計(jì)數(shù)器回零,且計(jì)數(shù)器的溢出使TCON中TF0或TF1置1,向CPU發(fā)出中斷請(qǐng)求(定時(shí)/計(jì)數(shù)器中斷允許時(shí))。如果定時(shí)/計(jì)數(shù)器工作于定時(shí)模式,則表示定時(shí)時(shí)間已到;如果工作于計(jì)數(shù)模式,則表示計(jì)數(shù)值已滿。
可見,由溢出時(shí)計(jì)數(shù)器的值(注:16位全填滿1時(shí),數(shù)值剛好是65535。而溢出時(shí)計(jì)數(shù)器的值應(yīng)該是65535+1=65536,即216)減去計(jì)數(shù)初值才是加1計(jì)數(shù)器的計(jì)數(shù)值。
從上面可以得到兩個(gè)結(jié)論:
l計(jì)數(shù)位數(shù)是16位:高8位THO(1)和低8位TL(1);
l計(jì)數(shù)參數(shù)(添入TH和TL)與計(jì)數(shù)初值的關(guān)系:X=216-N;//假設(shè)定時(shí)時(shí)間是50ms,即N=50000;則計(jì)數(shù)參數(shù)=65536-50000=15536。
附:計(jì)算THO(1)和低8位TL(1)初值// 假設(shè)延時(shí)時(shí)間為50ms
TH=(65536-50000)/256//求模
TL=(65536-50000)%256//求余
定時(shí)/計(jì)數(shù)器初始化程序應(yīng)完成如下工作:
l對(duì)TMOD賦值,以確定T0(1)的工作方式;
l計(jì)算初值,并將其寫入TH、TL;
l中斷方式時(shí),則對(duì)IE賦值,開放中斷;
l使TR0或TR1置位啟動(dòng)定時(shí)/計(jì)數(shù)器定時(shí)或計(jì)數(shù)。
定時(shí)程序模塊:
#include
void main()
{
TMOD=0x01;//定時(shí)器T0工作方式1
//送初值,定時(shí)為50ms。
TH0=(65536-50000)/256;
TL0=65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時(shí)器0中斷
TRO=0;//啟動(dòng)定時(shí)器0
}
評(píng)論