大家好,最近我学51串口通信 PC给单片机发一串数据 长度不定 单片机收到后,将原数据再发给PC,但是一直接收不到数据,请大家帮我看看是什么原因,新手求指导。我用定时器1做波特率发生器,定时器0用作超时法判断数据接收完毕,串口中断接收数据,查询法发送数据。下面附程序:
#include<STC12C5A32S2.H>
#include<INTRINS.H>
unsigned char idata tab[];
unsigned char j,cnt=0,flag=0;
unsigned char i=0;
void UART_INIT()
{
SCON=0X50; //工作方式1,发送使能
TMOD|=0X21; //定时器1,工作方式2,定时器0,工作方式1
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=0; //定时器0不使能
TR1=1; //定时器1使能
PS=1; //串口中断设为高优先级
ES=1; //开串口中断
ET1=0; //禁止定时器1中断
ET0=1; //开定时器0中断
EA=1; //开总中断
}
void delay_1ms(unsigned int t)
{
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;
for(j=0;j<cnt;j++)
{
SBUF=tab[j];
while(!TI);
TI=0;
}
ES=1;
}
}
}
void UART_Rountine() interrupt 4
{
if(RI)
{
TR0=0;
i=0;
RI=0;
tab[cnt++]=SBUF;
}
TR0=1;
}
void Timer0_Rountine() interrupt 1
{
TH0=0XFB; //定时长度1ms
TL0=0X33;
TF0=0;
i++;
if(i==50)
{
i=0;
TR0=0;
flag=1;
}
}
此帖出自
小平头技术问答
试过了 不行 串口还是接收不到数据,我把程序写了具体点:
#include<STC12C5A32S2.H>
#include<INTRINS.H>
unsigned char idata tab[]; //定义数组用于存放数据
unsigned char j,cnt=0,flag=0;
unsigned char i=0;
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;
}
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; //接收成功标志
}
}
一周热门 更多>