51单片机串口通讯实验2+Proteus仿真

51单片机串口通讯实验2+Proteus仿真


📌相关篇《51单片机串口通讯 +Proteus仿真实验》只是程序代码中对串口接收收据处理方式不一样,新增了按键中断。

✨注意不要使用Proteus 8 Professional 8.13版本串口通信会出错。

🔨准备工作

  • 🔧需要借助虚拟串口软件(Virtual Serial Port Driver),创建2个虚拟串口

具体软件下载和教程:http://www.xue51.com/soft/9349.html

在这里插入图片描述

  • 🔖添加虚拟串口成功后,在设备管理器窗口可以看到虚拟出来的端口号
    在这里插入图片描述

📝串口通讯实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
///共阳数码管 0-9 P 灭
uchar code smdm[]=
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xFF}; //共阳数码管断码
#define sm\_dm P0
sbit Led=P3^7;
sbit Key_set=P3^2;
uchar code hello_world[]="Hello World";
uchar Dat_rxd;
uchar work_mode=0;
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1; /\*12MHz频率\*/
while(--uscnt);
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
/\* 毫秒函数声明 \*/
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void DelayMs(unsigned int ms)
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}

//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*串口初始化函数\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*//
void Com0\_Init(void)
{
EA=1; //开总中断
ES=1; //允许串口中断
TMOD=0x20; //定时器T1,在方式3中断产生波特率
SCON=0x50;
TH1=0xfd; //波特率设置为9600(晶振12M)
TL1=0xfd;
TR1=1; //开定时器T1运行控制位
}

void Com0(void) interrupt 4 using 1
{
if(RI)
{
Led=~Led;
Dat_rxd=SBUF; //串口接收
Dat_rxd=Dat_rxd-0x30;
sm_dm=smdm[Dat_rxd];
RI=0;
}
}
void send\_string(uchar \*p)
{
while(\*p!= '\0')
{
SBUF=\*p;
p++;
while(TI==0);
TI=0;
}
}

void main(void)
{
Com0\_Init();//串口初始化
while(1)
{
if(~Key_set)
{
DelayMs(3);//按键消抖
if(~Key_set)
{
work_mode=1;
while(~Key_set);
}
}
switch(work_mode)
{
case 0:
break;
case 1:
Led=~Led;
send\_string(hello_world);
work_mode=0;
break;
}
}
}


Proteus8.9版本界面设置

  • 主界面设置

在这里插入图片描述

详细添加步骤

  • 添加所需元件:AT89C52COMPIM
    在这里插入图片描述
  • 🔧添加虚拟串口监视器
    在这里插入图片描述

如果在仿真过程中不小心关闭掉了,可以在,菜单栏上的调试,下面重新打开来。

在这里插入图片描述

⚡仿真前,Proteus对串口进行设置。

鼠标左键双击下面的compim元件
在这里插入图片描述

  • 🔰具体参数设置。(波特率:9600和串口号:COM8
    在这里插入图片描述
  • 🛠两个Virtual Terminal串口监视器 的Baud Rate都设置为9600
    在这里插入图片描述
  • 串口调试工具设置

注意串口波特率保持一致,串口号设置为COM7,。
在这里插入图片描述

📚程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1e3jUTrEBGr2Nk1XreCDPow 
提取码:4ptd