新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機學(xué)習(xí)筆記外部中斷,定時器,串口中斷

單片機學(xué)習(xí)筆記外部中斷,定時器,串口中斷

作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
CPU收到中斷請求,停下正在處理的工作A,去處理事件B,處理完后繼續(xù)回到中斷的地方繼續(xù)執(zhí)行事件A的過程,稱為中斷

51有5個中斷源外部中斷0定時計數(shù)中斷0外部中斷1定時繼續(xù)中斷1串口中斷

MCS-51單片機中斷系統(tǒng)的結(jié)構(gòu):

本文引用地址:http://butianyuan.cn/article/201611/318702.htm

5個中斷源的符號、名稱及產(chǎn)生的條件如下。

INT0:外部中斷0,由P3.2端口線引入,低電平或下跳沿引起。

INT1:外部中斷1,由P3.3端口線引入,低電平或下跳沿引起。

T0:定時器/計數(shù)器0中斷,由T0計滿回零引起。

T1:定時器/計數(shù)器l中斷,由T1計滿回零引起。

TI/RI:串行I/O中斷,串行端口完成一幀字符發(fā)送/接收后引起。





外部中斷 引腳P3.2 P3.3

EA=1; //全局中斷開
EX0=1; //外部中斷0開
IT0=0; //0為低電平觸發(fā) 1為下降沿觸發(fā)

void ISR_Key(void) interrupt 0 using 1
{
P1=~P1; //進入中斷程序執(zhí)行程序,
//此時可以通過 EA=0指令暫時關(guān)掉中斷
}



定時計數(shù)器 引腳P3.4 P3.5 引腳做計數(shù)功能

void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=0x00; //給定初值,這里使用定時器最大值從0開始計數(shù)一直到65535溢出
TL0=0x00;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關(guān)打開
}


void Timer0_isr(void) interrupt 1
{
TH0=0x00; //重新賦值
TL0=0x00;

LED=~LED; //指示燈反相,可以看到閃爍

}


串口通訊
并行通訊 控制簡單 8位數(shù)據(jù)線一個詢問線 一個應(yīng)答線
線多用于短距離速度快的通訊 對硬件要求高
串口通訊線少用于長距離傳送成本低數(shù)據(jù)一位一位的發(fā)送

異步通訊指發(fā)送與接收設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收的過程起始位0 + 8位數(shù)據(jù)位 + 結(jié)束位1
數(shù)據(jù)以幀為單位,不要求雙方時鐘嚴格一致,實現(xiàn)容易,設(shè)備開銷小,傳輸效率不高

單工:單方向傳送,例如遙控器
半雙工:同一時間只能一方發(fā)一方收,例如對講機
全雙工:可以同時數(shù)據(jù)雙向傳送。手發(fā)不影響。

奇偶效驗:奇校驗:0000 0001 0偶校驗:0000 00011
代碼和校驗:發(fā)送一塊數(shù)據(jù),多產(chǎn)生一個字節(jié)的校驗字符,在代碼末尾,
比特率:美妙傳送的二進制代碼的位數(shù),單位是位/秒(bps)
例如:每秒傳送240個字符, 0 1111 1111 1 10*240=2400bps

RS232是EIA美國電子工業(yè)協(xié)會1969年修訂的標準,定義了數(shù)據(jù)終端設(shè)備DTE與數(shù)據(jù)通信設(shè)備DCE之間的物理結(jié)接口標準
RS232 規(guī)定用25針連接器,
一般有作用的是3跟線TXDRXDSGND


串口通訊要轉(zhuǎn)換電壓,開發(fā)板用的是MAX232把TTL電平轉(zhuǎn)換成RS232電平















方式1,3的波特率=1/32或1/16*計時器2的溢出率
此處有一個公式:
波特率=1/16或1/32*(晶振的頻率/12*(256-TH1))
代入:
9600=11059200/32*12*(256-TH1)
TH1=TH0=FDH

定時器為工作方式2可自動再裝載的8位波特率發(fā)生器

void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打開
EA = 1; //打開總中斷
//ES = 1; //打開串口中斷
}

void main (void)
{
InitUART();
while (1)
{
SendStr("UART test,技術(shù)論壇: thank you!");
DelayMs(240);//延時循環(huán)發(fā)送
DelayMs(240);
}
}
/*------------------------------------------------
發(fā)送一個字節(jié)
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/*------------------------------------------------
發(fā)送一個字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!=