新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 中斷和串口剖析

中斷和串口剖析

作者: 時間:2016-11-24 來源:網(wǎng)絡 收藏
以前對STC89C52單片機的串口中斷始終沒有深入的了解

今天沒什么事,就好好的琢磨了一下,前提是單片機開啟了串口中斷

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

1、先說串口接收數(shù)據(jù)中斷吧:當單片機串口接收到數(shù)據(jù)后,產(chǎn)生中斷,單片機跳到中斷程序中,可以選擇接收數(shù)據(jù)或者進行其他的操作,此時的串口數(shù)據(jù)可以作為控制信號,也可以僅僅是一個觸發(fā)動作,具體的操作根據(jù)中斷函數(shù)實現(xiàn)具體的功能。在中斷函數(shù)最后,需要將串口接收標志位RI清0。

2、發(fā)送中斷:當單片機向串口發(fā)送數(shù)據(jù)后,單片機產(chǎn)生串口發(fā)送中斷,同理,所發(fā)送的數(shù)據(jù)僅僅是出發(fā)中斷,中斷函數(shù)的具體功能和所發(fā)的數(shù)據(jù)沒有必然的關系,串口發(fā)送的作用是觸發(fā)中斷。同樣,不要忘了在最后將 TI 清0.

總的來講,在STC89C52中,串口發(fā)送和串口接收終端公用一個中斷源,需要在中斷函數(shù)中采用一個if...elseif...結構來判斷接收中斷標志位和發(fā)送中斷標志位根據(jù)判斷結果執(zhí)行相應的函數(shù)。

如果需要讀取串口數(shù)據(jù),則在中斷函數(shù)中將緩沖區(qū)的數(shù)據(jù)讀入單片機進行相應的處理,如果不需要對接收到的數(shù)據(jù)進行處理,那么此時串口僅僅是作為一個開關,作用就是出發(fā)中斷,然后用戶根據(jù)需要在中斷函數(shù)中進行相應的操作即可,串口發(fā)送總中斷也是這樣一個道理,只是通常我們都是將串口作為一個數(shù)據(jù)通道,中斷的作用是,在接收和發(fā)送數(shù)據(jù)的同時還可以根據(jù)需要進行相關的操作。

VB下計算機與單片機的通訊:

(1)PC端程序:

Private Sub Command1_Click()
Dim Num As Integer
Dim outbte(0) As Byte
Num = Val(Text1.Text)
outbte(0) = CByte(Num)
MSComm1.OutBufferCount = 0
MSComm1.Output = outbte
End Sub

Private Sub Command2_Click()
Unload Me
End Sub

Private Sub Form_Load()
MSComm1.RThreshold = 2
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
Dim indata As Variant
Dim bte(0) As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
indata = MSComm1.Input
bte(0) = AscB(indata)
Text2.Text = bte(0)
MSComm1.InBufferCount = 0
End Select
End Sub

(2)單片機程序

#include

sbit CW = P1^1;
sbit CK2 = P1^2;
sbit CK1 = P1^3;
sbit M1 = P1^4;
sbit M2 = P1^5;
sbit REFIN = P1^6;
int m = 0;


void main(void)
{
int k,n;
TMOD = 0x20;
TH0 = 0xEF;//ef;
TL0 = 0xFF;

EA = 1;
ET0 = 1;

TR0 = 1;


TH1 = 0xfd;
TL1 = 0xfd;

PCON = 0x00;
SCON = 0x50;
//REN = 1;
//SM2 = 0;

ET1 = 0;
ES = 1;

TR1 = 1;


REFIN = 0;
M1 = 1;
M2 = 0;
CK1 = 1;
CW = 1;
//n = 100;
while(1)
{
for(k = 0; k < 30000; k++);
SBUF = m;
//n--;
}
}


void CLK() interrupt 1
{
CK2 = !CK2;
TH0 = 0xEF;
TL0 = 0xFF;
m++;
}

void SERIAL() interrupt 4
{

//TI = 0;
}



關鍵詞: 中斷串口剖

評論


技術專區(qū)

關閉