刚接触串口通信,PC给单片机发送一串数据,单片机接收后返还给PC机,用串口调试助手来收发数据,中断接收,查询发送,用超时法判断数据接收完成,但是程序调试一直没反应,求大家帮帮忙,看看是什么问题。下面附程序:
#include<STC12C5A32S2.H>
#include<INTRINS.H>
bit flag=0;
unsigned char idata tab[]; //定义数组用于存放数据
unsigned char j,cnt=0;
unsigned char i=0;
void UART_Rountine(void); //串口中断函数声明
void Timer0_Rountine(void); //定时器中断函数声明
void UART_INIT()
{
SCON=0X50; //工作方式1,发送使能
TMOD|=0X21; //定时器1,工作方式2
AUXR&=0x3F; //定时器0,1时钟为Fosc/12,即12T
AUXR&=0xFE; //串口1选择定时器1为波特率发生器
PCON&=0x7F; //波特率不加倍
TH1=0XFC; //波特率9600,时钟频率14.7456MHz
TL1=0XFC;
TH0=0XFB; //定时长度1ms
TL0=0X33;
TR0=1; //定时器0不使能,接收到数据在开始计时
TR1=1; //定时器1使能
PS=1; //串口中断设为高优先级
ES=1; //开串口中断
ET1=0; //禁止定时器1中断
ET0=1; //开定时器0中断
EA=1; //开总中断
}
void delay_1ms(unsigned int t) //软件延时1ms
{
unsigned int a,b;
for(a=0;a<t;a++)
for(b=0;b<1167;b++);
}
void mian(void)
{
delay_1ms(100); //单片机上电延时
UART_INIT(); //初始化
while(1)
{
if(flag==1) //检测到接收成功标志
{
flag=0;
ES=0; //关串口中断,查询法置TI也会产生中断,防止干扰
for(j=0;j<cnt;j++) //查询法发送数据
{
SBUF=tab[j];
while(!TI);
TI=0;
}
cnt=0; //接收计数清零,等待下一次接收
ES=1; //发送完毕打开串口中断,等待下一帧数据接收
}
}
}
void UART_Rountine() interrupt 4
{
if(RI)
{
TR0=0; //接收数据过程中定时器不工作
i=0; //计数清0
RI=0;
tab[cnt++]=SBUF; //接收数据
}
TR0=1; //接收完一个字节数据打开定时器,等待下一字节数据
}
void Timer0_Rountine() interrupt 1
{
TH0=0XFB; //定时长度1ms
TL0=0X33;
TF0=0; //清除溢出标志
i++; //没产生一次溢出中断,递增一次
if(i==50) //发送一个字节数据大概1ms,等待50ms还没有数据判断接收完毕
{
i=0; //计数清零
TR0=0; //关定时器
flag=1; //接收成功标志
}
}
大家帮忙看看,谢谢! |