“从单片机初学者迈向单片机工程师”LED篇第三章---- 模块化编程初识四
从单片机初学者迈向单片机工程师(对初学者非常有用)

从单片机初学者迈向单片机工程师 目录: 一、LED 1 二、LED 主题讨论周第二章----学会释放 CPU................................................. 2 三、LED 识..............................................8 四、LED 灯................................................25 五、LED 28 六、KEY 主题讨论第一章按键程序编写的基础..................................... 37 主题讨论周第五章----多任务环境下的数码管编程设计................. 主题讨论周第四章----渐明渐暗的 主题讨论周第三章----模块化编程初 主题讨论周第一章----写在前面....................................................摸索出来了自己的一条路子。当然这 个过程必然是艰辛的,而他学会 了之后也不会在网络上轻易分享自己的学习成果。如此恶性循环下去,也 就不难理解为什幺初级的学习资 料满天飞,而深入一点的学习资料却很少的原因了。相较于其他领域,单 片机技术的封锁更加容易。尽管 已经问世了很多年了,有价值的资料还是相当的欠缺,大部分的资料都是 止于入门阶段或者是简单的演示 实验。但是在实际工程应用中却是另外一回事。有能力的高手无暇或者是 不愿公开自己的学习经验。 很多时候,我也很困惑,看到国外爱好者毫不保留的在网络上发布自己的 作品,我忽然感觉到一丝丝的 悲哀。也许,我们真的该转变一下思路了,帮助别人,其实也是在帮助自 己。啰啰嗦嗦的说了这幺多,相 信大家能够明白说的是什幺意思。在接下来的一段日子里,我将会结合电 子工程师之家举办的主题周活动 写一点自己的想法。尽可能从实用的角度去讲述。希望能够帮助更多的初
从单片机初学者迈向单片机工程师(一份正真的让你成为工程师的贴子)

从这一章开始,我们开始迈入单片机的世界。
在我们开始这一章具体的学习之前,有必要给大家先说明一下。
在以后的系列文章中,我们将以51内核的单片机为载体,C语言为编程语言,开发环境为KEIL uv3。
至于为什么选用C语言开发,好处不言而喻,开发速度快,效率高,代码可复用率高,结构清晰,尤其是在大型的程序中,而且随着编译器的不断升级,其编译后的代码大小与汇编语言的差距越来越小。
而关于C语言和汇编之争,就像那个啥,每隔一段时间总会有人挑起这个话题,如果你感兴趣,可以到网上搜索相关的帖子自行阅读。
不是说汇编不重要,在很多对时序要求非常高的场合,需要利用汇编语言和C语言混合编程才能够满足系统的需求。
在我们学习掌握C语言的同时,也还需要利用闲余的时间去学习了解汇编语言。
1.从点亮LED(发光二极管)开始在市面上众多的单片机学习资料中,最基础的实验无疑于点亮LED了,即控制单片机的I/O的电平的变化。
如同如下实例代码一般void main(void){LedInit() ;While(1){LED = ON ;DelayMs(500) ;LED = OFF ;DelayMs(500) ;}}程序很简单,从它的结构可以看出,LED先点亮500MS,然后熄灭500MS,如此循环下去,形成的效果就是LED以1HZ的频率进行闪烁。
下面让我们分析上面的程序有没有什么问题。
看来看出,好像很正常的啊,能有什么问题呢?这个时候我们应该换一个思路去想了。
试想,整个程序除了控制LED = ON ;LED = OFF;这两条语句外,其余的时间,全消耗在了DelayMs(500)这两个函数上。
而在实际应用系统中是没有哪个系统只闪烁一只LED就其它什么事情都不做了的。
因此,在这里我们要想办法,把CPU解放出来,让它不要白白浪费500MS的延时等待时间。
宁可让它一遍又一遍的扫描看有哪些任务需要执行,也不要让它停留在某个地方空转消耗CPU时间。
单片机入门学习图文教程

