进期用51做课设用需要用到两个串口,故学习了一下51串口2.
使用串口2先检查你的芯片有没有串口2.
(2022年12月1日更正:本文使用的芯片信号为stc15系列。使用其他芯片可参考对应手册)
串口2的由定时器2产生波特率,中断号为8。
以下是关于串口2用的一些寄存器。具体请查看STC15系列单片机指南。
在使用时要注意寄存器是不是可位寻址,如果不可位寻址,需要用”与”“或”操作对寄存器进行进行相应位的置位。操作与串口1操作类似。
(以下代码仅供参考;如有错误,请多指教)
#include <stc15f2k60s2.h>
#define S2RI 0x01 //串口2接收中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
char flag = 0;
unsigned char a[10]={0};
void Uart2_Init(void) //9600bps@22.1184MHz
{
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xC0; //设定定时初值
T2H = 0xFD; //设定定时初值
AUXR |= 0x10; //启动定时器2
EA = 1;
IE2 = 0X01; //打开接收中断
}
void UART2_Send_Byte(unsigned char mydata)
{
IE2 = 0X00;
S2CON&=~S2TI; //TI = 1
S2BUF=mydata;
while((S2CON&S2TI)==0);
S2CON&=~S2TI; //TI = 1//清除发送标志位
IE2 = 0X01;
}
void Uart2_send_string(unsigned char *p) //串口2发送一个字符串
{
while(*p!='\0')
{
UART2_Send_Byte(*p);
p++;
}
}
void UART_2Interrupt(void) interrupt 8
{
unsigned char temp;
char i = 0;
if(S2CON&S2RI) //RI == 0
{
flag = 1;
S2CON&=~S2RI; //RI = 1
temp = S2BUF;
a[i++] = temp;
if(i == 10)
{
i=0;
}
}
}
void main()
{
Uart2_Init();
Uart2_send_string("123\n");
Uart2_send_string("456!");
while(1)
{
if(flag == 1)
{
IE2 &= ~S2RI;
S2BUF = temp;
while(!(S2CON&S2TI));
S2CON&=~S2TI;
IE2 |= S2RI;
flag = 0;
}
}
}