我用单片机串口传数据给电脑,传的是一个计时器,单用串口调试工具接收到的数字有点乱这是怎么回事?
串口调试助手上16进制的数显示:0102030405060708090A0B0C0D0E0F3031........由0F直接跳到了30,我的用的是USB-TTL线传送,...
串口调试助手上16进制的数显示:01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 30 31........
由0F直接跳到了30,我的用的是USB-TTL线传送,是我程序的问题吗?还是串口线的问题,恳请大神们解答,以下是我的程序:
#include<reg51.h>
/*七段共阳管显示定义*/
char code dispcode[ ]={40,235,50,162,225,164,36,234,32,160};
/*定义并初始化变量*/
int second=0,mstcnt=0;
/*函数声明*/
省略
/*****************************/
/*延时子程序*/
/****************************/
void delay (int k)
{省略
}
/*****************************/
/* 显示子程序*/
/****************************/
void display(void)
{ 省略
}
/*******************************************************************************
* 函数功能 :设置串口
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
//===========================================
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
TH0=0x4c;
TL0=0x00;
TMOD = 0x01;
mstcnt++;
if(mstcnt==21)
{
if(P3==127)//如果p3.7低电平
{second=second+1;
mstcnt=0;
UsartConfiguration();
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
else
{
second=second;
mstcnt=0;
UsartConfiguration();
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
}
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{
TMOD = 0x01; //time0为定时器,方式1
TH0=0x4c; //预置计数初值
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display(); //显示时间
}
} 展开
由0F直接跳到了30,我的用的是USB-TTL线传送,是我程序的问题吗?还是串口线的问题,恳请大神们解答,以下是我的程序:
#include<reg51.h>
/*七段共阳管显示定义*/
char code dispcode[ ]={40,235,50,162,225,164,36,234,32,160};
/*定义并初始化变量*/
int second=0,mstcnt=0;
/*函数声明*/
省略
/*****************************/
/*延时子程序*/
/****************************/
void delay (int k)
{省略
}
/*****************************/
/* 显示子程序*/
/****************************/
void display(void)
{ 省略
}
/*******************************************************************************
* 函数功能 :设置串口
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
//===========================================
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
TH0=0x4c;
TL0=0x00;
TMOD = 0x01;
mstcnt++;
if(mstcnt==21)
{
if(P3==127)//如果p3.7低电平
{second=second+1;
mstcnt=0;
UsartConfiguration();
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
else
{
second=second;
mstcnt=0;
UsartConfiguration();
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
}
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{
TMOD = 0x01; //time0为定时器,方式1
TH0=0x4c; //预置计数初值
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display(); //显示时间
}
} 展开
3个回答
展开全部
为了帮助你的学习,首先给你指出几个问题:
1,你的寄存器配置做的很蹩脚,更改寄存器配置的方法实在欠妥;
2,在中断函数中调用其它函数很容易造成变量冲突;
3,还有一个更严重的问题,是你在T0中断函数中调用的UsartConfiguration(); 函数,配置了ES = 1;但是在整个程序中却找不到串口中断函 数,这个程序怎么运行呢?!从你的程序中可以看出,你并不打算开放串口中断,那么建议ES = 0;(因为没有串口中断函数,程序不知会跑 飞到哪里去,开也白开)。
4,为了便于别人检查你串行波特率的的准确性,你应该提供单片机晶振频率;
以下是按照你的程序本意做的修改,仅供参考,不妥之处请指出,不明之处请追问:
#define uchar unsigned char
uchar bdata BITS;//位变量声明
bit TEST = BITS^0;
/**************************/
/*主函数*/
/**************************/
main()
{
SCON=0X50; //设置为工作方式1
TMOD=0X21; //设置计数器T1工作于方式2,T0工作于方式1
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器T1初始值设置,注意波特率是4800的
TL1=0XF3;
TH0=0x4c; //预置T0计数初值
TL0=0x00;
ET0=1; //允许定时器T0中断
TR0=1; //T0开始计数
TR1=1; //T1开始计数
// ES = 1;
EA=1; //打开总中断
TEST = 0; //清0位变量
while(1)
{
if(TEST)//如果T0计数中断次数达到21
{
TEST = 0;//清0该标志
if(P3==127)//如果p3.7低电平
{
second=second+1;
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
else{
second=second;
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
}
display(); //显示时间
}
}
//===========================================
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
mstcnt++;
if(mstcnt == 21)
{
mstcnt = 0;//清0计数器
TEST = 1;//置位mstcnt计数到21的标志
}
TH0=0x4c;
TL0=0x00;
}
1,你的寄存器配置做的很蹩脚,更改寄存器配置的方法实在欠妥;
2,在中断函数中调用其它函数很容易造成变量冲突;
3,还有一个更严重的问题,是你在T0中断函数中调用的UsartConfiguration(); 函数,配置了ES = 1;但是在整个程序中却找不到串口中断函 数,这个程序怎么运行呢?!从你的程序中可以看出,你并不打算开放串口中断,那么建议ES = 0;(因为没有串口中断函数,程序不知会跑 飞到哪里去,开也白开)。
4,为了便于别人检查你串行波特率的的准确性,你应该提供单片机晶振频率;
以下是按照你的程序本意做的修改,仅供参考,不妥之处请指出,不明之处请追问:
#define uchar unsigned char
uchar bdata BITS;//位变量声明
bit TEST = BITS^0;
/**************************/
/*主函数*/
/**************************/
main()
{
SCON=0X50; //设置为工作方式1
TMOD=0X21; //设置计数器T1工作于方式2,T0工作于方式1
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器T1初始值设置,注意波特率是4800的
TL1=0XF3;
TH0=0x4c; //预置T0计数初值
TL0=0x00;
ET0=1; //允许定时器T0中断
TR0=1; //T0开始计数
TR1=1; //T1开始计数
// ES = 1;
EA=1; //打开总中断
TEST = 0; //清0位变量
while(1)
{
if(TEST)//如果T0计数中断次数达到21
{
TEST = 0;//清0该标志
if(P3==127)//如果p3.7低电平
{
second=second+1;
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
else{
second=second;
SBUF=second;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0;
}
}
display(); //显示时间
}
}
//===========================================
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
mstcnt++;
if(mstcnt == 21)
{
mstcnt = 0;//清0计数器
TEST = 1;//置位mstcnt计数到21的标志
}
TH0=0x4c;
TL0=0x00;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询