【Proteus仿真】51单片机串口接收实验
-
📌相关篇《【Proteus仿真】51单片机串口输出实验》
-
🔖Proteus仿真基础实验-
串口单字符接收打印
。 -
🌿Proteus
8.12
平台 -
🌿本实验代码基于
VSM Studio
,采用SDCC编译器。 -
🌿调试串口波特率:
9600
-
🎬仿真实验演示:
🏳🌈配置条件
🔨需要安装虚拟串口工具,并创建2个虚拟端口:
🏳🌈注意事项
- ⚡针对字符串数据接收,需要根据所设定的波特率,计算好位处理时间并在数据响应第一个接收数据时,设定好数据长度和计算好相对应的延时时间。
波特率为9600表示的是串口每秒钟可以传输9600bit,每传输1bit所需时间:
1 s / 9600 b i t = 1000000 ( u s ) / 9600 ( b i t ) = 1000 / 9.6 = 104.1667 u s 1s/9600bit = 1000000(us)/9600(bit) =1000/9.6 =104.1667us 1s/9600bit=1000000(us)/9600(bit)=1000/9.6=104.1667us
那么8bit就是 104.1667 ∗ 8 = 833.3336us 104.1667*8 =833.3336us 104.1667∗8=833.3336us
实际项目中,串口通信时数据格式是:起始位+8位数据+奇偶校验位+停止位 ,一般都没有奇偶校验位,所以是10位
也就是一个字节的时间为 104.1667 ∗ 10 = 1041.667us 104.1667*10 =1041.667us 104.1667∗10=1041.667us
📝实验代码一
- ✨本示例实现的是单字节数据接收,并打印。
/* Main.c file generated by New Project wizard
*
* Created: 周一 5月 22 2023
* Processor: 80C52
* Compiler: SDCC for 8051
*/
#include <8052.h>
//#include <stc89.h>
#include <stdio.h>
#define FOSC 11059200UL //System frequency
#define BAUD 9600 //UART baudrate
typedef unsigned char uchar;
#define LED P2_1
void uart_init()
{
SCON = 0x50;
TMOD = 0x20;
// TH1 = 0xFD;//波特率9600
// TL1 = 0xFD;
TH1 = (unsigned char)(((65536 - (FOSC/32/BAUD) )>>8) - 2) ;
TL1 = (unsigned char)(65536- (FOSC/32/BAUD) - 2) ;
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1;
}
unsigned char serialReceiveByte()
{
while(RI == 0);
RI=0;
return SBUF;
}
void SendData(uchar data1)
{
SBUF = data1;
while (!TI) ;
TI = 0;
}
void SendString(uchar *buffer)
{
unsigned char *p = buffer;
while (*p)
{
SendData(*p);
p++;
}
}
void delayms(unsigned int ms)
{
unsigned int x, y;
for (y = ms; y > 0; y--) {
for (x = 227; x > 0; x--);
}
}
void main(void)
{
unsigned char buf;
uart_init();
SendString("Hello world!\r\n");
while (1)
{
buf = serialReceiveByte();
SendString("recv data: ");
SendData(buf);
SendString("\r\n");
}
}
📚实验一资源
链接: https://pan.baidu.com/s/1ACi5_Q3CqrCfycNKREzsZg
提取码: 6g2u
📑实验二
- ✨本示例实现的是字符串数据接收,并打印。
- 🔖所定义的接收字符串数组长度为8,限定接收字符串对象的长度为8,串口接收中断响应到数据接收完成等待的最小延时时间:1042us * 8
/* Main.c file generated by New Project wizard
*
* Created: 周六 5月 20 2023
* Processor: 80C52
* Compiler: SDCC for 8051
*/
//#include <mcs51reg.h>
#include <8052.h>
//#include <stc89.h>
#include <stdio.h>
#define FOSC 11059200UL //System frequency
#define BAUD 9600 //UART baudrate
typedef unsigned char uchar;
uchar BUF[8] = "";
static uchar cnt = 0;
__bit Rece_flag = 0;
#define LED P2_1
void uart_init()
{
SCON = 0x50;
TMOD = 0x20;
// TH1 = 0xFD;//波特率9600
// TL1 = 0xFD;
TH1 = (unsigned char)(((65536 - (FOSC/32/BAUD) )>>8) - 2) ;
TL1 = (unsigned char)(65536- (FOSC/32/BAUD) - 2) ;
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1;
}
void USART_ISR (void) __interrupt 4 __using 1
{
if(RI){
BUF[cnt] = SBUF;
RI=0;
cnt++;
Rece_flag = 1;//接收标志位
}
}
void SendData(uchar data1)
{
SBUF = data1;
while (!TI) ;
TI = 0;
}
void SendString(uchar *buffer)
{
unsigned char *p = buffer;
while (*p)
{
SendData(*p);
p++;
}
}
void delayms(unsigned int ms)
{
unsigned int x, y;
for (y = ms; y > 0; y--) {
for (x = 227; x > 0; x--);
}
}
void main(void)
{
uchar i = 0;
uart_init();
SendString("Hello world!\r\n");
while (1)
{
if(Rece_flag)
{
delayms(10); //这个延时时间是,等待字符串接收完成1BYTES=1041.667us
SendString("recv data: ");
SendString(BUF);
SendString("\r\n");
for(i=0;i<8;i++)
{
BUF[i] = 0; //清空字符串
}
cnt = 0;
Rece_flag = 0;
}
}
}
📚示例二仿真资源
链接: https://pan.baidu.com/s/1s76SyCfhh_eFrz2yepjxFQ
提取码: fk1u