串口中断
先看一下通信
同步就是你准备好了我就发数据,没准备好我等你,异步就是不管你有没有准备好,我都直接把数据发过去
就是每次数据之间任意间隙,然后每次传输的位与位间隔要一样的意思
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 永远等待
*************************************/