




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
定時(shí)開(kāi)關(guān)控制器
相關(guān)知識(shí)與實(shí)踐一、顯示
1、基礎(chǔ)知識(shí)
2、靜態(tài)顯示案例一
3、動(dòng)態(tài)顯示案例二二、按鍵
1、鍵盤(pán)接口
2、獨(dú)立按鍵案例三、四
3、行列按鍵案例五、六三、單片機(jī)應(yīng)用
1、數(shù)組
2、中斷
3、定時(shí)器4、案例七四、拓展部分
51單片機(jī)常識(shí)
輔助任務(wù)
難點(diǎn)、問(wèn)題分析
小結(jié)難點(diǎn)、問(wèn)題分析1、數(shù)組2、地址的形成3、特殊功能寄存器(SFR)4、中斷(定時(shí)器)
八段LED顯示塊基礎(chǔ)知識(shí)--數(shù)碼顯示共陰結(jié)構(gòu)共陽(yáng)結(jié)構(gòu)基礎(chǔ)知識(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顯示器基礎(chǔ)知識(shí)--數(shù)碼顯示
四位靜態(tài)LED顯示器電路靜態(tài)數(shù)碼顯示每一個(gè)數(shù)碼管的顯示筆畫(huà)都要占用單獨(dú)的具有鎖存功能的I/O接口。即需N×8個(gè)I/O控制線靜態(tài)顯示數(shù)碼管相應(yīng)筆段一直處于點(diǎn)亮狀態(tài),因此功耗大,而且占用硬件資源多,幾乎只能用在顯示位數(shù)極少的場(chǎng)合。優(yōu)點(diǎn):LED亮度高,可用在室外顯示場(chǎng)合。程序工作量小。例如:靜態(tài)顯示技術(shù)靜態(tài)顯示技術(shù)案例一顯示601111101P2=0X7DDPabcdefg1在proteus上畫(huà)出如下電路圖.2在keil中編制程序,要求能顯示學(xué)號(hào)最后4位數(shù).3運(yùn)行程序,觀察電路中數(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動(dòng)態(tài)顯示器電路
動(dòng)態(tài)數(shù)碼顯示所有數(shù)碼管的8個(gè)筆畫(huà)段同名端連在一起,公共端各自獨(dú)立。即需N+8個(gè)I/O控制線動(dòng)態(tài)顯示是多只數(shù)碼管共享段碼線,通過(guò)位選線(公共端)逐位逐位分時(shí)進(jìn)行掃描顯示(任時(shí)刻只有一只點(diǎn)亮)。其優(yōu)點(diǎn)是占用硬件資源少,功耗小。軟件工作量大.
必須注意:掃描周期必須控制在視覺(jué)停頓時(shí)間內(nèi),一般在20ms以?xún)?nèi),否則會(huì)出現(xiàn)閃爍或跳動(dòng)現(xiàn)象。最為廣泛的一種顯示方式。動(dòng)態(tài)顯示技術(shù)首先掃描最后掃描動(dòng)態(tài)顯示技術(shù)_案例二1在proteus上畫(huà)出如下電路圖.2在keil中編制程序,要求能顯示學(xué)號(hào)最后8位數(shù).3運(yùn)行程序,觀察電路中數(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上畫(huà)出如下電路圖.2在keil中編制程序,要求能顯示學(xué)號(hào)最后8位數(shù).3運(yùn)行程序,觀察電路中數(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ù)組長(zhǎng)度要給出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(); }}輔助任務(wù)一設(shè)計(jì)兩位數(shù)的十進(jìn)制減法顯示電路原理圖并編制程序.二設(shè)計(jì)電子時(shí)鐘顯示(時(shí)-分-秒)電路原理圖并編制程序.三設(shè)計(jì)用數(shù)碼顯示8只LED循環(huán)次數(shù),顯示的范圍為0-99.減法運(yùn)算顯示#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ù)組長(zhǎng)度要給出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時(shí)間間隔不能長(zhǎng)
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顯示時(shí)鐘顯示#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ù)組長(zhǎng)度要給出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(); }}時(shí)分秒顯示#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(); }}時(shí)分秒顯示#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,時(shí)間間隔不能長(zhǎng)
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;} }}時(shí)分秒顯示根據(jù)實(shí)驗(yàn)電路圖.在keil中編制程序,實(shí)現(xiàn)數(shù)碼管顯示LED循環(huán)點(diǎn)亮的次數(shù).數(shù)組概念數(shù)組的本質(zhì)則是一系列的數(shù)據(jù)元素(變量)。該數(shù)組中若干個(gè)元素必須是同一個(gè)類(lèi)的。對(duì)象數(shù)組的定義、賦值和引用和普通數(shù)組相同。
1.數(shù)組的定義
數(shù)組定義格式如下:
<類(lèi)名><數(shù)組名>[<大小>]...
其中,<類(lèi)名>指出該數(shù)組元素是屬于該類(lèi)的對(duì)象,方括號(hào)內(nèi)的<大小>給出某一維的元素個(gè)數(shù)。一維對(duì)象數(shù)組只有一個(gè)方括號(hào),二維對(duì)象數(shù)組要有兩個(gè)方括號(hào),等等,例如:datadates[7];
表明dates是一維對(duì)象數(shù)組名,該數(shù)組有7個(gè)元素,每個(gè)元素都是類(lèi)data的對(duì)象。
2.對(duì)象數(shù)組的賦值
對(duì)象數(shù)組能夠被賦初值,也能在程序中被賦值(除code類(lèi))。例如codeadd[3]={0x3f,0x06,0x4f};數(shù)組應(yīng)用(查表程序)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進(jìn)制0-F鍵盤(pán)接口技術(shù)1、鍵盤(pán)消抖2、鍵盤(pán)形式軟件去抖動(dòng)
前沿抖動(dòng)穩(wěn)定后沿抖動(dòng)
按鍵抖動(dòng)信號(hào)波形鍵盤(pán)消抖即檢測(cè)出鍵閉合后執(zhí)行一個(gè)延時(shí)程序,產(chǎn)生5ms~10ms的延時(shí),讓前沿抖動(dòng)消失后再一次檢測(cè)鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。鍵盤(pán)消抖硬件消抖:如RC濾波電路鍵盤(pán)消抖硬件消抖:如雙穩(wěn)態(tài)電路:RS觸發(fā)器為常用的硬件消抖電路。CD鍵盤(pán)的形式有以下兩種:獨(dú)立式鍵盤(pán)行列式鍵盤(pán)2、鍵盤(pán)的形式獨(dú)立式鍵盤(pán)結(jié)構(gòu)每一個(gè)按鍵的電路是獨(dú)立的,占用一條I/O數(shù)據(jù)線1在proteus上畫(huà)出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運(yùn)行程序,觀察電路中數(shù)碼管顯示.4用本圖實(shí)現(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上畫(huà)出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運(yùn)行程序,觀察電路中數(shù)碼管顯示.拓展題行列式鍵盤(pán)結(jié)構(gòu)每一個(gè)按鍵的電路是由行列組成,每一個(gè)按鍵占用兩條I/O數(shù)據(jù)線。當(dāng)鍵盤(pán)按下時(shí),相應(yīng)的行列線呈現(xiàn)短路。求鍵的位置(行、列)若D1=0,則D5=0假定S6按下求鍵的位置(行、列)假定S7按下若D1=0,則D5=?只有D2=0,則D5=0掃描原理:首先確定是否有鍵閉合(消抖,再判)然后逐一掃描以進(jìn)一步確定是哪一鍵閉合
(用編碼方式,找出唯一)
以4×4鍵盤(pán)為例:
(1)判斷是否有鍵按下:使列線D0~D3都輸出0,檢測(cè)行線D4~D7的電平。如果D4~D7上的電平全為高,則表示沒(méi)有鍵被按下。如果D4~D7上的電平不全為高,則表示有鍵被按下。(2)掃面按鍵鍵值:如果有鍵閉合,進(jìn)行逐列掃描,找出閉合鍵的鍵號(hào)。行列式鍵盤(pán)的工作原理unsignedcharI;全局變量voidScankey(){ unsignedcharN,m,L; P1=P1&0Xf0;//列全送低電平
delay(1);//等低電平穩(wěn)定
while((P1|0X0f)!=0Xff){ delay(2);//有按鍵,延時(shí)
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ù)行列信息,鍵盤(pán)處理程序
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))//判斷列號(hào)
{kcode=row+4*col;//求出具體的按鍵號(hào)
disp=table[kcode];P2=disp;//顯示
break;}}while(rowkey()!=0);delay(10);}scan=(scan<<1)|0x01;//這個(gè)掃描信號(hào)用來(lái)判斷行號(hào)
}}voidmain(){while(1){scanner();}}左邊程序?yàn)樾辛墟I盤(pán)、數(shù)碼顯示程序。要求:分析程序功能,畫(huà)出原理圖,調(diào)試,并修正程序。1在proteus上畫(huà)出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運(yùn)行程序,觀察電路中數(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上畫(huà)出如下電路圖.2在keil中編制程序,要求能顯示按鍵數(shù)值.3運(yùn)行程序,觀察電路中數(shù)碼管顯示.4在本圖上編程實(shí)現(xiàn)鍵控99-0倒計(jì)數(shù)秒顯示案例五、六根據(jù)本圖實(shí)現(xiàn)定時(shí)開(kāi)關(guān)控制器(用中斷)編程參考程序見(jiàn)書(shū)MCS系列單片機(jī):以8XC51表示,X不同片內(nèi)ROM類(lèi)型不同。注:X=0,類(lèi)型為:ROMX=7,類(lèi)型為:EPROM(電寫(xiě)入,紫外線擦除)X=9,類(lèi)型為:FLSAHROM(電改寫(xiě))
支持ISP(InSystemProgramming)在系統(tǒng)/線中編程
IAP(InApplicationProgramming)應(yīng)用中編程51子系列和52子系列
“51”是基本,“52”是增強(qiáng):?jiǎn)纹瑱C(jī)芯片51子系列和52子系列單片機(jī)的區(qū)別片內(nèi)ROM:4K增加到8K片內(nèi)RAM:128B增加到256B定時(shí)器:2個(gè)增加到3個(gè)中斷源:5個(gè)增加到6個(gè)MCS-51單片機(jī)結(jié)構(gòu)內(nèi)部數(shù)據(jù)區(qū)內(nèi)部數(shù)據(jù)存儲(chǔ)器物理上分為兩大區(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ū)別:前者不能定義絕對(duì)地址。如:sbitT1_1=P1^1;MCS-51單片機(jī)的外部擴(kuò)展性能MCS-51單片機(jī)的片外總線結(jié)構(gòu)
MCS-51系列單片機(jī)片外引腳可以構(gòu)成三總線結(jié)構(gòu):地址總線(AB)數(shù)據(jù)總線(DB)控制總線(CB)所有外部芯片都通過(guò)這三組總線進(jìn)行擴(kuò)展。三總線的概念:地址總線——AB,P0口提供(A7~A0);
P2口提供(A15~A8),共16位。數(shù)據(jù)總線——DB,P0口提供(D7~D0),共8位。控制總線——CB,ALE、、、、等。單片機(jī)總線引腳結(jié)構(gòu)
日常中斷的例子返回
你正在專(zhuān)心看書(shū),突然電話鈴響,于是你記下正在看的書(shū)的頁(yè)數(shù),去接電話,接完電話后再回來(lái)接著看書(shū)。時(shí)間
計(jì)算機(jī)中的中斷概念返回定義:中斷是指由于某種隨機(jī)事件的發(fā)生,計(jì)算機(jī)暫停現(xiàn)行程序的運(yùn)行,轉(zhuǎn)去執(zhí)行另一程序(處理發(fā)生的事件),處理完畢后又自動(dòng)返回原來(lái)程序暫停的位置繼續(xù)運(yùn)行。將能引起中斷的事件稱(chēng)為中斷源。CPU現(xiàn)行運(yùn)行的程序稱(chēng)為主程序。處理隨機(jī)事件的程序稱(chēng)為中斷服務(wù)子程序。
中斷技術(shù)的優(yōu)點(diǎn)提高工作效率
——CPU可以同多個(gè)外設(shè)“同時(shí)”工作實(shí)時(shí)處理
——CPU及時(shí)處理隨機(jī)事件(智能技術(shù))故障處理
——電源掉電、存儲(chǔ)出錯(cuò)、運(yùn)算溢出
中斷處理過(guò)程
中斷處理過(guò)程分為三個(gè)階段:中斷響應(yīng)、中斷處理和中斷返回。中斷響應(yīng)中斷處理(又稱(chēng)中斷服務(wù))
中斷返回
中斷請(qǐng)求撤除中斷響應(yīng)中斷返回MCS-51中斷系統(tǒng)中斷源中斷標(biāo)志中斷允許中斷優(yōu)先級(jí)中斷寄存器(主要為5個(gè)學(xué)習(xí)重點(diǎn))
MCS-51的中斷系統(tǒng)——中斷源8051單片機(jī)有5個(gè)中斷請(qǐng)求源:?jiǎn)纹瑱C(jī)INT0或
外部輸入中斷源INT0(P3.2)INT1或
外部輸入中斷源INT1(P3.3)T0
定時(shí)/記數(shù)器T0的溢出T1
定時(shí)/記數(shù)器T1的溢出串行口
片內(nèi)串行口發(fā)送或接收中斷源
MCS-51的中斷系統(tǒng)——中斷標(biāo)志
每一個(gè)中斷源都有相應(yīng)的中斷標(biāo)志位;某一個(gè)中斷源申請(qǐng)中斷,相應(yīng)中斷標(biāo)志位置1。特殊功能寄存器(SFR)IE
中斷允許SFRIP
中斷優(yōu)先SFRTCON
中斷控制SFRTMOD
定時(shí)器方式SFRSCON
串行口控制SFR(SBUF串行口緩沖SFR)單片機(jī)中斷響應(yīng)條件
中斷源有中斷請(qǐng)求;此中斷源的中斷允許位為1;
CPU開(kāi)中斷(即EA=1)。以上三條同時(shí)滿(mǎn)足時(shí),CPU才有可能響應(yīng)中斷。中斷請(qǐng)求的撤除
CPU響應(yīng)某中斷請(qǐng)求后,在中斷返回前,應(yīng)該撤除該中斷請(qǐng)求,否則會(huì)引起另一次中斷。
定時(shí)器0或1溢出:CPU在響應(yīng)中斷后,硬件清除了有關(guān)的中斷請(qǐng)求標(biāo)志TFO或TF1,即中斷請(qǐng)求是自動(dòng)撤除的。
外部中斷:CPU在響應(yīng)中斷后,也是用硬件自動(dòng)清除有關(guān)的中斷請(qǐng)求標(biāo)志IE0或IE1。
串行口中斷:CPU響應(yīng)中斷后,沒(méi)有用硬件清除T1、R1,故這些中斷不能自動(dòng)撤除,而要靠軟件來(lái)清除相應(yīng)的標(biāo)志。C51中斷程序設(shè)計(jì)的完整語(yǔ)法如下:void函數(shù)名interruptn[usingm]
m、n為正整數(shù),不允許使用表達(dá)式。n取值范圍0~5,對(duì)應(yīng)該中斷源的編號(hào)。通常對(duì)普通8051系列單片機(jī)來(lái)說(shuō),外部中斷0、定時(shí)器0、外部中斷1、定時(shí)器1、串口的中斷源編號(hào)依次為0、1、2、3、4。m取值范圍0~3。例如:
voidserial_serviceinterrupt4using2{……;}KeilC51編譯器用特定的編譯器指令分配寄存器組。當(dāng)前工作寄存器由using指定,“using”后的變量為一個(gè)0~3的整數(shù)。“using”只允許用于中斷函數(shù),它在中斷函數(shù)入口處將當(dāng)前寄存器組保留,并在中斷程序中使用指定的寄存器組,在函數(shù)退出前恢復(fù)原寄存器組。
中斷舉例程序#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上畫(huà)出如下電路圖.2在keil中編制程序,要求能對(duì)應(yīng)LED顯示按鍵按下的次數(shù)值(累計(jì)).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; //計(jì)數(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í)/記數(shù)1、0溢出中斷允許EX1、EX0外部中斷1、0允許76543210SFR
MCS-51的中斷系統(tǒng)——中斷允許INT0INT1T0T1串口IE0TF0IE1TF1TIRI中斷源中斷標(biāo)志位
EA——總中斷允許位,EA=1開(kāi)放所有中斷,EA=0,禁止所有中斷;某一個(gè)中斷源還有相應(yīng)的中斷允許位,1允許相應(yīng)中斷源的中斷,0禁止相應(yīng)中斷源的中斷。中斷允許IEESET0EX0EX1ET1EA
51單片機(jī)有兩個(gè)中斷優(yōu)先級(jí)——高級(jí)和低級(jí)專(zhuān)用寄存器IP為中斷優(yōu)先級(jí)寄存器,用戶(hù)可用軟件設(shè)定相應(yīng)位為1,對(duì)應(yīng)的中斷源被設(shè)置為高優(yōu)先級(jí),相應(yīng)位為0,對(duì)應(yīng)的中斷源被設(shè)置為低優(yōu)先級(jí)系統(tǒng)復(fù)位時(shí),均為低優(yōu)先級(jí)
PSPT1PX1PT0PX0MCS-51的中斷系統(tǒng)——中斷寄存器
IP
76543210IP寄存器——中斷優(yōu)先級(jí)寄存器SFR
MCS-51的中斷系統(tǒng)——中斷優(yōu)先級(jí)INT0INT1T0T1串口中斷源
單片機(jī)中有兩個(gè)中斷優(yōu)先級(jí),即高優(yōu)先級(jí)中斷和低優(yōu)先級(jí)中斷,前者優(yōu)先權(quán)高于后者(在程序中設(shè)置,IP相應(yīng)位=1,為高優(yōu)先級(jí));同一優(yōu)先級(jí)別的中斷源按照自然優(yōu)先級(jí)順序確定優(yōu)先級(jí)別(硬件形成,無(wú)法改變)。自然優(yōu)先級(jí)高低優(yōu)先控制IPPSPT0PX0PX1PT1
同一優(yōu)先級(jí)(IP)中的中斷申請(qǐng)不止一個(gè)時(shí),則有中斷優(yōu)先權(quán)排隊(duì)問(wèn)題。同一優(yōu)先級(jí)的中斷優(yōu)先權(quán)排隊(duì),由中斷系統(tǒng)硬件確定的自然優(yōu)先級(jí)形成,其排列如所示:MCS-51的中斷系統(tǒng)——中斷寄存器TF1
TR1TF0
TR0IE1IT1IE0IT0TCON
T1溢出中斷標(biāo)志(TCON.7):
T1啟動(dòng)計(jì)數(shù)(TR1=1)后,計(jì)滿(mǎn)溢出由硬件置位TF1=1,向CPU請(qǐng)求中斷,此標(biāo)志一直保持到CPU響應(yīng)中斷后,才由硬件自動(dòng)清0。也可用軟件查詢(xún)?cè)摌?biāo)志,并由軟件清0。(同樣T0在TR0=1,TF0的狀態(tài)處理)76543210TCON寄存器——T0和T1控制寄存器SFRTF1
TR1TF0
TR0IE1IT1IE0IT0TCON外部中斷INT1中斷標(biāo)志位(TCON.3):
IE1=1,外部中斷INT1向CPU申請(qǐng)中斷
外部中斷INT1觸發(fā)方式控制位(TCON.2):
IT1=0,電平觸發(fā)方式
IT1=1,下降沿觸發(fā)方式76543210TCON寄存器——T0和T1控制寄存器(同理外部中斷INT0)TMODD7D6D5D4D3D2D1D0GATA
M1M0GATAM1M0←T1方式字段→←T0方式字段→GATE——門(mén)控位。
GATE=0啟動(dòng)不受/INT0或/INT1的控制;
GATE=1啟動(dòng)受
/INT0或
/INT1的控制。
C/T——外部計(jì)數(shù)器/定時(shí)器方式選擇位
C/T=0定時(shí)方式;
C/T=1計(jì)數(shù)方式。
M1M0——工作模式選擇位(編程可決定四種工作模式)。
SFR(1)定時(shí)/計(jì)數(shù)器的工作方式M1M0——工作模式選擇位(編程可決定四種工作模式)0013位定時(shí)/計(jì)數(shù)器模式00116位定時(shí)/計(jì)數(shù)器模式108位定時(shí)/計(jì)數(shù)器(自動(dòng)重裝初值)模式211T08位定時(shí)/計(jì)數(shù)模式3T1停止工作
串行口控制寄存器SCONSM0、SM1:控制串行口的工作方式。SM2:允許方式2和方式3進(jìn)行多機(jī)通信控制位。REN:允許串行接收控制位。REN=1,允許接收。TB8:是工作在方式2和方式3時(shí)要發(fā)送的第9位數(shù)據(jù),根據(jù)需要由軟件置位和復(fù)位。RB8:是工作在方式2和方式3時(shí)接收到的第9位數(shù)據(jù)。TI:發(fā)送中斷標(biāo)志位。必須由軟件清零。RI:接收中斷標(biāo)志位。必須由軟件清零。返回
TI(SCON.1)——串行發(fā)送中斷標(biāo)志。
RI(SCON.0)——串行接收中斷標(biāo)志。
TIRIMCS-51的中斷系統(tǒng)——中斷寄存器SCON76543210SCON寄存器——串行口控制寄存器SFR返回
TI(SCON.1)——串行發(fā)送中斷標(biāo)志。
RI(SCON.0)——串行接收中斷標(biāo)志。
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中斷服務(wù)程序的注意事項(xiàng):1)為提高中斷響應(yīng)的實(shí)時(shí)性,中斷服務(wù)程序應(yīng)盡量簡(jiǎn)短,并避免使用復(fù)雜變量類(lèi)型及復(fù)雜算術(shù)運(yùn)算。通常在中斷服務(wù)程序中使用一些標(biāo)志,由主程序或相應(yīng)背景程序根據(jù)對(duì)應(yīng)的標(biāo)志作相應(yīng)的處理。
2)外部中斷0、1及定時(shí)器0、1的中斷申請(qǐng)標(biāo)志在CPU響應(yīng)中斷后會(huì)自動(dòng)清0,但串行口中斷標(biāo)志TI/RI及定時(shí)器2的中斷申請(qǐng)標(biāo)志TF2不會(huì)自動(dòng)清0,必須在中斷服務(wù)程序中用軟件清0,否則
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年慶祝婦女節(jié)活動(dòng)方案
- 高三上學(xué)期誠(chéng)實(shí)考試主題班會(huì)課件
- 2025年電子式熱過(guò)載繼電器項(xiàng)目可行性研究報(bào)告
- 2025年電化鋁包裝材料項(xiàng)目可行性研究報(bào)告
- 商丘師范學(xué)院《衛(wèi)生微生物學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海民航職業(yè)技術(shù)學(xué)院《新媒體產(chǎn)品設(shè)計(jì)與項(xiàng)目管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 洛陽(yáng)文化旅游職業(yè)學(xué)院《中醫(yī)體質(zhì)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東省濟(jì)寧市濟(jì)寧一中2025屆高考生物試題模擬(三診)試題含解析
- 湖南省新化縣2025屆初三下學(xué)期3月練習(xí)卷化學(xué)試題試卷含解析
- 湖北中醫(yī)藥大學(xué)《經(jīng)濟(jì)學(xué)原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 改裝店管理制度
- 醫(yī)療器械生產(chǎn)企業(yè)質(zhì)量控制與成品放行指南
- 常見(jiàn)腫瘤AJCC分期手冊(cè)第八版(中文版)
- 高考新課標(biāo)Ⅰ卷語(yǔ)文現(xiàn)代文閱讀Ⅰ試題《后真相時(shí)代》講評(píng)課件41張
- 幼兒英語(yǔ)卡片-食物系列
- 恒力石化(惠州)有限公司通用碼頭項(xiàng)目竣工驗(yàn)收?qǐng)?bào)告
- rpa財(cái)務(wù)機(jī)器人實(shí)訓(xùn)總結(jié)1000字
- 設(shè)備供應(yīng)進(jìn)度計(jì)劃供貨進(jìn)度及保證方案1
- 幼兒疾病預(yù)防與照護(hù)(嬰幼兒照護(hù))PPT完整全套教學(xué)課件
- 日本動(dòng)漫產(chǎn)業(yè)的發(fā)展歷程及其特點(diǎn)
- 新能源汽車(chē)火災(zāi)事故處置程序及方法
評(píng)論
0/150
提交評(píng)論