基于单片机的串行通信小系统Word文件下载.docx

上传人:b****6 文档编号:20446678 上传时间:2023-01-23 格式:DOCX 页数:20 大小:416.89KB
下载 相关 举报
基于单片机的串行通信小系统Word文件下载.docx_第1页
第1页 / 共20页
基于单片机的串行通信小系统Word文件下载.docx_第2页
第2页 / 共20页
基于单片机的串行通信小系统Word文件下载.docx_第3页
第3页 / 共20页
基于单片机的串行通信小系统Word文件下载.docx_第4页
第4页 / 共20页
基于单片机的串行通信小系统Word文件下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于单片机的串行通信小系统Word文件下载.docx

《基于单片机的串行通信小系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的串行通信小系统Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。

基于单片机的串行通信小系统Word文件下载.docx

1.2同步串行通信方式:

同步通信时要建立发送方时钟对接收方适中的直接控制,使双方达到完全同步。

此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步的关系,也保持字符同步关系。

发送方对接收方的同步可以通过外同步和自同步两种方法实现

面向字符的同步格式如图:

SYN

SYN

SOH

标题

STX

数据块

ETB/ETX

块校验

图2面向字符的同步格式

此时,传输的数据和控制信息都必须由规定的字符集(如ASC

码)中的字符所组成。

图2中帧头为1个或2个同步字符SYN(ASC

码为16H)。

SOH为序始字符(ASC

码为01H),表示标题的开始,标题中包含源地址、目标地址和路由指示等信息。

STX文始字符(ASC

码为02H),表示传送数据的开始。

数据块是传送的正文内容,由多个字符组成,数据块后面是组终字符ETB(ASC

码为17H)或文终字符ETX(ASC

码为03H),然后是校验码。

典型的面向字符的同步规程如IBM的二进制同步规程BSC。

面向位的同步格式如图3所示。

8位8位8位>

=0位16位8位

01111110

地址场

控制场

信息场

校验场

图3面向位的同步格式

此时,将数据块看做数据流,并用序列01111110作为开始和结束标志。

为了避免在数据流中出现序列01111110时引起的混乱,发送方总是在其发送的数据流中每出现5个连续的1就插入一个附加的0;

接收方每检测到5个连续的1并且其后跟一个0时候就删除该0。

典型的面向位的同步协议,如ISO的高级链路控制规程HDLC和IBM的同步数据链路控制规程SDLC。

面向位的同步通信的特点是以特定的位组合01111110作为帧的开始和结束标志,所传输的一帧数据可以是任意位。

它传输的效率较高,但实现的硬件设备比异步通信复杂。

1.3串行通信的制式:

(1)单工。

单工是指数据传输仅能沿一个方向,不能实现反向传输。

(2)半双工。

半双工是指数据传输可以两个方向,但需要分时进行。

(3)全双工。

全双工是数据可以同时进行双向传输。

三中制式分别如图3、图4、图5:

1.4程序原理框图

图6

二、串行通信电路设计

2.1RS-232电平与TTL电平的转换

分立元件实现RS-232电平与TTL电平转换电路(如图7)

图7

PC机默认的高低电平分别是-3V~-15V和3V~15V,为RS-232电平。

单片机默认的高低电平为5V~0V,为TTL电平。

分析图5,首先TTL电平TXD发送数据时,若发送低电平0,这时Q3导通,PCRXD由空闲时的低电平变成高电平(如PC用中断接收的话会产生中断),满足条件。

发送高电平1时,TXD为高电平,Q3截止,由于PCRXD内部高阻,而PCTXD平时是-3~-15V,通过D1和R7将其拉低PCRXD至-3~-15V,此时计算机接收到的就是1。

反过来,PC发送信号,由单片机来接收信号。

当PCTXD为低电平-3~-15V时,Q4截止,单片机端口的RXD被R9拉到5V高电平;

当PCTXD变高时,Q4导通,RXD被Q4拉到低电平,这样便实现了双向转换。

这也便是MAX232的转换原理。

2.2MAX232芯片实现电平转换

MAX232芯片是MAXIM公司生产的、包含两路接收器和驱动器的IC芯片,它的内部有一个电源电压变换器,可以把输入的+5V电源电压变换成为RS-232输出电平所需的+10V电压。

所以采用此芯片接口的串行通信系统只需单一的+5V电源就可以了。

对于

