面就是用C语言编写控制串行口的程序.pdf

合集下载

单片机串行口编程-推荐下载

单片机串行口编程-推荐下载
实验三 单片机串行口编程
一、实验目的 1、掌握单片机串行口的工作方式; 2、掌握片机串行口的编程方法。
二、实验内容 1、学习单片机串行口的工作方式、初始化以及应用等; 2、利用单片机串行口编写程序,利用串口助手工具通过 PC 机发送相应
信息,单片机串行口根据接收到的信息控制开发板上的 LED 灯按一定规 律工作。 要求: “#”指令开始标志,“*”指令结束标志。 根据接收到的指令 start—控制 LED 灯闪烁,闪烁频率 1Hz;pause—控制 LED 点亮;stop—控制 LED 熄灭。 测试串口正常工作的代码(通过串口接收一个字符,再发送回串口) #include <reg51.h> main() {
} //定时器中断 void Timer0() interrupt 1 {
TH0=(65536-50000)/256; TL0=(65536-50000)%256;
num ++; if(num==20) {
num=0; led=!led; } } //串行中断 void seri() interrupt 4 { //RI 接受中断标志 TI 发送中断标志 if(RI) {
TH1=0xf3; //设置定时器 1 的初值
TL1=0xf3; SCON=0x50; //设置串行口方式 1,并允许接收
PCON=0x80; //SMOD=1
TR1=1;
while(1) {
while(RI==0); a=SBUF; RI=0;
SBUF=a; while(TI==0); TI=0; } }
unsigned char num; //定时 unsigned char start[]="#start*"; unsigned char stop[]="#stop*"; unsigned char pause[]="#pause*"; unsigned char startNum,stopNum,pauseNum; //初始化 void init() {

第7章 单片机C语言编程串行口通讯

第7章 单片机C语言编程串行口通讯

7.3.3 串行口方式2和方式3
串行口工作在方式2和方式3均为每帧11 位异步通信格式,由TXD和RXD发送与接 收(两种方式操作是完全一样的,不同的 只是特波率)。 每帧11位:即1位起始位、8位数据位 (低位在前)、1位可编程的第9数据位和1 位停止位。 发送时,第9数据位(TB8)可以设置为 1或0,也可将奇偶位装入TB8; 接收时,第9数据位进入SCON的RB8。
7.2.2 与串行口有关的特殊功能寄存器
TB8(SCON.3):发送数据的第9位。
RB8(SCON.2):接收数据的第9位。
TI(SCON.1):发送中断标志。
RI(SCON.0):接收中断标志。
关于TI和RI:串行发送中断标志TI和接 收中断RI是同一个中断源,CPU事先不知道 是发送中断标志TI还是接收中断标志RI产生 的中断请求,所以,在全双工通信时,必须 由软件来判别。
SM2(SCON.5):多机通信控制位,在 方式2或3中使用。 REN(SCON.4):允许接收控制位,由 软件置1或清0。
7.2 MCS-51单片机的串行通讯接口
SFR:SCON串行接口控制器(98H) 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM0 SM1 SM2 REN TB8 RB8 TI
3执行proteus和串口调试助手745电路图功能分析串口调试助手通过rs232串口发送数据给单片机单片机接受数据后将该数据也通过rs232串口返发送给串口调试助75max487多机通信应用实例751设计要求用c语言编程在主从三个单片机中进行双机通信若从机显示数字和主机的数字一致则表示该从机在和主机通信中
振荡频率 32 (65536 ( RC AP2H, RC AP2L) )

单片机应用技术基础(C语言)-串行口通信技术

单片机应用技术基础(C语言)-串行口通信技术

