串口通信的原理

波特率v:每秒传输多少位

串口发送数据与定时器的溢出率有关,溢出一次,串口发送一次数据

51单片机通常采用定时器1的8位重装载模式:

UART口的 数据发送和接收 用的是SBUFF寄存器。

发送数据:直接把数据赋值给SBUF,例如 SBUF=0x58;发送完后标志位TI=1

接收数据,将SBUF中的数据赋值给变量,然后就可以了,dat=SBUF,接收完数据后标志位RI=1;数据的接收和发送都会产生相应的中断

工作模式为8位重装载模式,为0101 SM2为0,REN一般为1,然后就是后面的两位为校验位为0即可

SCON=0x50;对于蓝桥杯的单片机还要进行辅助寄存器的设置为 AUXR=0x8e,头文件是reg52.h

关于串口助手的理解,上位机一般指的是电脑,串口助手有发送缓冲区和接收缓冲区,单片机向电脑发送数据是显示在接收缓冲区,而发送缓冲区是电脑向单片机发送的数据,然后就是 怎样检测单片机是向电脑发送的数据,我们是通过程序向单片机写出了数据,实际上发送出来的数据是我们提起写进去的,当连接外部设备的时候就可以直接读取接收缓冲区的数据了

串口中断:

首先要初始化定时器1,用它的溢出值作为波特率的产生,首先是打开使用定时器的寄存器TOMD=0x20(模式8位自动重装载),然后配置初始值TH1和TL1(定时器0是TH0和TL0),配置的波特率可以看相关的数据手册 9600为0xfd,因为是8位自动重装载模式所以高位和低位都是0xfd,然后是打开相应的开关IE寄存器中的 ES=1,总开关EA=1,然后多了两个步骤是配置串口的寄存器SCON=0x50,看它相关的寄存器即可,然后还要配置辅助寄存器为AUXR=0x00,

然后是定义中断服务函数,中断号为4,中断服务函数中是负责数据的接收,就是电脑发送数据进来,然后写到SBUF中,然后我用一个变量去接受它,值得注意的是这里有一个接收的中断位为RI,当RI为1是接收完成,所以这里用手动清零

然后在定义一个发送数据,就是将SBUf中的数据发送到电脑上去,可以在电脑上的接收区看到,值得注意的是跟接收一样也有一个TI的标志位用来判断数据是否发生完成

例如单片机要发送一个数据给电脑就可以调用发送函数,但是刚开始单片机中没有数据,那么便要我自己写一个数据到单片机中,然后调用函数将数据发送出来,然后就是如果电脑发送数据给单片机,单片机就会进入中断接收数据,然后可以对数据进行相关的操作,然后通过发送函数将数据给发送出来

 

#include <STC12C5A60S2.H>


void send(unsigned char dat);
void delay(unsigned char i)
{
	while(i--);
	
}

void INint()
{
	TMOD=0x20;
	TR1=1;
	TH1=0xfd;
	TL1=0xfd;
	SCON=0x50;
	EA=1;
	ES=1;
	AUXR=0x00;


}
unsigned char date;
void service() interrupt 4
{
	if(RI==1)
	{
		date=SBUF;
		RI=0;
		send(date+1);
	}
	
}
void send(unsigned char date)
{
	SBUF=date;
	while(TI==0);
	TI=0;
}


void main()
{
	INint();
	send(0x50);
	while(1)
	{
		
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值