定時開關控制器課件_第1頁
定時開關控制器課件_第2頁
定時開關控制器課件_第3頁
定時開關控制器課件_第4頁
定時開關控制器課件_第5頁
已閱讀5頁,還剩92頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

定時開關控制器

相關知識與實踐一、顯示

1、基礎知識

2、靜態(tài)顯示案例一

3、動態(tài)顯示案例二二、按鍵

1、鍵盤接口

2、獨立按鍵案例三、四

3、行列按鍵案例五、六三、單片機應用

1、數(shù)組

2、中斷

3、定時器4、案例七四、拓展部分

51單片機常識

輔助任務

難點、問題分析

小結難點、問題分析1、數(shù)組2、地址的形成3、特殊功能寄存器(SFR)4、中斷(定時器)

八段LED顯示塊基礎知識--數(shù)碼顯示共陰結構共陽結構基礎知識--數(shù)碼顯示共陰數(shù)碼:假定Px.0-a,Px.1-b,Px.2-c,Px.3-d,Px.4-e,Px.5-f,Px.6-g,Px.7-dp則從Px口,送0x3f,顯示0,送0x06,顯示1

送0x5b,顯示2,送0x4f,顯示3

送0x66,顯示4,送0x6d,顯示5

送0x7d,顯示6,送0x07,顯示7

送0x7f,顯示8,送0x6f,顯示9

N位LED顯示器基礎知識--數(shù)碼顯示

四位靜態(tài)LED顯示器電路靜態(tài)數(shù)碼顯示每一個數(shù)碼管的顯示筆畫都要占用單獨的具有鎖存功能的I/O接口。即需N×8個I/O控制線靜態(tài)顯示數(shù)碼管相應筆段一直處于點亮狀態(tài),因此功耗大,而且占用硬件資源多,幾乎只能用在顯示位數(shù)極少的場合。優(yōu)點:LED亮度高,可用在室外顯示場合。程序工作量小。例如:靜態(tài)顯示技術靜態(tài)顯示技術案例一顯示601111101P2=0X7DDPabcdefg1在proteus上畫出如下電路圖.2在keil中編制程序,要求能顯示學號最后4位數(shù).3運行程序,觀察電路中數(shù)碼管顯示.#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D;voidmain(){ Led_D=0x0800;*Led_D=0x6f;//9

Led_D=0x0900;*Led_D=0x5b;//2Led_D=0x0a00;*Led_D=0x06;//1Led_D=0x0b00;*Led_D=0x3f;//0

while(1);}

八位LED動態(tài)顯示器電路

動態(tài)數(shù)碼顯示所有數(shù)碼管的8個筆畫段同名端連在一起,公共端各自獨立。即需N+8個I/O控制線動態(tài)顯示是多只數(shù)碼管共享段碼線,通過位選線(公共端)逐位逐位分時進行掃描顯示(任時刻只有一只點亮)。其優(yōu)點是占用硬件資源少,功耗小。軟件工作量大.

必須注意:掃描周期必須控制在視覺停頓時間內(nèi),一般在20ms以內(nèi),否則會出現(xiàn)閃爍或跳動現(xiàn)象。最為廣泛的一種顯示方式。動態(tài)顯示技術首先掃描最后掃描動態(tài)顯示技術_案例二1在proteus上畫出如下電路圖.2在keil中編制程序,要求能顯示學號最后8位數(shù).3運行程序,觀察電路中數(shù)碼管顯示.(注意:換位前先清段碼)#include<reg51.h>#defineucharunsignedcharvoiddelay(){ uchari; for(i=0;i<100;i++);}voidmain(){ while(1) {P2=0Xfe;P0=0X7f;delay();//8

