【蓝桥杯-单片机】工程代码模板

在学习蓝桥杯的过程中,发现使用工程模板可以使得我们刷题更有效率。掌握一套模板,在比赛过程中,先将框架写上去,也能更快地进入状态。

在这里分享我使用的模板供大家参考使用。

头文件


#include "stc15f2k60s2.h"
#include "intrins.h"

stc15f2k60s2.h

之所以使用 15 这个文件,是因为它里面定义了普通 51 内没有的寄存器。比如:AUXRT2HT2L等我们可能会用到的。其次,它也将 GPIO 重新定义,使用更简单的方式。例如:可以使用 P00 代替 P0^0 ,方便我们的使用。更详细的可以自行查看该头文件。

如何使用该头文件

如果使用这个头文件 keil 编译报错提示找不到该文件,按照下面步骤添加。

打开 stc 下载器,按照提示将文件添加到正确位置

请添加图片描述

找到 keil 安装位置,进入 C51 目录。 可以看到如下的文件,进入 INC(include) 目录。找到 STC ,进入目录,将stc15f2k60s2.h移动到 INC 目录下。

请添加图片描述

请添加图片描述

intrins.h

这个头文件包含了 NOP 指令,延时函数会用到。

宏定义和全局变量


#define uchar unsigned char
#define uint unsigned int

enum
{
	clc = 0x1f, led = 0x80, rmb = 0xa0, com = 0xc0, seg = 0xe0
};
uchar SEG[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xff};  // 数码管段码表
uchar SEL[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; 	// 数码管位选
uchar BUF[] = {0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0};		// 数码管缓冲区

这个枚举变量在我上一篇文章里说过,这里就不说了。

下面三个数组是为数码管服务的。单片机比赛中,数码管非常重要,也是必不可少。

段码不进行说明。SEL 是为了方便数码管刷新,BUF 内存放的是所要显示的数字或字母。

函数


void init();
void init_T0();
void seg_scan();

void init()
{
	P2 = ((P2&clc) | rmb);
    P0 = 0x00;	//关闭继电器、蜂鸣器
    
    P2 = ((P2&clc) | led);
    P0 = 0xff;	//关闭 led

    P2 = ((P2&clc) | com);
    P0 = 0xff;	//选择所有数码管

    P2 = ((P2&clc) | seg);
    P0 = 0xff;	//关闭数码管
}

void init_T0(void)
{
    TMOD = 0x00;	// 使用 15 定时器的方式 0
    TH0 = 0xFC;
    TL0 = 0x18;		//定时 1ms
    ET0 = 1;
    TR0 = 1;
    EA = 1;		//打开中断
}  

void seg_scan()
{
    static uchar i = 0;		//数码管扫描引索
	
	P2 = ((P2&clc) | seg);
	P0 = SEG[buf[i]];
	
	P2 = ((P2&clc) | com);
	P0 = slt[i];
	
	P2 &= clc;		//关闭 573 防止干扰
	
	i++;		//引索自增
	if (i >= 8)		//满 8 清零
		i = 0;
}

总体

#include "stc15f2k60s2.h"
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int


void init(void);
void init_T0(void);
void seg_scan(void);

enum
{
	clc = 0x1f, led = 0x80, rmb = 0xa0, com = 0xc0, seg = 0xe0
};
uchar SEG[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xff};  // 数码管段码表
uchar SEL[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; 	// 数码管位选
uchar BUF[] = {0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0};		// 数码管缓冲区

void main()
{
    init();
    init_T0();
    
    while (1)
    {
    }
}

void init()
{
	P2 = ((P2&clc) | rmb);
    P0 = 0x00;	//关闭继电器、蜂鸣器
    
    P2 = ((P2&clc) | led);
    P0 = 0xff;	//关闭 led

    P2 = ((P2&clc) | com);
    P0 = 0xff;	//选择所有数码管

    P2 = ((P2&clc) | seg);
    P0 = 0xff;	//关闭数码管
}

void init_T0(void)
{
    TMOD = 0x00;	// 使用 15 定时器的方式 0
    TH0 = 0xFC;
    TL0 = 0x18;		//定时 1ms
    ET0 = 1;
    TR0 = 1;
    EA = 1;		//打开中断
}  

void seg_scan()
{
    static uchar i = 0;		//数码管扫描引索
	
	P2 = ((P2&clc) | seg);
	P0 = SEG[buf[i]];
	
	P2 = ((P2&clc) | com);
	P0 = slt[i];
	
	P2 &= clc;		//关闭 573 防止干扰
	
	i++;		//引索自增
	if (i >= 8)		//满 8 清零
		i = 0;
}

void interruptTimer0() interrupt 1
{
    seg_scan();
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值