上次做好了LED灯的闪烁实验,这次要做串口实验了,串口对于调试程序很重要,有时候程序死了,又不知道是死在哪了,我们就可以在怀疑的地方加上一个串口输出,就可以查到程序死在什么地方了。
参考STC8F系列的参考手册,发现单片机具有4个串口,我只做了串口1的模式1,
配置串口主要是选择串口号及模式,给定时器装初值,开中断,不过在喵呜的程序里串口应该是并没有用到中断,但是因为之前的一贯思维,我还是写了中断,这里还是一样,开总中断EA=1;开串口中断ES=1,允许接受REN=1;
在配置串口的寄存器中出现了一个以前没有碰到过的寄存器 辅助寄存器 AUXR,用于选择哪一个定时器产生波特率生么的,开始的时候,我认认真真的在那对着数据手册算,又是系统频率又是什么的,说到系统频率,主板上用的是单片机内部的震荡源,系统的工作频率是在烧录时,在烧录软件上选择的,这里选择的是20M,然后设置串口的初始化有着很简便的方法,在所使用的STC烧录器版本上可以根据选择生成需要的串口初始化函数,不用在自己去算了。
这就是串口1的初始化函数了,然后串口发送和51一样,还是SBUF寄存器的操作,接收的时候也是一样的,但是在这款单片机里具有4个串口,我写接收中的时候就不知道该怎么写了,后来看到了手册上的中断序号,串口1依旧是4,所以还是一样的写,
#include<iap15w4k61s4.h> //这个头文件在keil 4的编译环境里并没有,需要自己添加
unsigned char date=0x00; //
unsigned int flag=0;
void UartInit(void) //115200bps@20.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xD5; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x10; //启动定时器2
}
void main()
{
UartInit();
REN=1; //允许串口接收
EA=1; //开总中断
ES=1; //开接受中断
while(1)
{
if(flag)
{
SBUF=date; //发送
while(TI==0); //等待发送完毕
TI=0;
flag=0;
}
}
}
void UART1_Routine() interrupt 4 //串口1接收中断
{
RI=0;
date=SBUF;
flag=1;
}
程序很简单,收到一个字节,再发回来,但是只要这个基础的对了,对于复杂的,只是繁琐
下一个
PWM电机控制
|