单片机设计与KeilC编程知识总结

发布者:冰雪勇士最新更新时间:2016-01-18 来源: eefocus关键字:单片机  KeilC  编程知识 手机看文章 扫描二维码
随时随地手机看文章
1基本原则

质量是关键。没有人会对很差的工作感到满足。当完成高质量的工作时,你会为此而感到骄傲。不管你是否知道,你都会因为你的高质量工作而得到信誉。因此,要想为自己所做的事感到骄傲,就需要建立个人标准,并为达到这一标准而努力奋斗。在达到这些标准时,再提高标准并继续努力。挑战自己去完成更优良的工作,你将会为自己的成就而感到惊讶。

1.1 了解单片机的能力

【规则1】设计满足要求的最精简的系统。

正确估计单片机的能力,知道单片机能做什么,最大程度的挖掘单片机的潜力对一个单片机系统设计者来说是至关重要的。我们应该有这样一个认识,即单片机的处理能力是非常强大的。早期的PC 机,其CPU(8086)处理能力和8051 相当,却能处理相当复杂的任务。单片机的能力的关键就在软件设计者编写的软件上。只有充分地了解到单片机的能力,才不会做出“冗余”的系统设计。而采用许多的外围芯片来实现单片机能实现的功能。这样做即增加了系统成本,也可能会降低了系统的可靠性。

1.2 系统可靠性至关重要

【规则2】使用看门狗。

看门狗电路通常是一块在有规律的时间间隔中进行更新的硬件。更新一般由单片机来完成,如果在一定间隔内没能更新看门狗,那看门狗将产生复位信号,重新复位单片机。更新看门狗的具体形式多是给看门狗芯片相关引脚提供一个电平上升沿或读写它的某个寄存器。使用看门狗电路将在单片机发生故障进行死机状态时,重新复位单片机。当前有多种看门狗的芯片,如MAXIM 公司的MAX802,MAX813等。而且,有好多种单片机中本身就集成有看门狗。一个外部的看门狗是最好的,因为它不依赖于单片机。如果可能的话,看门狗更新程序不应该放在中断或是子程序中,原则上应该放在主程序中。我曾经见过一个工程师,他所调试的程序在运行时偶而会引起看门狗的复位动作,于是他干脆在每10ms 就中断一次的时钟中断程序中清看门狗。我相信他也知道使看门狗失去作用,可他却没有不是去查明引起这个现象的真正原因。因此,我想提醒大家:不论什么理由,绝对不要忽略系统故障的真正原因。高质量的产品来自于高素质的工程师,高质量的产品造就高素质的工程师。

【规则3】确定系统的复位信号可靠。

这是一个很容易忽略的问题。当你在设计单片机系统时,你脑中有这个概念吗?什么样的复位信号才是可靠的吗?你用示波器查看过你设计的产品的复位信号吗?不稳定的复位信号可能会产生什么样的后果?你有没有发现过你所设计的单片机系统,每次重新上电启动后,数据变得乱七八糟,并且每一次现象并不相同,找不出规律,或者有时候干脆不运行,或者有时候进入一种死机状态,有时候又一点事都没有正常运行?在这种情况下,你应该查一下你的系统的复位信号。一般在单片机的数据手册(Datasheet)中都会提到该单片机需要的复位信号的要求。一般复位信号的宽度应为。复位电平的宽度和幅度都应满足芯片的要求,并且要求保持稳定。还有特别重要的一点就是复位电平应与电源上电在同一时刻发生,即芯片一上电,复位信号就已产生。不然,由于没有经过复位,单片机中的寄存器的值为随机值,上电时就会按PC 寄存器中的随机内容开始运行程序,这样很容易进行误操作或进入死机状态。

【规则4】确定系统的初始化有效。

系统程序开始应延时一段时间。这是很多单片机程序设计中的常用方法,为什么呢?因为系统中的芯片以及器件从上电开始到正常工作的状态往往有一段时间,程序开始时延时一段时间,是让系统中所有器件到达正常工作状态。究竟延时多少才算合适?这取决于系统的各芯片中到达正常工作状态的时间,通常以最慢的为准。一般来说,延时20-100 毫秒已经足够。对于系统中使用嵌入式MODEM 等“慢热”型的器件来说,则应更长。当然,这都需要在系统实际运行中进行调整。

【规则5】上电时对系统进行检测。