单片机入门学习图文教程想要学习单片机,建立一个单片机学习环境至关重要。
为此既可以用传统的方式,也可以借助于网络,网络上有很多有用的资源,利用这些资源,爱好者可以廉价和快速地建立自己的软、硬件学习环境。
网上学单片机的入门篇将带领大家走遍“五湖四海”,搜寻有用的资源。
一、软件实验环境1、编译、连接、仿真软件目前最流行的用于51系列单片机开发的软件是Keil,该软件可以直接从下载,如果你觉得网站上满眼的外文看得不习惯,那么以“Keil”为关键字,使用搜索引擎搜索,可以找到很多国内的下载地址,这里推荐一个下载地址:/KeilC51/keil_website.asp ,这是由获得Keil软件正式授权的周立功单片机网站提供的,当前能够下载的最高版本为7.01,图1是该网站图。
这两处下载得到的Keil软件均为EV AL版,这种版本的软件可以与正式版本一样使用,但是最终生成的目标文件不能超过2K的代码量,除可用于学习外,也可用于开发A T89C2051、A T89C1051之类内部程序存储器容量不超过2K的芯片。
2、其他软件Keil软件本身带有一个功能强大的软件仿真系统,可直接在该软件系统中使用软件调试等方法学习指令、程序设计等。
但这是一个英文软件,初学者可能会觉得不易使用,一个可选择的方法是采用国内仿真机生产商的仿真软件。
仿真机生产商为其仿真机提供调试软件,目前这些软件一般是全中文化的版本,并支持Keil,有一些公司的网站上提供了软件的使用说明书,因而使用上不会有太大的困难。
这些软件除可与其生产的仿真机配套外,通常也提供软件仿真功能,可以在没有仿真机的情况下进行程序的调试,这样,爱好者可以使用这类软件来学习。
万利公司出品的MedWin即是这样一种软件,该软件的下载地址是:/homepage/如果你使用Keil软件,那么很快会发现其自带的编缉器对汉字的支持不好,写汉字注释时,有半个汉字的现象,使用很不方便,因此建议用其它编缉器来编写程序。
单片机入门教程

单片机入门教程单片机,又称微控制器(Microcontroller),是一种集成在电路上的微型计算机,具有体积小、价格低、功能强大、使用方便等优点,广泛应用于智能家居、工业控制、消费电子、汽车电子等领域。
通过学习单片机,我们可以了解如何将计算机技术与实际应用相结合,实现各种控制系统的设计。
单片机主要由中央处理器(CPU)、存储器(RAM/ROM)、输入/输出接口(I/O口)、定时/计数器、中断系统等组成。
中央处理器(CPU):控制器的核心部件,负责指令执行、数据处理等。
存储器(RAM/ROM):存储数据和程序代码。
RAM用于实时存储数据,ROM用于存储固定程序。
输入/输出接口(I/O口):用于连接外部设备和CPU之间的数据传输。
定时/计数器:用于实现定时操作和计数功能。
中断系统:用于处理外部事件,实现实时控制。
单片机编程语言主要有汇编语言和C语言。
汇编语言是低级语言,与硬件密切相关,适用于对性能要求较高的场合;C语言是高级语言,具有可读性强、易于维护等优点,适用于初学者。
掌握基本概念:了解单片机的组成、工作原理、编程语言等基本概念。
学习电路基础:了解电路的基本原理和元件,为后续实践打下基础。
实践操作:通过实验和项目实践,加深对理论知识的理解和应用。
阅读相关书籍:参考相关书籍和资料,拓宽知识面和技能水平。
参加培训课程:参加专业培训课程,接受系统化的教学和实践指导。
交流与讨论:与其他学习者交流和讨论,分享经验和技巧,提高学习效果。
单片机是电子技术领域中重要的组成部分,学习单片机需要掌握基本概念、电路基础、编程语言等方面的知识。
通过实践操作和项目经验积累,可以更好地理解和应用单片机技术。
阅读相关书籍、参加培训课程和与其他学习者交流也是提高学习效果的重要途径。
Access是微软公司推出的一款关系型数据库管理系统,它作为Office套件的一部分,与Word,Excel和PowerPoint等应用一起,构成了微软公司强大的办公软件套件。
单片机教程

