大家好,最近我学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;
}
}
此帖出自
小平头技术问答
cnt清零也不行 我之前没用中断,接收也用的查询法 在主函数里面死等 调试时发送跟接收都是正常的 多个字节数据也正常 但这样写实际中是不能用的 才换的中断 所以串口应该是正常的 波特率也没问题 换了中断之后就完全没反应 我在数据接收后面加了一个led显示 发现不亮 说明没接收到数据 中断函数不对 但我中断初始化跟调用都是参考的手册 没看出有什么问题啊
你定义flag这个变量好像得用“汪愣忒奥”额,英文忘了怎么写了,你去查查吧。
我记得中断函数是不需要声明的,跟主函数是并行执行的,不过我还是听你的加了声明,然后flag确实定义错了,得用bit定义,但是现在调试程序还是没反应
一周热门 更多>