第三十八课 串口通讯之中断法
程序讲解:
/*---------------------------------------------------------------*/
//串口通讯
//按下按钮,单片机发送数据"Come On!\r\n"给主机
//单片机晶振:11.0592MHz
//波特率: 9600bps
/*-------------------------------------------------------------*/
//包含头文件
#include<at89x52.h>
unsigned char code tab[]={"Come On!\r\n"};
#define k1 P3_2 //对应开发板硬件
/*-------------------------------------------------------------*/
//串口初始化
void UART_Init(void)
{
SCON = 0x50; //串口工作方式为1,串行允许接受
TMOD = 0x20; //定时器1工作在方式2
PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfA; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfA;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}
/*-------------------------------------------------------------*/
//延时5000+0us 函数定义
void delay5ms(void)
{
unsigned char i,j,k;
for(i=135;i>0;i--)
for(j=2;j>0;j--)
for(k=7;k>0;k--);
}
/*-------------------------------------------------------------*/
//串口发送一个字节
void Uart_SendChar(unsigned char dat)
{
SBUF = dat; //待发送的数据写入缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送标志位
}
/*-------------------------------------------------------------*/
//串口发送一个字符串
void Uart_SendString(unsigned char *dat)
{
while(*dat!='\0')
{
Uart_SendChar(*dat); //发送当前数据
dat++; //指向下一个要发送的数据
}
}
/*-------------------------------------------------------------*/
//主函数
void main(void)
{
UART_Init(); //初始化串口
while(1)
{
if(k1==0)
{
delay5ms();
if(k1==0)
{
Uart_SendString(tab); //发送数据
while(P3_2==0);
}
}
}
}
/*-------------------------------------------------------------*/
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
unsigned char Rcv = 0;
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0; //接收标志位清零
Rcv = SBUF; //存储缓冲区的数据
Uart_SendChar(Rcv); //让从电脑上传到单片机的数据,传回的电脑显示
}
}
本节重点:
1、ES 串行通信中断使能在中断使能寄存器IE 中
寄存器对应位:EA - ET2 ES ET1 EX1 ET0 EX0
EA 使能标志位置位则所有中断使能复位则禁止所有中断
- 保留
ET2 定时器2 中断使能
ES 串行通信中断使能
ET1 定时器1 中断使能
EX1 外部中断1 使能
ET0 定时器0 中断使能
EX0 外部中断0 使能
2、当有数据从串口传送到单片机时,串口接收中断标志位RI会置位,此时若相关中断均使能则会进入串口接收中断服务函数
文章评论(0条评论)
登录后参与讨论