P2=0Xfd;P0=0X06;delay();//1P2=0Xfb;P0=0X5b;delay();//2P2=0Xf7;P0=0X4f;delay();//3P2=0Xef;P0=0X66;delay();//4P2=0Xdf;P0=0X6d;delay();//5P2=0Xbf;P0=0X7d;delay();//6P2=0X7f;P0=0X07;delay();//7}}P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;消除拖尾重影現(xiàn)象#include<reg52.h>#defineucharunsignedcharcodeuchardisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};voiddelay(){ uchari; for(i=0;i<100;i++);}voidmain(){ while(1) {P2=Tab[7];P0=display[8];delay();//8

P2=Tab[6];P0=display[1];delay();//1P2=Tab[5];P0=display[2];delay();//2P2=Tab[4];P0=display[3];delay();//3P2=Tab[3];P0=display[4];delay();//4P2=Tab[2];P0=display[5];delay();//5P2=Tab[1];P0=display[6];delay();//6P2=Tab[0];P0=display[7];delay();//7

}}P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];使用數(shù)組1在proteus上畫出如下電路圖.2在keil中編制程序,要求能顯示學號最后8位數(shù).3運行程序,觀察電路中數(shù)碼管顯示.(注意:換位前先清段碼)#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];//數(shù)組長度要給出voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){*Led_D=0;*Led_W=Tab[i];*Led_D=led[i];delay();}voidmain(){ led[0]=display[0];led[1]=display[1];led[2]=display[2];led[3]=display[3];led[4]=display[4];led[5]=display[5]; led[6]=display[6];led[7]=display[7];

while(1){display(); }}輔助任務一設計兩位數(shù)的十進制減法顯示電路原理圖并編制程序.二設計電子時鐘顯示(時-分-秒)電路原理圖并編制程序.三設計用數(shù)碼顯示8只LED循環(huán)次數(shù),顯示的范圍為0-99.減法運算顯示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;

ucharled[8];//數(shù)組長度要給出voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){ *Led_D=0; *Led_W=Tab[i];*Led_D=led[i]; delay(); }}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y; *Led_D=0; *Led_W=0xff; led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10];bzie=0;} display(); }}X-Y=Z顯示#include<reg52.h>#include<absacc.h>#defineucharunsignedchar#defineLed_DXBYTE[0xc000]#defineLed_WXBYTE[0xc800]ucharcodedisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};ucharcodeTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];bitbzie=1;voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){ Led_D=0; Led_W=Tab[i];Led_D=led[i]; delay(); }}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y;

Led_D=0; Led_W=0xff; led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10]; bzie=0; } display(); }}X-Y=Z顯示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;inti;ucharled[8];

voiddisplay()interrupt1{ TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;

if(i==8)i=0;*Led_D=0; *Led_W=Tab[i];*Led_D=led[i];i++;}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y;

TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;//1ms時間間隔不能長

i=0;IE=0x82;TMOD=0x01;TCON=0x10;led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10];bzie=0;} }}X-Y=Z顯示時鐘顯示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;

unsignedintx=0;ucharled[8];//數(shù)組長度要給出voiddelay(){ uchari; for(i=0;i<100;i++);if((++x)==1000){x=0;bzie=1;}}voiddisplay(){ inti;for(i=0;i<8;i++){*Led_D=0; *Led_W=Tab[i];*Led_D=led[i]; delay(); }}voidmain(){ unsignedinthour=0,mit=0,sec=0; *Led_D=0; *Led_W=0xff; led[2]=display_code[10];led[5]=display_code[10]; while(1){ if(bzie){

if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}} led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10];bzie=0;} display(); }}時分秒顯示#include<reg52.h>#include<absacc.h>#defineucharunsignedchar#defineLed_DXBYTE[0xc000]#defineLed_WXBYTE[0xc800]ucharcodedisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};ucharcodeTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];bitbzie=1;unsignedintx=0;

