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工具实用小技巧
自定义注释
...