STC单片机串口接收数据时,只有第一个字节正确,其它错误,且总漏一个字节,比正常数据短 20
使用STC15F2K60S单片机,用串口做接收数据,只第一个数据对,且总少收一个字节。类似的测试在90C516上确完全没问题。(使用单片机内的晶振11.0592MHz,波...
使用STC 15F2K60S单片机,用串口做接收数据,只第一个数据对,且总少收一个字节。类似的测试在90C516上确完全没问题。(使用单片机内的晶振11.0592MHz,波特率9600,8,1,N,数据为7个字节)
#include "reg52.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit P22=P2^2;
bit busy,flag2;
unsigned char eee[8];
unsigned char i,a;
void SendData(unsigned char dat);
void main()
{
SCON=0xda;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0x15;
ES=1;
EA=1;
while(1)
{
if(a>6)
{
for(i=0;i<7;i++)
SendData(eee[i]);
a=0;
}
}
}
void Uart() interrupt 4 using 1
{
if(RI)
{
RI=0;
eee[a]=SBUF;
a++;
}
if(TI)
{
TI=0;
busy=0;
}
}
void SendData(unsigned char dat)
{
while(busy);
ACC=dat;
busy=1;
SBUF=ACC;
} 展开
#include "reg52.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit P22=P2^2;
bit busy,flag2;
unsigned char eee[8];
unsigned char i,a;
void SendData(unsigned char dat);
void main()
{
SCON=0xda;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0x15;
ES=1;
EA=1;
while(1)
{
if(a>6)
{
for(i=0;i<7;i++)
SendData(eee[i]);
a=0;
}
}
}
void Uart() interrupt 4 using 1
{
if(RI)
{
RI=0;
eee[a]=SBUF;
a++;
}
if(TI)
{
TI=0;
busy=0;
}
}
void SendData(unsigned char dat)
{
while(busy);
ACC=dat;
busy=1;
SBUF=ACC;
} 展开
意法半导体(中国)投资有限公司
2020-01-15 广告
2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
#include "reg52.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit P22=P2^2;
bit busy,flag2;
unsigned char eee[8];
unsigned char i,a;
void SendData(unsigned char dat);
void main(){
SCON=0xda;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0x15; ES=1;
EA=1;
while(1) {
if(i!=a)
{
SendData(eee[i]);
i++;
i%=7;
} } }
void Uart() interrupt 4 using 1
{
if(RI)
{
RI=0;
eee[a]=SBUF;
a++;
a%=7;
}}
void SendData(unsigned char dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit P22=P2^2;
bit busy,flag2;
unsigned char eee[8];
unsigned char i,a;
void SendData(unsigned char dat);
void main(){
SCON=0xda;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0x15; ES=1;
EA=1;
while(1) {
if(i!=a)
{
SendData(eee[i]);
i++;
i%=7;
} } }
void Uart() interrupt 4 using 1
{
if(RI)
{
RI=0;
eee[a]=SBUF;
a++;
a%=7;
}}
void SendData(unsigned char dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
追问
这个程序还是问题依旧呢,程序发给了STC的技术,回复说写的无问题,让自己继续试,郁闷。。。。。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我认为片内时钟温漂很大,而且工作在9600那么高的波特率下出错那是在所难免。建议外加11.0592M晶振,或者将波特率降到2400就应该没问题了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
赋值有问题
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
改成
TL2= RCAP2L=(65536-(FOSC/4/BAUD));
TH2=RCAP2H=(65536-(FOSC/4/BAUD))>>8;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
改成
TL2= RCAP2L=(65536-(FOSC/4/BAUD));
TH2=RCAP2H=(65536-(FOSC/4/BAUD))>>8;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把自动识别取消,直接写 SCON = 0x50; //8位可变波特率 就可以了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询