voiddelay(){ uchari; for(i=0;i<100;i++);if((++x)==1000){x=0;bzie=1;}}voiddisplay(){ inti;for(i=0;i<8;i++){ Led_D=0; Led_W=Tab[i];Led_D=led[i]; delay(); }}voidmain(){ unsignedinthour=0,mit=0,sec=0;

Led_D=0; Led_W=0xff; led[2]=display_code[10];led[5]=display_code[10]; while(1){ if(bzie){

if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}}

led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10]; bzie=0; } display(); }}時分秒顯示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;inti;ucharled[8];unsignedintx=0;

voiddisplay()interrupt1{ TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;

if(i==8)i=0;*Led_D=0; *Led_W=Tab[i];*Led_D=led[i];i++;if((++x)==1000){x=0;bzie=1;}}voidmain(){ unsignedinthour=0,mit=0,sec=0;

TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;//1ms,時間間隔不能長

i=0;IE=0x82;TMOD=0x01;TCON=0x10;led[2]=display_code[10];led[5]=display_code[10]; while(1) {if(bzie){

if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}}

led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10];bzie=0;} }}時分秒顯示根據(jù)實驗電路圖.在keil中編制程序,實現(xiàn)數(shù)碼管顯示LED循環(huán)點亮的次數(shù).數(shù)組概念數(shù)組的本質(zhì)則是一系列的數(shù)據(jù)元素(變量)。該數(shù)組中若干個元素必須是同一個類的。對象數(shù)組的定義、賦值和引用和普通數(shù)組相同。

1.數(shù)組的定義

數(shù)組定義格式如下:

<類名><數(shù)組名>[<大小>]...

其中,<類名>指出該數(shù)組元素是屬于該類的對象,方括號內(nèi)的<大小>給出某一維的元素個數(shù)。一維對象數(shù)組只有一個方括號,二維對象數(shù)組要有兩個方括號,等等,例如:datadates[7];

表明dates是一維對象數(shù)組名,該數(shù)組有7個元素,每個元素都是類data的對象。

2.對象數(shù)組的賦值

