(一)PC 机与单片机通信(RS232 协议)【800个电子设计大赛资料合集】

800个电子设计项目分享解析含源码 帮助小白学嵌入式 从入门到年薪50万

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事与硬件设计,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验,共同互勉!全套资料领取扫描文末二维码


温馨提示:学而不思则罔,思而不学则殆。实践是检验真理的唯一标准!

PC机与单片机通信(RS232协议)


实验任务

        单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机系统接收后,用LED显示接收到的数据和向上位机发回原样数据。


一、实验原理

RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。

RS-232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为20kBps。

RS-232协议以-5V-15V表示逻辑1;以+5V-15V 表示逻辑0。 我们是用MAX232芯片将RS232电平转换为TTL电平的。 一个完整的RS-232接口有22根线,采用标准的25芯插头座。我们在 这里使用的是简化的9芯插头座。

注意我们在这里使用的晶振是11.0592M的,而不是12M。因为波特率的设置需要11.0592M的。

“串口调试助手V2.1.exe” 软件的使用很简单,只要将串口选择‘CMO1’波特率设置为‘9600’ 数据位为 8 位。打开串口(如果关闭)。然后在发送区里输入要发送的数据,单击手动发送就将数据发送出去了。注意,如果选中‘十六进制发送’那么发送的数据是十六进制的,必须输入两位数据。如果没有选中,则发送的是ASCLL码,那么单片机控制的数码管将显示ASCLL码值。单片机Px0~Px7引脚5V高电平上拉。

数字

二进制

引脚Px0~Px7

数码管Abcdefg p

十六进制

0

00111111

00000011

11111100

0xco

1

00000110

10011111

01100000

0xf9

2

01011011

00100101

11011010

0xa4

3

01001111

00001101

11110010

0xb0

4

00110110

10010011

01101100

0x99

5

01101101

01001001

10110110

0x92

6

01111101

01000001

10111110

0x82

7

00000111

00011111

11100000

0xf8

8

01111111

00000001

11111110

0x80

9

01101111

00001001

11110110

0x90

A

01110111

00010001

11101110

0x88

B

01111100

11000001

00111110

0x83

C

00111001

01100011

10011100

0xc6

D

01011110

10000101

01111010

0xa1

E

01111001

01100001

10011110

0x86

F

01110001

01110001

10001110

0x8e

代码

字符

代码

字符

代码

字符

代码

字符

代码

字符

32

52

4

72

H

92

\

112

p

33

!

53

5

73

I

93

]

113

q

34

54

6

74

J

94

^

114

r

35

#

55

7

75

K

95

_

115

s

36

$

56

8

76

L

96

