那位大侠帮忙写一下stc89c52单片机的单工串口通信程序,不胜感激。

那位大侠帮忙写一下stc89c52单片机的单工串口通信程序,不胜感激。,第1张

#include<reg51.h>

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

char getData(void)

{

char c

while (!RI)

c=SBUF

RI=0

return (c)

}

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

char sendData(char c)

{

while (!TI)

TI = 0

return (SBUF = c)

}

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

void init(void)

{

TMOD=0x20//mode 2 auto reload

TL1=0xfd

TH1=0xfd//baudRate:9600

SCON=0x52//sm0,sm1,sm2,ren,tb,rb8,ti,ri

PCON&=0x7f//smod=0

TR1=1//timer1 reset

}

main()

{

char c

init()

while(1)

{

c=getData()

switch (c)

{

case '1':

sendData('a')

break

case '2':

sendData('b')

break

case '3':

sendData('c')

break

default:

sendData('n')

break

}

}

}

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

(1)把以上程序copy两份,上面有发送和接收函数,其中一个单片机用于发送(可不用改直接用上面),另外一份稍微修改下main()函数即可,在while(1)用char getData(void)接收

串口字符

(2)也可以两片单片机同时运行以上程序,即可实现回环发送和接收

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

//以下是中断版

#include <at89x52.H>

//#include "UART.h"

#define uint8unsigned char

#define uint16 unsigned short int

#define uint32 unsigned long int

#define int8 signed char

#define int16signed short int

#define int32signed long int

#define uint64 unsigned long long int

#define int64signed long long int

#define Fclk 11059200UL /*使用11.0592M晶体*/

#define BitRate 9600UL /*波特率定义为9600*/

#define DEBUG0

#define DEBUG1

volatile uint8 Sending

volatile uint receive//接收的字符

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

函数功能:串口初始化。

入口参数:无。

返回:无。

备注:无。

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

void InitUART(void)

{

EA=0//暂时关闭中断

TMOD&=0x0F //定时器1模式控制在高4位

TMOD|=0x20 //定时器1工作在模式2,自动重装模式

SCON=0x50//串口工作在模式1

TH1=256-Fclk/(BitRate*12*16) //计算定时器重装值

TL1=256-Fclk/(BitRate*12*16)

PCON|=0x80 //串口波特率加倍

ES=1//串行中断允许

TR1=1 //启动定时器1

REN=1 //允许接收

EA=1//允许中断

}

////////////////////////End of function//////////////////////////////

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

函数功能:串口中断处理。

入口参数:无。

返回:无。

备注:无。

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

void UartISR(void) interrupt 4

{

if(RI)//收到数据

{

RI=0 //清中断请求

receive=SBUF

}

else //发送完一字节数据

{

TI=0

Sending=0 //清正在发送标志

}

}

////////////////////////End of function//////////////////////////////

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

函数功能:往串口发送一字节数据。

入口参数:d: 要发送的字节数据。

返回:无。

备注:无。

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

void UartPutChar(uint8 d)

{

SBUF=d//将数据写入到串口缓冲

Sending=1 //设置发送标志

while(Sending)//等待发送完毕

}

////////////////////////End of function//////////////////////////////

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

函数功能:发送一个字符串。

入口参数:pd:要发送的字符串指针。

返回:无。

备注:无。

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

void Prints(uint8 * pd)

{

while((*pd)!='\0') //发送字符串,直到遇到0才结束

{

UartPutChar(*pd)//发送一个字符

pd++ //移动到下一个字符

}

}

////////////////////////End of function//////////////////////////////

#ifdef DEBUG1

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

函数功能:将整数转按十进制字符串发送。

入口参数:x:待显示的整数。

返回:无。

备注:无。

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

void PrintLongInt(uint32 x)

{

int8 i

uint8 display_buffer[10]

for(i=9i>=0i--)

{

display_buffer[i]='0'+x%10

x/=10

}

for(i=0i<9i++)

{

if(display_buffer[i]!='0')break

}

for(i<10i++)UartPutChar(display_buffer[i])

}

////////////////////////End of function//////////////////////////////

#endif

code uint8 HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}

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

函数功能:将短整数按十六进制发送。

入口参数:待发送的整数。

返回:无。

备注:无。

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

void PrintShortIntHex(uint16 x)

{

uint8 i

uint8 display_buffer[7]

display_buffer[6]=0

display_buffer[0]='0'

display_buffer[1]='x'

for(i=5i>=2i--) //将整数转换为4个字节的HEX值

{

display_buffer[i]=HexTable[(x&0xf)]

x>>=4

}

Prints(display_buffer)

}

////////////////////////End of function//////////////////////////////

#if (defined DEBUG0)||(defined DEBUG1)

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

函数功能:发送一个byte的数据。

入口参数:待发送的数据。

返回:无。

备注:无。

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

void Printc(uint8 x)

{

Sending=1

SBUF=x

while(Sending)

}

////////////////////////End of function//////////////////////////////

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

函数功能:以HEX格式发送一个byte的数据。