對象數(shù)組能夠被賦初值,也能在程序中被賦值(除code類)。例如codeadd[3]={0x3f,0x06,0x4f};數(shù)組應用(查表程序)codeunsignedcharLEDMAP[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchari;unsignedcharLED;………….LED=LEDMAP[i];//i取值0-15或16進制0-F鍵盤接口技術1、鍵盤消抖2、鍵盤形式軟件去抖動

前沿抖動穩(wěn)定后沿抖動

按鍵抖動信號波形鍵盤消抖即檢測出鍵閉合后執(zhí)行一個延時程序,產(chǎn)生5ms~10ms的延時,讓前沿抖動消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認為真正有鍵按下。鍵盤消抖硬件消抖:如RC濾波電路鍵盤消抖硬件消抖:如雙穩(wěn)態(tài)電路:RS觸發(fā)器為常用的硬件消抖電路。CD鍵盤的形式有以下兩種:獨立式鍵盤行列式鍵盤2、鍵盤的形式獨立式鍵盤結構每一個按鍵的電路是獨立的,占用一條I/O數(shù)據(jù)線1在proteus上畫出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運行程序,觀察電路中數(shù)碼管顯示.4用本圖實現(xiàn)鍵控0-9秒表程序案例三、四

if((P1=P1|0x55)!=0xff){delay();if((P1=P1|0x55)==0xfd)*pled=0x06;if((P1=P1|0x55)==0xf7)*pled=0x5b;if((P1=P1|0x55)==0xdf)*pled=0x4f;if((P1=P1|0x55)==0x7f)*pled=0x66;}1在proteus上畫出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運行程序,觀察電路中數(shù)碼管顯示.拓展題行列式鍵盤結構每一個按鍵的電路是由行列組成,每一個按鍵占用兩條I/O數(shù)據(jù)線。當鍵盤按下時,相應的行列線呈現(xiàn)短路。求鍵的位置(行、列)若D1=0,則D5=0假定S6按下求鍵的位置(行、列)假定S7按下若D1=0,則D5=?只有D2=0,則D5=0掃描原理:首先確定是否有鍵閉合(消抖,再判)然后逐一掃描以進一步確定是哪一鍵閉合

(用編碼方式,找出唯一)

以4×4鍵盤為例:

(1)判斷是否有鍵按下:使列線D0~D3都輸出0,檢測行線D4~D7的電平。如果D4~D7上的電平全為高,則表示沒有鍵被按下。如果D4~D7上的電平不全為高,則表示有鍵被按下。(2)掃面按鍵鍵值:如果有鍵閉合,進行逐列掃描,找出閉合鍵的鍵號。行列式鍵盤的工作原理unsignedcharI;全局變量voidScankey(){ unsignedcharN,m,L; P1=P1&0Xf0;//列全送低電平

delay(1);//等低電平穩(wěn)定

while((P1|0X0f)!=0Xff){ delay(2);//有按鍵,延時

if((P1|0X0f)!=0Xff){//再判,有按鍵

L=0X01;//第一列

for(m=0;m<4;m++){//共四列

P1=~L;//送m列零

delay(1);if((N=

P1&0Xf0)!=0Xf0){I=N|L;return;}//返回行列信息

L<<=1;}//下一列送低電平

}

}}switch(I){//根據(jù)行列信息,鍵盤處理程序

case0x

:….;break;case0x

:…..;break;default:…….;break;}P1

高4位(.7,.6,.5,.4)為行,輸入低4位(.3,.2,.1,.0)為列,輸出#include"reg52.h"#defineuncharunsignedchar#defineunintunsignedint#definerowkey()(~P3)&0x0funcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//數(shù)碼管代碼unchardisp=0xff;voiddelay(unintt){unintx,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}voidscanner(){uncharcol,row,scan,keyin,kcode;scan=0xef;for(col=0;col<4;col++){P3=scan;P2=disp;keyin=rowkey();if(keyin!=0){for(row=0;row<4;row++){if(keyin==(0x01<<row))//判斷列號

{kcode=row+4*col;//求出具體的按鍵號

disp=table[kcode];P2=disp;//顯示

break;}}while(rowkey()!=0);delay(10);}scan=(scan<<1)|0x01;//這個掃描信號用來判斷行號

}}voidmain(){while(1){scanner();}}左邊程序為行列鍵盤、數(shù)碼顯示程序。要求:分析程序功能,畫出原理圖,調(diào)試,并修正程序。1在proteus上畫出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運行程序,觀察電路中數(shù)碼管顯示.提示逐列掃描參考:P1_4=0;P1_5=1;P1_6=1;P1_7=1; if(P1_0==0)P0=0X3F; //KEY0 if(P1_1==0)P0=0X06; //KEY1 if(P1_2==0)P0=0X..; //KEY2 if(P1_3==0)P0=0X..; //KEY3P1_4=1;P1_5=0;P1_6=1;P1_7=1; if(P1_0==0)P0=0X..; //KEY4 if(P1_1==0)P0=0X..; //KEY5 if(P1_2==0)P0=0X..; //KEY6 if(P1_3==0)P0=0X..; //KEY7P1_4=1;P1_5=1;P1_6=0;P1_7=1; if(P1_0==0)P0=0X..; //KEY8 if(P1_1==0)P0=0X..; //KEY9 if(P1_2==0)P0=0X..; //KEY- if(P1_3==0)P0=0X..; //KEY+P1_4=1;P1_5=1;P1_6=1;P1_7=0; if(P1_0==0)P0=0X..; //KEY= if(P1_1==0)P0=0X..; //KEY* if(P1_2==0)P0=0X..; //KEY/ if(P1_3==0)P0=0X..; //KEY