上电时对系统中进行检测是单片机程序中的一个良好设计。在硬件设计时也应该细细考虑将各个使用到的芯片、接口设计成容易使用软件进行测试的模式。很多有经验的单片机设计者都会在系统上电时(特别是第一次上电时)进行全面的检测,或者更进一步,将系统的运行状态中分为测试模式和正常运行模式,通过加入测试模式对系统进行详细的检测,使得系统的批量检测更为方便容易。另外要注意的是,一个简单明了的故障显示界面也是颇要费得心思的。比如:系统的外部RAM(数据存储器)是单片机系统中常用的器件。外部RAM 如果存在问题,程序通常都会成为一匹脱缰的野马。因此,程序在启动时(至少在第一次上电启动时)一定要对外部RAM 进行检测。检测内容包括:1)检测RAM 中的单元。这主要通过写入和读出的数据保持一致。

2)检测单片机与RAM 之间的地址数据总线。总线即没有互相短路,也没有连接到“地”上。另外,很多芯片,都提供了测试的方法。如串行通信芯片UART,都带环路测试的功能。

【规则6】按EMC 测试要求设计硬件。

EMC 测试要求已经成为产品的必需。有很多的文章关于这方面的。

1.3 软件编程和调试

【规则7】尽可能使用Small 模式编译

对比起Large 模式和Compact 模式,Small 模式能生成更为紧凑的代码。在Small模式下,C51 编译器将没有使用关键词,如idata、pdata、xdata 特殊声明的变量通通放在data 单元中。在编程中,对于在的数据区,可以指定放在外部存储器中。

【规则8】在仿真前做好充分的准备

单片机硬件仿真器给单片机开发者带来了极大的方便,同时也很容易造成人的依赖性。很多时候,没有仿真器却能促使工程师写出更高质量的程序。也许在硬件仿真调试之前,下面准备工作将会对你有用:

1)程序编完后,对代码仔细逐行检查。检查代码的错误,建立自己的代码检查表,对经常易错的地方进行检查。检查代码是否符合编程规范。

2)对各个子程序进行测试。测试的方法:用程序测试程序,编制一个调用该子程序的代码,建立要测试子程序的入口条件,再看看它是否按预期输出结果。

3)如果代码有修改,再次对代码进行检查。

4)有可能的话,进行软件仿真——Keil C 的软件仿真功能十分强大。软件仿真可以防止因硬件的错误,如器件损坏、线路断路或短路,而引起调试的错误。

5)开始硬件仿真。

【规则9】使用库函数

重用代码,尤其是是标准库的代码,而不是手工编写你自己的代码。这样更快、更容易也更安全。KeilC 中提供了多个库函数,这些库函数的用法在KeilC 的帮助文件中有详细的描述。

【规则10】使用const。

这一点在很多经典的关于C 和C++的书籍中是必谈的要点。在《Exceptional C++》一书中,对这点有很精彩的描述,现摘录如下:“没有正确的安全意识的枪手在世界上是不可能活的很长的。const 观念不正确的程序员也是一样和没有时间戴紧帽子的正确,没有时间检查带电电线的电工一样不会活的很长。”在C 语言中,const 修饰符表示告诉编译器此函数将不会改变被修饰的变量的指向的任何值(除了强制类型转换)。当把指针作为参数传递时,总是合适地使用const,不仅可以防止你无意中错误的赋值,而且还可以防止在作为参数将指针传递给函数时可能会修改了本不想改变的指针所指向的对象的值。如:

const int num= 7;
num = 9; //有/可能得到编译器的警告。
const char *ptr,则表示该指针所指向的内容不会被改变,如果在程序中被发生对其赋值的操作,编译时将出错误提示。如:
const char *ptr = “hello”;
*ptr = `H`;//错误,所指内容不可改变也可将const 放在星号后面来声明指针本身不可改变。如:
char* const ptr;
ptr++; //错误,指针本身不可改变
也可同时禁止改变指针和它所引用的内容,其形式如下: const char* const ptr;

【规则11】使用static

static 是一个能够减少命名冲突的有用工具。将只在一个模块文件中的变量和函数使用static 修饰,将不会和其他模块可能具有相同名称的函数和变量在模块连接时不会产生名称冲突。一般来说,只要不是提供给其它模块使用的函数,和非全局变量,均应使用static 修饰。将子程序中的变量使用static 修饰时,表示这个变量在程序开始时分配内存,在程序结束时释放,它们在程序执行期间保持它们的值。如:
void func1(void)
{
static int time = 0;
time++
}
void func2(void)
{
static int time = 0;
time++;
}

