日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯单片机基础学习00_2

發布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯单片机基础学习00_2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

三、功能模塊

4、中斷系統

中斷系統
1)中斷的概念:這是大家需要在腦子里有的一個印象,我們大致可以將中斷描述成CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程我們稱為中斷。
2)中斷源:我們將引起CPU中斷的根源或原因,稱為中斷源。中斷源向CPU提出的處理請求,稱為中斷請求或中斷申請。(傳統的51單片機有5個中斷源,而我們使用的IAP15有14個中斷源)
3)使用中斷我們一定要知道中斷優先級和中斷嵌套這兩個概念。
①中斷優先級:當有幾個中斷源同時申請中斷時,那么就存在CPU先響應哪個中斷請求的問題?為此,CPU要對各中斷源確定一個優先等級,稱為中斷優先級。中斷優先級高的中斷請求優先響應。
②中斷嵌套:中斷優先級高的中斷請求可以中斷CPU正在處理的優先級更低的中斷服務程序,待完成了中斷優先權高的中斷服務程序之后,再繼續執行被打斷的優先級低的中斷服務程序,這就是中斷嵌套。

我們使用的IAP15F2K61S2單片機的中斷系統有14個中斷源,2個優先級,可實現二級中斷服務嵌套。由片內特殊功能寄存器中的中斷允許寄存器IE、IE2、INT_CLKO控制CPU是否響應中斷請求;由中斷優先級寄存器IP、IIP2安排各中斷源的優先級;同一優先級內2個以上中斷同時提出中斷請求時,由內部的查詢邏輯確定其響應次序。

中斷請求標志:AP15F2K61S2單片機的10個中斷源的中斷請求標志分別寄存在TCON、SCON、PCON、S2CON、ADC_CONTR、SPSTAT、CCON中,其中,外部中斷2(/INT2)、外部中斷3(/INT3)和外部中斷4(/INT4)的中斷請求標志位被隱藏起來了,對用戶是不可見的。當相應的中斷被響應后或(EXn)=0(n=2、3、4),這些中斷請求標志位會自動被清0;定時器T2的中斷請求標志位也被隱藏起來了,對用戶是不可見的,當T2的中斷被響應后或(ET2)=0,這些中斷請求標志位會自動被清0。
IAP15F2K61S2單片機的中斷請求

中斷允許的控制:計算機中斷系統有兩種不同類型的中斷:一類稱為非屏蔽中斷,另一類稱為可屏蔽中斷。IAP15F2K61S2單片機的14個中斷源都是可屏蔽中斷,其中斷系統內部設有3個專用寄存器(IE、IE2、INT_CLKO)用于控制CPU對各中斷源的開放或屏蔽。

中斷優先的控制:IAP15F2K61S2單片機除外部中斷2(/INT2)、外部中斷3(/INT3)、定時器T2中斷和外部中斷4(/INT4)為固定最低優先級中斷外,其他中斷都具有2個中斷優先級,可實現二級中斷服務嵌套。IP、IP2為中斷優先級寄存器,鎖存各中斷源優先級控制位。

中斷源自然優先級從高到低排序
中斷源
外部中斷0
定時器T0
中斷
外部中斷1
定時器T1中斷
串行口中斷
A/D轉換中斷
LVD中斷
PCA中斷
串行口2中斷
SPI中斷
外部中斷2
外部中斷3
定時器T2中斷
外部中斷4

