文档库 最新最全的文档下载
当前位置:文档库 › 基于单片机的串行通信小系统

基于单片机的串行通信小系统

基于单片机的串行通信小系统
基于单片机的串行通信小系统

单片机与PC机之间的串口通信

摘要:

随着数据采集系统的广泛应用,通常由单片机构成的应用系统,如仪器仪表、智能设备等,都需要与PC机之间交换数据,实现与PC机之间的通讯功能,以充分发挥PC和单片机之间的功能互补,资源共享的优势。本文使用RS-232接口芯片,以及如何利用此芯片实现单片机与PC机之间的通讯。

51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是rs232电平,而单片机的串口是ttl电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。

PC机和单片机的串口通信系统由一根串口连接线把带有软件上位机的(PC机)和下位机(即单片机)连接起来进行,借用串口调试助手实现PC机和单片机的串口通信,并观察调试结果。上位机软件使用串口调试工具,下位机软件是本人所编写的一个串口测试程序

关键词:单片机,串口通信,虚拟,仿真

目录

一、方案 (3)

1.1串行通信基本概念 (3)

1.2同步串行通信方式 (3)

1.3串行通信的制式 (4)

1.4程序原理框图 (5)

二、模块电路设计 (5)

2.1 RS-232与TTL电平的转换原理 (5)

2.2 MAX232芯片实现电平转换 (6)

2.3 A/D转换电路的设计 (7)

2.4 液晶显示电路的设计 (8)

三、系统总电路 (9)

四、系统的软件设计 (10)

4.1程序流程图 (10)

4.2串口通信总程序 (11)

五、结果分析 (15)

六、小结 (18)

一、方案选择

1.1 串行通信方式基本概念:

串行通信方式是将数据字节分成一位一位的形式在一条传输线上逐个地传输,此时只需要一条传输线,外加一条公共地线和若干控制线号线。因为一次只能传输一位,所以对于一个字节的数据,至少要分8位才能传送完毕。

串行通信的必要过程是:发送时,要把并行数据编程串行数据发送到线路上去,接收时,要把串行数据转化成并行数据,这样才能被计算机及其他设备处理。

串行通信传输线少,长距离传输时候,成本低,且可以利用电话网等现成的设备,但数据的传输控制比并行通信复杂。

串行通信方式:异步串行通信和同步串行通信。

异步串行通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。在单片机和单片机之间,单片机与计算机之间,通常采用这种通信方式。本文主要介绍同步串行通信方式。

1.2 同步串行通信方式:

同步通信时要建立发送方时钟对接收方适中的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步的关系,也保持字符同步关系。

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

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

图2 面向字符的同步格式

此时,传输的数据和控制信息都必须由规定的字符集(如ASCII码)中的字符所组成。图2中帧头为1个或2个同步字符SYN(ASCII码为16H)。SOH为序始字符(ASCII码为01H),表示标题的开始,标题中包含源地址、目标地址和路由指示等信息。STX文始字符(ASCII码为02H),表示传送数据的开始。数据块是传送的正文内容,由多个字符组成,数据块后面是组终字符ETB(ASCII码为17H)或文终字符ETX(ASCII码为03H),然后是校验码。典型的面向字符的同步规程如IBM的二进制同步规程BSC。

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

图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.1 RS-232电平与TTL 电平的转换

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

图7

PC 机默认的高低电平分别是-3V~ -15V 和3V~ 15V ,为RS-232电平。单片机默认的高低电平为5V~ 0V ,为TTL 电平。分析图5,首先TTL 电平TXD 发送数据时,若发送低电平0,这时Q3导通,PCRXD 由空闲时的低电平变成高电平(如PC 用中断接收的话会产生中断),

PC 机的 RS-232串

AT89C51

RS-232电平转TTL 电平

A/D 转换

TTL 电平转RS-232电平

液晶显示采集数据

满足条件。发送高电平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.2 MAX232芯片实现电平转换

MAX232芯片是MAXIM 公司生产的、包含两路接收器和驱动器的IC 芯片,它的内部有一个电源电压变换器,可以把输入的+5V 电源电压变换成为RS-232输出电平所需的+10V 电压。所以采用此芯片接口的串行通信系统只需单一的+5V 电源就可以了。对于

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

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

(a )

(b ) 图8

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

其数据传输过程如下:MAX232的11脚

IN

T 1接单片机的TXD 端P3.1,TTL 电平从单片

机TXD 端发出,经过MAX232转换为RS-232电平后从MAX232的14脚OUT

T 1发出,再连接

到实验板上串口座的第2脚,在经过平行串口线连接至PC 机的串口座第2个脚RXD 端,至此计算机接收数据。PC 机发送数据时从PC 机串口座第3脚TXD 端发出数据,再逆向流向单片机的RXD 端P3.0接收数据。

图9

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

2.3 A/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 程序流程图:

图13 总程序流程图4.2 串口通信总程序:

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code table0[]="Mcu system";

uchar code table1[]="V oltage:";

sbit ADCS=P2^0; //0832片选端

sbit ADDI=P2^1; //0832数据端

sbit ADCLK=P2^2 //0832时钟端

sbit lcden=P2^6; //液晶使能端

sbit lcdrs=P2^7; //液晶数据命令选择端

uint t0_num,num;

uchar flag_uart,flag_time,flag_on,a,i,ad_val;

float ad_vo;

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

void delay(uint x)

{

uint i,j;

for(i=x;i>0;i--)

for(j=110;j>0;j--);

}

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

void ck_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*************/

void write_com(uchar com)

{

delay(1);

lcdrs=0;//选择写命令模式

P0=com; //将要写的命令字送到数据总线上

_nop_(); //稍作延时以待数据稳定

lcden=1; //给使能端一个高脉冲

delay(5); //稍作延时

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

}

void write_date(uchar date)

{

delay(1); //查忙

lcdrs=1; //选择写数据模式

P0=date; //将要写的数据送到数据总线上

_nop_();

lcden=1;

delay(5);

lcden=0;

}

void lcd_init()

{

lcden=0;

write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口

write_com(0x0c);//设置开显示,不显示光标

write_com(0x06); //写一个字符后地址加1

write_com(0x01);//显示清0,数据指针清0

}

void display(uchar x)

{

float j;

uint aa;

j=x*19.607;

aa=j+0.5;

write_com(0x80+0x03) ;//设置第一行字符显示的起始地址for(num=0;num<10;num++) //通过for循环将table0中的字符写到液晶上

{

write_date(table0[num]);

delay(1);

}

write_com(0x80+0x42);//设置第二行字符显示的起始地址

for(num=0;num<8;num++) //通过for循环将table1中的字符写到液晶上

{

write_date(table1[num]);

delay(1);

}

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************/

uchar ad_0832()

{

uchar date;

uint i;

ADDI=1;

_nop_();

_nop_();

ADCS=0;

_nop_();

_nop_();

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;

ADDI=0;

_nop_();

_nop_();

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;

ADDI=0;

_nop_();

_nop_();

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;

ADDI=1;

_nop_();

_nop_();

for(i=0;i<8;i++)

{

date|=ADDI; //收数据

ADCLK=1;

_nop_();

_nop_();

ADCLK=0; //形成一次时钟脉冲

_nop_();

_nop_();

date<<=1;

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

}

ADCS=1; //拉低CS端

ADCLK=0; //拉低CLK端

ADDI=1; //拉高数据端,回到初始状态

//date<<=8;

//date|=ndat;

return(date);

}

void main()

{

lcd_init();//1602初始化

ck_init(); //串口初始化

while(1)

{

if(flag_uart==1);//检测到标志位为1,根据接受到PC机

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

flag_uart=0;

ES=0;

TI=1;

switch(flag_on)

{

case 0:puts("Turn on ad!\n");

TR0=1; //开计数器0

break;

case 1:puts("Turn off ad!\n");

TR0=0; //关计数器0

break;

case 2:puts("Error!\n");

TR0=0;

break;

}

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("The voltage is %fV\n",ad_vo); // 向PC机发送字符串及转换结果

while(!TI); //等待发送完毕

TI=0;

ES=1; //关串口中断,以免接受数据丢失}

display(ad_val);

}

}

void timer0() interrupt 1

{

TH0=(65535-45872)/256;

TL0=(65535-45872)%256;

t0_num++;

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

{

t0_num=0;

flag_time=1; //将标志位flag_time置1 }

}

void ser() interrupt 4

{

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

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

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

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

flag_on=0;

else if(a==2)

flag_on=1;

else

flag_on=2;

}

五、结果分析

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

实际硬件电路见下图:

图14 实物图

实验结果见下图:

发送字符01的时候,显示“Turn on ad!”,然后发送采集的电压值:

图15

发送字符02的时候,显示“Turn off ad!”,然后停止发送采集的电压值:

图16

发送其他字符的时候,显示“Error!”,然后停止发送采集的电压值:

图17

六、小结

本系统充分利用PC机丰富的软硬件资源实现友好的人机界面又通过RS-232总线结构与单片机进行通信,对多台单片机进行数据采集和处理。本系统不仅硬件实现简单,而且软件实现可靠。通过测试,证明该方法思路简单,价格低、功能强、通讯可靠,是一种有效的多机通讯方法。但因 RS-232协议适用于短距离通信,且最大传输距离不超过15M。在同一系统上悬挂的从机数目也有限,一般不超过20台。若想达到更远距离或更大规模的应用宜采用RS-485协议。

单片机双机之间的串行通信设计

专业方向课程设计报告 题目:单片机双机之间的串行通信设计

单片机双机之间的串行通信设计 一.设计要求: 两片单片机利用串行口进行串行通信:串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。 二、方案论证: 方案一:以两片51单片机作为通信部件,以4*4矩阵键盘作为数据输入接口,通过16个不同键值输入不同的信息,按照51单片机的方式3进行串口通信,从机采用中断

方式接收信息并按照通信协议改变波特率或者用I/O口输出、CD4511译码、数码管显示相关数据,整个系统的软件部分采用C语言编写。 方案二:整个系统的硬件设计与方案一样,但是通信方式采用方式一进行通信,主从机之间的访问采用查询方式,数据输出直接由单片机的译码程序输出译码数据,同时软件编写采用汇编语言。 两种方式从设计上来说各有特色,而且两种方式都应该是可行的。方案一中按照方式三通信可以输出九位数据而方式一只能输出八位数据,但就本题的要求来说方式一就可以了。主从机之间的交流采用中断方式是一种高效且保护单片机的选择,但是相比之下本人对查询方式的理解更好一些。数码管的显示若采用CD4511译码则直接输出数据就可以了,但是这样会增加硬件陈本,而且单片机的资源大部分都还闲置着,所以直接编写一段译码程序是比较好的做法。另外在软件编写上,采用C语言在后续设计中对硬件的考虑稍少一些,换言之采用汇编可以使自己对整个通信过程及单片机的部分结构有更清晰地认识所以综合考虑采用方案二。 三、理论设计: 采用AltiumDesigner绘制的原理图(整图)

本系统主要包括五个基本模块:单片机最小系统(包括晶振电路、电源、复位电路及相关设置电路)、4*4矩阵键盘、功能控制电路、数据显示电路、波特率更改指示电路。 本设计的基本思路是通过控制口选择将要实现的功能,然后矩阵键盘输入数据,单片机对数据进行处理(加校验码、设置功能标志位),然后与从机握手,一切就绪之后后就开始发送数据,然后从机对接收数据校验,回发校验结果,主机根据校验结果进行下一步动作,或者重发,或者进入下一 数据的发送过程,然后按照此过程不段循环,直到结束。 晶振电路提供脉冲,加上复位电路,将 EA接入高电电平选择片内程序存储器。 这是一个单片机能够工作的最低设置。

51单片机串口调试实验(C语言)

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 /****************************************************************************** * * 实验名: 串口实验 * 使用的IO : P2 * 实验效果: 将接收到发送回电脑上面。 * 注意: ******************************************************************************* / #include void UsartConfiguration(); /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main() { UsartConfiguration(); while(1) { } } /****************************************************************************** * * 函数名:UsartConfiguration() * 函数功能:设置串口 * 输入: 无 * 输出: 无 ******************************************************************************* / void UsartConfiguration() { SCON=0X50; //设置为工作方式1

基于单片机的数据串口通信研究

龙源期刊网 https://www.wendangku.net/doc/b64495218.html, 基于单片机的数据串口通信研究 作者:蒋信 来源:《电子技术与软件工程》2016年第06期 摘要科技的发展日新月异,机电一体化的发展对自动化系统的可靠性提出了更高的要 求,在这样的背景下,单片机在工业控制领域的应用越来越广泛也越来越重要。基于以上,本文从通信过程、显示设计、键盘接口等方面研究了基于单片机的数据串口通信。 【关键词】单片机数据串口通信研究 在计算机控制领域中,计算机与外设数据之间的通信主要依靠单片机来实现,单片机的串口功能能够实现数据的传输以及分析,这就属于串口通信,可以预见的是,单片机的数据串口通信将会得到更广泛的应用,单片机之间的通信也有赖于其数据串口通信功能。基于以上,本文简要研究了基于单片机的数据串口通信。 1 串口通信的实现方式 设备在实现通信的过程中,必须树立一个信息接发双方都认可的通信方式,只有这样才能够保证信息在传送的过程中不发生冲突,才能够实现设备之间的通信,对于串口通信来说,主要有以下两种方式。 1.1 异步通信方式 异步通信方式实现的过程中,数据传输方式为独立字节的形式,不同的字节前端有着不同的起始信号,不同字节的后端则会有不同的终止信号,起始信号只能是一个,而终止信号可以是一个也可以是多个。数据传输过程中,字节进行移动,一个字节的迁移过程表示一个字节的传输过程,传输之前使用起始信号进行传输,传输结束之后使用终止信号将传输线调回标准状态,一个字节传输完毕后进行下一个字节的传输,字节传输有着连续性,这就是异步传输方式。由于没一个字节都要附加起始信号信息和终止信号信息,因此异步传输方式的效率较低,但异步通信方式容许一定程度的频率漂移,有着一定的误差缓冲作用。 1.2 同步通信方式 同步通信方式指的是将所有字符和字节连接在一起进行传输的一种通信方式,多个字符相互连接组成数据块,在数据块前增加同步字符,以同步字符作为传输起始信号,在传输后增加校验字符,以校验字符作为传输终止信号,以此来校验传输过程中的错误和误差,数据块中的各个字符之间没有间隔,相较于异步通信方式来说,其传输效率较高,但其对于信息接收端和信息发送端的同步性要求较高,因此硬件的复杂程度也就更高。 2 基于单片机的数据串口通信

基于单片机的串口通信模块设计

1 绪论 1.1 研究背景 通信是指不同的独立系统利用线路互相交换数据,它的主要目的是将数据从一端传送到另一端,实现数据的交换。在现代工业控制中,通常采用计算机作为上位机与下层的实时控制与监测设备进行通讯。现场数据必须通过一个数据收集器传给上位机,同样上位机向现场设备发命令也必须通过数据收集器。串行通信因其结构简单、执行速度快、抗干扰能力强等优点,已被广泛应用于数据采集和过程控制等领域。 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度快,串行通信的距离可以从几米到几千米。 随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行监测和控制。PC机具有强大的监控和管理能力,而单片机则具有快速及灵和的控制特点,通过PC 机的RS-232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。而随着USB接口技术的成熟和使用的普及,由于USB 接口有着 RS-232(DB-9)串口无法比拟的优点,RS-232(DB-9)串口正在逐步地为USB 接口所替代。而在现在的大多数笔记本电脑中,出于节省物理空间和用处不大等原因,RS-232(DB-9)串口已不再设置,这就约束了基于RS-232(DB-9)串口与PC 机联络的单片机设备的使用围。当前USB接口逐步取代RS-232(DB-9)串口已是大势所趋,单片机同计算机的USB通信在实际工作中的应用围也将越来越广。本文所介

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

单片机与PC机串口通讯设计

第一章串口通讯的系统组成与原理 1.1 系统组成及通讯原理 1.1.1 系统构成 一、MSP430F149功能简介: 本设计选用的主要芯片为MSP430F149,该单片机属于德州仪器公司MSP430F14X/16X FLASH 系列。该系列是一组工业级超低功耗的微控制器,运行环境温度为-40~+85 摄氏度工作电压范围 1.8~3.6V,MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。由于具有16位RISC(精简指令集)结构,16位寄存器和常数寄存器,MSP430 达到了最大的代码效率。数字控制的振荡器提供快速从所有低功耗模式苏醒到活动模式的能力时间少于6ms。MSP430F149有较高的处理速度,在8MHz 晶体驱动下指令周期为125 ns。另外它带有两个16 位定时器(带看门狗功能)、速度极快的8 通道12 位A/D 转换器(ADC)(带内部参考电压、采样保持和自动扫描功能)、一个内部比较器和两个通用同步/异步发射接收器、48个I/O口(均可独立控制)的微处理器结构。硬件乘法器提高了单片机的性能并使单片机在编码和硬件上可兼容[3]。这些特点保证了可编制出高效率的源程序。 二、系统构成 1、系统框图 系统构成如图1-1所示,由上位机(即工业控制计算机)、通讯接口和下位机3部分组成。上位机选用的是工控机,智能终端由单片机MSP430F149和外围传感器放大电路等构成(本设计部涉及该部分的设计)。单片机与PC 机之间通信方式为串行异步方式(UART),下位机采用中断方式进行与上位机的数据交换,上位机采用按时查询方式对各串口进行读写操作。单片机MSP430要想与PC 串口连接或者其它带有串口的终端设备连接,接口电路部分必须要进行EIA-RS-232-C 与MSP430 电平和逻辑关系的转换[4]。本设计将采用MAX3221芯片,完成3V~5V 电平与串口电平的双向转换。

实验单片机与PC机串口通信

实验单片机与PC机串口通信(C51编程)实验 要求: 1、掌握串行口的控制与状态寄存器SCON 2、掌握特殊功能寄存器PCON 3、掌握串行口的工作方式及其设置 4、掌握串行口的波特率(bondrate)选择 任务: 1、实现PC机发送一个字符给单片机,单片机接收到后即在个位、十位数码管上进行显示,同时将其回发给PC机。要求:单片机收到PC机发来的信号后用串口中断方式处理,而单片机回发给PC机时用查询方式。 采用软件仿真的方式完成,用串口调试助手和KEIL C,或串口调试助手和PROTEUS分别仿真。 需要用到以下软件:KEIL,VSPDXP5(虚拟串口软件),串口调试助手,Proteus。 (1)虚拟串口软件、串口调试助手和KEIL C的联调 首先在KEIL里编译写好的程序。

打开VSPD,界面如下图所示:(注明:这个软件用来进行串口的虚拟实现。在其网站上可以下载,但使用期为2周)。 左边栏最上面的是电脑自带的物理串口。点右边的addpair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。 接下来的一步很关键。把KEIL和虚拟出来的串口绑定。现在把COM3和KEIL绑定。在KEIL中进入DEBUG模式。在最下面的COMMAND命令行,输入 modecom39600,0,8,1 %分别设置com3的波特率、奇偶校验 位、数据位、停止位 assigncom3sout %把单片机的串口和COM3绑定到一 起。因为所用的单片机是

(以上参数设置注意要和所编程序中设置一致!) 打开串口调试助手 可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率9600,无校验位、8位数据位,1位停止位(和COM3、程序里的设置一样)。打开COM4。 现在就可以开始调试串口发送接收程序了。可以通过KEIL发送数据,在串口调试助手中就可以显示出来。也可以通过串口调试助手发送数据,在KEIL中接收。 实验实现PC机发送一个字符给单片机,单片机接收到后将其回发给PC机。在调试助手上(模拟PC)发送数据,单片机收到后将收到的结果回送到调试助手上。 2、以下在Proteus和串口调试助手实现的结果: 将编译好的HEX程序加载到Proteus中,注意这里需要加上串口模块,用来进行串行通信参数的设置。 点击串口,可以对串口进行设置: 用串口调试助手发送数据,即可看到仿真结果。 实验参考程序源文件在exp2-comm文件夹中。

基于51单片机的双机串行通信

河南机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级:xxxxxx 学号:13xxxxxxxxx 姓名:xxxxxxx 2015年12月

基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规范; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计

1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下: 图1.AT89C51(52) (1)数据缓冲器(SBUF) 接受或发送的数据都要先送到SBUF缓存。有两个,一个缓存,另一个接受,

第06章单片机串行通信系统习题解答

第6章单片机串行通信系统习题解答 一、填空题 1.在串行通信中,把每秒中传送的二进制数的位数叫波特率。 2.当SCON中的M0M1=10时,表示串口工作于方式 2 ,波特率为 fosc/32或fosc/64 。 3.SCON中的REN=1表示允许接收。 4.PCON 中的SMOD=1表示波特率翻倍。 5.SCON中的TI=1表示串行口发送中断请求。 6.MCS-51单片机串行通信时,先发送低位,后发送高位。 7.MCS-51单片机方式2串行通信时,一帧信息位数为 11 位。 8.设T1工作于定时方式2,作波特率发生器,时钟频率为,SMOD=0,波特率为时,T1的初值为 FAH 。 9.MCS-51单片机串行通信时,通常用指令 MOV SBUF,A 启动串行发送。 10.MCS-51单片机串行方式0通信时,数据从引脚发送/接收。 二、简答题 1.串行口设有几个控制寄存器它们的作用是什么 答:串行口设有2个控制寄存器,串行控制寄存器SCON和电源控制寄存器PCON。其中PCON中只有的SMOD与串行口的波特率有关。在SCON中各位的作用见下表: 2.MCS-51单片机串行口有几种工作方式各自的特点是什么 答:有4种工作方式。各自的特点为:

3.MCS-51单片机串行口各种工作方式的波特率如何设置,怎样计算定时器的初值 答:串行口各种工作方式的波特率设置: 工作方式O :波特率固定不变,它与系统的振荡频率fosc 的大小有关,其值为fosc/12。 工作方式1和方式3:波特率是可变的,波特率=(2SMOD/32)×定时器T1的溢出率 工作方式2:波特率有两种固定值。 当SM0D=1时,波特率=(2SM0D/64)×fosc=fosc/32 当SM0D=0时,波特率=(2SM0D/64)×fosc=fosc/64 计算定时器的初值计算: 4.若fosc = 6MHz ,波特率为2400波特,设SMOD =1,则定时/计数器T1的计数初值为多少并进行初始化编程。 答:根据公式 N=256-2SMOD ×fosc /(2400×32×12)= ≈243 =F3H TXDA: MOV TMOD,#20H ;置T1定时器工作方式2 MOV TL1,#0F3H ;置T1计数初值. MOV TH1,#0F3H B f B f N OSC SMOD OSC SMOD ??-=???-=384225612322256

基于51单片机的双机串行通信

机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级: xxxxxx 学号: 13xxxxxxxxx : xxxxxxx 2015年12月

基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:

串行口通信实验 单片机实验报告

实验六串行口通信实验 一、实验内容 实验板上有RS-232接口,将该接口与PC机的串口连接,可以实现单片机与PC机的串行通信,进行双向数据传输。本实验要求当PC机向实验板发送的数字在实验板上显示,按实验板键盘输入的数字在PC机上显示,并用串口助手工具软件进行调试。 二、实验目的 掌握单片机串行口工作原理,单片机串行口与PC机的通信工作原理及编程方法。 三、实验原理 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通信。进行串行通讯信要满足一定的条件,比如电脑的串口是RS232电平(-5~-15V为1,+5~+15V为0),而单片机的串口是TTL电平(大于+2.4V为1,小于- 0.7V为0),两者之间必须有一个电平转换电路实现RS232电平与TTL电平的相互转换。 为了能够在PC机上看到单片机发出的数据,我们必须借助一个Windows软件进行观察,这里我们可以使用免费的串口调试程序SSCOM32或Windows的超级终端。 单片机串行接口有两个控制寄存器:SCON和PCON。串行口工作在方式0时,可通过外接移位寄存器实现串并行转换。在这种方式下,数据为8位,只能从RXD端输入输出,TXD端用于输出移位同步时钟信号,其波特率固定为振荡频率的1/12。由软件置位串行控制寄存器(SCON)的REN位后才能启动,串行接收,在CPU将数据写入SBUF寄存器后,立即启动发送。待8位数据输完后,硬件将SCON寄存器的T1位置1,必须由软件清零。 单片机与PC机通信时,其硬件接口技术主要是电平转换、控制接口设计和远近通信接口的不同处理技术。在DOS操作环境下,要实现单片机与微机的通信,只要直接对微机接口的通信芯片8250进行口地址操作即可。WINDOWS的环境下,由于系统硬件的无关性,不再允许用户直接操作串口地址。如果用户要进行串行通信,可以调用WINDOWS的API 应用程序接口函数,但其使用较为复杂,可以使用KEILC的通信控件解决这一问题。 四、实验电路 [参考学习板说明书P27]

51单片机实现的485通讯程序

51单片机实现的485通讯程序 #ifndef __485_C__ #define __485_C__ #include #include #define unsigned char uchar #define unsigned int uint /* 通信命令*/ #define __ACTIVE_ 0x01 // 主机询问从机是否存在 #define __GETDATA_ 0x02 // 主机发送读设备请求 #define __OK_ 0x03 // 从机应答 #define __STATUS_ 0x04 // 从机发送设备状态信息 #define __MAXSIZE 0x08 // 缓冲区长度 #define __ERRLEN 12 // 任何通信帧长度超过12则表示出错uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号 sbit M_DE = P1^0; // 驱动器使能,1有效 sbit M_RE = P1^1; // 接收器使能,0有效

void get_status(); // 调用该函数获得设备状态信息,函数代码未给出 void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧 bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息 void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main() { uchar type; uchar len; /* 系统初始化*/ P1 = 0xff; // 读取本机设备号 dev = (P1>>2); TMOD = 0x20; // 定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收 ES = 0; // 关闭串口中断 IT0 = 0; // 外部中断0使用电平触发模式 EX0 = 1; // 开启外部中断0

单片机双机之间的串行通信设计

单片机双机之间的串行通 信设计 Prepared on 24 November 2020

专业方向课程设计报告题目:单片机双机之间的串行通信设计单片机双机之间的串行通信设计 一.设计要求: 两片单片机利用串行口进行串行通信:串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。 二、方案论证: 方案一:以两片51单片机作为通信部件,以4*4矩阵键盘作为数据输入接口,通过16个不同键值输入不同的信息,按照51单片机的方式3进行串口通信,从机采用中断方式接收信息并按照通信协议改变波特率或者用I/O口输出、CD4511译码、数码管显示相关数据,整个系统的软件部分采用C语言编写。 方案二:整个系统的硬件设计与方案一样,但是通信方式采用方式一进行通信,主从机之间的访问采用查询方式,数据输出直接由单片机的译码程序输出译码数据,同时软件编写采用汇编语言。 两种方式从设计上来说各有特色,而且两种方式都应该是可行的。方案一中按照方式三通信可以输出九位数据而方式一只能输出八位数据,但就本题的要求来说方式一就可以了。主从机之间的交流采用中断方式是一种高效且保护

单片机的选择,但是相比之下本人对查询方式的理解更好一些。数码管的显示若采用CD4511译码则直接输出数据就可以了,但是这样会增加硬件陈本,而且单片机的资源大部分都还闲置着,所以直接编写一段译码程序是比较好的做法。另外在软件编写上,采用C语言在后续设计中对硬件的考虑稍少一些,换言之采用汇编可以使自己对整个通信过程及单片机的部分结构有更清晰地认识所以综合考虑采用方案二。 三、理论设计: 采用AltiumDesigner绘制的原理图(整图) 本系统主要包括五个基本模块:单片机最小系统(包括晶振电路、电源、复位电路及相关设置电路)、4*4矩阵键盘、功能控制电路、数据显示电路、波特率更改指示电路。 本设计的基本思路是通过控制口选择将要实现的功能,然后矩阵键盘输入数据,单片机对数据进行处理(加校验码、设置功能标志位),然后与从机握手,一切就绪之后后就开始发送数据,然后从机对接收数据校验,回发校验结果,主机根据校验结果进行下一步动作,或者重发,或者进入下一数据的发送过程,然后按照此过程不段循环,直到结束。 单片机最小系统:接上电源和地,

C51单片机和电脑串口通信电路图

C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所示 在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。 按图7-3加上MAX232就可以了。这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。 为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片

基于51单片机的双机串行通信课程设计 1000110061

基于AT89C51单片机的双机串行通信设计 姓名:杨应伟 学号:100110061 专业:机械设计制造及其制动化 班级:机电二班

前言 单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域随着计算机技术的发展及工业自动化水平的提高, 在许多场合采用单机控制已不能满足现场要求,因而必须采用多机控制的形式,而多机控制主要通过多个单片机之间的串行通信实现。串行通信作为单片机之间常用的通信方法之一, 由于其通信编程灵活、硬件简洁并遵循统一的标准, 因此其在工业控制领域得到了广泛的应用。 在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。 在通信过程中,使用通信协议进行通信。在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。 串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.wendangku.net/doc/b64495218.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

单片机实验(简单的串口通信)

单片机技术与应用 实验报告 实验名称:单片机串行口与PC机通讯实验班级:11062811 学号:11061118 姓名:吕琳涛 指导老师:谷雨 2013年5月27日

1.实验要求 利用8031单片机串行口,实现与PC机通讯。 本实验实现以下功能,将从实验机键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符0-F(必须为大写字母)显示到实验机的数码管上。 2. 实验目的 1.掌握串行口工作方式的程序设计,掌握单片机通讯的编制。 2.了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议。 3.了解PC机通讯的基本要求。 3.程序说明: 在本次实验中,我们可以SCON = 0x50;对应的解释为我们在初始化串口接口控制寄存器SCON用于确定串口通道工作方式的选择、接收和发送控制及其串口的状态标志。TMOD = 0x20;表示我们在程序中用于设定定时和计数器的工作方式。TH1 = 0xfd;TL1 = 0xfd;用于对低八位和高八位进行初始化,也就是进行赋值。TR1 = 1;表明我们设定的计数器开始进行计数。ES = 1;是对串行接口中断的中断控制进行设定。EA = 1;是51单片机中断系统的总允许控制端。 s = SBUF;s = s+1;SBUF = s;这三个语句是对我们实验要求的主体部分的代码编写。也就是获取数据,对数据进行自加1然后通过串口返回到我们pc机上。我们知道接受RI = 1单片机没有自动复位的功能,也就是我们需要人为地进行赋值。T1也是这样的。 至此,程序编写完成,放入软件中进行编译和下载。

2.上机调试说明 将程序编写成功后,我们就上机进行调试。 下载成功后,通过键盘我们将我们想要的数据输入pc机里,等待pc 与单片机进行串口通信,单片机进行加一处理之后然后传到pc机里,显示到电脑屏幕上。 至此实验仿真过程结束。 3.写出源程序清单及执行结果。 源程序: #include unsigned char s; void main() { SCON = 0x50; TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; ES = 1; EA = 1; while(1) { } }

基于单片机C#串口通信

基于C#与单片机串口通信的投票器 李浩东20093101004 周守悦20093101012 一.作品的设计概述 我们知道每年每个班都需要班委换届,有很多同学积极参加竞选,然而每一次竞选投票都是大家拿出一张纸,然后再纸上写上自己心目中班委的名字,然后交给监票读票记票,这个过程不仅大大浪费了大家的宝贵时间,还有可能出现漏票等情况,体现不了公平公正公开。 本设计是通过按钮给班委竞选人投票,每个候选人都对应一个按钮,投票人如果想投票给某个人可以按下其对应按钮,每按下一次改竞选人的票数就会自动增加1,每个人只能按下一次,电脑显示屏将通过柱形图动态的呈现每个候选人获得票数竞争的情况以及通过框图显示总票数,不仅使得投票结果更加公开公正,而且也大大节省了大家的时间。本设计的创新点是通过柱形图动态显示整个投票过程,而不是直接显示到最后投票结果,更加体现公正公开。 二.作品的设计与分析 1.主要功能与分析 主要使用单片机和PC机之间的串口通信,在单片机硬件上设置七个按键,其中四个键是用来给A,B,C,D四个人投票的,这四个按键每按下一次就自动增1,记录这四个按键按下的总次数num1,num2,num3,num4,并把四个数按顺序不断循环通过串口发给PC机,PC 机通过串口把这些数据存储下来,并读出来,通过C#编程,把这四个人所获得的总票数在picturebox控件上面的柱形图动态呈现出来,通过time控件,不断更新这个人所获得的票数,让投票人通过柱形图更加形象直观的看出每个被投票人的竞争情况,同时在柱形图下方有着这四个人获得总票数的真实数目。还有一个按键是票数清零,如果这次投票已经完成或者无效可以按下这个按键,此时A,B,C,D四个人的总票数将变成零。还有一个按键作用是停止投票,如果需要停止这次投票可以按下此键,这时候那四个投票的按键将不可用。最后一个按键的作用是继续投票,如需继续投票,可按此键。其系统设计图如下: 2.串口通信规则 单片机与PC机为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置: (1)数据的传输速率 传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位到底代表几个位就不得而知了,

两个单片机之间的串行通信

两个单片机之间的串行通信 一、设计要求 在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。 二、实验所需元器件 三、电路原理图: 两个单片机之间的串行通信电路图

四、程序设计 这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。因此,需编写两个不同的程序,其程序流程图如下所示:

五、C语言程序: U1的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char void send(uchar state) { SBUF=state; while(TI==0); TI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; TI=0; TR1=1; ES=1; } void main() { P1=0xff; SCON_init(); while(1) { send(P1); } } U2的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char uchar state; void receive() { while(RI==0) state=SBUF; RI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; RI=0; TR1=1; } void main() { SCON_init(); while(1) { receive(); P1=state; } } 六、调试与仿真:

51单片机与上位机串口通信程序设计

51单片机与上位机串口通信程序设计 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include< reg51.h> #include< stdio.h> #include< string.h> #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收 PCON=0x00; ES=1;

TMOD=0x21; //定时器工作于方式2,自动装载方式TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break; case 0x04 :printf("D"); TI=0;break; default :printf("fg"); TI=0;break; } }

相关文档