标题: 新手学习串行口通信遇到问题,求大神帮忙 [打印本页]
作者: 夏日有余晖 时间: 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; //清除发送完成标志位
}
作者: zl2168 时间: 2016-8-6 09:53
本帖最后由 zl2168 于 2016-8-6 09:55 编辑
实例77 双机串行通信方式1
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-8-6 09:55
实例78 双机串行通信方式2
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-8-6 10:10
实例79 双机串行通信方式3
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-8-6 10:13
实验16 单片机与PC机虚拟串行通信
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机实用教程》ISBN978-7-04-044532-9,高教社出版。 书中电路和程序设计有详细说明,程序语句条条有注解。
作者: baofu 时间: 2016-8-6 16:43
帖子中说的不清楚,按常理,改动单片机波特率后,另一端的波特率也要改得与之一致才行,如果收、发双方波特率不相等,当然会出问题。
希望能帮到你。
作者: pengrubin 时间: 2016-8-6 20:58
学习下。看看了
作者: 夏日有余晖 时间: 2016-8-7 19:46
我全都改了,也不行,收到的是乱码
作者: 夏日有余晖 时间: 2016-8-7 19:48
谢谢了,不过觉得好麻烦,只是一个很简单的问题
作者: xljxlj 时间: 2016-8-7 21:04
可能有干扰,把线减短试试。
作者: jubaolun 时间: 2016-8-8 09:36
波特率,数据位,停止位.效验位.正确吗;还有晶振频率.
作者: 夏日有余晖 时间: 2016-8-8 11:32
我是按着郭天祥那本书上来的,书上并没有说要改数据位、停止位、校验位,还有晶振频率。。。。。。。。。。。。。。。。。。。。。。。。。
作者: 夏日有余晖 时间: 2016-8-8 11:52
已经很短了 十厘米左右 我4800bps正常
作者: wangliannc 时间: 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
作者: wangliannc 时间: 2016-8-8 13:58
如上回复 给了2个 初始化的函数。我用的是正常的
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |