单片机IO口模拟串口程序(发送+接收
前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。经过若干曲折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总结的部分贴出来。
程序硬件平台:11.0592M晶振,STC单片机(兼容51) /*************************************************************** typedef unsigned char uchar; int i; uchar code info[] = sbit newTXD = P2^1;//模拟串口的发送端设为P2.1 void UartInit() // TH0 = 0xFD; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=18.432MHz void WaitTF0(void) // TH0 = 0xFD; // 定时器重装初值 fosc=18.432MHz void WByte(uchar input) //发送校验位(无) //发送结束位 void Sendata() void main() ############################################################################## /*************************************************************** typedef unsigned char uchar ; //这里用来切换晶振频率,支持11.0592MHz和18.432MHz struct sbit newRXD=P3^2 ;//模拟串口的接收端设为P3.2 void UartInit() #ifdef F18_432 IE|=0x81 ;// 中断允许总控制位EA=1;使能外部中断0 void WaitTF0(void) #ifdef F11_0592 #ifdef F18_432 //接收一个字符 #ifdef F18_432 TF0=0 ; WaitTF0();//等过起始位 TR0=0 ;//停止Timer0 //向COM1发送一个字符 void main() //外部中断0,说明模拟串口的起始位到来了 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以上是两个独立的测试程序,分别是模拟串口发送的测试程序和接收的测试程序 1、《51》在接收数据的程序中,采用的是循环等待的方法来检测起始位(见《51》的“附:51 IO口模拟串口通讯C源程序(定时器计数法)” 部分),这种方法在较大程序中,可能会错过起始位(比如起始位到来的时候程序正好在干别的,而没有处于判断起始位到来的状态),或者一直在检测起始位,而没有办法完成其他工作。为了避免这个问题,在本接收程序中采用了外部中断的方法,将外部中断0引脚作为模拟串口的接收端,设IT0=1(将外部中断0设为边缘触发)。这样当起始位(低电平)到来时,就会引发外部中断,然后在外部中断处理函数中接收余下的数据。这种方法可以保证没数据的时候程序该干什么干什么,一旦模拟串口接收端有数据,就可以立即接收到。 2、加入了模拟串口接收缓冲区。在较大程序中,单片机要完成的工作很多,在模拟串口接收到了数据之后立即处理的话,有可能处理不过来造成丢失数据,或者影响程序其他部分执行。本程序中加入了64个字节的缓冲区,从模拟串口接收到的数据先存放在缓冲区中。这样就算程序一时没工夫处理这些数据,腾出手来之后也能在缓冲区中找到它们。 3、《51》文中的WByte函数和RByte函数中都先打开计数器后关闭计数器。如果使用本文的外部中断法来接收数据,并且外部中断处理函数里外都调用了WByte或RByte的话,需要将这两个函数中的TR0=1,TR0=0操作的语句除去,并在UartInit()中加入一句TR0=1;即让TR0始终开着就可以。 #ifdef F18_432 while(!TF0); /********************************************** #ifdef F18_432 WaitTF0();//等过起始位 /********************************************** //发送校验位(无) //发送结束位 4、在上面的新修改后的RByte()函数中,有被注释掉的如下两句: |
转载于:https://blog.51cto.com/2942350/607348
单片机IO口模拟串口程序(发送+接收相关推荐
- 串口发送程序linux,单片机IO口模拟串口程序(发送+接收
前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些现有的资料,基本上完成了.现在将完整的测试程序,以及其中一些需要总结的部分贴出来. 程序硬件平台:11. ...
- 20120726-分析解决“STM8L101单片机IO口模拟串口通讯发生的奇怪现象”
近日因工作关系,需要用STM8L101F3P6这款单片机用IO口模拟串行通讯,波特率2400bps,前辈同事已经写完了程序,我需要拿来研究一下该款MCU的低功耗的情况,而在调试的过程中,发现1个奇怪的 ...
- 芯圣SQ013单片机IO口模拟串口 延时法
因为懒,许久未来更新,不过学习还是没有停止.今天我们介绍用芯圣SQ013模拟串口. 串口通讯概述 我们常用的串口通讯协议 为1个起始位+8个数据位+1位结束位.起始位为低电平,结束位高电平.一般我们常 ...
- STM8学习笔记----普通IO口模拟串口功能
串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...
- 国产单片机IO口模拟IrDA1.0协议
单片机IO口模拟IrDA1.0协议 IrDA1.0协议是一种利用红外通信的无线传输协议,可以很好的解决一些便携式设备与主机之间通信的问题,具有携带方便,低功耗,成本低,传输可靠等特点,缺点是传输距离较 ...
- STM32 IO口模拟串口通讯
转自:http://ziye334.blog.163.com/blog/static/224306191201452833850647 前阵子,调项目时需要用到低波特率串口通讯(300的波特率),才发 ...
- 基于s32k146的IO口模拟串口
zhe最近在搞一个IO口模拟LIN的代码,其中包括IO口模拟UART的部分,就记录一下,希望对像我们这样的初学者能有所帮助. 1. 串口协议 串口的特点:全双工,串行,异步 串口协议(我这里选用最常见 ...
- io口模拟串口 1602显示数据位内容[转]
一个项目的一部分内容,让初学者模拟着做一下,还是很有用处的. 这样的程序可以实现一个51单片机有两个串口 #include<regx52.h> sbit BT_SND =P1^1; sbi ...
- 普通io口模拟串口通信
之前公司在做项目的时候需要用到多串口,板载串口资源不足,就在网上找相关内容,结合自己的理解做出虚拟串口. 模拟串口需要用到两个普通io引脚,一个定时器. /** *软件串口的实现(IO模拟串口) * ...
最新文章
- 30~60k | 小鹏汽车3D视觉感知工程师/专家招聘(社招)
- MySQL与SQLServer的区别(一千条语句)
- [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)
- 碗都交出去了,能不能分到羹?
- Iptables防火墙配置
- 数据库-优化-Limit查询的优化
- Android串口编程--开关灯Demo(附源码)
- Linux编程练习 --多线程1--线程创建
- spring boot maven项目返回值乱码的解决方法
- Python day13文件的读写
- 大数据之-入门_大数据部门业务流程分析---大数据之hadoop工作笔记0006
- 微信公众号开发 ----微信获取access_token(2)
- JavaScript TypeScript
- script加密解密工具下载
- linux rstudio 中文乱码,谈谈R中的乱码(一)
- WiFi温湿度传感器开发
- 一篇搞定企业级C++跨平台线程池
- 一个等号= 二个等号== 三个等号=== 的区别
- API登录接口文档事例
- AE基础界面设置和旋转加载案例
热门文章
- 函数指针也可作为函数的参数
- rhel7+apache+c cgi+动态域名实现web访问
- 【bzoj1726/Usaco2006 Nov】Roadblocks第二短路——SPFA
- reporting services订阅
- Kali忘记登录密码——修改root密码
- base64报错与已下载模块,但import失败解决
- I春秋第四季CTF-Web-Writeup(部分)
- Socket套接字的速率控制(linux)
- c语言1000内亲密对数,《C语言程序的设计上机指导》项目五函数及其应用.pptx
- linux crontab结束,linux – Crontab:有开始和结束时间的日志吗?