串行口通信技术
6.2.4 波特率设计计算与常用波特率 1. 波特率设计计算 在串行通信中,收发双方对发送或接收的数据速率要有
一定的约定,通过软件对串行口编程可约定4种工作方式。 其中方式0和方式2的波特率是固定的,而方式1和方式3的波 特率是可调的,由定时器的溢出率决定。
串行口通信技术
对方式1和方式3的波特率设计,实际上是通过对定时器 设计实现的。定时器1的溢出率取决于单片机定时器1的工作 方式和计数初值X。定时器1作波特率发生器使用时,通常 选用具有自动重装载初值功能的方式2,那么定时器每过 “256-X”个机器周期,定时器1就会产生一次溢出。定时 器1的溢出率可用以下公式表示:
1. 任务目的 了解51系列单片机串行口的结构,掌握其使用方法。 2. 任务要求 发送方向接收方发送数据,接收方接收数据并将数据在 P1口通过8个LED发光二极管以二进制形式显示出来。
串行口通信技术
3. 硬件电路 U1为发送方,U2为接收方,将双方的RXD(P3.0)和 TXD(P3.1)交叉互连即可,如图6.1所示。图中最小系统没有 画,本任务仅涉及单向通信,所以只需将发送方的TXD连 接至接收方的RXD即可。
串行口通信技术
异步通信中有两个重要指标:数据帧格式和波特率。 1) 数据帧格式 数据帧通常由起始位、数据位、奇偶校验位和停止位四 部分组成。 (1) 起始位:表示传送一个数据的开始,用低电平表示, 占一位。 (2) 数据位:要传送的数据的具体内容,典型的数据位 数是7位或8位,一般为7位(ASCII 码),数据从低位开始传 送。
串行口通信技术
2. 电源控制寄存器PCON PCON主要是为CHMOS型单片机的电源控制而设置的 专用寄存器,其字节地址为87H, 没有位寻址功能。 PCON的格式为

串行口的C51编程

串行口的C51编程

5.2.1 工作方式0的C51程序设计
• 方式0是同步移位寄存器输入/输出。 • 格式:
1、方式0的波特率
• 在串口方式0下,每个机器周期产生一个 移位时钟,对应着一个比特数据的发送和接 收。因此,此时波特率固定为单片机振荡频 率的1/12,其波特率计算公式如下: • 串口方式0波特率=fosc/12 • 在串口方式0下,波特率不受波特率倍增 SMOD的影响。因此,在C51程序设计时只要 指定工作方式0便完成串口速率的设置,而无 需再设置波特率。
5.3 串行口的C51编程应用示例
• 【例5-9】串行口自发自收
• • • • • • • • • • •
#include<reg51.h> #define uchar unsigned char #define uint unsigned int void main( ) { uchar i=0x55; uint j=0; TMOD=0X20; //设定定时器1模式2 TL1=TH1=0XF4; PCON=0X00; SCON=0X50; TR1=1;
第5章 单片机串行口的C51编程
5.1 串行口基础知识 5.1.1 串行口的结构 5.1.2 有关的寄存器 5.1.3 串行口的工作方式 5. 2 不同工作方式下的C51编程 5.2.1 工作方式0的C51程序设计 5.2.2 工作方式1的C51程序设计 5.2.3 工作方式2的C51程序设计 5.2.4 工作方式3的C51程序设计 5.3 串行口的C51编程应用示例
3.方式0的数据接收及C51程序设计
• 对于方式0的数据接收,单片机的TXD引脚都 用于发送同步移位脉冲,而8位串行数据是通 过RXD引脚来输入。 • 在方式0下,C51程序可以按照如下的流程来 进行数据的接收: • ①首先,需要对寄存器SCON进行初始化,即 工作方式的设置。由于这里使用的是串行口 的方式0,允许接收,因此需将10H送入SCON, 即置R和TB8位都 不起作用,一般置0即可。

最新-C语言实现串行通信接口程序 精品

最新-C语言实现串行通信接口程序 精品

C语言实现串行通信接口程序摘要本文说明了异步串行通信-232的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的语言源程序。

的通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上-232在标准条件下的最大通信速率仅为20。

尽管如此,大多数外设都提供了串行口接口,尤其在工业现场-232的应用更为常见。

及兼容机系列都有-232的适配器,操作系统也提供了编程接口,系统接口分为功能调用和功能调用两种21的03和04号功能调用为异步串行通信的接收和发送功能;而14有4组功能调用为串行通信服务,但和功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用语言编写了串行通信查询和中断两种方式的接口程序。

1串行口工作原理微机串行通信采用-232标准,为单向不平衡传输方式,信号电平标准±12,负逻辑,即逻辑1表示为信号电平-12,逻辑0表示为信号电平+12,最大传送距离15米,最大传送速率196波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位0,然后传8或7,6,5个数据位0,1,接着可传1位奇偶校验位,最后为1~2个停止位1,由此可见,传送一个字符7位,加上同步信号最少需9位数据位。

@@812300;图1@@串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送接收器,以节省的时间,提高程序运行效率,系列采用8250来处理串行通信。

在数据区中的头8个字节为4个的端口首地址,但只支持2个串行口1基地址00400000和2基地址00400002。

8250共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读写操作和线路控制寄存器的第7位来区分。

C语言_串行口

C语言_串行口