1在proteus上畫出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運行程序,觀察電路中數(shù)碼管顯示.4在本圖上編程實現(xiàn)鍵控99-0倒計數(shù)秒顯示案例五、六根據(jù)本圖實現(xiàn)定時開關控制器(用中斷)編程參考程序見書MCS系列單片機:以8XC51表示,X不同片內(nèi)ROM類型不同。注:X=0,類型為:ROMX=7,類型為:EPROM(電寫入,紫外線擦除)X=9,類型為:FLSAHROM(電改寫)

支持ISP(InSystemProgramming)在系統(tǒng)/線中編程

IAP(InApplicationProgramming)應用中編程51子系列和52子系列

“51”是基本,“52”是增強:單片機芯片51子系列和52子系列單片機的區(qū)別片內(nèi)ROM:4K增加到8K片內(nèi)RAM:128B增加到256B定時器:2個增加到3個中斷源:5個增加到6個MCS-51單片機結構內(nèi)部數(shù)據(jù)區(qū)內(nèi)部數(shù)據(jù)存儲器物理上分為兩大區(qū)域:00H~7FH即128B內(nèi)RAM區(qū)

80H~FFH即SFR區(qū)(idatasbitbit)。R0、R1、R2、R3、R4、R5、R6、R7(using0~3)即可位尋址,又可字節(jié)尋址(bitsbitbdatadataidata)數(shù)據(jù)緩沖區(qū)、堆棧區(qū)、工作單元(dataidata)bit與sbit區(qū)別:前者不能定義絕對地址。如:sbitT1_1=P1^1;MCS-51單片機的外部擴展性能MCS-51單片機的片外總線結構

MCS-51系列單片機片外引腳可以構成三總線結構:地址總線(AB)數(shù)據(jù)總線(DB)控制總線(CB)所有外部芯片都通過這三組總線進行擴展。三總線的概念:地址總線——AB,P0口提供(A7~A0);

P2口提供(A15~A8),共16位。數(shù)據(jù)總線——DB,P0口提供(D7~D0),共8位??刂瓶偩€——CB,ALE、、、、等。單片機總線引腳結構

日常中斷的例子返回

你正在專心看書,突然電話鈴響,于是你記下正在看的書的頁數(shù),去接電話,接完電話后再回來接著看書。時間

計算機中的中斷概念返回定義:中斷是指由于某種隨機事件的發(fā)生,計算機暫?,F(xiàn)行程序的運行,轉去執(zhí)行另一程序(處理發(fā)生的事件),處理完畢后又自動返回原來程序暫停的位置繼續(xù)運行。將能引起中斷的事件稱為中斷源。CPU現(xiàn)行運行的程序稱為主程序。處理隨機事件的程序稱為中斷服務子程序。

中斷技術的優(yōu)點提高工作效率

——CPU可以同多個外設“同時”工作實時處理

——CPU及時處理隨機事件(智能技術)故障處理

——電源掉電、存儲出錯、運算溢出

中斷處理過程

中斷處理過程分為三個階段:中斷響應、中斷處理和中斷返回。中斷響應中斷處理(又稱中斷服務)

中斷返回

中斷請求撤除中斷響應中斷返回MCS-51中斷系統(tǒng)中斷源中斷標志中斷允許中斷優(yōu)先級中斷寄存器(主要為5個學習重點)

MCS-51的中斷系統(tǒng)——中斷源8051單片機有5個中斷請求源:單片機INT0或

外部輸入中斷源INT0(P3.2)INT1或

外部輸入中斷源INT1(P3.3)T0

定時/記數(shù)器T0的溢出T1

定時/記數(shù)器T1的溢出串行口

片內(nèi)串行口發(fā)送或接收中斷源

MCS-51的中斷系統(tǒng)——中斷標志

每一個中斷源都有相應的中斷標志位;某一個中斷源申請中斷,相應中斷標志位置1。特殊功能寄存器(SFR)IE

中斷允許SFRIP

中斷優(yōu)先SFRTCON

中斷控制SFRTMOD

定時器方式SFRSCON

