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 展开
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 展开
3个回答
展开全部
单片机接的晶振一定要是11.0592。根据你的程序。这个程序不要用内部RC震荡
给你一个STC波特率计算器
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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
}
}
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;
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询