单片机教程单片机是一种集成电路,可以完成各种功能的微控制器。
它广泛应用于电子产品和自动化领域。
单片机教程是指向初学者介绍单片机的工作原理、编程方法和应用的教学材料。
下面是一个简短的单片机教程:单片机的基本原理是通过外部输入信号和内部程序对各种设备进行控制。
单片机的核心是控制器,它包括中央处理器、存储器和输入/输出设备。
通过编写程序,可以控制单片机的各个引脚,实现不同的功能。
编程是学习单片机的关键。
单片机通常使用汇编语言或高级语言,如C语言进行编程。
学习编程前,需要了解单片机的基本指令集和寄存器操作。
编写程序时,可以使用编程软件将代码烧录到单片机的闪存中。
单片机的应用非常广泛。
它可以用于控制各种电子设备,如数字显示器、LED灯、电机等。
通过输入、输出和各种传感器的结合,可以实现更复杂的功能,如温度控制、电子计时器等。
学习单片机需要一定的电子基础知识。
在学习之前,需要了解数字电路、模拟电路和微处理器的基本原理。
同时,还需要掌握基本的电路设计和焊接技巧。
为了更好地学习单片机,建议使用一些开发板和开发工具。
开发板是一种预先设计好的电路板,包含了单片机、输入/输出设备和其他必要的电子元件。
开发工具是用于编程和调试单片机的软件和硬件设备。
总之,单片机是一种非常有用的微控制器,学习单片机能够帮助我们理解电子产品的工作原理,并能编写程序实现各种功能。
通过上述单片机教程,初学者可以了解单片机的基本原理、编程方法和应用,并为以后的学习奠定基础。
希望这篇教程对大家有所帮助!。
三步教你从零开始成为单片机达人(附单片机实验经典详解)

三步教你从零开始成为单片机达人(附单片机实验经典详解)无论是作为一名业余的电子爱好者还是一名电子行业的相关从业人员,掌握单片机技术无疑可以使您如虎添翼,为您的电子小制作或者开发设计电子产品时打开方便的大门!学习单片机技术有一定的难度,不花费一番努力是很难学会的,但是只要不断努力就一定能成功,套用一句广告歌词:努力总有回报!学习单片机最好从51系列开始,第一是书多、资料多,而且掌握51技术的人多,碰到问题能请教的老师也就多了,51系列的实验芯片AT89C51价格低廉而且很容易买到,AT89C51芯片而且可以反复擦写1000次以上,对于初学者来说真是太合适了,就算以后考虑工业运用,也可以先学透51后再学其他类型的单片机,毕竟技术是相通的。
学习单片机的第一步是看书,单片机是一个知识密集的东东,不看书是绝对不行的,北京航空航天大学出版社出版了大量单片机方面的好书,你可以直接登录他们的网站进行邮购。
学习单片机的第二步是购买工具,单片机芯片必须借助编程器才能写入程序,站长用的编程器是一种性能较好的Genius NSP 通用编程器,通用编程器的特点是专为开发单片机和烧写各类存储器而设计的通用机型,它的编程可靠性高,支持的器件品种很多。
Genius NSP 通用编程器:4Opins万用锁紧插座。
适应绝大多数器件编程之所需。
使用适配器能够支持非DIP封装器件的编程。
RS232窜口通讯。
通讯波特率:57600bit/s9V/500mA电源转换器。
主要功能:EPROM、EEPROM、FLASH、MPU/CPU、PLD。
Serial EEPROM六大类器件的编程;RAM器件及CMOS/TTL器件的测试等等。
可选择的器件插入自动探测启动功能,即当您选择该功能并启动后,不再需要每次点击鼠标启动操作,每次当您更换芯片并锁紧万用插座后操作自动启动。
Genius NSP 可以在 WINDOS95、 98、me、2000、XP上运行。
从入门到大神,学习单片机的八个步骤介绍

