单片机串口通讯程序

发布者:丝语轻风最新更新时间:2013-03-19 来源: 21IC 关键字:单片机  串口通讯  进制显示 手机看文章 扫描二维码
随时随地手机看文章

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

测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收

//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

#i nclude

#i nclude

#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: timer 1, mode 2, 8-bit reload

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

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

IE |= 0x90 ; //Enable Serial Interrupt

TR1 = 1 ; // timer 1 run

// TI=1;

}

//向串口发送一个字符

void send_char_com( unsigned char ch)

{

SBUF=ch;

while (TI== 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 ;

}[page]

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提供)控制。

输入接口电路扩展

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

双列直插式74LS165引脚定义如图2所示。

其中:A~H为并行输入的数据,接PC机并口378H端口(接收数据的8个数据位);单片机串口接收的数据(RXD端口)从QH输入;SH/LD信号用于重新装载数据(通常用在数据完全移出后);SER是用于填充数据移出后的空位的逻辑电平信号(逻辑"1"或"0");而数据是否移动由CLK INH和CLK联合控制;内部数据移位依靠时钟CLK信号(仍由单片机的TXD提供)上升沿控制。

其他软硬件准备工作

输入输出控制端口的连接。将单片机的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机进行通信。

关键字:单片机  串口通讯  进制显示 引用地址:单片机串口通讯程序

上一篇:单片机计数器和定时器有何区别?
下一篇:高速SoC单片机C8051F040在双基色LED屏中的应用

推荐阅读最新更新时间:2024-03-16 13:20

