大二单片机笔记,串口通信代码【郭天祥】【700字】【勿笑】【原创】


工作时,串口通信理解(最新)

请添加图片描述

大二时,串口通信理解

/*cpu,串口助手,单片机,根据程序得知输入X之前,我之前理解的是错误的,根据郭天祥,也许郭天祥是正确的,
SBUF=a,我之前根据郭天祥理解的是首先进入的串口中断是个无意义的无效值,其实不然,那个首先进入的是(以下是根据涛涛讲解所理解),数据缓冲寄存器SBUF
,一个仓库,RI相当于旗子,SBUF先给a,a即为串口助手输入的X,之后a给上位机即电脑,无需理解怎么给电脑的,记住这里不是串口发送中断,具体怎么发送,涛涛解释为
只有上位机与单片机中的SBUF联系,之前的for循环里的table数据是分六次发送,为什么分六次,因为一帧只包括八位数据,而char就是八位,所有计算机中的任何字符
均能从ASCII表中找到编码,而所有的编码值均小于256,一个I即为一个字符,所以要分六次发送,上位机要与单片机联系,相当于两个人交流前要先定好使用哪种交流语言
串行交流语言就是发送字节的波特率,和串行口,根据寄存器调配,于是I get 都给了SBUF,I在仓库里装满时这时旗子被举了起来告诉CPU,仓库满了,你要来处理一下,于是I被放出
它去哪里了,这时串口中断是关闭的,但是串口中断只是控制串口助手输入的X,这六位字符是软件直接赋予SBUF的,所以跟中断没有关系,于是六位给了上位机,使用
助手先收了起来,之前的X给SBUF时,SBUF给a,然后打开中断,a就给了电脑,于是电脑显示I get X */

中断控制X,它不控制I get ,它是在code里的,是内部调制好的,不希望人为改变的

串口助手

在这里插入图片描述

代码部分

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int		   //接收与发送应该是两个控制,接收数据中断写出来了,但是发送中断不受其控制

uchar hint,a,i;																
uchar code table[]="I get ";	   //table[]={'I','','g','e','t',''}	//	{'I','','g','e','t','' };

void diaoyong()
{
	TMOD=0x20;	   //定时器计数器工作方式寄存器,此处设定定时器,但是用不到
	TH1=0xfd;	   //常数寄存器,始终为fd
	TL0=0xfd;	   //经波特率计算得知
	TR1=1;		   //打开定时器
	REN=1;		   //允许串口接受
	SM0=0;		   //串行口工作方式1
	SM1=1;
	EA=1;		   //打开总中断
	ES=1;		   //打开串行口中断
}

void main()
{
	diaoyong();
	while(1)
	{
		if(hint==1)				   //检测接受数据串口中断是否完成
		{
			ES=0;				   //暂时关闭串口中断总开关
			for(i=0;i<6;i++)
			{
				SBUF=table[i];	   //发送接收之分六次发送的table数据
				while(!TI);		   //检测是否发送完毕,若发送完毕则单片机内部硬件使TI置1,即发送中断仅进行这一次
				TI=0;			   //软件使TI置0, 使其允许进入下一次发送串口中断
			}
			SBUF=a;				   //此时接受的a数据经由SBUF发送,此时发送与接收使用的SBUF不同,第一次a应该是空值,不影响
			while(!TI)			   //检测发送是否完成
			TI=0;				   //软件使TI置0, 使其允许进入下一次发送串口中断  
			ES=1;				   //打开串口中断总开关
			hint=0;				   //软件使hint为0,使interrupt正常工作
		}
	}
}																			   

void chuankou() interrupt 4		   //接收数据中断
{	
	RI=0;						   //这个串口中断之前程序未发送数据,所以这个中断程序执行接收SBUF中的数据,此时数据应该为0,因为没发送数据
	a=SBUF;						   //接收数据
	hint=1;						   //检测中断接收完成
}								   
/*cpu,串口助手,单片机,根据程序得知输入X之前,我之前理解的是错误的,根据郭天祥,也许郭天祥是正确的,
SBUF=a,我之前根据郭天祥理解的是首先进入的串口中断是个无意义的无效值,其实不然,那个首先进入的是(以下是根据涛涛讲解所理解),数据缓冲寄存器SBUF
,一个仓库,RI相当于旗子,SBUF先给a,a即为串口助手输入的X,之后a给上位机即电脑,无需理解怎么给电脑的,记住这里不是串口发送中断,具体怎么发送,涛涛解释为
只有上位机与单片机中的SBUF联系,之前的for循环里的table数据是分六次发送,为什么分六次,因为一帧只包括八位数据,而char就是八位,所有计算机中的任何字符
均能从ASCII表中找到编码,而所有的编码值均小于256,一个I即为一个字符,所以要分六次发送,上位机要与单片机联系,相当于两个人交流前要先定好使用哪种交流语言
串行交流语言就是发送字节的波特率,和串行口,根据寄存器调配,于是I get 都给了SBUF,I在仓库里装满时这时旗子被举了起来告诉CPU,仓库满了,你要来处理一下,于是I被放出
它去哪里了,这时串口中断是关闭的,但是串口中断只是控制串口助手输入的X,这六位字符是软件直接赋予SBUF的,所以跟中断没有关系,于是六位给了上位机,使用
助手先收了起来,之前的X给SBUF时,SBUF给a,然后打开中断,a就给了电脑,于是电脑显示I get X */
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值