IAP15F2K61S2單片機中斷響應
中斷響應:是CPU對中斷源中斷請求的響應,包括保護斷點和將程序轉向中斷服務程序的入口地址(通常稱矢量地址)。CPU并非任何時刻都響應中斷請求,而是在中斷響應條件滿足之后才會響應。
中斷服務與中斷返回:中斷服務與中斷返回就是通過執行中斷服務程序完成的。中斷服務程序從中斷入口地址開始執行,到返回指令“RETI”為止,一般包括四部分內容,其結構是:保護現場,中斷服務,恢復現場、中斷返回。
保護現場:用入棧操作指令將需保護寄存器的內容壓入堆棧。
中斷服務:中斷服務程序的核心部分,是中斷源中斷請求之所在。
恢復現場:在中斷服務結束之后,中斷返回之前,用出棧操作指令將保護現場中壓入堆棧的內容彈回到相應的寄存器中,注意彈出順序必須與壓入順序相反。
中斷返回:中斷返回是指中斷服務完成后,計算機返回原來斷開的位置(即斷點),繼續執行原來的程序。中斷返回由中斷返回指令RETI來實現。

5、定時器/計數器(Timer0/1)

定時器(Timer0/1)
首先我們需要知道定時器Timer需要使用的寄存器有哪些:

我們先來簡單的說一下TMOD、 TCON兩個寄存器的功能和區別:
1)TMOD:就是運行模式配置寄存器,也就是配置定時器是工作在定時器狀態還是計數器狀態,以及定時器的工作模式是13位定時器,16位定時器,雙8位定時器自動重裝,還是雙8位定時器等等。
2)TCON:就是定時/計數器的控制寄存器,包括控制定時器的的啟動與停止,是否允許外部的中斷請求判斷定時器是否已經溢出等等。
簡而言之,一句話2個寄存器 一個是配置模式功能 一個是控制功能,具體的運用理解還需要大家多看多用。
定時器/計數器0/1控制寄存器TCON
TCON為定時器/計數器T0、T1的控制寄存器,同時也鎖存T0、T1溢出中斷源和外部請求中斷源等,TCON格式如下:
TCON為定時器/計數器中斷控制寄存器(可位尋址)

各寄存器功能

定時器/計數器0/1工作模式寄存器TMOD
定時和計數功能由特殊功能寄存器TMOD的控制位C/T進行選擇,TMOD寄存器的各位信息。

可以看出,2個定時/計數器有4鐘操作模式,通過TMOD的M1和M0選擇。2個定時/計數器模式0、1和2都相同,模式3不同,各模式下的功能請參見datasheet P593。
定時器0/1的中斷控制寄存器:IE和IP
IE:中斷允許寄存器(可位尋址)

EA:CPU的總中斷允許控制位,EA = 1,CPU開放中斷,EA = 0,CPU屏蔽所有的中斷申請。
ET1:定時/計數器T1的溢出中斷允許位,ET1 = 1,允許T1中斷,ET1 = 0禁止T1中斷。
ET0:同上。
IP:中斷優先級控制寄存器(可位尋址)

PT1: 定時器1中斷優先級控制位。
當PT1 = 0時,定時器1中斷為最低優先級中斷(優先級0)
當PT1 = 1時,定時器1中斷為最高優先級中斷(優先級1)
PT0: 定時器1中斷優先級控制位。
當PT0 = 0時,定時器0中斷為最低優先級中斷(優先級0)
當PT0 = 1時,定時器0中斷為最高優先級中斷(優先級1)
注意事項

輔助寄存器AUXR
普通8051單片機是12T的機器周期,STC15的是1T的這個輔助寄存器的功能就是用來選擇STC15工作在1T還是12T的模式下。

定時器/計數器0工作模式
通過對寄存器TMOD中的M1(TMOD.1)、(TMOD.0)的設置,定時器/計數器0有4種不同的工作模式。
模式0(16位自動重裝載模式)(只介紹該模式,其余三種模式見datasheet)

