模拟串口的三种方法及C语言

合集下载

LabWindows_CVI开发环境下实现串口通讯的方法

LabWindows_CVI开发环境下实现串口通讯的方法

软件应用
表 4 串口设置函数功能
函数名 ComB reak Com SetE scap e F lu sh InQ F lu shO u tQ SetCT SM ode SetCom T im e SetXM ode
函数功能 设置通讯终止时间 设置各种通信握手信号
清空接收队列 清空发送队列 设置硬件握手 设置通讯超时时间 允许或禁止串口通讯的软件握手
B u tton
函数为 R eceiveD a te
Q u it
QU IT
Comm and 退出应用程序, 消息
B u tton
响应函数为 qu it
413 程序部分代码 在主函数中打开串口:
O p enCom Config (1, " " , 9600, 0, 8, 1, 512, 512) ;
打 开 并 设 置 串 口, 此 调 用 语 句 打 开 串 口 1, 波 特 率 为
L abW indow s CV I 有许多标准函数库, 其中的 R S232 函数库提供了各种方式的串口通讯控制函数和 I O 函数, 一共可分为打开 关闭函数、I O 读写函数、 调制解调器控制函数、 串口设置函数、 寄存器状态函
数和回调函数 6 类。 其中部分较常用的函数如下: 这些函数返回的各种状态信息可参阅相应函数面
收稿日期: 2003 11 15
62
软件开发的角度来看, L abW indow s CV I 具有以下一 些特点:
(1) 基于标准 C 语言, 简单易学。 (2) 可视化、 交互式的开发工具。 具有人机交互 界 面编辑器, 运用可视化交互技术实现 “所见即所 得”, 使人机界面的实现直观简单。对每一个函数都提 供了一个函数面板, 用户可以通过函数面板交互地输 入函数的每一个参数及属性值。 这种交互式编程技术 大大提高了工程设计的效率和可靠性。 (3) 具有程序自动生成的能力, 可减少软件开发 过程中代码编写的工作量。 设计好的人机交互界面 (虚拟仪器面板) 存储在后缀名为 1u ir 的文件中。L ab2 W indow s CV I 自动生成原码头文件 1h, 自动声明界 面对象常量及相关的回调函数, 编程人员不必钻研这 些技术。 (4) 具有齐全的软件工具包及功能强大的函数库, 通过简单调用库函数就能驱动相应的总线的各种仪器 和硬件板卡。这些工具包和函数库具有更高的效率, 他 使得程序的编写更简洁、 直观。 (5) 完善的兼容性。借助于L abW indow s CV I, 有 经验的 C C+ + 语言开发人员可以采用熟悉的 C 语言 环境, 如V C, BC 等开发自己的虚拟仪器系统。另外, 还可将仪器库函数及子程序编译成 32 位DLL , 以用 于任何 32 位 C C+ + 环境中以及 V isua l B a sic 或 L ab2

c语言串口传输浮点数

c语言串口传输浮点数

c语言串口传输浮点数摘要:一、引言- 介绍C 语言串口传输浮点数的背景和意义二、C 语言串口传输浮点数的原理- 浮点数的表示方法- 串口通信的基本概念和原理- C 语言中串口通信的实现方法三、C 语言串口传输浮点数的步骤- 初始化串口通信- 发送浮点数- 接收浮点数- 解析浮点数四、C 语言串口传输浮点数的应用- 在工程中的实际应用- 应用案例分析五、总结- 概括C 语言串口传输浮点数的优点和不足- 对未来发展的展望正文:一、引言C 语言作为一种广泛应用于计算机领域的编程语言,在各种工程中有着广泛的应用。

在实际工程中,常常需要对浮点数进行传输,这就要求我们研究C 语言串口传输浮点数的方法。

本文将对此进行详细介绍。

二、C 语言串口传输浮点数的原理1.浮点数的表示方法浮点数是一种用于表示实数的计算机数据类型,它在计算机中广泛应用。

C 语言中的浮点数通常用float 和double 类型表示。

其中,float 类型占用32 位,double 类型占用64 位。

在实际应用中,我们需要将浮点数转换为二进制形式进行传输。

2.串口通信的基本概念和原理串口通信是一种异步通信方式,它在计算机和外部设备之间传输数据。

串口通信具有传输速度快、成本低等优点。

在C 语言中,我们可以通过调用串口通信库函数实现串口通信。

3.C 语言中串口通信的实现方法在C 语言中,我们可以使用stdio.h 库中的printf() 和scanf() 函数实现串口通信。