RI
位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM2:多机通信控制位。 1--允许多机通信;0--不允许多机通信。
REN:允许串行接收位。它由软件置位或清零。 1--允许接收;0--禁止接收。
TB8:发送数据的第9位。 在方式2和方式3中,由软件置位或复位,可做奇偶校验位。
接收时,由REN置1,允许接收,串行口采样RXD,当采样 由1到0跳变时,确认是起始位“0”,开始接收一帧数据。当 RI=0,且停止位为1或SM2=0时,停止位进入RB8位,同时置中 断标志RI;否则信息将丢失。所以,方式1接收时,应先用软件 清除RI或SM2标志。
方式1所传送和接受的波特率取决于定时器1的溢出率和 PCON中的SMOD位。
在多机通信中,可作为区别地址帧或数据帧的标识位,一般约 定地址帧时,TB8为1,数据帧时,TB8为0。 RB8:接收数据的第9位。功能同TB8。
5.8051单片机的串行接口寄存器
(2)串行口控制寄存器——SCON SM0、SM1:串行口工作方式选择位。
SM0 SM1 00 01 10 11
工作方式 方式 0 方式1 方式2 方式 3
波特率 2SMOD T1溢出率 32
T1溢出率
1 T1定时时间
1 机器周期T T1计数次数X
12
1 (最大计数次数M-计数初值C)
12
fOSC (2n -C)
fOSC
波特率
2SMOD 32
2.3 8051串行口应 用的C编程
1.串行通信与并行通信
在微型计算机中,通信(数据交换)有两种方式:并 行通信和串行通信。
并行通信——是指计算机与I/O设备之间通过多条传输 线交换数据,数据的各位同时进行传送。

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

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

C语言实现串行通信接口程序串行通信是一种在计算机系统中进行数据传输的常见方式。

C语言提供了许多用于串行通信接口的库函数,如<termios.h>和<fcntl.h>等。

在本文中,我将介绍如何使用这些库函数来实现一个简单的串行通信接口程序。

首先,我们需要打开串行通信端口并进行初始化设置。

