1.0 USART实现单个数据收发

串口启动之前需要对串口进行初始化,主要是设置产生波特率的定时器1,使用串口的工作方式还是中断的工作方式具体的配置步骤如下所示。

注:

1: 确定TMOD (定时器模式寄存器) 确定定时器的工作模式

2:计算定时器的初始值 TH1 或者TL1的初始值(这里是定时器的初始值计算涉及到波特率)

3:启动定时器TR

4: 确定串型口控制SCON(串口控制寄存器,用于对串口进行控制)

5:串行口在中断的工作方式时需要进行中断的设置,(IE 或者是IP寄存器)

【串口实现一个字节的数据收发】

51 中寄存器的定义(是否可以位寻址)

可以位寻址:数据的相关引脚系统总有定义

参考数据手册

SCON 串口控制寄存器----工作方式我们选中的工作模式为模式 1 ,REN允许单片机接收控制位这个位置为 1。


【串口方式1收发数据ASCII码值对应表】

注:文本模式下,存储的是ASCII的值,文本模式下发送过去的数据显示的是ASCII对应的值,也就是在文本模式下存储的是ASCII的值。

注:HEX---16进制模式下收到的才是发送过去的数据,也就是发送1 发送过去的就是01...


USART 单个数据收发程序

 【串口向电脑发送数据】

 

TI 的意思就是发送中断的意思:表示发送完了,TI 标志为设置为1,然后申请中断,处理事情,并且需要手动软件复位

RI 的意思表示的是接收中断标志位。表示数据接收完毕可以接收, RI = 1, 接收完毕后需要软件手动清 0

#include <REGX52.H>
#include <intrins.h>
#define uint  unsigned int 
#define uchar unsigned char 
#define beep P2_3
#define dula P2_6
#define wela P2_7

uchar temp;
uint num,num1,dis,bm;
uchar code table[]={
								0x3f,0x06,0x5b,0x4f,
								0x66,0x6d,0x7d,0x07,
								0x7f,0x6f,0x77,0x7c,
								0x39,0x5e,0x79,0x71};

void DelayMs(uint c);
void Display(uint shu);
void Init();

								
void main ()
{
	Init();

	while(1)
	{
		if(RI==1)
		{
			RI=0;
			temp=SBUF;
		}
		if(temp==2)
		{
			beep=0;
		}
		if(temp==3)
		{
			beep=1;
		}
		if(temp==4)
		{
			/*进入之后temp的值赋值为0*/
			temp=0;
			SBUF=0xaa;
		}
		Display(temp);
	}
}

void Init()
{
	TMOD=0x21;//配置定时器0是工作模式1,定时器1是工作模式2
	TH0=(65536-46296)/256;
	TL0=(65536-46296)%256;//装初值
	TH1=0xfd;//bps为9600
	TL1=0xfd;//装初值
	TR1=1;//启动定时器1
	SCON=0x50;//01010000
}

void Int0() interrupt 0
{
	beep=~beep;
}

void Time0() interrupt 1
{
	TH0=(65536-46296)/256;
	TL0=(65536-46296)%256;//装初值
	num++;
}

void Time1() interrupt 3
{
	TH1=(65536-45296)/256;
	TL1=(65536-45296)%256;//装初值
	num1++;
}



void DelayMs(uint c)
{
	uint a,b;
	for(a=c;a>0;a--)
		for(b=115;b>0;b--);
}
void Display(uint shu)
{
			wela=1;
			P0=0xfe;//11111110 打开第一个数码管的位选11000000
			wela=0;P0=0;
			dula=1;
			P0=table[shu/100];//显示0
			dula=0;
			DelayMs(2);	
	
			wela=1;
			P0=0xfd;//11111101 打开第2个数码管的位选11000000
			wela=0;P0=0;
			dula=1;
			P0=table[shu/10%10];//显示0
			dula=0;
			DelayMs(2);
	
			wela=1;
			P0=0xfb;//11111011 打开第3个数码管的位选11000000
			wela=0;P0=0;
			dula=1;
			P0=table[shu%10];//显示0
			dula=0;
			DelayMs(2);
}

2.0 keil工具实用小技巧

自定义注释


...

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部