定時器/計數器0工作模式0(16位自動重裝載模式)
M1和M0:方式選擇控制位
C/ T:功能選擇位。
1:計數器功能(對T0或T1引腳的負跳變進行計數)。
0:定時器功能(對時鐘周期進行計數)。
GATE:門控位。GATE用于選通控制。
1:INTX為高電平且TRX置位時,啟動定時器工作。
0:每當TRX置位時,就啟動定時器工作。
注意:TMOD寄存器不能進行位尋址,設置時只 能對整個寄存器賦值。
IAP15F2K61S2的定時器有兩種計數速率:一種是12T模式,每12個時鐘加1;另一種是1T模式,每個時鐘加1。
T0和T1的速率分別由特殊功能寄存器AUXR中的T0x12和T1x12決定。
T0x12=0,T0工作在12T模式;
T0x12=1,T0工作在1T模式。
T1x12=0,T1工作在12T模式;
T1x12=1,T1則工作在1T模式。
定時器0和定時器1分別有2個隱藏的寄存器RL_THx和RL_TLx。RL_THx與THx共有同一個地址,RL_TLx與TLx共有同一個地址。當TRx=0即定時器/計數器被禁止工作時,對TLx、THx寫入的內容會同時寫入RL_TLx、RL_THx。 當TRx=1即定時器/計數器工作時,對TLx 、THx寫入的內容不會寫入RL_TLx 、RL_THx。
當定時器工作在模式0時,[TLx,THx]的溢出 不僅置位TFx,而且會自動將[RL_TLx,RL_THx] 的內容重新裝入[TLx,THx]。
當T0CLKO=1時,T1/P3.5引腳配置為定時器0的時鐘輸出CLKOUT0。
當T1CLKO=1時,T0/P3.4引腳配置為定時器1的時鐘輸出CLKOUT1。
詳細介紹

定時器的最大定時能力
當工作于定時狀態時,定時/計數器是對時鐘周期進行計數,若對時鐘進行12分頻,則對每12個時鐘周期計數一次。
當晶振頻率為6MHz,采用12分頻時,計數的單位時間為:
單位時間為:
定時時間為: TC=XTu。
其中,Tu為單位時間,TC為定時時間,X為所需計數次數。
STC15F2K60S2單片機的定時/計數器是加1計數器。因此,不能直接將實際的計數值作為計數初值送入計數寄存器THX、TLX中,而必須將實際計數值以28、216為模求補,以補碼作為計數初值設置THX和TLX。
即應裝入計數/定時器的初值為:,其中,n=8或16。
例如:已知Tu=2μs,要求定時TC=1ms,則
對方式0和方式1,時間常數為:216-500=65036=FE0CH (THX裝入FEH,TLX裝入0CH)。
設系統時鐘頻率為6MHz,12分頻時,
8位定時器的最大定時能力為:T=(28 -0)×2μs=512μs
16位定時器的最大定時能力為:T=(216 -0)×2μs=131072μs=131.072ms
最后補充一下,初學階段對定時器的使用可以直接使用我第一章中所講的方法直接自動生成所需定時器,用以程序使用,但是還是希望大家理解最重要。
以上是定時器的原理,接下來我們簡單運用定時器來寫個控制LED量滅的程序:

#include “stc15f2k60s2.h”#define LED P0unsigned char t;void Timer0Init(void);void main() {P2 = ((P2&0x1f)|0xA0); //不再重復解釋,前兩章已解釋多次P0 = 0X00;P2 = ((P2&0x1f)|0x80);P0 = 0Xff;//先關閉LEDTimer0Init();EA = 1; //打開定時器0ET0 = 1;while(1){if(t == 200){LED = ~LED;t = 0;//初始化標志位}} }void Timer0Init(void)//5毫秒@11.0592MHz {AUXR |= 0x80;//定時器時鐘1T模式TMOD &= 0xF0;//設置定時器模式TL0 = 0x00;//設置定時初值TH0 = 0x28;//設置定時初值TF0 = 0;//清除TF0標志TR0 = 1;//定時器0開始計時 }void Timer0() interrupt 1 //定時器0的開啟中斷1 {t++; }

6、靜態數碼管和動態數碼管

共陰/共陽數碼管
使用的是兩個4位八段共陽數碼管。

