蓝桥杯框架-LED蜂鸣器继电器

蓝桥杯框架-LED蜂鸣器继电器

一,新建工程文件

在桌面上新建一个文件夹:用于存放所有工程文件

在文件夹中再建立一个文件夹DEMO_01:这是我们的第一个工程文件

在第一个工程文件中建立以下文件夹:

Driver用于存放底层框架

User用于存放main.c和keil生成的文件

在Driver中添加led.c和led.h文件

打开keil,按下图点击

然后会跳出一个弹窗,在这里选择工程存放的位置,一定要点进User中,取工程名字为DEMO_01

又会跳出一个选择芯片型号的弹窗:按下图选择芯片型号

出现下图的情况点击"是"

二,配置keil

点击"品",建立两个组:这两个组是和桌面上的对应的

选中这个Driver,点击Add Files,找到桌面上的Driver,将led.c添加进来

可以看到keil的文件管理:led.c已经添加进来了,那led.h怎么添加呢?

在扳手中添加,如下图:将led.h文件的上一级文件Driver添加进来即可

接下来添加main.c文件:Ctrl N+Ctrl S,出现以下界面

左上角的Text1是我们Ctrl N是生成的文件,我们将他保存在User下面,并且命名为main.c,如下图操作

其实我们刚才只是将main.c添加到了桌面上,并没有添加到keil中:所有点击"品",按下图操作

上面完成后出现下图就对了(因为led.c没有写东西,而且没有编译,所有led.h没有显现出来)

三,完善框架

在.c文件中右键,导入头文件:keil自动帮我们加入了单片机的头文件,我们将他Ctrl X下来,粘贴到led.h中

如何进入led.h?

在.c文件中右键,按下图按键,就可以进入.h文件;

同理.h文件进入.c也是相同的操作

main.c中

c 复制代码
/*头文件区域*/
#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include <Led.h>//Led底层驱动专用头文件

/*变量声明区域*/
unsigned char Led_Pos;
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//Led显示数据存放数组

/*任务函数区域*/
void Led_Proc()
{
	
}
/* 定时器0中断初始化函数 */
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;    //定时器中断0打开
	EA = 1;     //总中断打开
}
/* 定时器0中断服务函数 */
void Timer0Server() interrupt 1
{  
	if(++Led_Pos== 8) Led_Pos= 0;
	Led_Disp(Led_Pos,ucLed[Led_Pos]);
}

/* Main */
void main()
{
	Timer0Init();
	while (1)
	{
		Led_Proc();
	}
}

led.c中

c 复制代码
#include <Led.h>	//不频繁开关Led :防止电流响声和P0互斥,Seg没事

void Led_Disp(unsigned char addr,enable)
{
	static unsigned char temp = 0x00;			//重复调用时不会赋初值
	static unsigned char temp_old = 0xff;
	if(enable)									//开-与1或  不变-与0或
		temp |= 0x01 << addr;
	else										//关-与0与  不变-与1与
		temp &= ~(0x01 << addr);
	if(temp != temp_old)						//temp改变才进入if
	{
		P0 = ~temp;								//对P0赋值
		P2 = P2 & 0x1f | 0x80;					//开译码器-开锁存器
		P2 &= 0x1f;								//关译码器-关锁存器
		temp_old = temp;						//使二者相等,下次temp改变才进入if
	}
}

led.h中

c 复制代码
#include <STC15F2K60S2.H>

void Led_Disp(unsigned char addr,enable);

框架移植完毕,我们可以随意操作led了:在框架中,Led_Proc函数是空的,加入以下三句话就可以点亮第一,三,四个led

相关推荐
ヾChen2 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
小僧景贤2 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀3 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
青少儿编程课堂3 小时前
用图形化编程做一个“少年探险闯关”小游戏:方向键控制、碰撞检测与多关卡串起完整项目
c++·python·算法·bfs·信息学竞赛
雨田言炎3 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
liulilittle3 小时前
长上下文的成本结构与「甜点区间」——从推理引擎的物理约束看 200K/256K/400K
c++·人工智能·ai·llm·注意力·qkv
十五年专注C++开发3 小时前
100w条数据丝滑滚动!Qt Model/View 架构实战(二)
开发语言·c++·qt
skr爱码士4 小时前
06_Qt 常用数据类型与容器:QString、QList、QVector、QMap 的性能与实现分析
开发语言·c++·qt
奶茶树4 小时前
【C++】13. C++11新特性【上】
c语言·开发语言·c++·git·github
wabs6665 小时前
关于栈【力扣1047. 删除字符串中的所有相邻重复项的思考】
数据结构·c++·算法·leetcode··代码随想录