使用波特率为9600bpS,晶振频率为11.0592MHz,通过计算可知,串口的每位需延时0.104ms,通过执行96个指令周期可能完成0.104ms的延时。与其相关的程序在结构上可分为:IO口定义、串口发送函数、串口接收函数、延时函数。下面依次介绍各个部分。
1.IO口定义程序等
这部分程序主要包括基本的IO口定义、全局变量定义、头文件包含、函数声明等。为后面程序提供编程基本。其程序代码如下:
sbit RXD1 = 0x90;
sbit TXD1 = 0x91;
#define WR_delay 44 //写延时
#define RD_delay 43 //读延时
2.串口发送函数
串口发送函数首先发送起始位,再发送数据,根据通信协议选择是否发送校验位。最后发送停止位。延时法模拟串口发送流程如图所示。

其程序代码如下:
#define Check_bit_switch_on_off 0//不使用校验位
uchar Check_bit;
//往串口写一个字节
void Send_Byte(uchar input,bit Check_bit)
{
uchar i=8;
TXD=(bit)0; //发送启始位
Delay(39);
//发送8位数据位
while(i--)
{
TXD=(bit)(input&0x01); //先传低位
Delay(36);
input=input >>1;
}
//发送校验位(无)
#if Check_bit_switch_on_off
{
TXD1=(bit)(Check_bit); //发送校验位
Delay(36);
}
#else
Check_bit = Check_bit;
#endif
TXD1=(bit)1; //发送结束 位
Delay(46);
}
3.串口接收函数
串口接收函数首先等待起始位,然后接收数据,根据通信协议选择是否需要接收校验位。最后等待停止位。延时法模拟串口接收流程如图所示。

其程序代码如下:
//从串口读一个字节
uchar Revice_Byte(void)
{
uchar Output=0;
uchar i=8;
uchar temp=RD_delay;
//发送8位数据位
Delay(RD_delay *1.5); //此处注意,等过起始位
while(i--)
{
Output > >=1;
if(RXD1)
Output |=0x80; //先收低位
Delay(35); //(96-26)/2,循环共
//占用26个指令周期
}
//接收校验位
#if Check_bit_switch_on_off
(Check_bit)=TXD; //接收校验位
Delay(35);
#endif
while(--temp) //在指定的
//时间内搜寻结束位。
{
Delay(1);
if(RXD1)
break; //收到结束位便退出
}
return Output;
}
用延时方式可以模拟多个个串口,但是使用延时方式模拟的串口在接收上存在一定的难度,主要是采样定位要求严格,另外还必须知道每条语句的指令周期数。在调试过程中,读者可以借助编译软件通过反汇编的方式查看编译后的汇编语句,已确定你所使用的C语句的执行时间。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
晶振
+关注
关注
35文章
3637浏览量
73816 -
串口
+关注
关注
15文章
1627浏览量
83348 -
函数
+关注
关注
3文章
4422浏览量
67848 -
波特率
+关注
关注
2文章
320浏览量
35649 -
IO口
+关注
关注
3文章
170浏览量
25863
发布评论请先 登录
相关推荐
热点推荐
有关串口通讯延时问题的讨论
最简单的串口通讯作为子VI(写、延时50ms、读),然后单独运行子VI可以很好的通讯,然后在主程序调用该串口通讯子VI时问题来了,写进去以后要延时五六秒才能有返回数据,而且只要调用该子
发表于 12-24 16:49
串口通信延时发送问题or调用延时问题
本帖最后由 eehome 于 2013-1-5 10:08 编辑
有没有人遇到过以下奇怪的串口通信问题哈:简单的串口读写作为子VI供主程序调用,单独运行时读写正常,但是一旦在主程序中运行时就出
发表于 12-25 09:55
串口延时问题
最近写串口程序,遇到如下问题,在写与读之间设置延时,波特率为187500,发的16字节,收的8字节。但是运行一次延时需要设置在7ms以上才能每次都收到数据,只能延时设置小点,只运行一次
发表于 07-01 21:12
Labview串口读写的延时问题
先说一下通讯的目的:读取PLC中保持寄存器(MD)的值,通讯方式采用Modbus 485串口,波特率设置为19200;我采用VISA写函数将Modbus读指令写入串口中,再延时10ms后,采用
发表于 12-01 09:23
单片机IO 口模拟串口通信低到延时法
单片机IO 口模拟串口通信低到延时法,void WByte(uchar input){uchar i=8;TXD=(bit)0;//发送启始位Delay2cp(39);//发送8位数据位while
发表于 05-18 14:31
为什么4432无线串口模块有很大延时?
4432无线串口模块直接接在USB转TTL上通信就没有延时。。。。为什么接到单片机上就有延时。。。。。。。而且写得串口协议也都不能用了。。。
发表于 07-21 21:44
什么是无线串口模块?无线串口模块怎么用?
常看到很多网友在百度知道,天涯问答,搜搜问问等问答平台上提问什么是无线串口模块,无线串口模块怎么用等等这样的问题。可能是刚接触这个行业的人想了解这样的产品才会产生疑问,思为无线针对这个
使用延时法模块串口
评论