51单片机的串行通讯程序

51单片机的串行通讯程序
51单片机的串行通讯程序

51 单片机的串行通讯

一、简介:

在中颖单片机2009年79F系列单片机的试用活动中,有幸成为一名试用者,在此首先

感谢该公司为电工们举办的此次公益活动,得到了一套79F32评估板和一个JET51 仿真器,该仿真器能在Keil 下通过JTAG 口联机调试程序和编程,这对程序开发过程中的串行通讯功

能调试非常有用。

先上开发评估套件的图片如下:

由于常用的51 单片机只有一个串行通讯口,且简易仿真器大都是通过串口来完成仿真

时的通讯功能的,还有很多51单片机是通过串口来ISP程序的(比如STC和NXP的51单片机)。因而遇到有串行通讯的应用时,过去都采用直接把程序烧写到目标系统后然后联机测试结果,有问题时重新改程序,重新下载测试来实现的(俗称盲调),俺过去都用A T89S52 加一个下载器来调试此类应用,因为它下载程序时,不占用串口,故串口可与目标系统直接相连。中颖新推的8 位51 单片机具有JTAG 仿真功能,因而对于调试具有串行通讯外设的

应用系统带来了一个新的选择。

“51 单片机串行通讯”,这个话题我想大家初次看到,也许会觉得很简单,但您真的用

好串口的监视和可靠通讯两大主要功能吗?本文将结合本人的工作经验以中颖8 位51 增强

型SOC 单片机为平台讲述如何用好串行通讯功能,中颖单片机有双串口,非常适合有多种通讯要求的应用,比如集散控制系统的中位机硬件平台,起到承上启下的作用。

时间仓促,如有不当或不对之处,还请各位不吝指正。

文档版本(V1.0)

此部分为笔

者为验证流

水灯自行

DIY的元件

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

二、串口通讯的初始化与底层驱动程序:

51 单片机初始化串口有两个要点,

第一,初始化串口的波特率

中颖8051 中,波特率可以设置为系统时钟的分频或定时器的分频。

设置注意事项及规则如下:

A. 波特率不能等于系统时钟频率或定时器溢出率,只能为其分频值。

B. 当为串口方式1 或3 时,波特率发生器通过T2CON 的TCLK 和RCLK 来选择。TCLK 和RCLK 为1 时,选Timer2;TCLK 和RCLK 为0 时,选Timer1。

C. 当使用EUART1 时,不能使用Timer1 产生波特率。不管TCLK 和RCLK 为1或0,波特率发生器都为定时器2。但是当TCLK 或RCLK 为1 时,波特率为TCLK 或RCLK 为0 时的波特率的二分频。

D. UART 工作在不同的工作方式下,波特率发生器有所不同,具体内容如下:

方式0 时,波特率固定,波特率发生器为系统时钟的分频。当SM2=1时,波特率为系

统时钟的4 分频;当SM2=0 时,波特率为系统时钟的12 分频。当使用32.768K 并PLL 倍频后,系统时钟为8.192MHZ

当为方式 1 时,波特率可变,通过设置TCLK 和RCLK 来选择Timer1 或Timer2作为波特率发生器。通过SMOD 位(二倍频控制位)来选择分频值。当SMOD=1 时,波特率为定时器1 或2 溢出率/ 32 的二倍频,即16 分频;当SMOD=0 时,波特率为定时器1 或2 溢出率的32 分频。

当为方式 2 时,波特率固定,波特率发生器为系统时钟的分频。通过SMOD 位(二倍频控制位)来选择分频值。当SMOD=1 时,波特率为系统时钟/ 64 的二倍频,即32 分频;当SMOD=0时,波特率为系统时钟的64 分频。

当为方式 3 时,波特率可变,通过设置TCLK 和RCLK 来选择Timer1 或Timer2作为波特率发生器。通过SMOD 位(二倍频控制位)来选择分频值。当SMOD=1 时,波特率为定时器1 或2 溢出率/ 32 的二倍频,即16 分频;当SMOD=0 时,波特率为定时器1 或2 溢出率的32 分频。

小结一下:

1.串口方式0 和方式2 为不可变波特率,方式1 和方式3 为可变波特率,可变值由T1 或T2 控制

