80c51day08串口中断

串口中断

先看一下通信
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同步就是你准备好了我就发数据,没准备好我等你,异步就是不管你有没有准备好,我都直接把数据发过去

在这里插入图片描述
就是每次数据之间任意间隙,然后每次传输的位与位间隔要一样的意思
在这里插入图片描述
7位“有效“数据,校验为的话,比如前面7个有效位的1的个数是奇数个还是偶数个什么的,就是用于验证正确性的。
在这里插入图片描述
外同步,比如说iic通信
自同步还没遇到
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不太懂,没试过加倍会怎么样
在这里插入图片描述
重点是对这个寄存器的控制,后面两个是标志,之前说过了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

8位自动调整指的是高八位存起始值,低8位为数,移除后自动将高8位作为起始值

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
uchar num;//数码管显示的值

//共阴数码管段选表0-9
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};

/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
//void delay(uint z)
//{
//	uint x,y;
//	for(x = z; x > 0; x--)
//		for(y = 114; y > 0 ; y--); 		
//} 

/*====================================
函数	:display(uchar i)
参数	:i 显示数值,取值范围0-255
返回值	:无
描述	:三位共阴数码管动态显示
====================================*/
void display(uchar i)
{
	static uchar wei; 		
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = SMGwei[wei];
	WE = 0;//锁存位选数据
	switch(wei)
	{
		case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
		case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;	
		case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;		
	}
	wei++;
	if(wei == 3)
		wei = 0;
}
//定时器0初始化
void timer0Init()
{
	EA = 1;	//打开总中断
	ET0 = 1;//打开定时器0中断
	TR0 = 1;	 //启动定时器0
	REN = 1;//允许串口接收
	TMOD |= 0X01; //定时器工作模式1,16位定时模式
	TH0 = 0xED;
	TL0 = 0xFF; //定时5ms
}
//串口初始化
void UARTInit()
{
	EA = 1;	//打开总中断
	ES = 1; //打开串口中断
	SM0 = 0;	SM1 = 1;//串口工作方式1,8位UART波特率可变
	REN = 1;//串口允许接收
	TR1 = 1;//启动定时器1
	TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
	TH1 = 0xfd;
	TL1 = 0xfd;//设置比特率9600
}
void main()//main函数自身会循环
{	
	timer0Init();//定时器0初始化
	UARTInit();//串口初始化
	while(1);	
} 

//定时器0中断函数
void timer0() interrupt 1
{
	TH0 = 0xED;
	TL0 = 0xFF; //定时5ms
	display(num); //数码管显示函数	
}
//串口中断函数
void UART() interrupt 4
{
	uchar temp;
	if(RI)//判断接收是否完成
	{
		num = SBUF;//读SBUF,读出串口接收到的数据
		RI = 0;//软件清零接收标志位	
		temp = num;//
		SBUF = ++temp;//写SBUF,把要发送的数据送给发送缓存器
	}
	if(TI)//判断是否发送完成
		TI = 0;//清零发送完成标志位	
} 

将读取得数据显示在数码管上

#include <reg52.h>
#include <stdio.h>

#define uint unsigned int
#define uchar unsigned char

//毫秒级延时函数定义
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 

//串口初始化
void UARTInit()
{
	SM0 = 0;	SM1 = 1;//串口工作方式1,8位UART波特率可变
	TR1 = 1;//启动定时器1
	TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
	TH1 = 0xfd;
	TL1 = 0xfd;//设置比特率9600
}

void main()
{
	UARTInit(); //串口初始化
	while(1)
	{
		TI = 1;
		puts("大家好!欢迎学习单片机");
		while(!TI);//直到数据发完才将TI置零
		TI = 0;
		delay(1000);
	}	
}
/*************************************
备注:
使用printf()puts()前都应软件置位TI = 1;
printf()puts()  使用putchar函数发送字节

void putchar(uchar sbyte )
{
    while(!TI);   //等待发送完

    SBUF=sbyte;

}

所以第一次调用putchar前没TI=1 永远等待
*************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值