有+12V电源的场合,其适应性更强,加之其价格适中,硬件接口简单,所以被广泛采用。

MAX232芯片引脚结构和外围连接如图8(a)和(b)

(a)

(b)

图8

MAX232的外围电路连接如图9。

其数据传输过程如下:

MAX232的11脚

接单片机的TXD端P3.1,TTL电平从单片机TXD端发出,经过MAX232转换为RS-232电平后从MAX232的14脚

发出,再连接到实验板上串口座的第2脚,在经过平行串口线连接至PC机的串口座第2个脚RXD端,至此计算机接收数据。

PC机发送数据时从PC机串口座第3脚TXD端发出数据,再逆向流向单片机的RXD端P3.0接收数据。

图9

需要注意的是,MAX232与串口座连接时,无论是数据输出端,还是数据输入端,连接串口座的第2引脚获第3引脚都可以,选用不同的连接方式是,单片机与计算机之间的串口线要谨慎选择,是选平行串口线还是交叉串口线、是母头对母头串口线还是母头对公头的串口线这些都要非常注意,每种选择都有对应的电路,但是无论哪种搭配电路,在单片机与计算机之间必须要有一条数据能互相传输回路,把握好信号交接点就一定能通信成功。

2.3A/D转换电路的设计

A/D转换部分本实验采用ADC0832:

ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换

芯片。

由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,

其目前已经有很高的普及率。

ADC0832具有以下特点:

·

8位分辨率;

双通道A/D转换;

输入输出电平与TTL/CMOS相兼容;

5V电源供电时输入电压在0-5V之间;

工作频率为250KHZ,转换时间为32μS;

一般功耗仅为15mW;

ADC0832的外围电路和管脚图如图10(a)和(b)

(a)(b)

图10

ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以应一般的模拟量转换要求。

其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。

芯片转换时间仅为32μS,据有双通道输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。

通过DI数据输入端,可以轻易的实现通道功能的选择。

2.4液晶显示电路的设计

液晶显示采用我们熟悉的16*2显示的LCD1602。

图11单片机液晶显示电路

三、系统总电路

总体电路图:

图12串口通信系统总电路

四、系统的软件设计

4.1程序流程图:

开始

串口初始化

A/D转换

1602显示采集数据

启动定时器1

满1秒

单片机向PC机发送数据,刷新1602显示

计数器0计数

PC机向单片机发送的字符

单片机响应PC机

结束

LCD1602初始化

图13总程序流程图

4.2串口通信总程序:

#include<

reg51.h>

intrins.h>

stdio.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable0[]="

Mcusystem"

;

ucharcodetable1[]="

Voltage:

"

sbitADCS=P2^0;

//0832片选端

sbitADDI=P2^1;

//0832数据端

sbitADCLK=P2^2//0832时钟端

sbitlcden=P2^6;

//液晶使能端

sbitlcdrs=P2^7;

//液晶数据命令选择端

uintt0_num,num;

ucharflag_uart,flag_time,flag_on,a,i,ad_val;

floatad_vo;

/***********延时************/

voiddelay(uintx)

{

uinti,j;

for(i=x;

i>

0;

i--)

for(j=110;

j>

j--);

}

/**********串口初始化**********/

voidck_init()

TMOD=0x21;

//设定T1定时器工作方式2,T0定时器工作方式1;

TH0=(65535-45872)/256;

//T0计数器装初值;

TL0=(65535-45872)%256;

TH1=0xfd;

//T1定时器装初值;

TL1=0xfd;

TR1=1;

//启动T1定时器;

ET0=1;

//启动T0计数器;

SM0=0;

//设定串口工作方式1

SM1=1;

//同上

REN=1;

//允许串口接收

EA=1;

//开总中断

ES=1;

//开串口中断

}

/*************1602*************/

voidwrite_com(ucharcom)

{

delay

(1);

lcdrs=0;

//选择写命令模式

P0=com;

//将要写的命令字送到数据总线上

_nop_();

//稍作延时以待数据稳定

lcden=1;

//给使能端一个高脉冲

delay(5);

//稍作延时

lcden=0;

//使能端置0已完成高脉冲

}

voidwrite_date(uchardate)

delay

(1);

//查忙

lcdrs=1;

//选择写数据模式

P0=date;

//将要写的数据送到数据总线上

lcden=1;

voidlcd_init()

write_com(0x38);

//设置16*2显示,5*7点阵,8位数据接口

write_com(0x0c);

//设置开显示,不显示光标

write_com(0x06);

//写一个字符后地址加1

write_com(0x01);

//显示清0,数据指针清0

voiddisplay(ucharx)

{

floatj;

uintaa;

j=x*19.607;

aa=j+0.5;

write_com(0x80+0x03);

//设置第一行字符显示的起始地址

for(num=0;

num<

10;

num++)//通过for循环将table0中的字符写到液晶上

write_date(table0[num]);

write_com(0x80+0x42);

//设置第二行字符显示的起始地址

8;

num++)//通过for循环将table1中的字符写到液晶上

write_date(table1[num]);

write_com(0x80+0x40+10);

//设置A/D转换数据的起始地址

write_date(0x30+(aa/1000));

//写个位

write_date(0x2e);

//写小数点

write_date(0x30+(aa%1000/100));

//写小数点后面第一位

write_date(0x30+(aa%100/10));

//写小数点后面第二位

write_date(0x56);

//写字符“V”

/************0832************/

ucharad_0832()

uchardate;

uinti;

ADDI=1;

ADCS=0;

ADCLK=1;

ADCLK=0;

ADDI=0;

for(i=0;

i<

i++)

date|=ADDI;

//收数据

//形成一次时钟脉冲

date<

<

=1;

if(i==7)date|=ADDI;

ADCS=1;

//拉低CS端

//拉低CLK端

//拉高数据端,回到初始状态

//date<

=8;

//date|=ndat;

return(date);

voidmain()

lcd_init();

//1602初始化

ck_init();

//串口初始化

while

(1)

{

if(flag_uart==1);

//检测到标志位为1,根据接受到PC机

{//发送过来的数据进行回复

flag_uart=0;

ES=0;

TI=1;

switch(flag_on)

{

case0:

puts("

Turnonad!

\n"

);

TR0=1;

//开计数器0

break;

case1:

Turnoffad!

TR0=0;

//关计数器0

break;

case2:

Error!

}

while(!

TI);

TI=0;

ES=1;

if(flag_time==1)//检测到标志位为1,1S接受一次A/D转化数值

flag_time=0;

ad_val=ad_0832();

ad_vo=(float)ad_val*5.0/256.0;

ES=0;

TI=1;

printf("

Thevoltageis%fV\n"

ad_vo);

//向PC机发送字符串及转换结果

while(!

//等待发送完毕

TI=0;

//关串口中断,以免接受数据丢失

}

display(ad_val);

voidtimer0()interrupt1

t0_num++;

if(t0_num==20)//使计数器0计满1秒

{

t0_num=0;

flag_time=1;

//将标志位flag_time置1

voidser()interrupt4

RI=0;

//软件将发送中断标志位TI清0,取消此中断申请

a=SBUF;

//将串口接受寄存器中的数取走给a

flag_uart=1;

//将标志位flag_uart置1,表示执

if(a==1)//行过中断程序,即收到了数据

flag_on=0;

elseif(a==2)

flag_on=1;

else

flag_on=2;

五、结果分析

在实验过程中为了方便调试,采用支持STC单片机下载的串口调试助手进行实验结果的验证,由于STC单片机与AT89C51内部结构不同,且转换速度不同,因此理论上的1秒自动发送一次数据未能达到,发送字符速度非常快,经过大量调试,延长了计数器0的溢出时间才基本达到单片机1秒向PC机发送一次采样数据。

实际硬件电路见下图:

图14实物图

实验结果见下图:

发送字符01的时候,显示“Turnonad!

”,然后发送采集的电压值:

图15

发送字符02的时候,显示“Turnoffad!

”,然后停止发送采集的电压值:

图16

发送其他字符的时候,显示“Error!

图17

六、小结

本系统充分利用PC机丰富的软硬件资源实现友好的人机界面又通过RS-232总线结构与单片机进行通信,对多台单片机进行数据采集和处理。

本系统不仅硬件实现简单,而且软件实现可靠。

通过测试,证明该方法思路简单,价格低、功能强、通讯可靠,是一种有效的多机通讯方法。

但因RS-232协议适用于短距离通信,且最大传输距离不超过15M。

在同一系统上悬挂的从机数目也有限,一般不超过20台。

若想达到更远距离或更大规模的应用宜采用RS-485协议。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1