在<fcntl.h>中,有一个函数叫做open(,我们可以用它来打开串行端口。

例如,如果我们想打开/dev/ttyS0端口,可以使用以下代码:```cint fd = open("/dev/ttyS0", O_RDWR);if (fd == -1)perror("Error opening serial port");exit(1);```这里的O_RDWR表示我们将以读写模式打开串行端口。

如果打开串行端口失败,open(函数会返回-1,并通过perror(函数打印错误信息到标准错误输出。

在这种情况下,我们使用exit(1)来结束程序。

接下来,我们需要配置串行端口的通信参数。

在<termios.h>中,有一个结构体叫做termios,它包含了一些用于配置串行端口的参数。

我们可以使用tcgetattr(和tcsetattr(函数来获取和设置串行端口的参数。

```cstruct termios options;tcgetattr(fd, &options);//设置串行端口的通信参数cfsetispeed(&options, B9600); // 设置输入波特率为9600cfsetospeed(&options, B9600); // 设置输出波特率为9600options.c_cflag ,= CS8; // 设置数据位为8位options.c_cflag &= ~PARENB; // 禁用奇偶校验tcsetattr(fd, TCSANOW, &options);```在这个示例中,我们将波特率设置为9600,数据位设置为8位,并禁用了奇偶校验。

51单片机C语言应用开发实例精讲8结构实例6:单片机的串口通信

51单片机C语言应用开发实例精讲8结构实例6:单片机的串口通信

8. 结构实例6:单片机串口通信虽然那个流水灯游戏的可玩性和按键手感问题还值得再好好提升一下,但小月更希望调剂一下,转而开始了对手头烧写板上关于RS-232转换部分的学习。

小月的做法并不难以理解,毕竟与RS-232转换的相关电路在原理图中还是相当显眼的,甚至于他手头编程器的别名就是RS-232转换器。

图8.1 单片机中负责RS-232通讯的电路在烧写器一端与电脑连接的两个接头中,9针的RS-232接口就是串口通信线,而另一个USB口仅接通了+5V和GND,只有给烧写器供电的作用。

这样就可以知道,电脑可以通过RS-232对单片机的内部程序进行改写。

那么,这就意味着单片机与电脑间必然可以进行数据的交换,这种交换,就叫做通信。

所谓串口通信,就是指这种基于RS-232串口的通信方式。

RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。

最早是为使电脑通过电话线系统相互通信的调制解调器上而是设计的。

后来发展到连接鼠标或打印机上,目前已经被支持设备的即插即用和热插拔功能的USB所替代,但仍广泛的用于工业仪器仪表中,同时也是单片机最基础和最常见的通信方式。

不过要把“最基础和最常见”这两个最拆开来说,就要在后面加上“之一”了。

虽然目前的通信技术日新月异,但这种说法在今后很长一段时期内都是成立的,也正因为这样的特点,STC的51系列单片机都是默认通过RS-232方式进行烧写的。

作为两台设备之间进行的通信,必然需要共同遵守某种规定或规则,包括交流什么、怎样交流及何时交流。

这个规则就是通信协议。

RS-232通信中通信协议的原则就是串口按位(bit)发送和接收数据。

线路上,RS-232通信使用3根线完成,分别是地线、发送、接收。

端口能够在一根线上发送数据的同时在另一根线上接收数据,即全双工传输。

全双工传输是传输制式的一种分类方式中的一类,除此还有单工传输和半双工传输。

单工传输,是指消息只能单方向传输的工作方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
int port,*G; { int GM; SendPort(port,*G); GM=ReadPort(port); if(GM/16==0) return GM; else if(GM/16==1){ do{ *G=GM; SendPort(port,GM); GM=ReadPort(port); }while(GM/16==1); } return GM; } void GetFileName(char *f) { int G1,G2,G3; char ch; G1=ReadPort(PORT); G2=ReadPort(PORT); do{ G3=Receive(PORT,&G3); ch=(char)(G1%16+G2/16); *f=ch; *f++; G2=Receive(PORT,&G3); G1=G3; }while(G1/16!=32);
2
一寸光阴不可轻
int s; { int G; SendPort(PORT,s); G=ReadPort(PORT); /*等待握手信号*/ if(s!=G) s=s+16; do{ SendPort(PORT,s); G=ReadPort(PORT);/*等待握手信号*/ }while(s!=G); } void SendFileName(fname) char *fname; { int s,ch; printf("Now transmit the file.Please wait..."); while(*fname){ ch=(int)fname++; s=ch%16; /*取文件名中一个字节的低 4 位*/ Send(s); s=ch/16; Send(s); /*取文件名中一个字节的低 4 位*/ } s=32; /*发送文件名结束标志*/ Send(s); Send(s); } void ReceiveFile(){ FILE *fp;
一寸光阴不可轻
面就是用 C 语言编写控制串行口的程序。
#include "dos.h" #include "stdlib.h" #include "stdio.h" #define PORT 0 void SendFile(char *fname); /* 发送文件*/ void Send(int s); /*发送一个字节*/ void SendFileName(char *fname); /*发送文件名*/ void ReceiveFile(); /*接收文件*/ void GetFileName(char *f); /*接收文件名*/ void InitPort(int port,unsigned char para); /*初始化端口*/ void SendPort(int port,char c); /*端口发送*/ int ReadPort(int port); /*读端口字节*/ int CheckState(int port); /*检查端口状态*/ int Receive(int port,int *G); /*接收一个字节*/ main(int argc,char *argv[]) { if(argc<2){ printf("Please input R(receive) or S(sent) parametre:"); exit(1); } InitPort(PORT,231); if(*argv[1]==''''S'''') /*检查选择的有效性*/ SendFile(argv[2]); else if(*argv[1]==''''R'''') ReceiveFile(); else{ printf("Error parament.Please input again.");
3
一寸光阴不可轻
char ch; int G1,G2,G3; char fname[15]; GetFileName(fname); printf("Receiving file %s.\n",fname); remove(fname); if((fp=fopen(fname,"wb"))==NULL) { printf("Can''''t open output file.\n"); exit(1); } /*循环为检测每次接受的数据是否为新数据,如果不是,*/ /*则用此次接收的数据覆盖上次接收的数据*/ G1=ReadPort(PORT); G2=Receive(PORT,&G1); do{ G3=Receive(PORT,&G2); ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高 4 位和低 4 位*/ putc(ch,fp); if(ferror(fp)){ printf("\nError writing file."); exit(1); } G2=Receive(PORT,&G3); G1=G3; }while(G1/16!=48); printf("\nTransmit finished."); fclose(fp); } int 阴不可轻
exit(1); } } void SendFile(char *fname) { FILE *fp; int ch,s; if((fp=fopen(fname,"rb"))==NULL) { printf("Can''''t open the file.\n"); exit(1); } SendFileName(fname); do{ ch=(int)getc(fp); if(ferror(fp)){ printf("Error reading file.\n"); break; } s=ch%16; /*取文件中一个字节的低 4 位*/ Send(s); s=ch/16; /*取文件中一个字节的高 4 位*/ Send(s); }while(!feof(fp)); s=46; /*发送文件结束信息*/ Send(s); Send(s); fclose(fp); } void Send(s)
相关文档
最新文档