串行口控制SFR(SBUF串行口緩沖SFR)單片機中斷響應條件

中斷源有中斷請求;此中斷源的中斷允許位為1;

CPU開中斷(即EA=1)。以上三條同時滿足時,CPU才有可能響應中斷。中斷請求的撤除

CPU響應某中斷請求后,在中斷返回前,應該撤除該中斷請求,否則會引起另一次中斷。

定時器0或1溢出:CPU在響應中斷后,硬件清除了有關的中斷請求標志TFO或TF1,即中斷請求是自動撤除的。

外部中斷:CPU在響應中斷后,也是用硬件自動清除有關的中斷請求標志IE0或IE1。

串行口中斷:CPU響應中斷后,沒有用硬件清除T1、R1,故這些中斷不能自動撤除,而要靠軟件來清除相應的標志。C51中斷程序設計的完整語法如下:void函數(shù)名interruptn[usingm]

m、n為正整數(shù),不允許使用表達式。n取值范圍0~5,對應該中斷源的編號。通常對普通8051系列單片機來說,外部中斷0、定時器0、外部中斷1、定時器1、串口的中斷源編號依次為0、1、2、3、4。m取值范圍0~3。例如:

voidserial_serviceinterrupt4using2{……;}KeilC51編譯器用特定的編譯器指令分配寄存器組。當前工作寄存器由using指定,“using”后的變量為一個0~3的整數(shù)?!皍sing”只允許用于中斷函數(shù),它在中斷函數(shù)入口處將當前寄存器組保留,并在中斷程序中使用指定的寄存器組,在函數(shù)退出前恢復原寄存器組。

中斷舉例程序#include<reg51.h>#defineucharunsignedcharsbitkey1=P1^0;sbitkey2=P1^2;sbitkey3=P1^4;sbitkey4=P1^6;sbitkled1=P3^4;sbitkled2=P3^5;sbitkled3=P3^6;sbitkled4=P3^7;ucharnkey1=0,nkey2=0,nkey3=0,nkey4=0,nkey;codeuchardis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};codeucharwie[]={0x01,0x02};ucharled[2];voiddelay(){ uchark;for(k=0;k<250;k++);}voidkey()interrupt0{kled1=1;kled2=1;kled3=1;kled4=1;if(key1==0){nkey1++;nkey=nkey1;kled1=0;}if(key2==0){nkey2++;nkey=nkey2;kled2=0;}if(key3==0){nkey3++;nkey=nkey3;kled3=0;}if(key4==0){nkey4++;nkey=nkey4;kled4=0;}led[1]=nkey/10;led[0]=nkey%10;}voidmain(){ucharii; IE=0X81;IP=0X0;TCON=0X01;while(1){for(ii=0;ii<2;ii++){P0=0x00;P2=wie[ii];P0=dis[led[ii]]; delay(); }}}1在proteus上畫出如下電路圖.2在keil中編制程序,要求能對應LED顯示按鍵按下的次數(shù)值(累計).Key1Key2key3123#include<reg51.h>#defineucharunsignedcharuchardisplayD[2];//顯示段碼緩沖單元ucharcodedisplayW[]={0x01,0x02};//顯示位碼ucharcodedisplayB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbitled1=P1^0;sbitled2=P1^1;sbitled3=P1^2;//LED顯示uchari=0,key=0;ucharNUMW=0,NUMC=0,NUMG=0; //計數(shù)初值

voiddisW()interrupt0using1 // led1{ if((++NUMW)==100)NUMW=0;key=0x01;}voiddisG()interrupt2using1 // led2{ if((++NUMC)==100)NUMC=0; key=0x02;}voiddisC()interrupt3using1 // led3{ if((++NUMG)==100)NUMG=0;TH1=0xff;TL1=0xff; key=0x03;}voiddispllay()interrupt1using2 //顯示程序{TH0=(65536-10*11059/12)/256;//10MSTL0=(65536-10*11059/12)%256;P0=0x00;P2=displayW[i];P0=displayD[i];if(++i==2)i=0;}voidmain(){ IE=0x8f;TMOD=0x51;TH1=0xff;TL1=0xff;IP=0x02;TH0=(65536-10*11059/12)/256;//10msTL0=(65536-10*11059/12)%256;TCON=0x55; //下降沿觸發(fā)0x50電平觸發(fā)

