看芯片图观看串口通讯的寄存器
从上往下来观看芯片图进行配置
SCON配置
- SCON如下介绍,其中看到只有含有定时器溢出率的才是可调波特率所以一般就选方式1和方式3.
- 这里选用方式1,计算得出9600=(1/32)x(115200/12x(256-TH1)){这里的9600时=是自己设置的,而SYSclk为115200},计算出TH1为253,换成十六进制为0xFD,这里的TL1为0x00或0xFD都行 .
- 然后这里来进行位的配置,通过一下来看之需要B7为1,B6为0,REN一定要置为1,SCON需要先配置为0x1000 0000即可,这里其他不用管直接清0也行所以就直接配置就行即SCON=0x50即可
SBUF配置
这个就是来进行数据交换的。
PCON配置
多机才会使用现在不用配置
常见错误
- 首先AURX寄存器需要定义地址,并且配置时赋予0x00就行不然会出现一些bug
- 配置的定时1记得打开即TR1=1,SCON配置一般就是0x50
- 记得两个寄存器,TI是发送数据时为0,结束为1需要清0。RI是接受过程为0,结束为1记得清0。
- 发送字符串关于指针的理解就是,指针指向字符串时就是代表该字符串的第一个字符的首地址,每次加一地址移动一位,发送时需要用*取内容,最后判断一下为\0就是退出发送即可。
#include<reg52.h>
#include<intrins.h>
sfr AURX=0x8e;
unsigned char str[]="Welcome to my world\r\n";
unsigned char buf;
void Dis_74HC53(unsigned char i);
//=================================串口通信========
void Init_Usart(void)
{
TMOD|=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;//寄存器配置错误,串口是选择方式一波特率可变
AURX=0x00;
ES=1;
EA=1;
}
void Uasrt_Rountine() interrupt 4
{
if(RI==1)
{
buf=SBUF;
Dis_74HC53(4);
P0=buf;
RI=0;
}
}
//====================================================
void send_buf(unsigned char send)
{
SBUF=send;
while(TI==0);//传送数据中TI为0,传送完毕此循环退出
TI=0;//该寄存器必须手动清0
}
void Send_Information(unsigned char * sendbuf)
{
while(*sendbuf!='\0')
{
send_buf(*sendbuf);
sendbuf++;
}
}
void Delay1000us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Init_Bsp()
{
Dis_74HC53(5);
P0=0x00;
Dis_74HC53(4);
P0=0xff;
}
void main(void)
{
Init_Usart();
Init_Bsp();
Send_Information(str);
while(1);
}
void Dis_74HC53(unsigned char i)
{
switch(i)
{
case 4: P2=(P2&0x1f)|0x80;break;
case 6: P2=(P2&0x1f)|0xc0;break;
case 7: P2=(P2&0x1f)|0xe0;break;
case 5: P2=(P2&0x1f)|0xa0;break;
}
}