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

【征服单片机】实战篇:Keil+Proteus流水灯(模块化编程)

大家好!我是皮皮猫。
每文一言: 如果没有明天,一切似乎简单了不少,人所有的痛苦、纠结,就是因为还有无数个明天。


本篇文章:

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

进入正文:
一、Proteus仿真图

1)在编写代码的时候,我们首先要做的就是绘图,绘制好模型图之后,才可以编写对应的代码。首先,在Proteus创建一个工程(PS:新手请看:Proteus和Keil分别创建单片机工程
2)根据自己的要求,绘制指定的图形。此次做的是流水灯,请看图:
在这里插入图片描述
(PS:如果对画图有难度的话,请查看:Proteus画图
3)绘制好Proteus之后,开始Keil部分。

二、Keil的模块化编程

Keil模块化编程:对代码分开管理,每一部分都是一个完整的代码,需要使用的时候,最后被主函数调用即可。可以方便程序排查错误,方便管理。
1)在keil新建一个工程
新手请看:Proteus和Keil分别创建单片机工程
2)在工程中创建自己的主函数,主函数控制着整个单片机的运行。
附上我的主函数:example.c

#include<reg51.h>
#include<intrins.h>
#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<intrins.h>
//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<reg51.h>

void topToBottom();
void bianToMiddle();
void yici();
void delay();

#endif

5)此时,模块化编程还没有结束,我们在我们的主文件中,也需要包含#include “hanshu.h”(注:自己写的.h文件加双引号,单片机自带的.h文件是<>)
6)我们来看一下我的效果:
在这里插入图片描述
7)编译,生成对应的.hex文件
(不知如何生成.hex文件的,看这边:Keil生成.hex文件

三、Proteus仿真

流水方式一:
在这里插入图片描述
流水方式二:
在这里插入图片描述
流水方式三:
在这里插入图片描述


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

完结,撒花…

更多Keil+Proteus项目,持续更新中…

作者:皮皮猫


  • 35
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值