这是我们的实验要求:
效果1:单片机发送数据给PC机,PC机利用串口调试助手将数据显示出来。(40分)
效果2:PC机发送数据给单片机,单片机将收到的数据返回给PC机,并通过串口调试助手显示出来。(50分)
01电路图
这个图的最小系统的电路是有问题的。【就是单片机左边的电路,参考时要慎重】
虚拟串口:
然后是单片机的串口设置
我们把虚拟串口com2给了MCU,那么我们把com3给PC端
02写代码前的一些设置
1.晶振设置为11.0592MHz
2.我们的波特率为9600
SCON =0X50;//SM0=0,SM1 =1【方式一】,REN =1【允许串口接收】PCON =0X80;//控制波特率的倍速提高一倍:SMOD = 1TMOD |=0X20;//使用的是定时器T1TH1 =0XFA;//波特率为9600TL1 =0XFA; TR1 =1; IE =0X90;// 1001 0000 EA 置为1 ES 置为1//EA 中断总允许位 ES 串行中断允许位
【注意】 定时器T1作为默认的波特率发生器,要记得禁止T1中断。
接下来说说我们的TH1和TL1怎么计算的
TL1 = TH1= 256-(2^SMOD*f_osc)/ 32 * 12 *波特率
f_osc:晶振频率 (单位:MHz) 计算时,记得乘以10^6
例如我们本次实验使用的是提高一倍的波特率的倍速
PCON=0X80; //控制波特率的倍速提高一倍:SMOD = 1
波特率为9600,晶振为11.0592MHz
那么我们的TH1 = 256-(211.059210^6)/(32129600)=250
打开电脑的计算器:将十进制数转换为十六进制数,在DEC那里输入250,我们要获取的就是HEX的值
最后TH1=TL1 = 0XFA;
这里也要设置哦
这个是串口助手的设置
03代码
代码很短小哦
#include< reg51.h >#defineu8 unsigned char#defineu16 unsigned intu8 data_r;voidinit(){ SCON =0X50; PCON =0X80; TMOD |=0X20; TH1 =0XFA; TL1 =0XFA; TR1 =1; IE =0X90; }voidputchar(u8 n){ SBUF = n;while(TI ==0); TI =0; }voidmain(){init();putchar('H');putchar('E');putchar('L');putchar('L');putchar('O');while(1) { } }voidUsart()interrupt 4{if(RI ==1) { data_r = SBUF ;putchar(data_r); RI =0; } }04分块来讲
//串口、定时器T1的初始化voidinit(){SCON=0X50;PCON=0X80;TMOD|= 0X20;TH1=0XFA;TL1=0XFA;TR1=1;IE=0X90;