两个子程序中的time 变量使用static 修饰,所以它们是静态变量,每调用一次time将进行加1,并保持这个值。它们的功能与下面程序相似:
int time1 = 0;
int time2 = 0;
void func1(void)
{
time1++
}
void func2(void)
{
time2++;
}
我们可以看出,使用static 修饰后,模块中的全局变量减少,使得程序的更为简单。

【规则12】不要忽视编译器的警告。

编译器的给出的警告都是有的放矢,在没有查清引起警告的真正原因之前,不要忽视它。

【规则13】注意溢出问题,写安全的代码。

1.4 KeilC 编程

【规则14】深入了解你所用的工具。

仔细查看KeilC 附带的帮助文件,你能找到你期待已久的东西。KeilC 是当前最好用的单片机开发软件。要充分利用该软件的功能,就必须对它深入的进行了解。

【规则15】不要使用语言的冷僻特性,并且记住,耍小聪明会贻害无穷。最重要的是编写你理解的代码,理解你编写的代码,你就可能会做得很好。

2 推荐书目

要成为一个优秀的单片机系统产品设计工程师,兴趣、热情、责任心至关重要。

2.1 单片机技术学习

《微机原理及应用(从16 位到32 位) 》戴梅萼等著清华大学出版社。学校教材,也是当年我学习单片机的启蒙书。

2.2 C51 编程学习

《单片机高级语言C51 Windows 环境编程与应用》作者:徐爱钧彭秀华电子工业出版社。这本书几乎覆盖了C51 编程的方方面面,最新版本对当前使用最广的keilC 也有很详细的讲述。对于刚学C51 编程的同志,本书是上上之选,强力推荐。比起现今书市上的所谓什么“C51 编程圣经”之类的书强得多。

2.3 C 语言编程必读

《C 陷阱与缺陷》Andrew Koenig 著

《C 专家编程》Peter Van Der Linden 著

C 语言开发技术经典之作,C 程序员必读之书,数十年来经久不衰。如果你想对C语言全面的掌握,真正了解C 语言的精髓,这两本书是必读之作。由人民邮电出版社出版的中文译本也还不错。

2.4 程序设计技术方面

《数据结构》 严蔚敏 清华大学出版社。清华大学出版社的教材质量稳定,中规中矩,价格相对来说也便宜一点。

《程序设计实践》Brian W. Kernighan Rob Pike 著;《代码大全》(网上有下载)。这两本是能让你看后,感觉有大突破的那种书籍,千万别吝惜银子。

关键字:单片机  KeilC  编程知识 引用地址:单片机设计与KeilC编程知识总结

上一篇:Freescale 16位单片机命名参考规则
下一篇:如何在单片机中生成随机数

推荐阅读最新更新时间:2024-03-16 14:44

Interrupt(单片机中断)
所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。 proteus原理图: 1.外部中断: 代码: #include reg52.h #include stdio.h #define uint unsigned int #define uchar unsigned char uchar temp; //声明一个全局变量 void delay(uint delay_time); void main() { EA=1; //开总中断 EX0=1; //开外部中断0 IT0=0; //设置有效方式
[单片机]
Interrupt(<font color='red'>单片机</font>中断)
基于凌阳SPCE061A单片机的音控小车的设计
  随着电子业的发展,自动化已经不再是新鲜的话题了,在对系统业提出更高更深入的要求的同时,智能化已成为必然的发展趋势。智能化产品已开始逐渐投入市场,走进千家万户,渗入各个领域。随着经济的增长,个人拥有私家汽车已不再是梦想,伴随着汽车业的发展,无人驾驶的智能汽车也必将进入实用阶段。   本设计的主要目的是针对智能无人驾驶汽车设计出智能音控小车,在智能化小车上实现语音控制,避免出现许多大大小小的事故。本设计方案也可应用于移库倒库过程中,而且在诸如智能建筑、公共便民设施、自动立体车库等类似的人性化环境中也能够发挥其作用 。    1 系统的总体设计方案及硬件设计   1. 1系统的总体设计描述   本设计以凌阳单片机SPCE0
