打印
[51单片机]

单片机串行通信的问题?

[复制链接]
1610|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huster_tjs|  楼主 | 2014-3-11 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是郭天祥视屏上的程序,单片机与上位机串行通信,通过串行通信助手调试,波特率设置9600。在视屏中他运行这个程序好好的,上位机发送一个十六进制,然后通过单片机返回一个相等的十六进制回到上位机,led也正常。但是我运行的时候,发送一个数据,返回的数字不对,不知道什么情况。而点亮led的时候只有低四位是与发送的数字对应的,高四位就不对了,这是什么情况?
#include<reg51.h>
unsigned char flag=0,a=0;
void main()
{

    TMOD=0X20;
    TH1=0x1f;
    TL1=0xfd;
    TR1=1;
    REN=1;
    SM0=0;
    SM1=0;
        EA=1;
        ES=1;

    while(1)
                {
                     if(flag==1)
                         {
                                          ES=0;
                                          flag=0;
                                          SBUF=a;
                                          while(!TI);
                                          TI=0;
                                          ES=1;
                     }
                }
}


void ser() interrupt 4
{
    RI=0;
    P0=SBUF;
        a=SBUF;
        flag=1;
       
}

相关帖子

沙发
liudanwei| | 2014-3-11 16:56 | 只看该作者
#include <reg52.h>                   //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
uchar num,a;

/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main()
{
        TMOD=0x20;                   //用定时器设置串口波特率                   9600
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;          //串口初始化
        SM0=0;
        SM1=1;
        EA=1;           //开启总中断
        ES=1;
        while(1)
        {
                if(num==1)    //判断是否有串口数据的传送
                {
                        ES=0;
                        num=0;
                        SBUF=a;                         //发送数据a到SBUF,即将单片机的数据发送到计算机
                        while(!TI);
                        TI=0;
                        ES=1;
                }
        }       
}
void ser() interrupt 4
{
        RI=0;
        P2=SBUF;                        //接收数据SBUF,即将计算机的数据接收。
        a=SBUF;
        num=1;
}

使用特权

评论回复
板凳
ningling_21| | 2014-3-11 17:15 | 只看该作者
TH1=0x1f;
    TL1=0xfd;

波特率9600,这是怎么来的呢?

使用特权

评论回复
地板
huster_tjs|  楼主 | 2014-3-11 22:40 | 只看该作者
ningling_21 发表于 2014-3-11 17:15
TH1=0x1f;
    TL1=0xfd;

哦,复制错了,,,我的TH1=0xfd;TL1=0xfd;

使用特权

评论回复
5
huster_tjs|  楼主 | 2014-3-11 22:58 | 只看该作者
liudanwei 发表于 2014-3-11 16:56
#include                    //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int

我复制了你的程序,然后拷录到单片机,结果还是一样,发送一个55,收到的是D5;发送一个4D,收到C5;发送aa,收到AA;发送ff,收到FF;发送22,收到A2;

然后我发送的数字,低四位对应的LED灯亮正常,高四位就不对了;

这怎么办?

使用特权

评论回复
6
ningling_21| | 2014-3-12 08:56 | 只看该作者
huster_tjs 发表于 2014-3-11 22:58
我复制了你的程序,然后拷录到单片机,结果还是一样,发送一个55,收到的是D5;发送一个4D,收到C5;发送 ...

使用的晶振是多少的?

使用特权

评论回复
7
huster_tjs|  楼主 | 2014-3-12 13:31 | 只看该作者
ningling_21 发表于 2014-3-12 08:56
使用的晶振是多少的?

12MHZ

使用特权

评论回复
8
ningling_21| | 2014-3-12 13:44 | 只看该作者
huster_tjs 发表于 2014-3-12 13:31
12MHZ

改成11.0592M的试试...

使用特权

评论回复
9
huster_tjs|  楼主 | 2014-3-12 22:39 | 只看该作者
ningling_21 发表于 2014-3-12 13:44
改成11.0592M的试试...

现在解决了,,,是波特率设置太高了,,,这样设置的初值误差太大。我用2400的波特率才完全不出错。。。谢谢你了

使用特权

评论回复
10
huster_tjs|  楼主 | 2014-3-12 22:41 | 只看该作者
为了结贴,,再回复一个。。。。;P

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

31

帖子

0

粉丝