×
嵌入式 > 技术百科 > 详情

中断和串口剖析

发布时间:2020-06-05 发布时间:
|
以前对STC89C52单片机的串口中断始终没有深入的了解

今天没什么事,就好好的琢磨了一下,前提是单片机开启了串口中断

1、先说串口接收数据中断吧:当单片机串口接收到数据后,产生中断,单片机跳到中断程序中,可以选择接收数据或者进行其他的操作,此时的串口数据可以作为控制信号,也可以仅仅是一个触发动作,具体的操作根据中断函数实现具体的功能。在中断函数最后,需要将串口接收标志位RI清0。

2、发送中断:当单片机向串口发送数据后,单片机产生串口发送中断,同理,所发送的数据仅仅是出发中断,中断函数的具体功能和所发的数据没有必然的关系,串口发送的作用是触发中断。同样,不要忘了在最后将 TI 清0.

 

总的来讲,在STC89C52中,串口发送和串口接收终端公用一个中断源,需要在中断函数中采用一个if...elseif...结构来判断接收中断标志位和发送中断标志位根据判断结果执行相应的函数。

 

如果需要读取串口数据,则在中断函数中将缓冲区的数据读入单片机进行相应的处理,如果不需要对接收到的数据进行处理,那么此时串口仅仅是作为一个开关,作用就是出发中断,然后用户根据需要在中断函数中进行相应的操作即可,串口发送总中断也是这样一个道理,只是通常我们都是将串口作为一个数据通道,中断的作用是,在接收和发送数据的同时还可以根据需要进行相关的操作。

 

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;
}

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题