STC15F2K60S2点灯及串口中断收发

前段时间上测量技术基础,接触了一下单片机,借着实验课的机会买了一块板子玩,试着写了一下LED点灯程序和串口中断收发程序,在此记录一下

板子型号:STC15F2K60S2

使用的软件:KeilC,板子专用的下载器

前话

在写程序的过程中发现板子使用的头文件较为散乱,所以自己花了一点时间,根据资料包里给的例程,自己整合了一点用到的部分(可能不全)

头文件:STC.h

这里面定义了板子的各种参数,例如寄存器地址、LED的口之类的,类似于写单片机程序时用到的reg51.h,只不过用了这个头文件以后就不用再包含reg51.h了

整个文件一共快900行,就不贴程序了,只放一个下载链接。

点我下载:STC.h

延时文件:Led.c

里面定义了一个延时函数,单位ms,输入1000时延时1s左右

#include "STC.h"

//延时函数,单位ms
void delay_ms(unsigned int ms)
{
    unsigned int i;
    ms = ms/2;
    do{
        i=MAIN_Fosc/13000;  //MAIN_Fosc是定义好了的时钟频率
        while(--i);
    }while(--ms);
}

点亮LED灯

这个板子的LED灯使用P44口控制的(至于我咋知道的,看给的例程。。。翻了一遍用户手册,还真没翻到明确说LED接在哪个口上。。。)

直接将Led.c包含进来,由于所有的定义都在STC.h里了,所以直接用P44就可以控制

这里文件我都放在了head文件夹里

#include "head\Led.c"

//主函数
void main()
{
    //让程序一直跑在循环里
    while(1)
    {
        P44 = 0;    //熄灭
        delay_ms(1000); //延时1s
        P44 = 1;    //点亮
        delay_ms(1000);
    }
}

编译构建下载到板子上,板子的LED灯亮1s灭1s

串口中断收发

串口中断收发比点亮LED灯麻烦一些,因为需要计算波特率,这里使用板子的下载器STC-ISP里的波特率计算器来计算。

波特率选择9600,定时器选择定时器1、8位自动重载,下面的代码会自动生成。

使用过程中发现,如果选择的波特率过高,在使用长字符串测试的时候容易产生数据丢失的情况

波特率计算器

点击复制代码复制到你的程序中

通过查询资料获知中断函数监听的口
我们要用的是interrupt 4

中断函数

下面是程序的其余部分

#include "head/Led.c"

//初始化函数,波特率9600,暂时无数据丢失现象
//这里可以替换为你自己生成的初始化函数
void UartInit1(void)        //[email protected]
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x40;       //定时器1时钟为Fosc,即1T
    AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;       //设定定时器1为16位自动重装方式
    TL1 = 0xE0;     //设定定时初值
    TH1 = 0xFE;     //设定定时初值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1
    //下面两行波特率计算机生成的代码里没有,需要手动加上
    ES = 1;         //串行口1允许中断
    EA = 1;         //CPU开放中断
}

//发送函数,一次发送一个字符
void SendByte(unsigned char Char)
{
    TI = 0;
    SBUF = Char;
    while(!TI);     //等待发送完成
    TI = 0;
}

//发送字符串函数,循环调用发送函数发送字符串
void SendMsg(char* String)
{
    while(*String)
    {
        SendByte(*String);
        String++;
    }
}

//主函数
void main()
{
    UartInit1();    //初始化串口
    delay_ms(1000);     //延时一秒保证下载器的串口助手能收到下面的消息
    SendMsg("Init completed");  //发送初始化完成的消息
    P44 = 0;
    while(1);
}

//中断函数
//这里的中断函数无需在主函数中调用
//interrupt x 指明了该函数是x口的中断函数
//当产生中断时系统会自动调用该函数
void UART1_Routine(void) interrupt 4
{
    unsigned char temp,i=0;
    P44 = 1;    //通过点亮LED灯获取中断状态
    if(RI)
    {
        RI = 0;
        temp = SBUF;
        TI = 0;
        SBUF = temp;
    }
    TI = 0;     //这里的TI必须要写在if外面,否则单片机会一直保持中断状态
    P44 = 0;
}

SBUF:存储接收到的或者要发送的数据,xxx=SBUF是获取接收到的数据,SBUF=xxx是将xxx发送

RI:串行口1中断接受标志,(可以理解为)接收完数据后变为1,需要在程序中手动置为0

TI:串行口1发送中断标志,(可以理解为)发送完数据后变为1,需要在程序中手动置为0

串口收发消息

《STC15F2K60S2点灯及串口中断收发》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注