`

116

t

37

%

57

9

77

M

97

a

117

u

38

&

58

:

78

N

98

b

118

v

39

59

;

79

O

99

c

119

w

40

(

60

<  

80

P

100

d

120

x

41

)

61

=

81

Q

101

e

121

y

42

*

62

>  

82

R

102

f

122

z

43

+

63

?

83

S

103

g

123

{

44

,

64

@

84

T

104

h

124

|

45

-

65

A

85

U

105

i

125

}

46

.

66

B

86

V

106

j

126

~

47

/

67

C

87

W

107

k

48

0

68

D

88

X

108

l

49

1

69

E

89

Y

109

m

50

2

70

F

90

Z

110

n

51

3

71

G

91

[

111

o

二、单片机程序源码

1.主函数C

代码如下(示例):

#include "reg52.h" //包函8051 内部资源的定义
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit gewei=P2^4; //个位选通定义
sbit shiwei=P2^5; //十位选通定义
sbit baiwei=P2^6; //百位选通定义
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //1~10
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
void LED() //LED显示接收到的数据(十进制)
{
gewei=0; P0=table[dat%10]; Delay(10); gewei=1;
shiwei=0; P0=table[dat/10]; Delay(10); shiwei=1;
baiwei=0; P0=table[dat/100]; Delay(10); baiwei=1;
}
///功能:串口初始化,波特率9600,方式1/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/主程序功能:实现接收数据并把接收到的数据原样发送回去///
void main()
{
Init_Com();//串口初始化
while(1)
{                      
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0; //RI 清零。
SBUF = dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
}
LED(); //显示接收到的数据
}
}
///这一个例子是以扫描的方式编写的,还可以以中断的方式编写,请大家思考//

2.PC控制单片机IO口输出

代码如下(示例):

#include "reg52.h" //包函8051 内部资源的定义
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
    {
        unsigned int i;
        for(i=0; i<100; i++);
        tc--;
    }
}
///功能:串口初始化,波特率9600,方式1/
void Init_Com(void)
{
        TMOD = 0x20;
        PCON = 0x00;
        SCON = 0x50;
        TH1 = 0xFd;
        TL1 = 0xFd;
        TR1 = 1;
}
/主程序功能:实现接收数据并把接收到的数据原样发送回去///
void main()
{
Init_Com();//串口初始化
while(1)
    {                      
    if ( RI ) //扫描判断是否接收到数据,
        {
            dat = SBUF; //接收数据SBUF赋与dat
            if(dat==0x00)	//如果PC发送十六进制00,单片机P1口全亮。
                P1=0x00;
            else if(dat==0x01)
                P1=0x01;
            else if(dat==0x02)
                P1=0x02;
            else if(dat==0x03)
                P1=0x03;
            else if(dat==0x04)
                P1=0x04;
                RI=0; //RI 清零。
                SBUF = dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
        } 
    }
}

3.PC机给单片机发送数据

代码如下(示例):

#include "reg52.h" //包函8051 内部资源的定义
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
unsigned char fan;
int i,j;
void Delay() //延时程序
{
for(i=0; i<100; i++)
for(j=0; j<100; j++);
}
void delays()
{
int k;
for (k=0;k<1200;k++);
}
///功能:串口初始化,波特率9600,方式1/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/主程序功能:实现接收数据并把接收到的数据原样发送回去///
void main()
{
Init_Com();//串口初始化
while(1)
    { 
                 
        if ( RI ) //扫描判断是否接收到数据,
        {
            dat = SBUF; //接收数据SBUF赋与dat
            if(dat==0x30)	//如果PC发送十六进制00,单片机P1口全亮。
                {
                 P1=0x00;
                 Delay();   
                 }
            else if(dat==0x31)
                {P1=0x01;
                Delay();}
            else if(dat==0x32)
                {P1=0x03;
                Delay();}
            else if(dat==0x33)
                {P1=0x07;
                Delay(); }
            else if(dat==0x34)
                {P1=0x0f;
                Delay(); }
            else if(dat==0x35)
                {P1=0x1f;
                Delay();}
            else if(dat==0x06)
                {P1=0x3f;
                Delay(); }
            else if(dat==0x07)
                {P1=0x7f;
                Delay();}
            else if(dat==0x08)
                {P1=0xff;
                Delay(); }
            else if(!(P2&0x01))
                { delays();
                while(!(P2&0x01));
                    fan = 0x36;}
                else if(!(P2&0x02))
                    { delays();
                while(!(P2&0x02));
                    fan = 0x37;}
                else if(!(P2&0x04))
                    { delays();
                while(!(P2&0x04));
                    fan = 0x38;}
                else if(!(P2&0x08))
                    { delays();
                      RI=0; //RI 清零。
                      SBUF =dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
                    } 
          }
}


回复【更多资料】海量嵌入式资料赠送

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事与硬件设计,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验,共同互勉!              

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 51单片机RS232通信是一种常见的串行通信方式。RS232通信协议是一种标准的串行通信协议,用于在计算机或其他设备之间进行数据传输。 在51单片机中,通常使用UART(通用异步收发传输器)来实现与RS232通信的功能。UART是一种串行通信接口,它能够将数据以位的形式发送和接收。 为了实现51单片机RS232通信,需要将单片机的串行端口连接到计算机的串行端口。首先,需要设置单片机的串行通信参数,如波特率、数据位数、校验方式等。然后,在单片机程序中,可以使用相应的UART库函数或编程指令来发送和接收数据。 数据的发送过程通常是将要发送的数据写入到UART的发送缓冲区,然后单片机通过UART将数据以位的形式传输给计算机。而数据的接收过程则是通过读取UART的接收缓冲区来获取计算机发送过来的数据。 通过51单片机RS232通信,可以实现许多应用,如与计算机进行数据交互、远程控制、数据采集等。此外,还可以通过双向通信实现命令的发送和接收,以实现更复杂的功能。 总结起来,51单片机RS232通信是一种常见的串行通信方式,通过串口连接,使用UART实现数据的发送和接收。这种通信方式广泛应用于各种领域,为系统间的数据交换和控制提供了一种可靠的方式。 ### 回答2: 51单片机RS232通信是一种常见的串行通信方式,通过这种方式可以实现单片机与计算机之间的数据交换。 在51单片机RS232通信中,需要通过串口来进行数据传输。串口是一种串行接口,它能够将数据一位一位地发送或接收。而RS232是一种物理层标准,规定了电气特性、信号电平等参数,使得通信双方能够正常地通信。 在实际应用中,通常需要使用MAX232芯片来进行电平转换,因为RS232通信采用的是±12V的电平,而51单片机输出的是0V和5V的电平。MAX232芯片可以将51单片机的信号转换成RS232所需的电平,从而实现双方的通信。 在程序设计上,通常需要使用相应的串口通信函数来实现数据的发送和接收。单片机利用串口发送数据时,需要将数据按照一定的格式进行封装,包括起始位、数据位、停止位等。计算机接收到数据后,也需要按照相同的格式进行解析。 通过51单片机RS232通信,可以实现很多实际应用,比如远程监控、数据采集等。例如,可以通过计算机向单片机发送指令,控制某个设备的开关状态。或者将传感器采集到的数据通过RS232传输到计算机端进行处理和显示。 总的来说,51单片机RS232通信是一种常见且实用的通信方式,通过合适的硬件和软件设计,可以实现单片机与计算机之间的数据交互。 ### 回答3: 51单片机RS232通信可以通过串口来实现。RS232是一种标准的串行通信接口,包括发送端和接收端,用来实现个人计算机(PC)与其他设备(如打印机、调制解调器等)的通信。而51单片机是一种常用的控制芯片,可以通过编程来控制和管理各种外设。 在使用51单片机RS232通信时,需要将51单片机的串口与RS232的发送端(TXD)和接收端(RXD)相连接。通过编程,可以配置51单片机的串口为特定的波特率、校验位、数据位和停止位,以便与RS232通信接口匹配。 在通信过程中,51单片机可以通过串口发送数据给RS232,或从RS232接收外部设备发送的数据。要发送数据,可以将需要发送的数据存储在相应的寄存器中,然后通过配置好的串口发送数据。要接收数据,需要不断地检测串口接收缓冲区是否有数据到达,如果有数据,则将其读取出来并进行处理。 通过51单片机RS232通信,可以实现各种应用,比如将传感器数据上传到PC,或者通过PC发送指令控制51单片机的行为。在实际应用中,需要根据具体的需求和通信协议来进行编程和配置。 总结起来,51单片机RS232通信通过配置51单片机的串口参数和编程来实现数据的发送和接收。这种通信方式广泛应用于工控领域、嵌入式系统和物联网等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式学习资料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值