<>串口练习
内容来自B站小蜜蜂老师
串口通信概述
波特率的计算
串口数据的接收与发送
串口寄存器
practise one
#include "reg52.h" /********************************************
Date:2022-1-13 Author:小殷同学 Learn From:B 站小蜜蜂老师
*********************************************/ sfr AUXR = 0x8e; //串口辅助寄存器
unsigned char dat; //接收数据变量
//--------------------------74HC138初始化--------------------------- void
Init_74HC138(unsigned char n) { switch(n) { case 4: P2 = P2 | 0x1f; P2 = 0x80;
break; case 5: P2 = P2 | 0x1f; P2 = 0xa0; break; case 6: P2 = P2 | 0x1f; P2 =
0xc0; break; case 7: P2 = P2 | 0x1f; P2 = 0xe0; break; } }
//--------------------------------------------------------------------
//-----------------------------系统初始化----------------------------- void
InitSystem(void) { Init_74HC138(5); //Y5选通 P0 = 0x00; //关闭继电器和蜂鸣器 Init_74HC138(4
); //Y4 P0 = 0xff; //关闭LED }
//----------------------------------------------------------------------
//---------------------------------串口初始化------------------------- void Init_Uart
(void) { TMOD = 0x20; //定时器1的方式2 自动重载8位 最大值256 TH1 = 0xfd; //9600波特率 TL1 = 0xfd;
TR1= 1; //启动定时器 AUXR = 0x00; SCON = 0x50; //8位接收 ES = 1; //串口中断使能 EA = 1;
//中断总开关 }
//---------------------------------------------------------------------
//-----------------------------串口发送函数----------------------------- void SendByte
(unsigned char dat) { SBUF = dat; while(TI == 0); //等待发送完成 TI = 0; } void main(
void) { InitSystem(); Init_Uart(); SendByte(0xa5); SendByte(0x5a); while(1) { }
} //-----------------------------------串口中断服务函数--------------------- void
ServerUart() interrupt 4 { if(RI == 1) //接收完成 { RI = 0; dat = SBUF; SendByte(dat
+1); } }
这里由于我们命令和亮点的0和1正好相反 所以将我们的命令先进行取反与亮点的指令保持一致,高四位保持不变只改变低四位
#include "reg52.h" /********************************************
Date:2022-1-13 Author:小殷同学 Learn From:B 站小蜜蜂老师
*********************************************/ sfr AUXR = 0x8e; //串口辅助寄存器
unsigned char command = 0x00; //接收数据变量
//--------------------------74HC138初始化--------------------------- void
Init_74HC138(unsigned char n) { switch(n) { case 4: P2 = P2 | 0x1f; P2 = 0x80;
break; case 5: P2 = P2 | 0x1f; P2 = 0xa0; break; case 6: P2 = P2 | 0x1f; P2 =
0xc0; break; case 7: P2 = P2 | 0x1f; P2 = 0xe0; break; } }
//--------------------------------------------------------------------
//-----------------------------系统初始化----------------------------- void
InitSystem(void) { Init_74HC138(5); //Y5选通 P0 = 0x00; //关闭继电器和蜂鸣器 Init_74HC138(4
); //Y4 P0 = 0xff; //关闭LED }
//----------------------------------------------------------------------
//---------------------------------串口初始化------------------------- void Init_Uart
(void) { TMOD = 0x20; //定时器1的方式2 自动重载8位 最大值256 TH1 = 0xfd; //9600波特率 TL1 = 0xfd;
TR1= 1; //启动定时器 AUXR = 0x00; SCON = 0x50; //8位接收 ES = 1; //串口中断使能 EA = 1;
//中断总开关 }
//---------------------------------------------------------------------
//-----------------------------串口发送函数----------------------------- //发送一个字节 void
SendByte(unsigned char dat) { SBUF = dat; while(TI == 0); //等待发送完成 TI = 0;
//清除标志位 } //发送一个字符串 void SendString(unsigned char *str) { //字符串以'\0'为结束标志 while(
*str != '\0') { SendByte(*str++); } }
//-----------------------------------------------------------------------
//---------------------------------接收命令处理--------------------------- void
Command_Tackle(void) { if(command != 0x00) { switch(command & 0xf0) { case 0xa0:
P0= (P0 | 0x0f) & (~command | 0xf0); command = 0x00; break; case 0xb0: P0 = (P0
| 0xf0) & ((~command << 4) | 0x0f); command = 0x00; break; case 0xc0: SendString
("xiao yin students\r\n"); command = 0x00; break; } } } void main(void) {
InitSystem(); Init_Uart(); while(1) { Init_74HC138(4); Command_Tackle(); } }
//-----------------------------------串口中断服务函数--------------------- void
ServerUart() interrupt 4 { if(RI == 1) //接收完成 { RI = 0; //清除标志位 command = SBUF;
} }
需特别注意的是:不要忘记AUXR寄存器的配置