找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3718|回复: 14
收起左侧

新手学习串行口通信遇到问题,求大神帮忙

[复制链接]
ID:134288 发表于 2016-8-5 14:09 | 显示全部楼层 |阅读模式
我只是把波特率改成9600bps的,就不能收到正常信号了???源程序是这样的:


#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        UsartInit();  //        串口初始化
        while(1);               
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Usart() interrupt 4
{
        u8 receiveData;

        receiveData=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志位
        SBUF=receiveData;//将接收到的数据放入到发送寄存器
        while(!TI);                         //等待发送数据完成
        TI=0;                                                 //清除发送完成标志位
}


回复

使用道具 举报

ID:111634 发表于 2016-8-6 09:53 | 显示全部楼层
本帖最后由 zl2168 于 2016-8-6 09:55 编辑

实例77  双机串行通信方式1


Proteus仿真一下,确认有效。


实例77 双机通信方式1.rar (40.4 KB, 下载次数: 8)

串1.jpg
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

ID:111634 发表于 2016-8-6 09:55 | 显示全部楼层
实例78  双机串行通信方式2


Proteus仿真一下,确认有效。
实例78 双机通信方式2.rar (46.57 KB, 下载次数: 2)
串2.jpg



以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。




回复

使用道具 举报

ID:111634 发表于 2016-8-6 10:10 | 显示全部楼层
实例79  双机串行通信方式3


Proteus仿真一下,确认有效。
实例79 双机通信方式3.rar (45.3 KB, 下载次数: 2)
串3.jpg


以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

ID:111634 发表于 2016-8-6 10:13 | 显示全部楼层
实验16  单片机与PC机虚拟串行通信


Proteus仿真一下,确认有效。
实验16 与PC机虚拟串行通信.rar (151.41 KB, 下载次数: 2)
pc.jpg


以上摘自张志良编著《80C51单片机实用教程》ISBN978-7-04-044532-9,高教社出版。     书中电路和程序设计有详细说明,程序语句条条有注解。




回复

使用道具 举报

ID:113415 发表于 2016-8-6 16:43 | 显示全部楼层
帖子中说的不清楚,按常理,改动单片机波特率后,另一端的波特率也要改得与之一致才行,如果收、发双方波特率不相等,当然会出问题。
        希望能帮到你。
回复

使用道具 举报

ID:136144 发表于 2016-8-6 20:58 | 显示全部楼层
学习下。看看了
回复

使用道具 举报

ID:134288 发表于 2016-8-7 19:46 | 显示全部楼层
baofu 发表于 2016-8-6 16:43
帖子中说的不清楚,按常理,改动单片机波特率后,另一端的波特率也要改得与之一致才行,如果收、发双方波特 ...

我全都改了,也不行,收到的是乱码
回复

使用道具 举报

ID:134288 发表于 2016-8-7 19:48 | 显示全部楼层
zl2168 发表于 2016-8-6 09:53
实例77  双机串行通信方式1

谢谢了,不过觉得好麻烦,只是一个很简单的问题
回复

使用道具 举报

ID:136110 发表于 2016-8-7 21:04 | 显示全部楼层
可能有干扰,把线减短试试。
回复

使用道具 举报

ID:105206 发表于 2016-8-8 09:36 | 显示全部楼层
波特率,数据位,停止位.效验位.正确吗;还有晶振频率.
回复

使用道具 举报

ID:134288 发表于 2016-8-8 11:32 | 显示全部楼层
jubaolun 发表于 2016-8-8 09:36
波特率,数据位,停止位.效验位.正确吗;还有晶振频率.

我是按着郭天祥那本书上来的,书上并没有说要改数据位、停止位、校验位,还有晶振频率。。。。。。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

ID:134288 发表于 2016-8-8 11:52 | 显示全部楼层
xljxlj 发表于 2016-8-7 21:04
可能有干扰,把线减短试试。

已经很短了  十厘米左右  我4800bps正常
回复

使用道具 举报

ID:68005 发表于 2016-8-8 13:57 | 显示全部楼层
/*-------------------------------------------------
  串口 初始化函数 (可变更波特率 )         串口_波特率_初始          无EA=1 ;//z总中断 开
--------------------------------------------------*/
       void chuankou_BTL_int(UINT16 botelv)
  {
     SCON  = 0x50;   //配置串口为模式 1
     TMOD &= 0x0F;  //清零 T1 的控制位
     TMOD |= 0x20;  //配置 T1 为模式 2
     TH1 = 256 - (11059200/12/32)/botelv;  //计算 T1 重载值
     TL1 = TH1;     //初值等于重载值
             // ET1 = 0;       //禁止 T1 中断            此句似乎没用因为T1是自动重装的方式
     ES  = 1;       //使能串口中断
     TR1 = 1;       //启动 T1
   }
/*-------------------------------------------------
  串口 初始化函数 (固定波特率9600 )         串口_波特率固定_9600MHZ  无EA=1 ;//z总中断 开
--------------------------------------------------*/

       void chuankou_int()
  {
     SCON  = 0x50;   //配置串口为模式 1
     TMOD |= 0x20;  //TMOD: timer1, mode 2,8bit 自动重装
     PCON  = 0x00;  //波特率正常模式, 如PCON=0x80是波特率加倍模式
     TH1 = 0xFD;  // 9600MHZ 在晶振11.0592MHZ 下 可查表
     TL1 = 0xFD;     //初值等于重载值
             // ET1 = 0;       //禁止 T1 中断            此句似乎没用因为T1是自动重装的方式
     ES  = 1;       //使能串口中断
     TR1 = 1;       //启动 T1
   }


9600用的TH1和TL  =0xfd
回复

使用道具 举报

ID:68005 发表于 2016-8-8 13:58 | 显示全部楼层
如上回复 给了2个 初始化的函数。我用的是正常的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表