單片機學(xué)習(xí)筆記外部中斷,定時器,串口中斷
51有5個中斷源外部中斷0定時計數(shù)中斷0外部中斷1定時繼續(xù)中斷1串口中斷
MCS-51單片機中斷系統(tǒng)的結(jié)構(gòu):
本文引用地址:http://cafeforensic.com/article/201611/318702.htm5個中斷源的符號、名稱及產(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ù)以幀為單位,不要求雙方時鐘嚴(yán)格一致,實現(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年修訂的標(biāo)準(zhǔn),定義了數(shù)據(jù)終端設(shè)備DTE與數(shù)據(jù)通信設(shè)備DCE之間的物理結(jié)接口標(biāo)準(zhǔn)
RS232 規(guī)定用25針連接器,
一般有作用的是3跟線TXDRXDSGND
串口通訊要轉(zhuǎn)換電壓,開發(fā)板用的是MAX232把TTL電平轉(zhuǎn)換成RS232電平
此處有一個公式:
波特率=1/16或1/32*(晶振的頻率/12*(256-TH1))
代入:
9600=11059200/32*12*(256-TH1)
TH1=TH0=FDH
定時器為工作方式2可自動再裝載的8位波特率發(fā)生器
void InitUART (void)
{
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)
{
{
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!=