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_7uchar 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是工作模式2TH0=(65536-46296)/256;TL0=(65536-46296)%256;//装初值TH1=0xfd;//bps为9600TL1=0xfd;//装初值TR1=1;//启动定时器1SCON=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 打开第一个数码管的位选11000000wela=0;P0=0;dula=1;P0=table[shu/100];//显示0dula=0;DelayMs(2); wela=1;P0=0xfd;//11111101 打开第2个数码管的位选11000000wela=0;P0=0;dula=1;P0=table[shu/10%10];//显示0dula=0;DelayMs(2);wela=1;P0=0xfb;//11111011 打开第3个数码管的位选11000000wela=0;P0=0;dula=1;P0=table[shu%10];//显示0dula=0;DelayMs(2);
}
2.0 keil工具实用小技巧
自定义注释
...