单片机串口通信的多字节传输
题目: 一个8XX51单片机的双机通信系统波特率为9600bps,fosc=12MHz,用中断方式编写程序,将甲机片内RAM 30H ~ 3FH的数据块通过串行口传送到乙机的片内RAM 40 ~ 4FH单元中。
串口通信是一个字节一个字节的发送与接收,但实际上我们一般都是用来多字节的传输,而当我们用来多字节传输时,我们会发现,一旦我们传输速率加快,我们传输的数据就容易出错(我认为其实会出现数据传输不完全的情况)。
那这怎么解决呢?
这个就与我们单片机的晶振与我们设置的波特率有关了,当我们采用时钟周期为11.0592Mhz的晶振时,不管设置波特率多少(1200-115200范围,11.0592的最大波特率为115200,也是常用的波特率),误差为0,也就是说,假如当我们用11.0592Mhz的晶振产生9600的波特率,结果是刚刚好的。但是当我们采用12Mhz的晶振时,波特率越大误差越大, 这个时候一般常常使用波特率加倍减小误差(但是波特率越大,加倍其实也减小不了多少误差了,甚至误差不变)。
其实,我们可以通过延时来减小传输数据的误差,让其传输慢一点
比如题目要求我们要传输16个字节的数据,这个延时不加的话,会有问题(我出现了传输字节不够的情况,即没有传输到16个字节)。
发送数据时这个延时不能少,而当我们接收数据时,这个延时似乎是可以不要的(因为测试的时候我没有发现问题,原因我也不清楚),我为了保险,也进行了延时。
//发送数据SBUF=*p; //将p指向的地址所存储的值放进缓存区delay1ms(1); //延时1ms//接收数据*p=SBUF; //读取缓冲区的值delay1ms(1); //延时1ms
完整代码如下
//发送数据
#include <reg52.h>
#include "Delay.h"unsigned char *p; //指针,用来指向内存地址void UART_Init()
{TMOD=0x20; //设置计数器工作方式2SCON=0x40; //串行口设置为工作方式1TH1=0XFD; //计数器重装载值设置TL1=0XFD; //计数器初始值设置TR1=1; //打开计数器ES=1; //打开接收中断EA=1; //打开总中断p=0x30; //p指向内存地址为0x30的空间SBUF=*p; //将0x30这个地址所存储的值放进缓存区delay1ms(1); //延时1ms
}void main()
{unsigned char k=0;p=0x30;*p=k;while(p!=0x3F) //给30H ~ 3FH的内存地址赋值{p++;k++;*p=k;}UART_Init(); //中断初始化while(1);
}void UART_Routine() interrupt 4
{TI=0; //清除发送完成位标志p++;SBUF=*p; //将值存入缓冲区delay1ms(1); //延时1msif(P==0x3F)EA=0; //关闭总中断
}
//接收数据
#include <reg52.h>
#include "Delay.h"unsigned char *p;void UART_Init()
{TMOD=0x20; //设置计数器工作方式2SCON=0x50; //串行口设置为工作方式1,并允许接受TH1=0XFD; //计数器重装载值设置TL1=0XFD; //计数器初始值设置TR1=1; //打开计数器ES=1; //打开接收中断EA=1; //打开总中断p=0x40;
}void main()
{ UART_Init();while(1);
}void UART_Routine() interrupt 4
{RI=0; //清除接收完成位标志*p=SBUF; //读取缓冲区的值delay1ms(1); //延时1msp++;if(P==0x4F)EA=0; //关闭总中断
}
测试结果
如果发现错误,请告知。
单片机串口通信的多字节传输相关推荐
- 基于PC与单片机串口通信的温度监控系统程序设计
基于PC与单片机串口通信的温度监控系统程序设计 1.系统介绍 1)本系统主要讲解基于PC与单片机串口通信的温度监控系统程序设计(如图1),上位机采用常用的PC机,下位机使用的是STC89C52单片机, ...
- 51单片机-串口通信
目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部 ...
- 51单片机串口通信模板_深入理解51单片机串口通信及通信实例
串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...
- 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码
目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...
- Atmega16单片机串口通信
Atmega16单片机串口通信 Atmega16单片机串口通信 串口通信需要使用到的内部寄存器 程序代码 Atmega16单片机串口通信 本篇文章参考自叶大鹏老师于2008年4月5日完成的UART通信 ...
- 51单片机串口通信【收集学习向】
本篇整理了学习51串口通信过程中看到的一些比较好的文章,有很多的超链接.并根据自己遇到的情况分析了串口传输乱码的一些原因. 目录 1.原理知识 2.测试程序和虚拟仿真 3.电路设计与公母口连线 电路设 ...
- 《单片机串口通信及测控应用实战详解》——6.3 PC端程序设计
本节书摘来异步社区<单片机串口通信及测控应用实战详解>一书中的第6章,第6.3节,作者:李江全,聂晶,梁习卉子,刘新英,更多章节内容可以访问云栖社区"异步社区"公众号查 ...
- 蓝桥杯单片机串口通信学习提升笔记
今日得以继续蓝桥杯国赛备赛之旅: 有道是 "不知何事萦怀抱,醒也无聊,醉也无聊,梦也何曾到谢桥." 那我们该如何 让这位诗人纳兰 "再听乐府曲 ,畅解相思苦"呢 ...
- 普中单片机--串口通信(2)---通过串口助手发送数据点LED
普中单片机–串口通信(2) 通过串口助手发送数据 点亮LED 软件部分 #include <reg52.h> #define jingzhen 12000000UL /*使用12.0M晶体 ...
- 51单片机串口通信模板_51单片机串口通信
51 单片机串口通信 51 单片机串口通信(转载) 2009-03-03 18:22 一.串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计 算机端,而且也能实现计算机对单 ...
最新文章
- 【js】内置对象String的常用方法
- 在一个有返回值的方法中,用block回传的解决方法
- Android性能优化面试题,与性能优化相关面试题 - 与IPC机制相关面试题 - 《Android面试宝典》 - 书栈网 · BookStack...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
- 贫穷中透着零基础的单人制作游戏手册之二:做游戏不光靠创意
- DAVINCI开发原理之三----达芬奇编解码引擎Codec Engine(CE)
- MapReduce中的InputFormat(1)概述
- unity3d 鼠标延各个方向拖拽物体
- 让PHP查询mysql时不区分大小写
- 转载:图解SSL/TLS协议
- 《学习之道》第十七章保持平静
- FRR BGP协议分析12 -- ZEBRA路由的处理1
- 序列选项设置html,clustalx序列比对步骤
- 未转变者服务器载具名称,未转变者可以乘坐哪些车及载具参数介绍
- RocketMQ创建topic流程解析
- 微信红包服务器连接失败是怎么回事啊,微信公众平台,红包_微信发红包接口,线下测试正确,服务器上提示CA证书错误,微信公众平台,红包 - phpStudy...
- Apostrophe not preceded
- 农村也可以干大事业,小伙返乡种植葡萄,年收益达100万
- Ubuntu18.04安装sagemath(命令行安装,超方便)
- QSocketNotifier: Socket notifiers cannot be enabled or disabled from another
热门文章
- 武汉大学计算机学院2010情景剧,武汉大学金秋情景剧大赛精彩落幕(组图)
- 阿里巴巴JAVA代码规范三【考题】
- 【大数据技术详解】搭建redis集群服务的步骤和配置以及解决创建集群时会遇到的错误:NodeX replied with error:ERRInvalid node address specified
- 天使轮,种子,A轮,B轮,C轮,Pre-IPO
- java pdf 水印_java 如何给pdf文件加水印
- 易捷行云荣登“2020行业信息化百强之云计算大数据20强榜单”
- IT“茫一代”转型记:创业维艰 苦乐皆有
- 如何让技术大佬失去理智
- 万物互联时代,谷歌、亚马逊Alexa、homekit该如何选择?
- 程序员常用网站和工具(持续更新)