单片机定时器实验两位倒计时秒表_51单片机基础与应用8天速成(三)
在講授中斷這一概念時(shí),人們總是喜歡舉洗衣服燒水的例子:
話說,一天“你”獨(dú)自在家,為了泡腳給自己燒上了一壺水,然后想著明天沒有衣服穿了,就去陽臺(tái)洗起了衣服。過了十幾分鐘,“你”在陽臺(tái)洗著衣服,突然聽到了廚房燒水壺沸騰的鳴叫,所以,“你”放下洗了一半的衣服,去關(guān)閉了煤氣灶,接著又返回陽臺(tái)繼續(xù)洗衣服。在這個(gè)小故事中,如果我們把燒水和洗衣服分別看作兩個(gè)進(jìn)程,那么顯然,燒水壺沸鳴對(duì)應(yīng)的是中斷請(qǐng)求,洗衣服則是正常運(yùn)行的主進(jìn)程,高優(yōu)先級(jí)進(jìn)程通過向CPU提交中斷請(qǐng)求的方式,暫時(shí)中斷主進(jìn)程轉(zhuǎn)而運(yùn)行其他進(jìn)程,利用有限的CPU資源,盡可能的做到了對(duì)效率和實(shí)時(shí)性的兼顧。
在第一天的教程中曾經(jīng)提到過,我們會(huì)用三天的時(shí)間分別學(xué)習(xí)外部中斷、定時(shí)器/計(jì)數(shù)器中斷以及串口中斷,占據(jù)全部八天課程的三分之一還多,單單從課程安排上,大家就可以體會(huì)到中斷在單片機(jī)學(xué)習(xí)中的重要地位。
中斷的優(yōu)先級(jí)
當(dāng)有多個(gè)中斷同時(shí)被提交,那么CPU該選擇響應(yīng)哪個(gè)中斷呢?這要從中斷源的類型來分
單片機(jī)的中斷源分為三類:
外部中斷
定時(shí)器/計(jì)數(shù)器中斷
串口中斷
但單片機(jī)最基本的中斷源卻有5個(gè):
外部中斷0
定時(shí)器/計(jì)數(shù)器中斷0
外部中斷1
定時(shí)器/計(jì)時(shí)器中斷1
串口中斷
(排列即為他們的優(yōu)先級(jí))
豐富的中斷源可以大大提高單片機(jī)的便捷性,有些較新的單片機(jī)已經(jīng)擁有了8個(gè)中斷源,但本教程中只講單片機(jī)必備的5個(gè)中斷源的使用.
在洗衣燒水的小故事中,我們已經(jīng)意識(shí)到了優(yōu)先級(jí)這一概念的存在,高優(yōu)先級(jí)的中斷將被優(yōu)先執(zhí)行,且可以打斷低優(yōu)先級(jí)的中斷,反之則不能。5個(gè)中斷源的優(yōu)先級(jí)(或查詢次序)已經(jīng)被指定,在軟件編程中又有著相對(duì)應(yīng)的中斷號(hào)(0-4),軟件編程里的中斷號(hào)與中斷優(yōu)先級(jí)匹配正確,程序才能正常進(jìn)入中斷(程序中會(huì)再次講解)。
特殊功能寄存器
前面也曾講過,對(duì)單片機(jī)的編程,基本可以說是對(duì)單片機(jī)內(nèi)部寄存器的操作,五種中斷所涉及到的特殊寄存器以及各個(gè)位的功能講解如下:
IE寄存器(中斷允許控制寄存器)
IE:EAXXESET1EX1ET0EX0
其中,EA為總中斷允許位,ES為串口中斷允許位。
ET1、ET0分別是定時(shí)器/計(jì)數(shù)器1與定時(shí)、計(jì)數(shù)器0中斷允許位。
EX1、EX0為外部中斷1與外部中斷0中斷允許位。
可以看到,IE寄存器可以控制所有中斷的開關(guān),而且支持位尋址。
TCON寄存器(定時(shí)器/計(jì)數(shù)器控制寄存器)TCON:TF1TR1TF0TR0IE1IT1IE0IT0
其中,TF1、TF0分別為定時(shí)器T1/T0溢出標(biāo)志位,當(dāng)定時(shí)器溢出時(shí)狀態(tài)改變,無需手動(dòng)設(shè)置。
TR1/TR0分別為定時(shí)器1/定時(shí)器0中斷允許位
IE1/IE0分別為外部中斷請(qǐng)求標(biāo)志位,IT1/IT0分別設(shè)置兩個(gè)外部中斷源的觸發(fā)方式(0上升沿觸發(fā),1下降沿觸發(fā))。
TCON寄存器支持位尋址。
TMOD寄存器(定時(shí)器/計(jì)數(shù)器模式控制寄存器)
TMOD:GATEC/TM1M0GATEC/TM1M0
其中,GATE為門控制位,當(dāng)此位為1時(shí),外部中斷被觸發(fā)與定時(shí)器中斷允許位同時(shí)為1,才會(huì)開啟定時(shí)器/計(jì)數(shù)器。
兩個(gè)C/T位,分別是定時(shí)器/計(jì)數(shù)器1模式選擇位,0為定時(shí)器模式,1為計(jì)數(shù)器模式。
M1M0,設(shè)置定時(shí)器/計(jì)數(shù)器1/0工作方式,00為13位定時(shí)/計(jì)數(shù)器模式,01為16位定時(shí)器/計(jì)數(shù)器模式,10為8位定時(shí)/計(jì)數(shù)器自重裝模式(就是自動(dòng)歸零),11則是指將T0分為兩個(gè)8位定時(shí)/計(jì)數(shù)器,T1停止計(jì)數(shù)。
要注意的是,TMOD不支持位尋址,只能對(duì)整體賦值
T0寄存器組:TH0TL0
T1寄存器組:TH1TL1
以上兩種寄存器分別是定時(shí)/計(jì)數(shù)器的計(jì)數(shù)初值設(shè)定,TH是高八位,TL指低八位,這兩者共同控制定時(shí)器/計(jì)數(shù)器溢出的時(shí)間(在定時(shí)/計(jì)數(shù)器中斷一節(jié)會(huì)詳細(xì)講解)
從上面的總體介紹中,我們單獨(dú)提取外部中斷需要設(shè)置的寄存器:IE寄存器中的EA、EX,TCON中的IT1、IT0,同時(shí)需要接線P3^2、P3^3外部中斷引腳
接下來,我們將會(huì)在上次流水燈的項(xiàng)目基礎(chǔ)上,使用外部中斷的方式讓按鈕控制流水燈的切換
原理圖
本項(xiàng)目新增Button元件(按鈕),原理圖如下:
說明:
emm,沒什么特別好說的,看圖連接就行了,注意整潔美觀。
keli中的代碼
#include
#include
sbit k0 = P3^2;
sbit k1 = P3^3;
sbit LED = P2^0;
void IntInit()
{
EA = 1;//打開總中斷
IT0 = 1;//設(shè)置觸發(fā)方式為下降沿
EX0 = 1;
IT1 = 1;
EX1 = 1;
P0 = 0x01;
k0 = k1 = 1;
}
void main()
{
IntInit();
while(1);
}
void Int0() interrupt 0
{
if(k0 == 0)
{
P0=P0>>1;
}
if(P0==0x00)
{
P0 = 0x80;
}
}
void Int1() interrupt 2
{
LED = 0;
if(k1 == 0)
{
P0=P0<<1;
}
if(P0==0x00)
{
P0 = 0x01;
}
}
說明
說明:
1.頭文件中包含了很多匯編會(huì)用的操作,比如這個(gè)項(xiàng)目中使用的左移右移運(yùn)算,可以大大簡化代碼
2.IntInit()函數(shù)主要用來初始化外部中斷,其中語句的順序可以調(diào)換,可以依照自己的習(xí)慣或者記憶方式,自行設(shè)計(jì)安排。
3.void Int0() interrupt 0 、void Int1() interrupt 2分別對(duì)應(yīng)外部中斷0與外部中斷1,interrupt之后跟的數(shù)字就是我們之前說的優(yōu)先級(jí)標(biāo)號(hào),格式不能錯(cuò),編號(hào)一定一一對(duì)應(yīng),名字各自隨便修改(依照C語言命名規(guī)范),函數(shù)里面的內(nèi)容就是中斷后執(zhí)行的程序。
實(shí)驗(yàn)現(xiàn)象
分別按下兩個(gè)按鈕,可以觀察到LED燈向左/右接力閃爍,證明實(shí)驗(yàn)成功。
另外:
剩下兩天基礎(chǔ)課程的學(xué)習(xí)難度將會(huì)提升,定時(shí)器/計(jì)數(shù)器中斷以及串口中斷的學(xué)習(xí),將要比今天的課程難度提升不少
不過,穩(wěn)扎穩(wěn)打,多做實(shí)驗(yàn),你會(huì)發(fā)現(xiàn)也沒有什么大不了。加油!
總結(jié)
以上是生活随笔為你收集整理的单片机定时器实验两位倒计时秒表_51单片机基础与应用8天速成(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么画图片 wafer ma
- 下一篇: python中char的用法_如何从C+