单片机与PC机串口通信实验,SBUF 2024-03-04 16:40:00 0 0 描述 这是我们的实验要求: 效果1 : 单片机发送数据给PC机,PC机利用串口调试助手将数据显示出来。(40分) 效果2 : PC机发送数据给单片机,单片机将收到的数据返回给PC机,并通过串口调试助手显示出来。(50分) 01电路图 这个图的最小系统的电路是有问题的。【就是单片机左边的电路,参考时要慎重】 虚拟串口: 然后是单片机的串口设置 我们把虚拟串口com2给了MCU,那么我们把com3给PC端 02写代码前的一些设置 1.晶振设置为11.0592MHz 2.我们的波特率为9600SCON = 0X50; //SM0=0,SM1 =1【方式一】,REN =1【允许串口接收】 PCON = 0X80; //控制波特率的倍速提高一倍:SMOD = 1 TMOD |= 0X20; //使用的是定时器T1 TH1 = 0XFA; //波特率为9600 TL1 = 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 #define u8 unsigned char#define u16 unsigned int u8 data_r;void init(){ SCON = 0X50; PCON = 0X80; TMOD |= 0X20; TH1 = 0XFA; TL1 = 0XFA; TR1 = 1; IE = 0X90;}void putchar(u8 n){ SBUF = n; while(TI == 0); TI = 0;}void main(){ init(); putchar('H'); putchar('E'); putchar('L'); putchar('L'); putchar('O'); while(1) { }}void Usart () interrupt 4{ if(RI == 1) { data_r = SBUF ; putchar(data_r); RI = 0; }} 04分块来讲//串口、定时器T1的初始化void init(){ SCON = 0X50; PCON = 0X80; TMOD |= 0X20; TH1 = 0XFA; TL1 = 0XFA; TR1 = 1; IE = 0X90;} 这个初始化就不多说了,我们的“02”部分,要点已经讲完了。void putchar(u8 n){ SBUF = n; while(TI == 0); TI = 0;} 这一部分也没啥好讲的,就是一个发送字符的函数,我们将要发送的字符,放进我们的发送寄存器SBUF中,TI是系统自动产生的中断信号,最后记得T1手动清零哦。TI = 0; 这个是串口中断函数:void Usart () interrupt 4{ if(RI == 1) { data_r = SBUF ; putchar(data_r); //写了这句话,是为了在串口助手看到你发过去的数据 RI = 0; }} 这个SBUF是接收寄存器SBUFdata_r = SBUF ; 将接收到的字符存入我们的data_r中,再通过这句代码,就可以在串口助手上,看到我们发送给单片机的数据putchar(data_r); //写了这句话,是为了在串口助手看到你发过去的数据 最后是我们的主函数void main(){ init(); putchar('H'); putchar('E'); putchar('L'); putchar('L'); putchar('O'); while(1) { }} 这块代码的效果:串口助手显示:HELLO【可以自己去试一试昂】putchar('H'); putchar('E'); putchar('L'); putchar('L'); putchar('O'); 收藏(0)