51单片机串口通讯总是发送00

#include"C:\Keil\C51\INC\STC\STC12C5A60S2.H"unsignedintcount;//串口1初始化函数voidUartInit(v... #include "C:\Keil\C51\INC\STC\STC12C5A60S2.H"

unsigned int count;
//串口1初始化函数
void UartInit(void) //2400bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xF4; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}

void main(){
//配置中断
EA=1;
ES=1;
UartInit();//初始化串?
REN=0;
while(1){
SBUF=0x11;
for(count=0;count<1000;count++);
}
}

void uart1() interrupt 4{
if(TI==1){
TI=0;
}
}
这是源代码,实现循环发送一个数据(没有硬件仿真器,想用串口监测变量),但是串口助手接受到总是00
展开
 我来答
cjj796
推荐于2018-05-06 · TA获得超过8709个赞
知道大有可为答主
回答量:1.3万
采纳率:68%
帮助的人:3469万
展开全部

没有用过 STC12C5A60S2 这款单片机,但是从你接收的情况看,你重点检查:

    1、串口助手的波特率和单片机设置的是否一致?

    2、单片机程序串口波特率和晶振计算的是否准确?

    3、串口助手,是不是16进制接收的?

    4、给你一个串口调试软件,你用它试试看吧

香松锡心
2013-09-06 · TA获得超过194个赞
知道小有建树答主
回答量:360
采纳率:72%
帮助的人:109万
展开全部

单片机接的晶振一定要是11.0592。根据你的程序。这个程序不要用内部RC震荡

给你一个STC波特率计算器

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
推荐于2016-08-15 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38386
国家科技进步奖

向TA提问 私信TA
展开全部
#include "C:\Keil\C51\INC\STC\STC12C5A60S2.H"

unsigned int count;
//串口1初始化函数
void UartInit(void) //2400bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xF4; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
void main(){
UartInit();//初始化串?
while(1){
SBUF=0x11;
while(TI==0);
TI=0;
for(count=0;count<1000;count++);

//另外看看串口助手波特率设置是否是2400
}
}
追问
靠谱!不过还请教两个小问题:
1、程序中for(count=0;count<1000;count++); //数据间延时
我测试过如果两个数据之间没有延时的话,收到的数据是不准确的,这个是51串口一定要的嘛??还是其他什么原因?
2、为啥我那个中断进去就不对呢,一定要软件检测
追答
如果没有延时,接收方有可能丢失数据,因此数据有不准确的情况。你用中断当然也是可以的,但处理方式上还有待改进。比如按如下修改一下试试:

#include "C:\Keil\C51\INC\STC\STC12C5A60S2.H"
bit flag=1;
unsigned int count;
//串口1初始化函数
void UartInit(void) //2400bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xF4; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}

void main(){
//配置中断
EA=1;
ES=1;
UartInit();//初始化串?
REN=0;
while(1){
if(flag)SBUF=0x11;
flag=0;
for(count=0;count<1000;count++);
}
}

void uart1() interrupt 4{
if(TI==1){
TI=0;
flag=1;
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式