八段數碼管:八個發光二極管組成的如上圖的結構形態,
共陰數碼管:八個LED陰極相連組成公共端接GND,
共陽數碼管:八個LED陽極相連組成公共端接VCC。
4位八段數碼驅動原理:其中八個管腳作為(A,B,C,D,E,F,G,DP)的驅動端口,選擇哪一段數碼管亮或不亮,我們稱之為數碼管段選,還有4個管腳作為選擇四位數碼管中的哪一位亮或不亮的驅動端口,也就是四個公共端,我們稱之為數碼管位選。
驅動原理

圖中a1、b1……dp1就是數碼管的段選端口,com1、com2……com8就是數碼管的位選端口,我們可以看到,藍橋杯開發板的數碼管段選和位選都是通過單片機的P0寄存器來驅動的,但是因為P0不能同一時刻既做段選又做位選,所以這里就要在一個很短的時間內在段選和位選之間切換選擇操作。
靜態數碼管數碼管所有公共端接GND或VCC,在該開發板上不是接GND和VCC而是接在兩個573三態鎖存器上,全亮全滅不單獨選擇端口操作。優點:不閃爍,亮度高。缺點:占用端口多。
示例程序:

/******************//* 數碼管程序示例 *//******************/ #include “stc15f2k60s2.h” #define uchar unsigned char #define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; /*這里如果不加code,就會占用寄存器,允許讀取和修改寄存器的值, 但是寄存器的數量有限,故我們在這里加上code,將其定義為代碼的 類型,只能讀取不能修改*/ uchar t = 0,i;void Timer0Init(void);void main() {P2 = ((P2&0x1f)|0xa0);//不再重復解釋,前兩章已解釋多次P0 = 0x00;P2 = ((P2&0x1f)|0xc0);//打開位選選573P0 = 0xff;//選擇8位數碼管P2 = ((P2&0x1f)|0xff);//打開段選573Timer0Init();EA=1;ET0=1;while(1){if(t == 100){t = 0;P0 = tab[i];i++;if(i == 12)i = 0;}} }void Timer0Init(void)//5毫秒@11.0592MHz {AUXR |= 0x80;//定時器時鐘1T模式TMOD &= 0xF0;//設置定時器模式TL0 = 0x00;//設置定時初值TH0 = 0x28;//設置定時初值TF0 = 0;//清除TF0標志TR0 = 1;//定時器0開始計時 }void Timer0() interrupt 1 {t++; }

動態數碼管
數碼管公共端依次掃描接通。優點:占用端口少。缺點:攝像,拍照時閃爍,在同樣電壓下與靜態相比,亮度較低。示例程序:

#include "stc15f2k60s2.h" #include "intrins.h"#define uchar unsigned char #define uint unsigned intuchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f}; /*這里如果不加code,就會占用寄存器,允許讀取和修改寄存器的值, 但是寄存器的數量有限,故我們在這里加上code,將其定義為代碼的 類型,只能讀取不能修改*/ uchar t = 0; uchar c5, c6, c7, c8; uint num = 2330;void Timer0Init(void); void display(uchar c5, uchar c6, uchar c7, uchar c8); void Delay1ms();void main() {P2 = ((P2&0x1f)|0xa0);//不再重復解釋,前兩章已解釋多次P0 = 0x00;Timer0Init();EA=1;ET0=1;while(1){if(t == 200){t = 0;num--;c5 = (num / 1000) % 10;c6 = (num / 100) % 10;c7 = (num /10) % 10;c8 = num % 10;}display(c5, c6, c7, c8);} }void display(uchar c5, uchar c6, uchar c7, uchar c8) {P2 = ((P2&0x1f)|0xc0);P0 = 0x80;P2 = ((P2&0x1f)|0xff);P0 = tab[c8];Delay1ms();P2 = ((P2&0x1f)|0xc0);P0 = 0x40;P2 = ((P2&0x1f)|0xff);P0 = tab[c7];Delay1ms();P2 = ((P2&0x1f)|0xc0);P0 = 0x20;P2 = ((P2&0x1f)|0xff);P0 = tab[c5];Delay1ms();P2 = ((P2&0x1f)|0xc0);P0 = 0x10;P2 = ((P2&0x1f)|0xff);P0 = tab[c6];Delay1ms(); }

