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;
}
展开
 我来答
意法半导体(中国)投资有限公司 2020-01-15
展开全部
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
改变世界的魔法师
2013-12-22 · TA获得超过681个赞
知道小有建树答主
回答量:158
采纳率:0%
帮助的人:109万
展开全部
看一下STC 15F2K60S数据手册,是不是什么寄存器设置的不对。或者是波特率的算法不对。我记得STC好像有的单片机一个时钟周期是两个机器周期。或者是6个机器周期,而一般的单片机都是12个机器周期。这个有一个寄存器可以进行设置,你查一下看是不是这个问题。
T2L=(65536-(FOSC/4/BAUD)); T2H=(65536-(FOSC/4/BAUD))>>8;
去看一下,数据手册,可能是这里出了问题。
意法半导体(中国)投资有限公司
2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
zhxiufan
2013-12-19 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38387
国家科技进步奖

向TA提问 私信TA
展开全部
#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;
}
追问
这个程序还是问题依旧呢,程序发给了STC的技术,回复说写的无问题,让自己继续试,郁闷。。。。。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wwpwwp20088
2013-12-20 · TA获得超过429个赞
知道小有建树答主
回答量:651
采纳率:0%
帮助的人:253万
展开全部
我认为片内时钟温漂很大,而且工作在9600那么高的波特率下出错那是在所难免。建议外加11.0592M晶振,或者将波特率降到2400就应该没问题了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
79511175
2016-08-23 · 超过33用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:47.3万
展开全部
赋值有问题
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
改成
TL2= RCAP2L=(65536-(FOSC/4/BAUD));
TH2=RCAP2H=(65536-(FOSC/4/BAUD))>>8;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
电子电脑维修
2018-12-16
知道答主
回答量:3
采纳率:0%
帮助的人:2043
展开全部
把自动识别取消,直接写 SCON = 0x50; //8位可变波特率 就可以了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式