大家好,最近我学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;
}
}
此帖出自
小平头技术问答
你定义flag这个变量好像得用“汪愣忒奥”额,英文忘了怎么写了,你去查查吧。
一周热门 更多>