定時器中斷實現實時時鐘程序

使用單片機定時器制作一個以00-00-00模式顯示,可以通過四個獨立按鍵進行時間修改的24小時制時鐘。
定時器、中斷、數碼管、按鍵等功能

#include "stc15f2k60s2.h" #define uchar unsigned char #define uint unsigned sbit key1=P3^0;//定義端口參數 sbit key2=P3^1; sbit key3=P3^2; sbit key4=P3^3; /*key1用于小時 +1key2用于小時 -1key3用于分鐘 +1key4用于分鐘 -1 */int uchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xbf,0x7f}; uchar strtab[8];//定義緩沖區域 uchar hour = 10, minute = 25, second = 12; //初始化起始時間10-25-12void display(void); void delayms(int ms); void Timer0Init(void); void Timer1Init(void);void main() {P2 = ((P2&0x1f)|0xa0);P0 = 0x00;Timer0Init();Timer1Init();ET0 = 1;//開啟定時器0ET1 = 1;//同上EA = 1;//定時器使能display();while(1){if (!key1){delayms(5);//按鍵消抖if (!key1){hour++;if (hour == 24)hour = 0;display();while(!key1);//松手檢測}}//其余三個按鍵功能請自行編寫,如遇問題請下載參考源程序} }void display(void) {strtab[0] = tab[hour / 10];strtab[1] = tab[hour % 10];strtab[2] = tab[10];strtab[3] = tab[minute % 10];strtab[4] = tab[minute % 10];strtab[5] = tab[10];strtab[6] = tab[second / 10];strtab[7] = tab[second % 10]; }void delayms(int ms) {int i,j;for(i=ms;i>0;i--)for(j=845;j>0;j--); }void Timer0Init(void) //5毫秒@11.0592MHz //內容請自行計算void Timer1Init(void) //1毫秒@11.0592MHz //內容請自行計算void Timer1_int() interrupt 3 using 0 {static uchar num;TH1 = 0xcd;TL1 = 0xd4;switch(num)//分別調用緩沖區的值進行掃描{case 0: P2 = ((P2&0x1f)|0xc0); P0 = 0x01;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;case 1: P2 = ((P2&0x1f)|0xc0); P0 = 0x02;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;case 2: P2 = ((P2&0x1f)|0xc0); P0 = 0x04;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;case 3: P2 = ((P2&0x1f)|0xc0); P0 = 0x08;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;case 4: P2 = ((P2&0x1f)|0xc0); P0 = 0x10;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;case 5: P2 = ((P2&0x1f)|0xc0); P0 = 0x20;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;case 6: P2 = ((P2&0x1f)|0xc0); P0 = 0x40;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;case 7: P2 = ((P2&0x1f)|0xc0); P0 = 0x80;P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;default:break;}num++;if (num == 8)num = 0; } void Timer0_int() interrupt 1 using 1 {static uchar count;//定義內部靜態變量TL0 = 0x00; //初始化初值TH0 = 0x28;<count++;switch (count);{case 0:case 40:case 80:case 120:case 160:display();break;}if (count == 200){count = 0;second++;//加一秒if (second == 60){second = 0;minute++;//加一分if (minute == 60){minute = 0;hour++;//加一小時if (hour == 24)hour = 0;}}} }

習題:使用單片機定時器制作一個以00-00-00為初始可以通過四個獨立按鍵進行時間修改的24小時制時鐘。

總結

以上是生活随笔為你收集整理的蓝桥杯单片机基础学习00_2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。