当前位置:文档之家› 中断法串口通信

中断法串口通信

中断法串口通信(用关串口中断 ES 方法)推荐不丢 帧 ***********************************************/ #include; #define uchar unsigned char #define uint unsigned int uchar flag=0,temp;
{ //RI=0;//不在此清零接收中断标志,否则接收
SUBF 处于一直接收状态,中断一直进行影响其它指令进 行,造成返回丢帧现象实验得出
flag=1; }
if(flag==1) {
ES=0;//flag 为 1 说明接收完引起中断,关串口中断, 处理当前帧
flag=0;//清中断标志 RI=0;//对接收中断标志清零,为下一帧数据接收作 准备,此处清零不丢帧 temp=SBUF;//读入接收数据,在不关中断 ES 前担下, CPU 读入接收数据也不会引起中断,接收数据由接收 SBUF 接收缓存器自动执行 P0=temp; //读入数据送 P0 口 SBUF=temp; //向发送方返回接收数据 //TI=0; //要等待发送完,否则数据没发送完 TI =0,flag=0 已经执行 //flag=0; //发送完后引起中断,flag 又置 1,进入 死循环,一直发数据 while(!TI);//等待发送完,!!要等待!! TI=0;//数据发送完对发送中断标志清零,为下一帧 数据发送作准备 //flag=0; //必须有否则进入死循环,放最后 ES=1;//允许串口中断继续接收数据 } } } void serial() interrupt 4//执行此句,即产生中断表 示数据已接收完
中断法串口通信
第一个例子: 避免死循环,一直发数据(用自设接收数据标志位法, 不用关串口中断 ES 方法)flag 必须放 if 语句中的最后 位置,否则死循环 #include; #define uchar unsigned char #define uint unsigned int uchar flag=0,temp; void init() { TMOD=0X20;//定时器 1 方式 2 作为波特率发生器 TH1=0XF3;//装初值 波特率为 4800bps 的初值 TL1=0XF3; TR1=1;//启动定时器 1 SCON=0X50;//设置串口工作方式为方式 1 PCON=0X80;//加倍波特率后为 4800 EA=1;//开总中断 ES=1;//允许串口中断 TI=0;//清发送中断标志位 RI=0;//清接收中断标志位
Hale Waihona Puke } void main() {
init(); while(1) {
if(flag==1) {
//ES=0;//flag 为 1 说明接收完引起中断 //flag=0;//清中断标志 RI=0;//对接收中断标志清零,为下一帧数据接收作 准备 temp=SBUF;//读入接收数据,在不关中断 ES 前提下, CPU 读入接收数据也不会引起中断,接收数据由接收 SBUF 接收缓存器自动执行 P0=temp; //读入数据送 P0 口 SBUF=temp; //向发送方返回接收数据 //TI=0; //要等待发送完,否则数据没发送完 TI =0,flag=0 已经执行 //flag=0; //发送完后引起中断,flag 又置 1,进入 死循环,一直发数据 while(!TI);//等待发送完,!!要等待!!
void init() {
TMOD=0X20;//定时器 1 方式 2 作为波特率发生器 TH1=0XF3;//装初值 波特率为 4800bps 的初值 TL1=0XF3; TR1=1;//启动定时器 1 SCON=0X50;//设置串口工作方式为方式 1 PCON=0X80;//加倍波特率后为 4800 EA=1;//开总中断 ES=1;//允许串口中断 TI=0;//清发送中断标志位 RI=0;//清接收中断标志位 } void main() { init(); while(1) {
TI=0;//数据发送完对发送中断标志清零,为下一帧 数据发送作准备
flag=0; //必须有否则进入死循环,放最后 //ES=1;//允许串口中断继续接收数据 } } } void serial() interrupt 4 { flag=1; } ----------------------第 2 个例 子:---------------------------------------------/***********************************************
相关主题