入口参数:待发送的数据

返回:无。

备注:无。

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

void PrintHex(uint8 x)

{

Printc('0')

Printc('x')

Printc(HexTable[x>>4])

Printc(HexTable[x&0xf])

Printc(' ')

}

////////////////////////End of function//////////////////////////////

#endif

1、单工通信是指报文只能在一个方向上传输的工作模式。

特点:在单工通信中,通信信道是单向的,发送端和接收端是固定的,即发送端只能发送信息,不能接收信息接收端只能接收信息,不能发送信息。在这种情况下,数据信号从一端发送到另一端,信号流是单向的。

2、半双工通信可以实现双向通信,但不能同时在两个方向进行。它必须交替进行。

特点:该方式可将发送端转换为接收端;相应地,接收端也可以转换为发送端。但与此同时,信息只能向一个方向传输。因此,半双工通信也可以理解为定向开关单工通信。

3、全双工通信是指在线路上进行通信时,从A到B、B到A的双向信号传输。

特点:全双工通信允许数据同时向两个方向传输,也称为双向同时通信,即通信双方可以同时发送和接收数据。在全双工模式下,通信系统的两端各有一个发射机和一个接收机,从而可以控制数据同时向两个方向传输。

扩展资料:

1、邮寄

基于实物的传播,虽然现在写信的人越来越少,越是简单越真实,越是简单越真诚,书信是信息传播最简单、最简单的方式,更不会因为传播速度过快而造成信息泄露;快递是人类社会发展的需要。

主要原因是随着人们物质生活水平的提高,对服务的需求越来越高,但其发展受到交通的制约。没有便利的交通不能迅速起来。

2、电话

电话可以分为固定电话,移动电话和互联网电话。传输方式的优点和缺点与网络方式基本相同。区别是电话不能直接传输文字和图片,区别是它不能传输物理对象。

3、传真、

传真是近二十年来发展最快的非电话电信业务。文字、图表、照片等静止图像记录在纸上,通过扫描和光电变换,变成电信号,通过各种各样的渠道目标,通过一系列逆变换过程在接收端,得到一个类似于发送沟通的记录的原件,称为传真。

4、卫星电话

卫星电话是一种基于卫星通信系统传输信息的电话。卫星电话是现代移动通信的产物。其主要功能是填补现有通信终端(有线通信、无线通信)无法覆盖的区域,为人们的工作提供更完整的服务。

在现代通信中,卫星通信是其他通信方式无法替代的。现有通用通信所提供的通信功能已全部应用到卫星通信中。

1、单工通信(Simplex Communication)是指消息只能单方向传输的工作方式。

特点:在单工通信中,通信的信道是单向的,发送端与接收端也是固定的,即发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。基于这种情况,数据信号从一端传送到另外一端,信号流是单方向的。

2、半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。

特点:在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。

3、全双工通信(Full duplex Communication)是指在通信的任意时刻,线路上存在A到B和B到A的双向信号传输。

特点:全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。

扩展资料

现代通信方式

1、邮递

以实物传递为基础,虽然如今写信的人越来越少,但越简单越真实,越纯朴越真情,信件是信息传递最简单最纯朴的方式,更不因传递速度过快造成信息的溢漏;快递是人类社会发展的的需要,

主要原因是因为随着人类物质生活水平的提高服务需求面也越来越高,但其发展受交通运输制约无便利的交通运输怎么也快不起来。

2、电话

电话分固定电话、移动电话与网络电话,其传递方式与网络方式优缺点基本相同,与网络方式不同之处在于电话不能直接传递文字图片,与邮递方式不同在于不能传递实物。

3、传真

传真是近二十多年发展最快的非话电信业务。将文字、图表、相片等记录在纸面上的静止图像,通过扫描和光电变换,变成电信号,经各类信道传送到目的地,在接收端通过一系列逆变换过程,获得与发送原稿相似记录副本的通信方式,称为传真。

4、卫星电话

基于卫星通信系统来传输信息的电话就是卫星电话。卫星电话是现代移动通信的产物,其主要功能是填补现有通信(有线通信、无线通信)终端无法覆盖的区域,为人们的工作提供更为健全的服务。

现代通信中,卫星通信是无法被其他通信方式所替代的,现有常用通信所提供的所有通信功能,均已在卫星通信中得到应用。

5、电报

电报,就是用电信号传递的文字信息。通讯越来越迅捷,电报的作用已经不是很大了,也许有一天电报就会从我们的生活中消失了。

电报是通信业务的一种,是最早使用电进行通信的方法。它利用电流(有线)或电磁波(无线)作载体,通过编码和相应的电处理技术实现人类远距离传输与交换信息的通信方式。

6、数据通信

计算机网络中传输的信息都是数字数据,计算机之间的通信就是数据通信方式,数据通信是计算机和通信线路结合的通信方式。在数据通信中,按每次传送的数据位数,通信方式可分为:并行通信和串行通信。

参考资料来源:百度百科——通信方式


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8058460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存