led1=0;led2=0;led3=0;P2=0x0ff; displayD[0]=0x3f;displayD[1]=0x3f; while(1) { switch (key){case0x01:displayD[1]=displayB[NUMW/10];displayD[0]=displayB[NUMW%10];led1=1;led2=0;led3=0;break;case0x02:displayD[1]=displayB[NUMC/10];displayD[0]=displayB[NUMC%10];led1=0;led2=1;led3=0;break;case0x03:displayD[1]=displayB[NUMG/10];displayD[0]=displayB[NUMG%10];led1=0;led2=0;led3=1;break; default:break; } }}MCS-51的中斷系統(tǒng)——中斷寄存器

IE

EA

ESET1EX1ET0EX0

IE寄存器——中斷允許寄存器EA中斷允許總控位ES串行通訊中斷允許ET1、ET0定時/記數(shù)1、0溢出中斷允許EX1、EX0外部中斷1、0允許76543210SFR

MCS-51的中斷系統(tǒng)——中斷允許INT0INT1T0T1串口IE0TF0IE1TF1TIRI中斷源中斷標志位

EA——總中斷允許位,EA=1開放所有中斷,EA=0,禁止所有中斷;某一個中斷源還有相應的中斷允許位,1允許相應中斷源的中斷,0禁止相應中斷源的中斷。中斷允許IEESET0EX0EX1ET1EA

51單片機有兩個中斷優(yōu)先級——高級和低級專用寄存器IP為中斷優(yōu)先級寄存器,用戶可用軟件設定相應位為1,對應的中斷源被設置為高優(yōu)先級,相應位為0,對應的中斷源被設置為低優(yōu)先級系統(tǒng)復位時,均為低優(yōu)先級

PSPT1PX1PT0PX0MCS-51的中斷系統(tǒng)——中斷寄存器

IP

76543210IP寄存器——中斷優(yōu)先級寄存器SFR

MCS-51的中斷系統(tǒng)——中斷優(yōu)先級INT0INT1T0T1串口中斷源

單片機中有兩個中斷優(yōu)先級,即高優(yōu)先級中斷和低優(yōu)先級中斷,前者優(yōu)先權高于后者(在程序中設置,IP相應位=1,為高優(yōu)先級);同一優(yōu)先級別的中斷源按照自然優(yōu)先級順序確定優(yōu)先級別(硬件形成,無法改變)。自然優(yōu)先級高低優(yōu)先控制IPPSPT0PX0PX1PT1

同一優(yōu)先級(IP)中的中斷申請不止一個時,則有中斷優(yōu)先權排隊問題。同一優(yōu)先級的中斷優(yōu)先權排隊,由中斷系統(tǒng)硬件確定的自然優(yōu)先級形成,其排列如所示:MCS-51的中斷系統(tǒng)——中斷寄存器TF1

TR1TF0

TR0IE1IT1IE0IT0TCON

T1溢出中斷標志(TCON.7):

T1啟動計數(shù)(TR1=1)后,計滿溢出由硬件置位TF1=1,向CPU請求中斷,此標志一直保持到CPU響應中斷后,才由硬件自動清0。也可用軟件查詢該標志,并由軟件清0。(同樣T0在TR0=1,TF0的狀態(tài)處理)76543210TCON寄存器——T0和T1控制寄存器SFRTF1

TR1TF0

TR0IE1IT1IE0IT0TCON外部中斷INT1中斷標志位(TCON.3):