2.中颖单片机只用一个串口0 时,可选T1 或T2 作为波特率发生器。

3.中颖单片机使用两个串口时,T1 为串口0 波特率发生器,T2 为串口1的波特率发生器。第二,初始化串口的控制器SCON和其它部分(比如中断和波特率加倍位等)

串口0 的控制寄存器为SCON,串口1 的控制寄存器为SCON1,其内容与51 的相同,但要注

意中颖51 的串口为与其它功能复用,因而要将管脚配置好方向,输入引脚配置好上拉电阻,而输出引脚全部输出为高电平1,这样才能可靠的发送,发送完成后,状态符合串行通讯的要求。

Demo 程序如下,采用定时器1作波特率发生器,也适用于普通51单片机使用。

串口初始化示例程如下,以中颖79F32平台验证,在8.192M系统时钟时,波特率为9600

/**************************************************************************** void InitSys(void)

功能说明: 系统寄存器初始化

其他说明: Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

IEN0 EA EADC ET2 ES0 ET1 EX1 ET0 EX0

IEN1 EFCOF EI2C EPWM ESCM EHSEC ES1 EX2 ESPI

输入:无

输出:无

*****************************************************************************/ void InitSys(void)

{

P0SS = Bin(00000000); //P0 as io

P1SS = Bin(00000000); //P1 as io

P0CR = Bin(00000000);

P0PCR = Bin(00000000);

P0 = Bin(00000000);

P1CR = Bin(00000000);

P1PCR = Bin(00000000);

P1 = Bin(00000000);

P2CR = Bin(00000000);

P2PCR = Bin(00000000);

P2 = Bin(00000000);

//将P30,P31 初始化为串行通讯口

P3CR = Bin(00000010);

P3PCR = Bin(00000001);

P3 = Bin(00000011);

P4CR = Bin(00000000);

P4PCR = Bin(00000000);

P4 = Bin(00000000);

/*--------------------EUART初始化-------------------*/

TR0 = 0;

TR1 = 0; //stop timer1

TR2 = 0; //stop timer2

//----------------------------------------------------

TF0 = 0;

TF1 = 0;

// TMOD = Bin(00010001); //设置Timer1 为定时模式,工作方式一

(16bit,用于)

//定时器1 为8 位自装载,波特率发生器功能

TMOD = Bin(00100001); //设置Timer1 为定时模式,工作方式一

(16bit,用于)

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

TL0 = LOBYTE(CLOCK_1MS);

TH0 = HIBYTE(CLOCK_1MS);

// TL1 = LOBYTE(CLOCK_1MS);

// TH1 = HIBYTE(CLOCK_1MS);

TH1 = 0xe5;

TL1 = 0xe5;

TF2 = 0;

// T2MOD = Bin(00000000); //设置Timer2 用于产生波特率(baudrate

generator)

// T2CON = Bin(00110000);

//设置串口通讯方式为8位异步通讯,波特率可变。

SCON = Bin(01010000);

// RCAP2L = LOBYTE(UART_BAUDRA TE);

// TL2 = LOBYTE(UART_BAUDRA TE);

// RCAP2H= HIBYTE(UART_BAUDRA TE);

// TH2 = HIBYTE(UART_BAUDRA TE);

//----------------------------------------------------

TR0 = 1;

TR1 = 1; //start timer1

// TR2 = 1; //start timer2

//开启EUART和Timer0中断

IEN0 = Bin(00010010);

// IEN0 = Bin(00000010); //禁止串行中断

IEN1 = Bin(00000000);

TI = 1;

}

三、如何将程序中的变量内容输出到串行口

在程序调试过程中,出现了问题,用仿真器跟踪当然是最直接和高效的方法,但如果

没有仿真器,较好的方法是将相关的变量全部输出到串口,然后通过PC 机上的串口调试助手软件来查看相关内容。通过对关键变量的查看结合源程序分析,很快能找到BUG所在。软件中的变量常用的有好几种类型。那是否有通用的函数能完成将此变量的信息通过串

口送PC 来监视呢?C-51 有这样的现成函供供您调用。它就是我要隆重向您推荐的printf() 库函数,学过PC 机上的C 语言的同学对此应该比较熟悉。

使用printf前要做以下几个工作

1. 初始化串口波特率和模式,并置TI 为1;

2. 在源程序中包含头文件。

3. 如果是定时器1 作为波特率发生器,还可通过Keil-C51 软件仿真先在IDE 的虚拟

设备串口上看看printf()的工作情况

做好前面的工作后就可输出变量内容了。

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

字符型变量的输出用如下语句

printf(“字符变量X 的值为:%d\n”,(unsigned int )ucTemp);其中ucTemp 为一个字节

型的变量

整型变量的输出用如下语句

printf(“整形变量X 的值为:%d\n”,uiTemp); 其中uiTemp 为一个整形变量

长整型变量(4 字节)的输出用如下语句

printf(“长整形变量X 的值为:%ld\n”,ulTemp); 其中ulTemp 为一个长整形变量

串口输出程序中的变量的Demo程序如下(在中颖79F32 评估板上测试通过)

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

void main(void)

{

uchar ucCount;

uint uiCount;

ulong ulCount;

EA =0;

RSTSTA T = 0x00; //feed watchdog

InitSys();

EA =1;

ucCount =0;

uiCount = 0;

ulCount = 0;

while(1)

{

printf("HolleWorld!\n");

printf("ucCount V alue is %d\n",(uint)ucCount);

printf("uiCount V alue is %d\n",uiCount);

printf("ulCount V alue is %ld\n\n",ulCount);

printf("ucCount V alue is %02x\n",(uint)ucCount);

printf("uiCount V alue is %04X\n",uiCount);

printf("ulCount V alue is %l08X\n\n",ulCount);

ucCount++;

uiCount++;

ulCount++;

RSTSTA T = 0x00; //feed watchdog

}

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

}

测试过程中的电脑屏幕截图如下:

可在中颖79F32评估版上直接调试和验证的完整工程项目详见压缩包。

四、如何编程实现串口数据包的接收与发送

l 串口数据通讯,比较实用的模式有两种

4. 1 发送和接收都采用中断模式

发送和接收操作都要设数据缓冲区,占用内存较大,但CPU 的利用效率最高,无空耗

情况发生。

4.2 发送采用查询,接收采用中断

当设备要向外发送数据时,由于发送的数据的数量是已知的,因而在特定的波特率下,完成发送操作的时间也是可以预测的。因而采用查询操作发送可简化发送数据过程,减小内存

的占用。

数据接收只有采用中断方式才能高效可靠,应用中CPU 通常要完成基本功能的运转,只有在收到串口命令时才临时解析命令,完成相应的功能,完成后还有基本功能要做。

l 串口数据通讯时常采用的封包技术

串口通讯时,通常将数据内容组织成一个数据包,才能完成应用层相关协议的功能。通常的包包括“包头+数据内容+校验内容+包尾”构成。例如,我们在产品中常用的联机命令如下1B 10 00 01 88 //其中1B 10为包头,00 为约定的命令号01 为后续数据的长度,88 为包

尾字符。

l 接收和解析数据包采用状态机较易实现

针对以上介绍的数据包,我们可以定义以下几种状态

#define c_UART_RCV_Status_Idle 0 //空闲态

#define c_UART_RCV_Status_Head0 1 //接收到包头字符0 后进入的状态

#define c_UART_RCV_Status_Head1 2 //接收到包头字符1 后进入的状态

#define c_UART_RCV_Status_CMD 3 //接收到命令字符后进入的状态

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

#define c_UART_RCV_Status_DataLength 4 //接收到数据长度后进入的状态

#define c_UART_RCV_Status_DataContent 5 //接收指定长度的数据内容的状态

//#define c_UART_RCV_Status_PackageTail 6 //接收包尾数据

#define c_UART_RCV_Status_ReceiveEnd 7 //数据接收完成的状态

为了保存接收到的数据和控制状态机的切换,还要定义如下几个数据结构变量

uchar ucRCV_StatusMachineV alue; //定义串口接收状态机的当前状态值

uchar ucRCV_CommandV alue; //定义无符号字符型的串口数据命令字

uchar ucRCV_DataLength; //定义附加数据体的长度。

#define c_MaxDataLength 16 //定义串口数据的最大长度

uchar ucRCV_DataBuff[c_MaxDataLength]; //定义用于保存串口接收数据的缓冲区

uchar *pucDataBuff; //定义用于操纵串口缓冲区的指针

bool bCOM_ReceivePackageEndFlag; //串口接收数据完成时的标志位

其它常量定义如下

#define c_PackageHead0 0x1B

#define c_PackageHead1 0x10

#define true 1

#define false 0

建立在上述数据结构上的功能实现

/**************************************************************************

**

void EUART0_ISP(void) interrupt 4

功能说明: 串口通讯中断响应程序

其他说明: TI1---发送完一个字节

RI1---接收完一个字节

输入:无

输出:无

***************************************************************************

**/

void EUART0_ISP(void) interrupt 4

{

EA = 0;

UartInterface();

EA = 1;

}

串口数据中断处理函数如下,实现状态的跳转与数据的保存

/************************************************************************** **

void UartInterface(void)

功能说明: 串口通讯接收、发送处理程序

其他说明:

输入:无

输出:无

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

*************************************************************************** **/

void UartInterface(void)

{

uchar ucReceiveData; //临时存储串口接收到的数据内容

/*--------------------------数据发送--------------------------*/

if(TI) //发送完一个数据

{

//是发送数据完成后的中断,不做处理,采用查询方式发送

}

/*--------------------------数据接收--------------------------*/

if(RI) //接收完一个数据

{

ucReceiveData = SBUF;

RI = 0;

switch(ucRCV_StatusMachineV alue)

{

case c_UART_RCV_Status_Idle:

if(ucReceiveData == c_PackageHead0)

{

ucRCV_StatusMachineV alue = c_UART_RCV_Status_Head0;

}

break;

case c_UART_RCV_Status_Head0:

if(ucReceiveData == c_PackageHead1)

{

ucRCV_StatusMachineV alue = c_UART_RCV_Status_CMD;

pucDataBuff = ucRCV_DataBuff;//将指针指向串口数据缓冲区的

首端

}

break;

case c_UART_RCV_Status_CMD:

//合法性检查及数据的保存操作

ucRCV_CommandV alue = ucReceiveData;

*pucDataBuff++ = ucReceiveData;

//跳转到下一状态

ucRCV_StatusMachineV alue = c_UART_RCV_Status_DataLength; break;

case c_UART_RCV_Status_DataLength:

//合法性检查及数据的保存操作

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html, ucRCV_DataLength = ucReceiveData;

//避免指针越界的冗余设计

if(ucRCV_DataLength > c_MaxDataLength-2)

{

ucRCV_DataLength = c_MaxDataLength-2;

}

*pucDataBuff++ = ucReceiveData;

//跳转到下一状态

ucRCV_StatusMachineV alue = c_UART_RCV_Status_DataContent; break;

case c_UART_RCV_Status_DataContent:

//数据包中的附加变长数据体内容存入缓冲区

*pucDataBuff++ = ucReceiveData;

if(ucRCV_DataLength > 0)

{

ucRCV_DataLength--;

if(ucRCV_DataLength == 0)

{

//串口接收数据包完成的标芯位置位

//通知主进程进行串口数据包的处理

bCOM_ReceivePackageEndFlag = true;

//接收完最后一个字符.

//跳转到下一状态

ucRCV_StatusMachineV alue =

c_UART_RCV_Status_ReceiveEnd;

}

}

break;

case c_UART_RCV_Status_ReceiveEnd:

//接收数据溢出时的处理,可报警或点灯

break;

default:

//默认的处理,防错

ucRCV_StatusMachineV alue = c_UART_RCV_Status_Idle;

break;

}

}

}

//主进程循环监测数据包接收是否完成,并执行喂狗操作。

/************************************************************************** PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

**

void UARTProcess(void)

功能说明: 数据接收完成处理

其他说明: 当数据接收完成,进行接收完成处理

输入:无

输出:无

*************************************************************************** **/

void UARTProcess(void)

{

//process of uart

ucRCV_StatusMachineV alue = c_UART_RCV_Status_Idle;

bCOM_ReceivePackageEndFlag = false;

while(1)

{

RSTSTA T = 0x00; //feed watchdog

if(_testbit_(bCOM_ReceivePackageEndFlag) ) //是否接收完一

个数据包

{

UartDecode();

bCOM_ReceivePackageEndFlag = false;

ucRCV_StatusMachineV alue = c_UART_RCV_Status_Idle;

}

}

}

下面再讲一下查询方式发送数据到串口的相关代码

//通过串口发送一字节的内容,发送完成后返回

void COM_SendOneChar(uchar ucWriteData)

{

SBUF = ucWriteData;

while(!TI);

TI =0;

}

/**************************************************************************** void UartDecode()

功能说明: 数据解码处理

其他说明: 此处简化了解码部分,将接收到的数据返回到宿主机"

输入:无

输出:无

*****************************************************************************/ PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

void UartDecode()

{

uchar ucDataLength;

ucDataLength = ucRCV_DataBuff[01]; //包头的两个字符不包含在内

ucDataLength += 2;

pucDataBuff = ucRCV_DataBuff;

COM_SendOneChar(c_PackageHead0);

COM_SendOneChar(c_PackageHead1);

while(ucDataLength--)

{

COM_SendOneChar(*pucDataBuff++);

}

}

测试硬件平台连接图片如下:

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

测试过程中的PC机屏幕截图如下:

由上图可见,发送到79F32 开发板的数据包被完整的接收下来,并通过串口返回。

可在中颖79F32评估版上直接调试和验证的完整工程项目详见压缩包。

l 数据接收中采用超时判错的冗余设计能提高通讯的健壮性。

上面所举的例程状态机的跳转由串口接收到字符时进行触发操作,当数据包不完整或

遇到非法的数据包时,会进入某个中间状态而无法继续运转下去。在高可靠的应用中,宜加上超时机制,每次进行状态切换后,超时计数器清零,如果超时时间段内未发生状态切换,超时时间一到,强制状态机切换到空闲态,且置超时出错标志,主进程检测到超时标志置位后,发送超时错误数据包给宿主机。

未设超时机制的串口驱动,在宿主机多次重发正确数据包后,也能转入正常接收状态。

总结:

单片机的串口由于只完成数据传输的物理层协议,因而编写严谨而可靠的通讯协议

对于复杂应用显得尤为重要。具备JTAG 仿真特性的单片机在串口软件驱动层的调试过程中

能发挥较为重要的作用。

编写:古道热肠

邮箱:xg_2004_sy@https://www.360docs.net/doc/ac12937306.html,

完成日期: 2009-12-26

PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.360docs.net/doc/ac12937306.html,

(完整版)51单片机实现双机通信(自己整理的)

1号机程序 #in clude #defi ne uint un sig ned int #defi ne uchar un sig ned char sbit p10=P1 A 0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i; while(y__) for(i=0;i<120;i++) 5 } void put(uchar x) // 发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while (TI==0); 〃等待发送结束 TI=0; } P £j £fA>l3 旳 4阳 1370 丘阳 H 鮎口 PDLWAJil- PDSA>f POfiAME PQ TiJT FZ^KS 畑 阳pz- A A-m FZW11 PZ.AtZ FZj9jAl4 PZ.TW? P3£VR : iD paimcc P3.sii nrn pjjfflrn F3.WTI] M*Tl pgtjgQIH F3.7/IF 1E 11 左边1号机,右边2号机, ,功能实现 帕叶DO ■ 口 IJApi FDJ H [I Z — 观旧 IP 口 .hQKD* *QAADf H ^ 弓 H.Lta RQfMM FZJWS pz. iwe F2JKA-IDI P2JTA11I F2.HW1Z P2JSM13 F2W.14 F2JM1S F3Ji nHX& gj.im:& riaiWTO rjjfWTT F3.1/W f3AT1 P3JillW F3JMF ■T2 1E

MCGS软件与MCS51单片机多机通信的几种方法

MCGS软件与MCS51单片机多机通信的几种方法 Multi-machineSerialCommunicationMethodbetweenConfigurationSoftwareMCG SandMCS51SCMLiaoningMechanicAndElectricityProfessionTechnologyAcademy InformationInstrumentliunaPostcode:118002[摘要]MCGS是目前较常见的一 种工业控制通用组态软件,可以利用它十分方便地构成了分布式系统的监控画面,动态显示控制设备的运行状态、实时、历时曲线和报表、上下限报警等。在该系统中对于由多个MCS51单片机控制的下位机仪表,其工作由MC Multi-machine Serial Communicat io n Method between Configuration Software MCGS and MCS51 SCM Liaoning Mechanic And Electricity Profession Technology Ac ad emy Information Instrument liuna Postcode:118002 [摘要] MCGS是目前较常见的一种工业控制通用组态软件,可以利用它十分方便地构成了分布式系统的监控画面,动态显示控制设备的运行状态、实时、历时曲线和报表、上下限报警等。在该系统中对于由多个MCS51单片机控制的下位机仪表,其工作由MCGS远程监控,充分利用计算机的资源进行各种管理。那么对于MCGS与MCS51单片机多机组成的系统如何设计其通信方式,本文介绍几种工程 中可用的通信方法。 [abstract] MCGS is the normal industry configuration software. We can use it to consist apicture of DCS system , it can display the device’s dynamic moving state, the moment 、history curves and reports、high and low alarm。In the system more MCS51 SCM is under control, the MCGS remote control the SCM, the method can use the pc’s source to manage the matter. So how to design multi-machine serial communication method between configuration software MCGS and MCS51 SCM, the article introduce some communication method. [keywords] Configuration Software VB SCM multi –machine Serial Communication Fuction OLE 一、引言 在工业控制领域中,分布式监控系统常常采用计算机机为上位机、单片机做下位机的系统,这是一种经济、可靠、真观、合理的控制方式。组态软件MCGS 是目前较常见的一种工业控制通用组态软件,是开发工程一非常有效的上位机工具软件,下位机采用单片机来开发的仪表,则具有计量精度高,功耗低,稳定可靠,成本低等特点。 组态软件MCGS与MCS51单片机的通迅方法一般有三种:一、单片机通过PLC、采集板卡、智能模块等设备实现通信;二、通过采用VB编制通信服务程序,利用串口通讯控件与单片机进行多机通信, 利用OLE功能在服务程序和MCGS之间进行数据交换,从而实行了MCGS与单片机的多机通信。;三、通过使用MCGS 嵌入版的串行口通迅函数进行PC机与单片机多机通信。前者实现简单,只需对

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

三个51单片机通信汇编程序

(1)主机程序 AT89C51-A ORG 00H JMP START START: MOV SP,#60H ;设置堆栈 MOV TMOD,#00100000B ;TIMER1工作在MODE2 ANL PCON,#01111111B ;SMOD=0 MOV TH1,#0F3H ;波特率为2400 MOV TL1,#0F3H SETB TR1 ;启动TIMER1 MOV SCON,#11010000B ;UART工作在MODE3 MOV IE,#10010000B ;UART中断使能 SETB SM2 ;设SM2=1 MOV P2,#0FFH ;给P2口赋初值 MOV 32H,0FFH ;两个副CPU地址暂存器 SCAN0: MOV R3,#F7H ;键盘扫描初始值 SCAN: JB RI,UARTI ;是否有接收中断 MOV R1,#00H ;TABLE取码指针 SCAN1: MOV A,R3 ;输出行扫描 MOV P1,A MOV A,P1 MOV R4,A SETB C MOV R5,#03H ;扫描4列 L1: RLC A JNC KEYIN ;C=0表示有键按下 INC R1 ;C不等于0,未按则取码指针加1 DJNZ R5,L1 ;扫描下一列 MOV A,R3 ;扫描下一行 SETB C

RRC A MOV R3,A JC SCAN1 ;4行扫描完 JMP SCAN0 KEYIN: MOV R7,#0D0H ;消除抖动 D2: MOV R6,#19H DJNZ R6,$ DJNZ R7,D2 D3: MOV A,P1 ;按键放开否? XRL A,R4 JZ D3 MOV A,R1 ;至TABLE取键盘码 MOV DPTR,#TABLE MOVC A,@A+DPTR MOV 30H,A XRL A,#83H ;“#1”是否按下? JZ UART1 MOV A,30H XRL A,#C6H ;“#2”是否按下? JZ UART2 MOV A,30H MOV SBUF,A ;载入SBUF发送出去WAIT: JBC TI,SCAN ;发送完毕否? JMP WAIT UART1: SETB TB8 ;设TB8=1 MOV SBUF,#01H ;发送AT89C51-B的地址01H WAIT1: JBC TI,L2 ;发送完毕否? JMP WAIT1 L2: CLR TB8 ;清除TB8=0 JMP SCAN0

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

汇编语言实现串口通信(PC和单片机间)教学文案

8.用C语言或汇编语言实现串口通信(PC和单片机间) 上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示 1 硬件电路的设计 MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。因此在通信距离较短时可采用零MODEM方式,简单三连线结构。IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51 机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。电路如图1所示。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示: 2 系统软件设计 软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信, 1上位PC机与下位单片机异步串行通信的通信协议

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软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站https://www.360docs.net/doc/ac12937306.html,可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

基于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单片机串行接口的结构如下:

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

标签:modbus8051源程序 modbus协议--51端程序的实现 RTU需要一个定时器来判断3.5个流逝时间。 #define ENABLE 1 #define DISABLE 0 #define TRUE 1 #define FAULT 0 #define RECEIVE_EN 0 #define TRANSFER_EN 1 #define MAX_RXBUF 0x20 extern unsigned char emissivity; extern unsigned char tx_count,txbuf[15]; extern unsigned char rx_count,rxbuf[15]; extern unsigned char tx_number,rx_number; extern bit rx_ok; unsigned char rx_temp; void InitTimer1() //针对标准8051 { TMOD=(TMOD|0xf0)&0x1f; //将T1设为16位定时器 TF1=0; TH1=0x62; //设T1位3.5位的接收时间35bit/9600bit/s=3.646ms TL1=0x80;//晶振为11.0592MHz,T= 65535-3.646ms*11.0592MHz/12=0xf2df //0x6280是22.1184M下LPC9XX下的值。 ET1=1; //允许T1中断 TR1=1; //T1开始计数 } void timer1() interrupt 3 using 2 //定时器中断 { TH1=0x62; //3.646ms interrupt TL1=0x80; if(rx_count>=5) //超时后,若接收缓冲区有数则判断为收到一帧 { rx_ok=TRUE; } } void scomm() interrupt 4 using 3 //modbus RTU模式 {

51单片机与PC串口通讯

目录 第1章需求分析 ............................................................................................................................ - 1 - 1.1课题名称 (1) 1.2任务 (1) 1.3要求 (1) 1.4设计思想 (1) 1.5课程设计环境 (1) 1.6设备运行环境 (2) 1.7我在本实验中完成的任务 (2) 第2章概要设计 ............................................................................................................................ - 2 - 2.1程序流程图 (2) 2.2设计方法及原理 (3) 第3章详细设计 ............................................................................................................................ - 3 - 3.1电路原理 (3) 3.1.1STC89C52芯片 ............................................................................................................. - 3 -3.2串口通信协议 (4) 3.3程序设计 (5) 3.3.1主程序模块 .................................................................................................................... - 5 - 3.3.2串口通讯模块 ................................................................................................................ - 6 - 3.3.3控制部分文件 ................................................................................................................ - 8 - 3.3.4公共部分模块 .............................................................................................................. - 11 -3.4电路搭建 (12) 3.4.1电路原理图 .................................................................................................................. - 12 -第4章上位机关键代码分析 ...................................................................................................... - 12 - 4.1打开串口操作 (12) 4.2后台线程处理串口程序 (15) 4.3程序运行界面 (18) 第5章课程设计总结与体会 ...................................................................................................... - 19 -第6章致谢 .................................................................................................................................. - 19 -参考文献........................................................................................................................................... - 19 -

基于51单片机的多机通信系统设计

单片机多机通信系统 一、引言 随着单片机技术的不断发展,单片机的应用已经从单机向多机互联化方向发展。单片机在实时数据采集与数据处理方面,有着成本低、能满足一般要求、开发周期短等优点,其在智能家居、计算机的网络通信与数据传输、工业控制自动化等方面有着广泛的应用。 本系统就是面向智能家居应用而设计的。在初期,采用红外无线通信方式,其传输距离短,适于一般家庭应用,且成本相对较低;待方案成熟、成本允许,可以改用GSM无线通信方式。 二、系统原理及方案设计 1 、系统框架介绍 本系统为基于51单片机的多机红外无线通信系统,由三个51单片机模块组成。其中一个作为主机(即上位机),负责接收来自从机1(即下位机)采集的数据信息,以及向从机2(即下位机)发送控制信息。从机1就是数据采集模块,采集温度、光强等室内数据,并将其发送给主机。主机经分析处理,作出相应判断,并给从机2发送控制信息,使由从机2控制的电机作出相应反应,调节室内环境状况。 系统总体框图如下图1所示,图2为红外收发模块简图:

图1 系统总体框图 图2 红外收发模块简图 2 、多机通信原理介绍 在多机通信系统中,要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51单片机串行口控制寄存器SCON中的控制位SM2正就是为了满足这一要求而设置的。当串行口以方式2或方式3工作时,发送或接收的每一帧信息都就是11位的,其中除了包含SBUF 寄存器传送的8位数据之外,还包含一个可编程的第9位数据TB8或RB8。主机可以通过对TB8赋予1或0,来区别发送的就是数据帧还就是地址帧。 根据串行口接收有效条件可知,若从机的SCON控制位SM2为1,则当接收的就是地址帧时,接收数据将被装入SBUF并将RI标志置1,向

51单片机usart通信程序(有CRC校验)

#include #include #include #define uchar unsigned char #define uint unsigned int //uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar p[]={0x01,0x03,0x25,0x23,0x00,0x01}; /* CRC 高位字节值表*/ uchar const crchi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC低位字节值表*/ uchar const crclo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

51单片机多机通信课程设计

《单片机应用与仿真训练》设计报告 单片机多机通信 姓名: 学号: 专业班级: 指导老师: 所在学院: 2011年7月5日

摘要 本设计是基于AT89S52单片机温度检测传输的三机通信系统,有三个单片机组成,其中一个作为主机(上位机),控制并负责接收来自从机1号和从机2号采集的数据信息,并显示在数码管上。由主机发送控制信息(通过按键控制),确定是接收来自想要得到各从机数据。从机1号和2号是数据采集模块,用来采集室内或室外温度信息,并通过通信协议传送给主机。为保证三机通信可靠性,通信口要有识别功能,51单片机串行口控制寄存器SCON中SM2位正是满足这一要求而设置的。当串行口以工作方式三工作时,接收和发送的信息都是11位数据,既包含SBUF寄存器传送的8位数据,还包括SCON中可编程第9位数据即TB8或RB8,主机可通过设定TB8是0或1,来区别发送的是地址还是数据。从机都先将SCON中的SM2设置为1,待主机发送地址信息,与本身的地址对照,如果是,则令从机SM2为0,准备接收主机信息并发送温度信息,如果不是,则继续等待。主机通过中断口接收数据,处理后显示在数码管上。此次设计由于只有一个18b20温度传感器,这里用三个任意的数据代替从机2采集温度数据,由于传输距离较短,这里不用MAX232,直接将主机的发送端接从机接收端,主机接收端连接从机发射端,仿真结果正常显示,实验结果正常。

目录 1概述 (1) 1.1设计概述 (1) 1.2多机通信基本原理 (1) 1.3 通信协议 (2) 2系统总体方案及硬件设计 (3) 2.1总体设计方案 (3) 2.2硬件电路设计 (3) 3软件设计 (7) 3.1控制流程图 (7) 3.2串行口采集步骤 (7) 3.3软件流程图 (8) PROTEUS仿真 (9) 课程设计体会 (11) 参考文献: (12) 附件1:主机A源程序代码 (13) 附件2:原理图 (24)

【最新编排】基于51单片机的DHT11串口通讯

//****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include #include // typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U 6; /* defined for unsigned 6-bits integer variable 无符号 6位整型变量 */ typedef signed int S 6; /* defined for signed 6-bits integer variable 有符号 6位整型变量 */ typedef unsigned long U3 ; /* defined for unsigned 3 -bits integer variable 无符号3 位整型变量 */ typedef signed long S3 ; /* defined for signed 3 -bits integer variable 有符号3 位整型变量 */ typedef float F3 ; /* single precision floating point variable (3 bits) 单精度浮点数 3 位长度 */ typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数 64位长度 */ // #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P _0 = P ^0 ; sbit P _ = P ^ ; sbit P _ = P ^ ; sbit P _3 = P ^3 ;

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; }

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

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

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

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; } }

相关文档
最新文档