[单片机]
PIC单片机开发的若干问题
由美国Microchip公司生产的PIC系列单片机,由于其超小型、低功耗、低成本、多品种等特点,已广泛应用于工业控制、仪器、仪表、通信、家电、玩具等领域,本文总结了作者在PIC单片机开发过程中的一些经验、技巧,供同行参考。 1 怎样进一步降低功耗 功耗,在电池供电的仪器仪表中是一个重要的考虑因素。PIC16C××系列单片机本身的功耗较低(在5V,4MHz振荡频率时工作电流小于2mA)。为进一步降低功耗,在保证满足工作要求的前提下,可采用降低工作频率的方法,工作频率的下降可大大降低功耗(如PIC16C××在3V,32kHz下工作,其电流可减小到15μA),但较低的工作频率可能导致部分子程序(如数学计算)需占用较多的时间。
[单片机]
PIC<font color='red'>单片机</font>开发的若干问题
单片机学不会怎么办?单片机从哪里开始学?
说起单片机学不会怎么办?就想起我自己一些学习的辛酸史。 我做单片机开发10余年了,单片机硬软件开发自然是很熟练了。 但做其他的工作可是一窍不通,在上家公司工作的时候,公司有很多上位机软件开发的需求,所以我就想扩展一下自己的知识,想学一下 C++ 和Java。 话说活到老学到老,多掌握一门技术,将来发展的空间就越大。 我有个朋友是这一块开发的高手,他给我提供了很多资料。 先是看基础语法,又是搭环境,开始实战,奋斗了大概3周,找不到感觉,对着理论知识,冷冰冰的提不起继续学习的兴趣,就放下了,没有继续。 后面想了一下,没继续学习的最主要原因还是没有目标驱动。 如果工作上正好有个项目需要,根据项目需求针对性去学习,相信我很快能学会。 还有
[单片机]
ARM11以后值得关注的Cortex产品系列
ARM在经典处理器ARM11以后的产品改用Cortex命名,并分成A、R和M三类,旨在为各种不同的市场提供服务。Cortex系列属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。ARMv7架构定义了三大分工明确的系列:A系列面向尖端的基于虚拟内存的操作系统和用户应用;R系列针对实时系统;M系列对微控制器。由于应用领域不同,基于v7架构的Cortex处理器系列所采用的技术也不相同,基于v7A的称为Cortex-A系列,基于v7R的称为Cortex-R系列,基于v7M的称为Cortex-M系列。 今天就带大家来看看ARM11以后的Cortex产品系列: ARM推出ARMv8架构ARM Cortex-A50处理
[单片机]
ARM11以后值得关注的Cortex产品系列
HT46R22单片机在电磁炉功率控制中的应用
摘要:介绍了电磁炉的基本工作原理,并提出了一种采用HT46R22单片机实现电磁炉功率稳定输出的功率控制方法,最后简单介绍了该方法的软硬件设计过程。 关键词:电磁炉;HT46R22;功率控制 引言 近年来,随着环保和节能意识的逐步提高,一种新兴的"绿色的厨具"--电磁炉正在家庭中普及。它改变了传统的明火烹调方式,利用电磁感应原理,使电流通过内置的线圈时产生磁场,磁场内的磁力线感应到铁制器皿,产生无数高速运动的小涡流,涡流产生的巨大循环能量转换为有效热能,使锅具自行高速加热,最终直接加热食物。电磁炉的热效率达到90%以上,同时它无烟无灰,无污染,不升高室温,不产生一氧化碳等有害物质,安全环保。电磁炉还采用了微电脑控制,能够随意控
[单片机]
51单片机C语言us级的精确延时
us级的精确延时延时,非要要汇编吗?否。请看下面例子: void delay1(unsigned char i) { while(--i); } i  delay time/us 1  5 2  7 3  9 ...
[单片机]
一文详解80C51系列单片机的定时/计数器
在单片机的实际应用系统中,经常会使用到精确延时,定时扫描,统计事件的发生次数和长生一定频率的声音等功能。 这些功能都需要在时序电路中实现定时和计数的功能。 80C51系列单片机内部集成了两个可编程的16位定时/计数器,简称T0和T1。每个定时器可以独立工作,可以设置成定时和计数两种模式,有4种工作方式可供选择。 定时/计数器的结构 80C51单片机内部的定时计数器的核心由两个16位加1计数寄存器T0和T1组成,每个计数寄存器都分为高8位THx和低8位TLx分别访问。 时钟源可以选择内部时钟源,也可以选择外部时钟源,当选择内部时钟源时,时钟脉冲序列由单片机内部产生;当选择外部时钟源时,由引脚P3.4、P3.5输入外部时钟
[单片机]
一文详解80C51系列<font color='red'>单片机</font>的定时/计数器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved