您的位置 首页 观点

单片机的串口通讯源代码

通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推hellip;hellip;,最后一个字节为前几个字节后7位的异或校

通讯协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非榜首字节标志,其他类推……,最终一个字节为前几个字节后7位的异或校验和。

测验办法:能够将串口调试帮手的发送框写上 95 10 20 25,并选上16进制发送,接纳框选上16进制显现,假如每发送一次就接纳到95 10 20 25,阐明测验成功。

//这是一个单片机C51串口接纳(中止)和发送例程,能够用来测验51单片机的中止接纳

//和查询发送,别的我觉得发送没有必要用中止,因为程序的开支是相同的

#include 《reg51.h》

#include 《string.h》

#define INBUF_LEN 4 //数据长度

unsigned char inbuf1[INBUF_LEN];

unsigned char checksum,count3;

bit read_flag= 0 ;

void init_serialcomm( void )

{

SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr

TMOD |= 0x20 ; //TMOD: mer 1, mode 2, 8-bit reload

PCON |= 0x80 ; //SMOD=1;

TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz

IE |= 0x90 ; //Enable Serial Interrupt

TR1 = 1 ; // mer 1 run

// =1;

}

//向串口发送一个字符

void send_char_com( unsigned char ch)

{

SBUF=ch;

while (== 0 );

TI= 0 ;

}

//向串口发送一个字符串,strlen为该字符串长度

void send_string_com( unsigned char *str, unsigned int strlen)

{

unsigned int k= 0 ;

do

{

send_char_com(*(str + k));

k++;

} while (k 《 strlen);

}

//串口接纳中止函数

void serial () interrupt 4 using 3

{

if (RI)

{

unsigned char ch;

RI = 0 ;

ch=SBUF;

if (ch》 127 )

{

count3= 0 ;

inbuf1[count3]=ch;

checksum= ch- 128 ;

}

else

{

count3++;

inbuf1[count3]=ch;

checksum ^= ch;

if ( (count3==(INBUF_LEN- 1 )) (!checksum) )

{

read_flag= 1 ; //假如串口接纳的数据到达INBUF_LEN个,且校验没错,

//就置位取数标志

}

}

}

}

main()

{

init_serialcomm(); //初始化串口

while ( 1 )

{

if (read_flag) //假如取数标志已置位,就将读到的数从串口宣布

{

read_flag= 0 ; //取数标志清0

send_string_com(inbuf1,INBUF_LEN);

}

}

}

串行通讯虽然有其本身长处:如合适长距离通讯,有必定的纠错才能等,但并行通讯在短距离(数米范围内)传输进程中的长处是清楚明了的。首要串行通讯时要设置串口数据,如:串标语(Com1、Com2或许其他串口)、波特率、数据位数、中止位、校验位等等。并且单片机与PC机的串口数据有必要逐个对等,不然不能传输。而并行传输时,无需上述进程。其次,PC机的串口电平值为+12V~-12V,单片机是TTL电平(0~+5V),两者有必要要经过电平转化芯片进行电平间的转化。而进行并行传输时,因为两边都是TTL电平,所以PC的并口能够与单片机或其他芯片直接相连;别的,串行传输速度慢,每次只能传送一位,而并行每次能够传送8位,速度上的差异清楚明了。

而关于单片机,串口(UART)是最常用的端口,特别关于存在两个或多个串口的单片机来说,充分利用串口进行通讯是十分重要的。

输出输入接口的扩展

单片机串口完结“并行”通讯,其原理便是将PC机传过来的并行数据转化成串行数据,送入单片机的串口再由其进行相应处理。实质上便是一个数据串-并、并-串转化的进程。

PC的并口为一个规范的25针插座,包括一个八位二进制数据端口(地址为378H),即第2脚到第9脚;一个输入操控端口(地址为379H),即第15脚、13脚、12脚、10脚、11脚,其别的低三位无界说;一个输出操控口(地址为37AH),即第1脚、14脚、16脚、17脚,其别的高四位无界说。由此可见后边两个端口都不是彻底的8位。

输出接口电路扩展

这儿运用常用的移位寄存器74LS164与单片机的RXD口构成输出接口电路。

双列直插式74LS164引脚界说如图1所示。

其间:QA~QH为并行输出的数据,送入PC机并口378H端口(接纳数据的8个数据位);单片机串口输出的数据从AB输入;CLR信号用于铲除输出数据(一般用在移位完结时);内部数据移位依托时钟CLK信号上升沿(由单片机TX供给)操控

表1是该芯片作业的真值表。

输入接口电路扩展

运用常用的移位寄存器74LS165与单片机的RXD口构成输入接口电路。

双列直插式74LS165引脚界说如图2所示。

其间:A~H为并行输入的数据,接PC机并口378H端口(接纳数据的8个数据位);单片机串口接纳的数据(RXD端口)从QH输入;SH/LD信号用于从头装载数据(一般用在数据彻底移出后);SER是用于填充数据移出后的空位的逻辑电平信号(逻辑“1”或“0”);而数据是否移动由CLK INH和CLK联合操控;内部数据移位依托时钟CLK信号(仍由单片机的TXD供给)上升沿操控。

表2是该芯片作业的真值表。

其他软硬件预备作业

输入输出操控端口的衔接。将单片机的P3.4、P3.5口别离与PC并口的第15脚、第16脚相连。这样在进行数据通讯时,两者的握手信号传输就处理了:当并口的第16脚置高电平时,用来告诉单片机接纳PC机已预备就绪的数据,单片机收到今后就能够进行相应操控,接纳数据;当单片机接纳完数据时,会置P3.4为高电平并被379H的第15脚接纳,所以PC机预备发送下一个数据……单片机向PC机发送数据时,状况与此相似,由P3.4发送信号给PC机,而由P3.5接纳PC机发送过来的信号。

软件方面,因为是用串口进行“并行”通讯,因而就不能将串口的作业办法设置为办法0(移位寄存器输入/输出办法)以外的其他办法。还要留意此刻串口的波特率固定为单片机外接晶振频率的1/12。串行数据经过RXD输入/输出,TXD用于发送操控输入输出数据移位的时钟脉冲。收发的数据为8位,低位在前。

规划实例

因为这一并行通讯完结办法十分简略,所以关于有必定单片机编程经历的开发人员来说,只需硬件电路确认下来,软件方面的问题就十分简略。图3为电路原理图。

需求阐明的是:1、单片机与PC机并口要共地;2、因为并行通讯存在应对信号(本图中由单片机的P3.4、P3.5完结此功用),所以不会呈现RXD端口数据紊乱的状况。

小结

现在单片机的使用越来越广泛,单片机与PC之间的通讯是一个十分重要的使用。假如单纯的从完结单片机与PC的并行通讯的视点来说,该完结办法并不是最简略的。最简略的办法是将PC的并口对应引脚与单片机的P1口和P3口直接相连,然后软件上完结。本文的意图是充分利用单片机的串口资源与PC机进行通讯。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/152849.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部