历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2021年11月26日 | 【单片机】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仿真

流水方式一:

在这里插入图片描述

流水方式二:

在这里插入图片描述

流水方式三:

在这里插入图片描述

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


完结,撒花…

推荐阅读

史海拾趣

Gems Sensors & Controls公司的发展小趣事

Gems Sensors & Controls公司始终致力于技术创新和产品研发。数十年来,公司不断推出新型号的液位、流量和压力传感器、微型电磁阀及预装射流系统等产品,以满足客户日益多样化的需求。这些产品凭借其卓越的性能和稳定的质量,在行业内赢得了广泛的赞誉和认可,也推动了整个传感器行业的进步和发展。

Gardner Denver公司的发展小趣事

1955年,Gems Sensors & Controls公司的创始人Edward H. Moore在地下室中开始了他的创新之旅,成功研发出了第一台液位指示器。这一发明不仅为日后的公司奠定了基础,也标志着Moore在传感器技术领域的初步探索。1959年,他获得了该技术的专利,这一成果迅速吸引了业界的关注,为Gems公司的诞生铺平了道路。

Bedford Opto公司的发展小趣事

近年来,电子行业经历了深刻的变革,新兴技术的不断涌现给Bedford Opto公司带来了前所未有的挑战。然而,公司凭借敏锐的市场洞察力和灵活的战略调整,成功应对了这些变革。通过加大研发投入,积极引进新技术,公司不断推出新产品,保持了市场竞争优势。

GTE Microcircuits公司的发展小趣事
学习高性能复合放大器电路的设计需要掌握模拟电路的基础知识,包括放大器的工作原理、电路分析方法、以及元器件的选择和使用等。此外,还需要通过阅读专业书籍、参加培训课程、以及实践项目等方式来不断积累经验和提高技能。
Advanced Technology Corp公司的发展小趣事

随着科技的飞速发展,ATC公司始终保持着对技术创新的热情与追求。公司不断投入研发资源,引进先进设备和技术人才,致力于开发更具创新性和实用性的电子产品。经过多年的努力,ATC公司在多个技术领域取得了重要突破,推出了一系列具有行业影响力的创新产品,赢得了市场的广泛认可。

Helium_Systems__Inc.公司的发展小趣事

在20世纪90年代初,一家名为“海曼电子”(虚构名称,类似HEIMANN发音)的初创公司在德国慕尼黑成立。创始人海曼博士凭借其在半导体材料领域的深厚研究背景,带领团队成功研发出了一种新型高效能传感器芯片。这种芯片在温度测量领域表现出色,迅速获得了市场的认可。随着技术的不断迭代,海曼电子逐渐在传感器市场占据了一席之地,并通过持续的技术创新,将产品线扩展至光电子、汽车电子等多个领域。

问答坊 | AI 解惑

车载传感器的应用与分类

将当今的汽车说成是电子产品毫不过分,而且有人预言今后还会在安全、环保和信息化这三个领域加速实现电子化。这一趋势今后肯定只会加速而不可能停滞。因为汽车厂商在安全、环保和信息化这三个领域里早就提出了加速实现电子化的方针。而其中最值得关 ...…

查看全部问答>

有没有接触过额定频率为166HZ的么?

前段时间接触过一台166HZ,132KW的1W转的电机是风机上用的,用我们CHF100-132G的变频器带动,启动的时候电流特别大,得235A的电流。很容易在启动的时候跳过电流故障,有谁接触过的,可以说明下这类电机相关的特性,最近客户又说开不起来了,暂时有 ...…

查看全部问答>

软硬件完全参与的第一个项目获得成功,送分

      菜鸟出道一年,软硬件完全参与的第一个项目获得成功,特此自勉。       希望论坛内各位高手多多指点。…

查看全部问答>

saa7113h有人用过吗?

我想问下saa7113h 这个设备应该被视为主设备 还是从设备呢 还有就一般有什么办法来区分主设备 和 从设备吗 …

查看全部问答>

ce下的ReadFile()读串口时,是立刻返回,还是等待?

对这个问题比较迷惑,当使用ReadFile(),读串口时,如果没有数据过来,它是立刻返回还是在哪儿等待,如果等待,等多长时间?如果立刻返回,当数据过来时,我如何得到那个数据?…

查看全部问答>

用GSOAP做ARM+uclinux的web service

因为gsoap可以生成C,不知有谁做过类似的移植。 是否可行?对gsoap需要哪些改动吗? 望交流email:xia_1029@tom.com qq:173160851…

查看全部问答>

RC全波整流滤波计算

   最近手头碰到一个利用RC对全波整流滤波的电路,电路看上去很简单,用Pspice仿真很容易出来相应的值,但是考虑用数学方程表述时却不是那么简单了,一般我们见的RC不是理解为积分就是电容的瞬态响应再者用低通理解,可是全试了一遍,几 ...…

查看全部问答>

具有 6 位点校正功能的 16 通道 12 位 PWM LED 驱动器

你想知道大屏幕视频是怎样成功驱动成千上万个小LED的吗?德仪DC/DC转换器应用主管Michael Day为您展示具有 6 位点校正功能的 16 通道 12 位 PWM LED 驱动器,更多信息请访问http://focus.ti.com.cn/cn/docs/prod/folders/print/tlc5946.html…

查看全部问答>

关于IC板游戏开发疑问

本人虽用vs2008 c#基于电脑应用程序开发也有很长时间了,但类似环境下的IC板游戏开发一无所知,目的是想像市面上的IC板类的游戏(如:猜色子点数大小 游戏)自己能开发一套类似的游戏出来运行在IC板上。列举问题如下:1、IC板的硬件是否也有一个类似 ...…

查看全部问答>

FPGA 安装问题

quartus ii 13.1 usb-blaster 安装时 drivers 文件夹中 usb-blaster 与usb-blaster-ii 应该选哪一个啊…

查看全部问答>