IE1=1,外部中斷INT1向CPU申請中斷

外部中斷INT1觸發(fā)方式控制位(TCON.2):

IT1=0,電平觸發(fā)方式

IT1=1,下降沿觸發(fā)方式76543210TCON寄存器——T0和T1控制寄存器(同理外部中斷INT0)TMODD7D6D5D4D3D2D1D0GATA

M1M0GATAM1M0←T1方式字段→←T0方式字段→GATE——門控位。

GATE=0啟動不受/INT0或/INT1的控制;

GATE=1啟動受

/INT0或

/INT1的控制。

C/T——外部計數(shù)器/定時器方式選擇位

C/T=0定時方式;

C/T=1計數(shù)方式。

M1M0——工作模式選擇位(編程可決定四種工作模式)。

SFR(1)定時/計數(shù)器的工作方式M1M0——工作模式選擇位(編程可決定四種工作模式)0013位定時/計數(shù)器模式00116位定時/計數(shù)器模式108位定時/計數(shù)器(自動重裝初值)模式211T08位定時/計數(shù)模式3T1停止工作

串行口控制寄存器SCONSM0、SM1:控制串行口的工作方式。SM2:允許方式2和方式3進行多機通信控制位。REN:允許串行接收控制位。REN=1,允許接收。TB8:是工作在方式2和方式3時要發(fā)送的第9位數(shù)據(jù),根據(jù)需要由軟件置位和復位。RB8:是工作在方式2和方式3時接收到的第9位數(shù)據(jù)。TI:發(fā)送中斷標志位。必須由軟件清零。RI:接收中斷標志位。必須由軟件清零。返回

TI(SCON.1)——串行發(fā)送中斷標志。

RI(SCON.0)——串行接收中斷標志。

TIRIMCS-51的中斷系統(tǒng)——中斷寄存器SCON76543210SCON寄存器——串行口控制寄存器SFR返回

TI(SCON.1)——串行發(fā)送中斷標志。

RI(SCON.0)——串行接收中斷標志。

TIRIMCS-51的中斷系統(tǒng)——中斷寄存器SCON76543210SCON寄存器——串行口控制寄存器SFR#include<reg51.h>#defineucharunsignedcharsbitkey1=P1^0;sbitkey2=P1^2;sbitkey3=P1^4;sbitkey4=P1^6;sbitkled1=P3^4;sbitkled2=P3^5;sbitkled3=P3^6;sbitkled4=P3^7;ucharnkey1=0,nkey2=0,nkey3=0,nkey4=0,nkey;codeuchardis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};codeucharwie[]={0x01,0x02};ucharled[2];voiddelay(){ uchark;for(k=0;k<250;k++);}voidkey()interrupt0{kled1=1;kled2=1;kled3=1;kled4=1;if(key1==0){nkey1++;nkey=nkey1;kled1=0;}if(key2==0){nkey2++;nkey=nkey2;kled2=0;}if(key3==0){nkey3++;nkey=nkey3;kled3=0;}if(key4==0){nkey4++;nkey=nkey4;kled4=0;}led[1]=nkey/10;led[0]=nkey%10;}voidmain(){ucharii; IE=0X81;IP=0X0;TCON=0X01;while(1){for(ii=0;ii<2;ii++){P0=0x00;P2=wie[ii];P0=dis[led[ii]]; delay(); }}}C51中斷服務程序的注意事項:1)為提高中斷響應的實時性,中斷服務程序應盡量簡短,并避免使用復雜變量類型及復雜算術運算。通常在中斷服務程序中使用一些標志,由主程序或相應背景程序根據(jù)對應的標志作相應的處理。

2)外部中斷0、1及定時器0、1的中斷申請標志在CPU響應中斷后會自動清0,但串行口中斷標志TI/RI及定時器2的中斷申請標志TF2不會自動清0,必須在中斷服務程序中用軟件清0,否則

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論