本帖最后由 austin丁 于 2013-11-22 22:32 编辑
串口2工作在方式三,作为从机去响应主机,并把串口1得到的数据发给主机,可串口二的中断只执行一小段,大为疑惑,还请大家帮我看看程序的问题所在。
#include "12C5A60S2.h"
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define S2SM2 0x20 //S2CON.5
#define S2REN 0x10 //S2CON.4
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
#define S2RB8 0x04 //S2CON.2
#define S2TB8 0x08 //S2CON.3
#define addr1 0x01
void uart1_init();
void uart2_init();
uchar master2(uchar addr);
void errst();
unsigned int i;
uchar place;
uchar p;
void main()
{
uart1_init();
uart2_init();
p=master2(0x01);
P0=p;
place=p;
while(1);
}
uchar master2(uchar addr)
{
uchar radr,p=0,rec1;
SBUF=addr; //发送地址
while(TI!=1); //未发完则等待
TI=0;
while(RI!=1); //等待从机回答
RI=0;
radr=SBUF; //收到从机数据给radr
if(radr!=addr)
{
errst(); //若地址错,发复位信号
goto next; //goto只用于函数内部跳转
}
else
{
SBUF=0xfe;
while(TI!=1);
TI=0;
}
while(RI!=1);
RI=0;
rec1=SBUF;
while(RI!=1);
RI=0;
p=SBUF;
if(p==rec1)
{
SBUF=0x00; //校验和相同发00
while(TI!=1);
TI=0;
}
else
{
errst();
}
// TB8=1; //改为发送地址
next:;
return p;
}
void errst()//reset function
{
SBUF=0xff;
while(TI!=1);
TI=0;
}
/*-----串口1初始化-----*/
void uart1_init()
{
TMOD=0x20; //定时器定义为方式2
TL1=0xfd;
TH1=0xfd; //置初值9600波特率
PCON=0x00;
TR1=1; //启动定时器1
SCON=0xf8; //串行口为方式3,SM2=TB8=1
}
/*-----串口2初始化-----*/
void uart2_init() //9600bps@11.0592MHz
{
AUXR &=0xF7; //波特率不倍速,S2SMOD=0
S2CON =0xf0; //9位数据,可变波特率
AUXR &=0xFB; //独立波特率发生器时钟为Fosc/12,BRTx12=0
BRT =0xFD; //设定独立波特率发生器重装值
AUXR |=0x11; //启动独立波特率发生器,BRTR=1
EA=1; //开总中断
IE2 |=0x01; //开串口2中断
}
void UART2_INTR() interrupt 8
{
uchar rec0;
S2CON &= ~S2RI; //S2RI清零
IE2 &= ~0x01; //禁止串口中断
if(S2BUF!=addr1)
{
IE2 |=0x01; //串行口中断允许位
goto reti; //非本机地址,跳出中断,继续监听
}
else
S2CON &=~S2SM2; //取消监听状态,S2SM2=0
S2BUF=addr1; //发送本机地址
while((S2CON & S2TI)!=1);//判断S2TI是否为1
S2CON &= ~S2TI; //S2TI清零
while((S2CON & S2RI)!=1);//判断S2RI是否为1
S2CON &= ~S2RI; //S2RI清零
rec0=S2BUF;
if((rec0&0xff)==0xff)
{
S2CON |=0x20;
IE2 |=0x01;
goto reti;
}
do
{
S2BUF=place;
while((S2CON & S2TI)!=1);
S2CON &= ~S2TI;
while((S2CON&S2RI)!=1);
S2CON &= ~S2RI;
}while(S2BUF!=0); //主机接收不正确,重新发送
S2CON |=0x20;
IE2 |=0x01;
reti:;
} |