此外,还可以使用第三方库,如Windows 下的PuTTY 和Linux 下的minicom 等工具进行串口通信。

三、C 语言串口传输浮点数的步骤1.初始化串口通信在进行串口通信前,我们需要先打开串口,配置串口参数,如波特率、数据位、停止位和奇偶校验等。

2.发送浮点数将需要传输的浮点数转换为二进制形式,并按照一定的格式发送到串口。

3.接收浮点数接收从串口传来的数据,并将其转换为浮点数形式。

如何使用单片机的单个IO口模拟串口UART输出

如何使用单片机的单个IO口模拟串口UART输出
if(பைடு நூலகம்at & BIT(i)) {
IO_UART_TX_H(); } else {
IO_UART_TX_L(); asm("l.nop");//延时一个机器周期 } delay_one_bit_tx(); } IO_UART_TX_H();//发送结束位 delay_one_bit_tx(); }
1
V1.0
模拟的串口协议如下:
起始位 1 位 数据位 8 位 停止位 1 位 校验位 无
参考的代码如下:
void io_uart_send_byte(unsigned char dat) {
Unsigned char i ; IO_UART_TX_L();//拉低作为起始 delay_one_bit_tx();//按照需要的波特率来延时 for(i = 0 ; i< 8 ; i++) {
普通 MCU 模拟串口发送说明
相关说明:
(1)、模拟 115200 波特率,信号跳变的时间为 8.68uS = 1 / 115200 (2)、模拟 9600 波特率,信号跳变的时间为 104.1uS = 1 / 9600 (3)、串口的波特率越高,所需要的时间越短,相对稳定性越差,建议采用 9600 波特率。 (4)、串口的发射模拟相对比较容易,接收比较困难。下面就串口的 IO 模拟发射做说明 (5)、我们的串口允许的时钟误差最多 3%。所以用户请严格的控制时间误差在这个范围。

用C语言程序实现串行通信接口技术

用C语言程序实现串行通信接口技术

收, 称为通用异步发送胺 收 用来节省 CU的时间, 器, P 提高
收稿 日期 :0 2 0 — 2 21—40
作者简 介 : 文杰( 9 5 )男 , 宁职业技术学 院讲师 。 施 17 一 , 咸
21年 6 02 月
天 津 市 经 理 学 院 学 报
Junl f i j aae C lg ora o a i M ngr o ee T nn l
程序运行的效率, MP I C系列通常采用 85U R B 20 A T来处理 串行通信。
二、编程
查询通信方式接 口 程序, 是一典型的数据采集程序。其
中 b O ( i S )函数初始化 C M 此函数实际调用 BO oC m O 1( IS
请要求( 打开串口) , 通信完成 后必须释放资源, 即关闭串口。 P c系列机可以通过 D S O 调用 ,IS BO 调用或直接存取硬件来 存取串行口, D S B S 但 O 和 I 功能调用均为查询方式, O 需数 根信号线连接或彼此间 互相短接, 需握手信号, 不提供中 断 功能, 难以实现高效率的 通信, 为提高通信效率可采用直接 访问串行 口端口地址的方式, 并用 C语言来编写串行通信查 询和中断两种方式的接口 程序。
及时将之读出, 以免后续字符重叠 , 发生溢出错误 ,A T有 UR

串口 通信的基本原理
用 r 规程的异步通信适配器的 EA S22 接 口标 I . I IR 一3C
准, 选择单向 不平衡传输方式, 采用负逻辑电 既逻辑 1 平, 表 示为 信号电平一5 , 1 逻辑0 V 表示为信号电 1 , 平+5 其通信规 V
串口 的本质功能是作为 CU P 和串1 3 通信设备间的编码 转换器。当数据从 CU经过串口发送出去时, P 字节数据转换

c语言在处理需要等待的串口应答时,的处理方法

c语言在处理需要等待的串口应答时,的处理方法

C语言在处理需要等待串口应答时的方法在嵌入式系统开发中,经常会遇到需要与外部设备进行串口通信的情况。

而在串口通信过程中,有时需要等待外部设备的应答,这就需要我们在C语言中设计一种有效的处理方法。

本文将从深度和广度的角度,探讨C语言在处理需要等待串口应答时的方法,以便读者能更深入地理解。

1. 等待串口应答的基本原理在进行串口通信时,通常会向外部设备发送指令或数据,并等待外部设备的应答。

在C语言中,为了处理这种情况,我们通常会采用轮询或中断的方式来实现。

轮询方式是指在发送指令后,通过循环不断查询串口接收缓冲区是否有数据到达;而中断方式则是通过串口接收中断来实现异步的数据接收和处理。

2. 轮询方式的处理方法当采用轮询方式时,我们可以通过循环调用串口接收函数来查询是否有数据到达。

在等待串口应答时,可以设置一个超时计数器,当超过一定时间还没有接收到应答时,即认为超时。

这种方法简单直接,适用于简单的应用场景。

3. 中断方式的处理方法相比轮询方式,中断方式更加灵活和高效,特别适用于需要高并发处理或低功耗设计的情况。

在中断方式下,当串口接收到数据时,会触发一个中断,我们可以在中断服务函数中对接收到的数据进行处理。

在等待串口应答的过程中,可以设置一个标志位,在中断服务函数中对标志位进行检测,以判断是否接收到了应答数据。

4. C语言处理方法的选择在实际应用中,我们需要根据具体的需求和系统特点来选择合适的处理方法。

如果系统比较简单,且串口通信并发量不高,可以考虑采用轮询方式;如果系统需要保持低功耗,或需要处理大量的并发数据,那么中断方式可能更为适合。

5. 个人观点和理解在处理需要等待串口应答的情况时,我们需要综合考虑系统的实际需求、性能要求和功耗设计等因素,选择合适的处理方法。

在设计和实现时,需要考虑到错误处理、超时机制和数据完整性等问题,以确保通信的可靠性和稳定性。

总结回顾本文从轮询和中断两种处理方法出发,探讨了C语言在处理需要等待串口应答时的方法。

VC 串口编程基础之如何用 VC 打开串口和关闭串口

VC 串口编程基础之如何用 VC 打开串口和关闭串口

VC 串口编程基础之如何用VC 打开串口和关闭串口在对串口进行操作之前都需要先打开串口,VC 串口编程方法分为利用VC 串口控件(或VC 串口类)和直接调用Windows底层API函数(我称之为VC API 串口编程)两种方法,不管哪种方法,其实质都是利用底层API函数对串口进行操作,这里我们来看怎么利用API函数来用VC 打开串口。

在Windows 32位以上操作系统(Win98以上)中,将串口(包括其它通信设备)作为文件来处理,所以串口的打开、读写和关闭所用API函数与文件操作函数一样。

所以打开串口用CreateFile,读串口用ReadFile,写串口用WriteFile,关闭串口用CloseHandle。

一、用VC 打开串口、关闭串口的API函数1、打开串口用CreateFile,其声明如下:1HANDLE CreateFile(2LPCTSTR lpFileName, // file name3DWORD dwDesiredAccess, // access mode4DWORD dwShareMode, // sha re mode5LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD6DWORD dwCreationDisposition, // how to create7DWORD dwFlagsAndAttributes, // file attributes8HANDLE hTemplateFile // handle to template file9);部分参数解释如下:●lpFileNam e:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2,若要知道您的电脑有哪此串口,可以打开设备管理器查看,如下图所示,或用丁丁串口调试助手,这个工具启动后会枚举系统当前存在的串口。

●dwDesiredAccess:访问类型,有读(dwDesiredAccess=GENERIC_READ)、写(dwDesiredAccess=GENERIC_WRITE)或两者兼有((dwDesiredAccess=GENERIC_READ | GENERIC_WRITE)。

用C语言实现串口通信技术

LI Xi o g HU U —d n , ANG i a i L —r n
(Sadr stt o oae i n ehooyJ a 5 13 C i hn o I tue f rnra adTcn l ,i n200 ,hn gni Cr cl g n a)
Ab t a t T i p p r many it d c d t e b sc k o e g f s r lc mm n c t n, n e e l e eil s c: r h s a e i l n r u e h a i n wld e o e i o u iai a d t n rah d s r o a o h a
少, 在远距离通信 中可以节约通信成本 , 当然 , 其传
输 速度 比并 行传输 慢 。
由于 C U与接 口之间按并行方式传输 , 口与 P 接
外设之间按串行方式传输 , , 串行接 口中 , 因此 在 必
须要有“ 接收移位寄存器” 串一并 ) 发送移位寄 ( 和“
存 器 ”并 一 串 ) ( 。在数据 输入 过程 中, 据一 位一 位 数
中图分类号 : T 3 1 P1 文献标识码 : A 文章编号 : 17 —48 (070 — 9 —0 6 1 35 20 )2 0 3 4
To Re l e S ra mm u iato c noo y by C n u g ai e ilCo z n c in Te h lg La g a e
维普资讯 业技 术学院学报
Ju a fS a dn ntueo o o r lo hn o gIsi t fC mme n n t  ̄eadT
V0 . N . 17 o2 A r2 0 v .0 7
2O 年 4月 O7

基于C语言的RS232串口通信的设计


Wh e t h e r C o m 函数 、 O u t C o m 函数 、 R e c e i v e C o m 函数
进 行若 干字节 数 据 的发送 和 接 收 ,并 利 用 R e c e i v e 。 Da t a函数将 不 连续 的数 据包 进 行叠 加 , 形 成一 个 完 整 的数 据包 。
i m C h e c k P o r t ( u n s i g n e d i n t n R e s u l t )
Re c e i ve Da t a
i m Wh e t h e r Co m( i n t p o t r , b y t e d a t a )

f 砀 e t he r Co m
Re c e i ve Co m
d a t a , i m p a r i t y , i n t s t o p ) / 指 定 的 串 口 p o r t ,波 特 率 b a u d , 数 据位 d a t a , 是 否校 验 p a r i y, t 停 止位 s t o p /
由p o r t 指 定 相 应 的 端 口 0表示 C OM1 , 1表 示 C OM2 , 以此 类推 。C md定 义如 表二 所示 。
表 二 Cmd定 义
2 . 3 通信函数的应用
函数 的实 现 流程 如 图一所 示 。通 过 I n i t i a l C o m 函数可 以方 便初 始 化 串行 接 口 , C h e c k P o r t 函数检 查
C o m、 检 测 串 口是 否 发 生错 误 函数 C h e c k P o r t 、 串口 是 否有 数 据 到达 函数 Wh e t h e r C o m、 向串 口发 送 一

Keil仿真的串口仿真的调试技巧

引言在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。

通常使用单片机串口通过RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。

RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。

在单片机编程中,串口占了很重要的地位。

传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。

在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。

使用硬件仿真器的确是很有效的方法,但是也有一些缺点:◆很多仿真器不能做到完全硬件仿真,因而会造成仿真时正常,而实际运行时出现错误的情况;也有仿真不能通过,但是实际运行正常的情况。

◆对于一些较新的芯片或者是表面贴装的芯片,要么没有合适的仿真器或仿真头;要么就是硬件仿真器非常昂贵,且不容易买到。

◆有时由于设备内部结构空间的限制,仿真头不方便接入。

◆有的仿真器属于简单的在线仿真型,仿真时有很多限制。

例如速度不高,实时性或稳定性不好,对断点有限制等,造成仿真起来不太方便。

1 调试前的准备工作下面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法。

使用这种方法,无需任何硬件仿真器,甚至都不需要用户电路板。

所需的只是:①硬件。

1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。

②串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用来收发数据。

如果没有合适的串口调试软件,则可使用笔者编写的一个免费的串口小工具TurboCom。

除了与其他软件一样的数据收发功能外,它还有定时轮流发送自定义数据帧和自动应答(接收到指定数据帧后,自动返回相应的数据帧)这两个很有用的功能,特别适合于老化测试。

linux c语言 串口读取数据的方法

linux c语言串口读取数据的方法Linux下使用C语言读取串口数据的方法引言:串口是计算机和外部设备进行通信的一种重要的通信接口。

在Linux系统中,要使用C语言读取串口数据,需要通过打开串口设备文件,设置串口参数,并进行读取数据的操作。

本文将介绍如何通过C语言在Linux下读取串口数据的方法。

目录:1. 了解串口的工作原理2. 打开串口设备文件3. 设置串口参数4. 读取串口数据5. 示例程序6. 总结1. 了解串口的工作原理:在开始编写C语言读取串口数据的方法前,首先需要了解串口的工作原理。

串口是通过硬件电路实现两台设备之间的数据传输,属于一种异步串行通信方式。

典型的串口包含发送数据引脚(TX)、接收数据引脚(RX)、数据位、停止位、奇偶校验位等。

2. 打开串口设备文件:在Linux系统中,每个串口设备都被映射到一个设备文件上,例如/dev/ttyS0代表第一个串口设备,/dev/ttyUSB0代表第一个USB串口设备。

要使用C语言读取串口数据,需要首先打开相应的串口设备文件。

在C语言中,使用open()函数打开串口设备文件。

open()函数的原型如下:cint open(const char *pathname, int flags);其中pathname参数指定要打开的串口设备文件路径,flags参数指定打开方式。

常用的flags参数有O_RDONLY(只读方式打开)、O_WRONLY (只写方式打开)和O_RDWR(读写方式打开)。

例如,要打开第一个串口设备文件,可以调用open()函数如下:cint fd = open("/dev/ttyS0", O_RDWR);if (fd == -1){perror("Error opening serial port");return -1;}当open()函数成功打开串口设备文件时,会返回一个非负整数的文件描述符fd,用于后续的操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机模拟串口的三种方法[ 2007-8-2 9:50:00 | By: MCUBLOG ](转)随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。

这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。

本文所说的模拟串口,就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。

至于串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的时间越短。

如波特率为9600BPS,即每一位传送时间为1000ms/9600=0.104ms,即位与位之间的延时为为0.104毫秒。

单片机的延时是通过执行若干条指令来达到目的的,因为每条指令为1-3个指令周期,可即是通过若干个指令周期来进行延时的,单片机常用11.0592M的的晶振,现在我要告诉你这个奇怪数字的来历。

用此频率则每个指令周期的时间为(12/11.0592)us,那么波特率为9600BPS每位要间融多少个指令周期呢?指令周期s=(1000000/9600)/(12/11.0592)=96,刚好为一整数,如果为4800BPS则为96x2=192,如为19200BPS则为48,别的波特率就不算了,都刚好为整数个指令周期,妙吧。

至于别的晶振频率大家自已去算吧。

现在就以11.0592M的晶振为例,谈谈三种模拟串口的方法。

方法一:延时法通过上述计算大家知道,串口的每位需延时0.104秒,中间可执行96个指令周期。

#define uchar unsigned charsbit P1_0 = 0x90;sbit P1_1 = 0x91;sbit P1_2 = 0x92;#define RXD P1_0#define TXD P1_1#define WRDYN 44 //写延时#define RDDYN 43 //读延时//往串口写一个字节void WByte(uchar input){uchar i=8;TXD=(bit)0; //发送启始位Delay2cp(39);//发送8位数据位while(i--){TXD=(bit)(input&0x01); //先传低位Delay2cp(36);input=input>>1;}//发送校验位(无)TXD=(bit)1; //发送结束位Delay2cp(46);}//从串口读一个字节uchar RByte(void){uchar Output=0;uchar i=8;uchar temp=RDDYN;//发送8位数据位Delay2cp(RDDYN*1.5); //此处注意,等过起始位while(i--){Output >>=1;if(RXD) Output |=0x80; //先收低位Delay2cp(35); //(96-26)/2,循环共占用26个指令周期}while(--temp) //在指定的时间内搜寻结束位。

{Delay2cp(1);if(RXD)break; //收到结束位便退出}return Output;}//延时程序*void Delay2cp(unsigned char i){while(--i); //刚好两个指令周期。

}此种方法在接收上存在一定的难度,主要是采样定位存在需较准确,另外还必须知道每条语句的指令周期数。

此法可能模拟若干个串口,实际中采用它的人也很多,但如果你用Keil C,本人不建议使用此种方法,上述程序在P89C52、AT89C52、W78E52三种单片机上实验通过。

方法二:计数法51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。

这样我们就可以通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。

//计数器初始化void S2INI(void){TMOD |=0x02; //计数器0,方式2TH0=0xA0; //预值为256-96=140,十六进制A0TL0=TH0;TR0=1; //开始计数TF0=0;}void WByte(uchar input){//发送启始位uchar i=8;TR0=1;TXD=(bit)0;WaitTF0();//发送8位数据位while(i--){TXD=(bit)(input&0x01); //先传低位WaitTF0();input=input>>1;}//发送校验位(无)//发送结束位TXD=(bit)1;WaitTF0();TR0=0;}//查询计数器溢出标志位void WaitTF0( void ){while(!TF0);TF0=0;}接收的程序,可以参考下一种方法,不再写出。

这种办法个人感觉不错,接收和发送都很准确,另外不需要计算每条语句的指令周期数。

方法三:中断法中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位,当然程序中需对中断进行初始化,同时编写中断程序。

本程序使用Timer0中断。

#define TM0_FLAG P1_2 //设传输标志位//计数器及中断初始化void S2INI(void){TMOD |=0x02; //计数器0,方式2TH0=0xA0; //预值为256-96=140,十六进制A0TL0=TH0;TR0=0; //在发送或接收才开始使用TF0=0;ET0=1; //允许定时器0中断EA=1; //中断允许总开关}//接收一个字符uchar RByte(){uchar Output=0;uchar i=8;TR0=1; //启动Timer0TL0=TH0;WaitTF0(); //等过起始位//发送8位数据位while(i--){Output >>=1;if(RXD) Output |=0x80; //先收低位WaitTF0(); //位间延时}while(!TM0_FLAG) if(RXD) break;TR0=0; //停止Timer0return Output;}//中断1处理程序void IntTimer0() interrupt 1TM0_FLAG=1; //设置标志位。

}//查询传输标志位void WaitTF0( void ){while(!TM0_FLAG);TM0_FLAG=0; //清标志位}中断法也是我推荐的方法,和计数法大同小异。

发送程序参考计数法,相信是件很容易的事。

另外还需注明的是本文所说的串口就是通常的三线制异步通信串口(UART),只用RXD、TXD、GND。

附:51 IO口模拟串口通讯C源程序(定时器计数法)#i ncludesbit BT_SND =P1^0;sbit BT_REC =P1^1;/**********************************************IO 口模拟232通讯程序使用两种方式的C程序占用定时器0**********************************************/#define MODE_QUICK#define F_TM F0#define TIMER0_ENABLE TL0=TH0; TR0=1;#define TIMER0_DISABLE TR0=0;sbit ACC0= ACC^0;sbit ACC1= ACC^1;sbit ACC2= ACC^2;sbit ACC3= ACC^3;sbit ACC4= ACC^4;sbit ACC5= ACC^5;sbit ACC6= ACC^6;sbit ACC7= ACC^7;void IntTimer0() interrupt 1F_TM=1;}//发送一个字符void PSendChar(unsigned char inch) {#ifdef MODE_QUICKACC=inch;F_TM=0;BT_SND=0; //start bitTIMER0_ENABLE; //启动while(!F_TM);BT_SND=ACC0; //先送出低位F_TM=0;while(!F_TM);BT_SND=ACC1;F_TM=0;while(!F_TM);BT_SND=ACC2;F_TM=0;while(!F_TM);BT_SND=ACC3;F_TM=0;while(!F_TM);BT_SND=ACC4;F_TM=0;while(!F_TM);BT_SND=ACC5;F_TM=0;while(!F_TM);BT_SND=ACC6;F_TM=0;while(!F_TM);BT_SND=ACC7;F_TM=0;while(!F_TM);BT_SND=1;F_TM=0;while(!F_TM);TIMER0_DISABLE; //停止timer #elseunsigned char ii;ii=0;F_TM=0;BT_SND=0; //start bit TIMER0_ENABLE; //启动while(!F_TM);while(ii<8){if(inch&1){BT_SND=1;}else{BT_SND=0;}F_TM=0;while(!F_TM);ii++;inch>>=1;}BT_SND=1;F_TM=0;while(!F_TM);#endifTIMER0_DISABLE; //停止timer }//接收一个字符unsigned char PGetChar() {#ifdef MODE_QUICKTIMER0_ENABLE;F_TM=0;while(!F_TM); //等过起始位ACC0=BT_REC;TL0=TH0;F_TM=0;while(!F_TM);ACC1=BT_REC;F_TM=0;while(!F_TM);ACC2=BT_REC;F_TM=0;while(!F_TM);ACC3=BT_REC;F_TM=0;while(!F_TM);ACC4=BT_REC;F_TM=0;while(!F_TM);ACC5=BT_REC;F_TM=0;while(!F_TM);ACC6=BT_REC;F_TM=0;while(!F_TM);ACC7=BT_REC;F_TM=0;while(!F_TM){if(BT_REC){break;}TIMER0_DISABLE; //停止timer return ACC;#elseunsigned char rch,ii; TIMER0_ENABLE;F_TM=0;ii=0;rch=0;while(!F_TM); //等过起始位while(ii<8){rch>>=1;if(BT_REC){rch|=0x80;}ii++;F_TM=0;while(!F_TM);}F_TM=0;while(!F_TM){if(BT_REC){break;}}TIMER0_DISABLE; //停止timer return rch;#endif}//检查是不是有起始位bit StartBitOn(){return (BT_REC==0);}void main(){unsigned char gch;TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */PCON=00;TR0=0; //在发送或接收才开始使用TF0=0;TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒执行的timer是//104.167*11.0592/12= 96TL0=TH0;ET0=1;EA=1;PSendChar(0x55);PSendChar(0xaa);PSendChar(0x00);PSendChar(0xff);while(1){if(StartBitOn()){gch=PGetChar();PSendChar(gch);}}}。

相关文档
最新文档