从入门到大神,学习单片机的八个步骤介绍任何一款单片机,其实学习步骤都是一样的,不管是8位的入门芯片,还是32位的高速芯片。
以下步骤是必须的,按部就班的学完了,你不成大神你来找我。
第一步:数字I/O的使用使用按键输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,同时还学会了寄存器的操作方式。
例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。
每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。
要注意的是两个功能使用同一组I/O口,比如LCD和LED数据端口在好多例程里都是共用一组端口,如果两者结合,会有冲突,达不到预期的效果,或者在现在LCD的同时LED也在乱跳,这是目前大开发板采用的方式,建议不同的模块使用不同的IO口。
第二步:定时器的使用学会定时器的使用,就可以写出更高效的程序,别人的程序跑完一遍需要100ms,加入定时器后,你的程序跑完一遍可能只要10ms,在工业、家用电气设备的控制中也有很多应用。
真正会写程序的人必然是用定时器的高手。
例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。
数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。
定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。
第三步:中断单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事。
单片机模块化编程方法

{ TMOD |= 0x01; TH0 = 0x3C; TL0 = 0xB0; ET0 = 1; TR0 = 1; } void timer0(void) interrupt 1 //定时器 0 中断函数 { TH0 = 0x3C; TL0 = 0xB0; //定时器 0 重赋初值 if (TimeCounter != 0) { TimeCounter--; } } 其对应的头文要向 led.c 文件提供 TimeCounter 变量,向 main.c 提 Timer0Config 函数, 因此要在头文件中进行声明,具体内容如下: #ifndef TIMR0_H #define TIMR0_H extern unsigned char TimeCounter; extern void Timer0Config(void); #endif 3.3 串口通信文件 串口配置及中断服务程序 uart.c 文件,该文件的代码如下: #include <reg52.h> #include "uart.h" unsigned char tem = 0; void UartConfig(void) { SCON = 0x50; //串口工作在方式 1,即 10 位收发器模式 PCON = 0x00; //波特率不增倍 TMOD |= 0x20; //定时器 1 做波特率发生器,工作在方式 2 即 8 位自动重装初值模式 TH1 = 0xFD; //定器 1 赋初值 TL1 = TH1; //定时器 0 工作在方式 2,即 16 位计数器 //定时器 0 重赋初值 //使能定时器 0 中断 //开启定时器 0
单片机模块化编程方法
目前我们在学习和开发单片机时广泛采用 c 语言进行编程, 当我们开发的单片机项目较 小时, 或者我们所写的练习程序很小时, 我们总是习惯于将所有代码编写在同一个 c 文件下, 由于程序代码量较少,通常为几十行或者上百行,此时这种操作是可行方便的,也没有什么 问题。但如果要开发的项目较大,代码量上千行或者上万行甚至更大,如果你还继续将所有 代码全部编写在仅有的一个 c 文件下,这种方式的弊病会凸显出来,它会给代码调试、更改 及后期维护都会带来极大的不便。 试想一下, 当你尝试着从几千几万行代码中定位到某一位 置或者去寻找某一错误点,上下拉动巨长的滚动条慢慢地、一点点地浏览整个 c 文件,是件 多么令人眼花缭乱,头昏脑胀的事。模块化编程可解决这个问题,我们只要根据实际需要使 用模块化编程的思维将具有不同功能的程序封装在不同模块中, 将各个不同模块存放在不同 的 c 文件中。模块化编程后的程序不但使整体的程序功能结构清晰明了,同时也提高程序代 码的利用率, 有些模块代码我们可以直接进行移植或者经简单修改就可另作他用, 好比封装 好的函数。 那么什么是模块化呢?首先我们来简单来聊聊模块概念, 我们可能听说过电源模块, 通 信模块,这些是硬件模块,它们都提供一些接口,譬如电源模块会有输出额定电压电流的接 口,通信模块可能提供了 RS232、USB 等接口。那么对软件来说模块是怎样的呢?软件里 的模块跟硬件模块类似,抽象地说就像一个黑盒子,盒子内部细节我们可以不予理会,我们 只关心盒子给我们提供什么东西,即提供了什么接口,利用这些接口我们能实现什么功能。 我们把相对独立, 具有独立功能用代码编写在一个 c 文件下, 把需要对外的函数或变量进行 声明供外部使用,把不需要的细节尽可能对外部屏蔽起来,这就是软件模块化编程的思维。 这样不同的模块占用不同 c 文件,一个个 c 文件将整个项目串接起来实现所有的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“从单片机初学者迈向单片机工程师”LED篇第三章---- 模块化编程初识四
2010-03-06 11:31
OK ,到此一个简单的工程模板就建立起来了,以后我们再新建源文件和头文件的时候,就可以直接保存到src文件目录下面了。
下面我们开始编写各个模块文件。
首先编写Timer.c 这个文件主要内容就是定时器初始化,以及定时器中断服务函数。
其内容如下。
#include <reg52.h>
bit g_bSystemTime1Ms = 0 ; // 1MS系统时标
void Timer0Init(void)
{
TMOD &= 0xf0 ;
TMOD |= 0x01 ; //定时器0工作方式1
TH0 = 0xfc ; //定时器初始值
TL0 = 0x66 ;
TR0 = 1 ;
ET0 = 1 ;
}
void Time0Isr(void) interrupt 1
{
TH0 = 0xfc ; //定时器重新赋初值
TL0 = 0x66 ;
g_bSystemTime1Ms = 1 ; //1MS时标标志位置位
}
由于在Led.c文件中需要调用我们的g_bSystemTime1Ms变量。
同时主函数需要调用Timer0Init()初始化函数,所以应该对这个变量和函数在头文件里作外部声明。
以方便其它函数调用。
Timer.h 内容如下。
#ifndef _TIMER_H_
#define _TIMER_H_
extern void Timer0Init(void) ;
extern bit g_bSystemTime1Ms ;
#endif
完成了定时器模块后,我们开始编写LED驱动模块。
Led.c 内容如下:
#include <reg52.h>
#include "MacroAndConst.h"
#include "Led.h"
#include "Timer.h"
static uint16 g_u16LedTimeCount = 0 ; //LED计数器
static uint8 g_u8LedState = 0 ; //LED状态标志, 0表示亮,1表示熄灭
#define LED P0 //定义LED接口
#define LED_ON() LED = 0x00 ; //所有LED亮
#define LED_OFF() LED = 0xff ; //所有LED熄灭
void LedProcess(void)
{
if(0 == g_u8LedState) //如果LED的状态为亮,则点亮LED
{
LED_ON() ;
}
else //否则熄灭LED
{
LED_OFF() ;
}
}
void LedStateChange(void)
{
if(g_bSystemTime1Ms) //系统1MS时标到
{
g_bSystemTime1Ms = 0 ;
g_u16LedTimeCount++ ; //LED计数器加一
if(g_u16LedTimeCount >= 500) //计数达到500,即500MS到了,改变LED的状态。
{
g_u16LedTimeCount = 0 ;
g_u8LedState = ! g_u8LedState ;
}
}
}
这个模块对外的借口只有两个函数,因此在相应的Led.h 中需要作相应的声明。
Led.h 内容:
#ifndef _LED_H_
#define _LED_H_
extern void LedProcess(void) ;
extern void LedStateChange(void) ;
#endif
这两个模块完成后,我们将其C文件添加到工程中。
然后开始编写主函数里的代码。
如下所示:
#include <reg52.h>
#include "MacroAndConst.h"
#include "Timer.h"
#include "Led.h"
sbit LED_SEG = P1^4; //数码管段选
sbit LED_DIG = P1^5; //数码管位选
sbit LED_CS11 = P1^6; //led控制位
void main(void)
{
LED_CS11 = 1 ; //74HC595输出允许
LED_SEG = 0 ; //数码管段选和位选禁止(因为它们和LED共用P0口)
LED_DIG = 0 ;
Timer0Init() ;
EA = 1 ;
while(1)
{
LedProcess() ;
LedStateChange() ; }
}
整个工程截图如下:
至此,第三章到此结束。
一起来总结一下我们需要注意的地方吧
1. C 语言源文件(*.c)的作用是什么
2. C 语言头文件(*.h)的作用是什么
3. typedef 的作用
4. 工程模板如何组织
5. 如何创建一个多模块(多文件)
的工程。