51单片机串口通讯示例+Proteus仿真

51单片机串口通讯示例+Proteus仿真


  • 📺Proteus仿真
    在这里插入图片描述
  • 🔧本示例需要借助虚拟串口工具,创建2个虚拟串口,用来模拟收发。
  • 👉🏻关于中文汉字乱码问题,可以使用补丁修复字符编码0Xfd的问题。汉字乱码补丁到华军软件园下载。https://www.onlinedown.net/tag/10375.htm
    在这里插入图片描述
    在这里插入图片描述

📝程序代码

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
#include <reg52.h> //包含头文件
//毫秒级延时函数
void delay(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
//字符发送函数
void putchar(unsigned char data1)
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(TI == 0); //等待发送完成
TI = 0; //发送中断标志请0
}
//字符串发送函数
void putstring(unsigned char \*dat)
{
while(\*dat != '\0') //判断字符串是否发送完毕
{
putchar(\*dat); //发送单个字符
dat++; //字符地址加1,指向先下一个字符
delay(5);
}
}
//主函数
void main(void)
{
unsigned char c = 0;
SCON = 0x50; //串口方式1 ,允许接收
TMOD = 0x20; //T1工作于方式2
PCON = 0x00; //波特率不倍增
TL1 = 0xfd; //波特率设置
TH1 = 0xfd; //
EA = 1; //开总中断
ES = 1; //开串口接收中断
//TI = 0;
TR1 = 1; //定时器开启
delay(200);
putstring("Receiving from 8051单片机...\r\n"); //串口向终端发送字符串,结尾处回车换行
putstring("----------------------\r\n");
delay(50);
while(1)
{

}
}

//
void revdata(void) interrupt 4
{
unsigned char temp;
if(RI == 0) return; //如果没有接收中断标志,返回
ES = 0; //关闭串口中断
RI = 0; //清串行中断标志位
temp = SBUF; //接收缓冲器中的字符
putchar(temp); //将接收的字符发送出去
ES = 1; //开启串口中断
}


📚通讯实验仿真资源和程序代码

1
2
3
链接:https://pan.baidu.com/s/1MePMLe8VP0vDbfNSfYkflQ 
提取码:sp4d


🌼单纯通过Proteus仿真串口打印,不接收数据

  • 🔖仅作为调试输出,来查看串口打印数据。
    在这里插入图片描述
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
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include <stdio.h>

#define FOSC 11059200UL
#define Baudrate 9600UL /\*波特率定义为9600\*/

typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void delay(unsigned int i);
void UartInit(void); //9600bps@11.0592MHz

void main()
{
u8 cnt;
UartInit();
printf("Hello World!\r\n");
while(1)
{
delay(1000);
printf("cnt:%bu\r\n",++cnt);
}

}
void delay(unsigned int i)
{
unsigned int j,k;
for(j=i;j>0;j--)
for(k=110;k>0;k--);
}
void UartInit(void) //9600bps@11.0592MHz
{
// PCON &= 0x7F; //波特率不倍速
EA = 0; //暂时关闭中断
TMOD &= 0x0F; //定时器1模式控制在高4位
TMOD |= 0x20; //定时器1工作在模式2,自动重装模式
SCON = 0x50; //串口工作在模式1:8位数据,可变波特率;

TH1=256-FOSC/(Baudrate\*12\*32); //计算定时器重装值
TL1=256-FOSC/(Baudrate\*12\*32);
ES = 1; //串行中断允许
TR1 = 1; //启动定时器1
ET1 = 0; //禁止定时器中断
REN = 1; //允许接收
EA = 1; //允许中断
TI = 1; //
}
/\*----------------------------
发送串口数据
----------------------------\*/
void SendData(unsigned char dat)
{
SBUF = dat;
while(!TI); //等待前一个数据发送完成
TI = 0;//清除发送标志
}

char putchar(char dat)
{
SendData(dat);
return dat;
}
/\*----------------------------
发送字符串
----------------------------\*/
//void SendString(char\* s)
//{
// while(\*s) //检测字符串结束标志
// {
// SendData(\*s++); //发送当前字符
// }
//}

void uart(void) interrupt 4 //串口发送中断
{
if(RI) //收到数据
{
RI=0; //清中断请求
}
if(TI) //发送完一字节数据
{
TI=0;
}
}

  • 📚仿真资源和程序代码:
1
2
3
链接:https://pan.baidu.com/s/10KA8DKmZkRKI4tUGmNtYjw 
提取码:k003