单片机
返回首页

【单片机】Keil+Proteus流水灯(模块化编程)

2021-11-26 来源:eefocus

本篇文章:

主要是Keil的模块化编程,同时实现了一个小实验,通过Keil模块化编程来实现流水灯(设计了三种流水方式)。


进入正文:

一、Proteus仿真图

1)在编写代码的时候,我们首先要做的就是绘图,绘制好模型图之后,才可以编写对应的代码。首先,在Proteus创建一个工程(PS:新手请看:Proteus和Keil分别创建单片机工程)

2)根据自己的要求,绘制指定的图形。此次做的是流水灯,请看图:

在这里插入图片描述

(PS:如果对画图有难度的话,请查看:Proteus画图)

3)绘制好Proteus之后,开始Keil部分。


二、Keil的模块化编程

Keil模块化编程:对代码分开管理,每一部分都是一个完整的代码,需要使用的时候,最后被主函数调用即可。可以方便程序排查错误,方便管理。

1)在keil新建一个工程

新手请看:Proteus和Keil分别创建单片机工程

2)在工程中创建自己的主函数,主函数控制着整个单片机的运行。

附上我的主函数:example.c


#include

#include

#include'hanShu.h'

#define led P1


void main(){

while(1){

yici(); //LED灯依次亮

bianToMiddle();//LED灯从两边向中间逐次点亮

led = 0xff; //关闭LED灯

topToBottom();//由上向下依次点亮LED灯

}

}


3)在工程中创建独自的函数。

流水方式一:led1.c

LED灯的流水方式:一次点亮一个,从上到下,循环两次


#include'hanShu.h'

#include

//LED点亮方式:依次点亮(一次一个,循环三次)

void yici(){

uchar i, j;

  for(j = 0; j < 2; j++){

led = 0xfe;

for(i = 0; i < 7; i++){

led = _cror_(led, 1);

delay();

}

led = 0x7f;

for(i = 0; i < 7; i++){

led = _crol_(led, 1);

delay();

}

}

}


流水方式二:led2.c

LED灯的流水方式:从两边向中间点亮,循环三次


#include'hanShu.h'

uchar toMiddle[] = {0x7e, 0xbd, 0xdb, 0xe7, 0xdb, 0xbd, 0x7e};//LED灯点亮方式

void bianToMiddle(){

uchar i, j;

  for(j = 0; j < 3; j++){//循环三遍

for(i = 0; i < 7; i++){//LED点亮方式:从两边到中间

led = toMiddle[i];

delay();

}

}

}


流水方式三:led3.c

LED灯的流水方式:从上到下依次点亮,循环三次


#include'hanShu.h'

uchar toBottom[] = {0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};

void topToBottom(){

char i, j;

  for(j = 0; j < 3; j++){

led = 0xff;

for(i = 0; i < 8; i++){

led = led << 1;

delay();

}

for(i = 6; i >= 0; i--){

led = toBottom[i];

delay();

}

}

}


延迟函数:delays.c


#include'hanShu.h'

void delay(){

uint a, b;

for(a = 0; a < 200; a++)

for(b = 0; b < 200; b++);

}


4)重点:创建一个.h文件

此文件是模块化编程的关键文件。创建一个hanshu.h文件。

该文件需要包含你自定义函数,例如:在led1.c中定义了一个void topToBottom()函数,我们在hanshu.h中就要有一个对应的void topToBottom()函数。同时,在led1.c的头文件中,需要加上:#include “hanshu.h”(其他文件一样)。这样子的话,当你包含了hanshu.h文件之后,当你调用topToBottom()函数的时候,调用的就是led.c中的topToBottom()函数。


注意: 此时的hanshu.h文件中包含了四个函数,这四个函数分别在自己创建的.c文件中,当调用这几个函数的时候,默认调用的是自己创建的.c文件中的同名函数

现在再看上方的.c文件,是不是都含有一个#include 'hanshu.h'


#ifndef _HANSHU_H_ //防止重复定义

#define _HANSHU_H_

#define uint unsigned int

#define uchar unsigned char

#define led P1

#include


void topToBottom();

void bianToMiddle();

void yici();

void delay();


#endif


5)此时,模块化编程还没有结束,我们在我们的主文件中,也需要包含#include “hanshu.h”(注:自己写的.h文件加双引号,单片机自带的.h文件是<>)

6)我们来看一下我的效果:

在这里插入图片描述

7)编译,生成对应的.hex文件

(不知如何生成.hex文件的,看这边:Keil生成.hex文件)


三、Proteus仿真

流水方式一:

在这里插入图片描述

流水方式二:

在这里插入图片描述

流水方式三:

在这里插入图片描述

现在的话,就到这里了,对模块化编程还有不理解的地方的话,请在评论区,表示自己的困惑。


完结,撒花…

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章