51单片机(二十一)—— 定时器计数功能
在本文,我们对51单片机定时器的计数功能进行测试,采用定时器0通过方式2产生10KHz的方波,并通过单片机的P1.0口输出。定时器1采用方式1的计数功能,即对外部输入的脉冲进行计数。T1与P3.5引脚复用。实验时,需要用杜邦线将单片机的P1.0引脚,与P3.5引脚连接在一起。T0输出的脉冲又通过P3.5引脚输入给定时器1的计数器。定时器1对脉冲进行计数,设置为5000个脉冲溢出一次。脉冲的周期为0.1ms,即定时器1的溢出周期为500ms,所以LED1以1秒一次的频率闪烁。 定时器0和定时器1的初始化代码如下所示 void init_T0_T1(void) { TMOD= 0x52; //定时器0使用方式2,8位自
[单片机]
51单片机 LED流水灯
使用位定义实现LED流水灯 #include reg52.h #define time 20000 sbit LED1=P2^0; sbit LED2=P2^1; sbit LED3=P2^2; sbit LED4=P2^3; sbit LED5=P2^4; sbit LED6=P2^5; sbit LED7=P2^6; sbit LED8=P2^7; void delay(unsigned int i) { while(i--); } void main() { while(1) { LED8=1; LED1=0; delay(time); LED1=1;
[单片机]
新唐科技推出8位微控制器N79E352
新唐科技日前推出8位MCU新产品N79E352。具备高速处理速度的N79E352,在相同工作频率下新唐N79E352的效能为传统8051的2.5倍,其外接振荡器频率可达24 MHz,内置8K快闪容量(Flash ROM),断电储存用128B数据记忆容量, 内部还提供准确的11M/22M RC振荡器、I2C界面及40pin DIP、44pin PLCC/QFP、48pin LQFP的封装,以满足原来采用标准8051产品的客户需求。此外,还可选择内置20KHz的看门狗(Watch Dog Timer)或P0的输入脚来唤醒省电模式,让客户的产品系统能达到更省电的要求。 N79E352有针对须具备高抗干扰性的产品而设计,特别
[单片机]
如何使用单片机模拟读写24C01EEPROM数据
实验目的: 熟悉使用单片机模拟读写24C01EEPROM 1、首先向24C01EEPROM写入数据 2、在从24C01EEPROM中读取数据,并用LED显示 硬件设置: 1、SW4开关全部闭合 2、SW2开关1闭合,其它断开 3、SW3开关7和8闭合,其它断开 #include __CONFIG(0x3545); //FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护 //RB3为数字IO口,低电压复位使能,上电延时开, 看门狗 开,4M晶体XT 振荡器 #defineucharunsignedchar #defineuintunsignedint #defineSCLT RISC
[单片机]
如何使用<font color='red'>单片机</font>模拟读写24C01EEPROM数据
带中文字库LCD12864按键菜单设置反白单片机实验程序
带中文字库LCD12864 按键菜单设置反白实验分享 制作出来的实物图如下: 用的是普中的开发板 如果你的也是同型号的普中开发板 直接下载也不能显示 因为我的开发板改电路了 你需要改 #include lcd12864.h 里面的 sbit LCD12864_RS=P2^6; //寄存器选择输入 sbit LCD12864_RW=P2^5; //寄存器选择输入 sbit LCD12864_E=P2^7; //液晶使能控制 sbit LCD12864_PSB=P3^0; //串/并方式控制 sbit LCD12864_RES=P3^2; //数据复位 即可 部分程序(还有些程序在 #inclu
[单片机]
带中文字库LCD12864按键菜单设置反白<font color='red'>单片机</font>实验程序
基于SST89C58单片机的仿真器设计与电路构成
单片机仿真器可实现对单片机程序的单步跟踪调试,具备断点或全速等多种调式方式,同时能够记录各种变量以及RAM和寄存器的动态数据,对于程序的执行步骤与效果进行实时观察。此外,其还可实现对硬件电路的动态调试。当前单片机仿真器已在工业中得到了广泛应用,因此加大对其的研究具有重要的现实意义。 1 基于SST89C58单片机的仿真器设计 设计的主要部分是SST89C58单片机,从其构成来看,内部集成了72 kB大小的SuperFlashEEPROM程序存储器,涵盖了64 kB大小的Block0及8 kB大小的Block1的Flash ROM。该单片机对于传统使用的SoftICE监控也做出了一定的优化处理,其中监控程序共占据了存储块Block0
[单片机]
基于SST89C58<font color='red'>单片机</font>的仿真器设计与电路构成
单片机构成的噪声测量自动定位装置
  1 引 言   随着近代工业和交通运输业的机械设备向着大型、高速、重载的方向发展,所引起的噪声越来越大。例如冶金轧制设备、破碎机、球磨机、纺织机械、喷气运输机及各种机动车辆等的噪声已经成为当代三大主要环境公害之一。噪声对人体健康有着严重的危害,因此如何减少噪声危害已成为当前一项迫切的任务。精确的测量、分析噪声将为控制噪声源、改进产品设计工艺、制定环保措施和相关法律提供重要依据。在办公自动化、计算机等新技术日新月异发展的今天,人们同样把对办公自动化设备的噪声处理倍加关注,在相应的环保标准中噪声作为一项重要指标。在噪声测量方面大都采用分布采点的方法来进行测量。但是测量点选择只是通过简单的投影量距的方法,每次测量都需人工去测量调整
[单片机]
由<font color='red'>单片机</font>构成的噪声测量自动定位装置
单片机学习札记9 定时器模拟PWM呼吸灯
在上一节中,我们交代了为什么要做这样一个项目,以及我们提出了需求,并根据具体的需求分析,将其转化为硬件设计,画出了具体的原理图,但是还有许多的问题没有交代清楚,比如数码管的引脚判断,12个管脚哪8个是数码管的段码?4个是数码管的位码?这个我们刚买来并不清楚,还需要测量,这就要用到万用表了,将万用表拨到二极管档位,二极管有单向导电性,我们知道数码管就是8个小灯组成的,如果我们买的是共阳极的数码管,也就是如下图所示: 如果我们将万用表的红表笔接12个引脚中的任意一个,黑表笔接其余11的任意一个引脚,如果小灯亮的话,说明红表笔管脚是数码管的位码,而我们的数码管有四个,所以有4个位码,可以按照点亮小灯的方法查找,找完位码之后,记下来,
[单片机]
<font color='red'>单片机</font>学习札记9 定时器模拟PWM呼吸灯
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved