通讯协议: 第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机进行通讯。