单片机应用编程技巧100问

05月 3rd, 2008

单片机应用编程技巧100问

1.c语言和汇编语言在开发单片机时各有哪些优缺点?

答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的cpu,其汇编语言可能有所差异,所以不易移植。

c语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。

对于目前普遍使用的risc架构的8bit mcu来说,其内部rom、ram、stack等资源都有限,如果使用c语言编写,一条c语言指令编译后,会变成很多条机器码,很容易出现rom空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供c编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在单片机开发中,我们还是建议采用汇编语言比较好。

如果对单片机c语言有兴趣,holtek的单片机就有提供c编译器,可以到holtek的网站(。同时可以到一些电子市场去购买一些

简单器件自己练习搭一下电路以加强硬件方面的知识。

29. 如果已经有了针对某mcu的c实现的某个算法,保持框架不变,对核

心的部分用汇编优化,有没有一些比较通用的原则?

答:每个人的编程都有自己的风格与习惯,如果要利用别人的程序,在其中修修

改改,如果他的程序并没有很好的模块化的话,建议最好不要这幺做,否则本来

预期达到事倍功半,说不定反而事半功倍了。要参考他人的程序当然可以,但是

首要是要看懂并理解他人程序的算法精髓,而不是在他的基础上打补丁。而关于

算法方面的优化,可以购买一些数据结构的书籍,上面有比较详细的说明。

30. 如果准备估计一个算法的mips,有什幺好的途径?

答:算法的运行时间是指一个算法在计算机上运算所花费的时间。它大致等于计

算机执行简单操作(如赋值操作,比较操作等)所需要的时间与算法中进行简单

操作次数的乘积。通常把算法中包含简单操作次数的多少叫做算法的时间复杂

性。它是一个算法运行时间的相对量度,一般用数量级的形式给出。度量一个程

序的执行时间通常有两种方法:

一种是事后统计的方法。因为很多计算机内部都有计时功能,不同算法的程

序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一

是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬

件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种

事前分析估算的方法。

一种是事前分析估算的方法。一个程序在计算机上运行时所消耗的时间取决

于下列因素:

① 依据的算法选用何种策略;

② 问题的规模。例如求100以内还是1000以内的素数;

③ 书写程序的语言。对于同一个算法,实现语言的级别越高,执行效率就越低;

④ 编译程序所产生的机器代码的质量。这个跟编译器有关;

⑤ 机器执行指令的速度。

显然,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或

者在不同的计算机上运行时,效率均不相同。这表明使用绝对的时间单位衡量算

法的效率是不合适的。撇开这些与计算机硬件、软件有关的因素,可以认为一个

特定算法"运行工作量"的大小,只依赖于问题的规模(通常用整数量n表示),

或者说,它是问题规模的函数。

一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类

型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题

的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)

来说是基本运算的原操作,以该基本操作重复执行的次数作为算法的时间度量。

算法的mips有专门的一门学问,可以去好好参考相关的数据结构书籍。

31. 遥控的编解码思路和设计流程是怎样的?

答:一般来说完整的遥控码分为头码、地址码、数据码和校验码四个组成部分。

头码根据不同的厂家各不相同,地址码和数据码都由逻辑“1”和逻辑“0”组成。

编码的设计目的,就是按照编码规则发送不同的码值。我们最常见的码型有

sony、松下、nec等厂家型号。遥控编码芯片最常用的是在空调、dvd、车

库门等遥控器上。

设计编码程序可以分为三个部分。

第一部分是了解码型的特性。遥控码的头码和地址码(也称为客户码)是固定不

变的,数据码和校验码根据不同的键值而改变。

第二部分是计算发码时间。遥控码大部分都是由逻辑“1”和逻辑“0”组成,也

就是由一串固定占空比、固定周期的方波所组成。通常这些方波的周期是毫秒甚

至微秒等级,需要在时间上计算的比较精确。所以选择发码单片机型号的时候,

就要考虑到单片机的运行速度是不是够快,以及程序运行时间够不够。

第三部分就是程序的编写。选定单片机型号之后,开始设计程序流程。一般来说

我们使用i/o口就可以做发码的输出端口。发码程序一般由几个子程序组成,头

码子程序、逻辑1子程序,逻辑0子程序以及校验码的算法子程序。一旦我们得

到要发送码的命令后,首先调用头码子程序,然后根据客户码和键值调用逻辑1

子程序或者逻辑0子程序,最后调用校验码算法子程序输出校验码。

holtek公司的ht48ca0/ht48ra0、ht48ca3/ht48ra3和ht48ca6是专为

遥控器设计的单片机,它们具有专门红外输出口,可以实现绝大部分发码的要求。

设计解码程序也可以分为三部分。

第一部分了解编码波形特性。从分析编码的高、低脉冲宽度入手,了解逻辑“1”

和逻辑“0”的波形占空比、周期。了解头码的特性。

第二部分确定接收方式。一般我们可以用i/o口查询方法或者int口中断响应方

法来接收编码。这两者的区别是i/o口查询方式比较耗费单片机的运行时间资源,

需要不断的去侦测i/o的电平变化,以免漏掉有效的码值;而int口中断接收方

式则比较节省资源,当外部有电平变化时,单片机才需要去处理,不需要时刻进

行侦测。但是int口中断接收方式不能辨别相同周期不同占空比的波形特性,

当编码所携带的逻辑“1”和逻辑“0”具有这种特性时,就无法通过int口中

断接收方式来辨别了,因为int中断只是在上升沿或者下降沿的时候才触发。

第三部分将接收的码值存储并分析执行。根据判断高低电平的宽度(定时器或者

延时),可以得到码值,也就是我们所说的解码。一般我们连续收到3个相同的

完整码值,就确认此码的确被发出,并接收成功。当解码结束,根据码值我们可

以判断出是哪个按键被按下,由此去执行相对的按键功能。

holtek公司的ht48以及ht49(带lcd)系列单片机,都可以符合大多数解码

的任务。

32. 在学习单片机的过程中,如何理解预分频,12时钟模式(6时钟模型)

等概念?

答:预分频器的英文是prescaler。它就是将输入的频率信号分频,然后再输出。

holtek公司有一款最基本的8位i/o型单片机ht48r05a-1,我们就以这款单

片机为例说明。ht48r05a-1有一个8位向上计数的定时器counter。系统时钟

fsys(4mhz)进入八阶预分频器(8-stage prescaler)进行分频,再进入定时计

数器counter计数。根据软件设置,预分频器可以将fsys进行2的n次方分频

(n=1~8)。举例来说,如果软件设置为预分频器2分频,那幺预分频器输出的频

率就是fsys/2=2mhz,这个2mhz信号再进入定时计数器counter。

如果需要ht48r05a-1或者其它各类holtek单片机的详细资料,可以在

如下地址下载:http://www.holtek.com.cn/referanc/htk_book.htm

12时钟模式(6时钟模型)应该就是在mcs51系列中,12个系统时钟为一

个机器周期,2个系统时钟为一个状态,即一个机器周期有6个状态。

33. a/d、d/a的采样速率与其它单片机相比有什幺优势?

答:holtek a/d tyep mcu内嵌逐位逼近的a/d转换电路,精度有

8bit/9bit/10bit,a/d转换时间最快为76us。

至于d/a,一般是指pwm输出,holtek a/d type mcu都带有8bit的pwm

输出,但holtek pwm的特点是其输出频率由系统频率决定(既系统频率选定

后,pwm频率也就定了),其占空比通过对[pwm]寄存器赋值进行控制,不需要

占用定时/计数器资源。

34. 采用at89s51时,出现了按了复位按钮,ram中的数据被修改了。这

是怎幺回事?注:数据放在特殊寄存器之外。

答:如果是reset脚的复位按钮:一般mcu的reset复位,其特殊寄存器会

被重新初始化,而通用寄存器的值保持不变。

如果复位按钮是电源复位:那就是mcu的上电复位,其特殊寄存器会被初

始化,而通用寄存器的值是随机数。

35. 将p2。7用来驱动一个npn三极管,中间串接了一个1k的电阻。问题

是:当我尝试向p2。7写’1′时,发现管脚只能输出大约0。5v的一个电平。

这个电路的使用得妥当幺?如何正确的使用io功能?

答:是在仿真时遇到的问题,还是烧录芯片后遇到的问题?

可以先将p2。7的外部电路断开,测量输出电压是否正常。如果断开后输出

电压正常,那就说明p2。7的驱动能力不够,不能驱动npn三极管,应该改用

pnp三极管(一般在mcu应用中,都采用pnp方式驱动)。如果断开后输出电压

还不正常,那有可能是仿真器(或芯片)已经损坏。

36. 在做充电管理的时候,提高pwm的频率往往以牺牲精度为代价,如果用

的at90s4433(avr)、78p458(elan)频率分别做到16khz(8bit)和32khz(8bit),

而希望做到的是100khz(8bit以上),诸如atiny15那样。怎幺办?

答:你所说的pwm是通过定时/计数器来控制其频率和占空比的,所以要提高

频率,必然会降低精度。如果要提高pwm的频率,只能通过提高系统振荡频率

来解决。

37. 汽车电子用的单片机是8位多,还是32位?如何看待单片机在汽车电子

市场中的前景?

答:现今汽车制造也是一个进步很快的工业,特别是电子应用于汽车上,令多种

新功能得以实现。

总的来说,汽车电子应用分三部份。

- 汽车发动机控制:限速控制,涡轮增压,燃料喷注控制……

- 汽车舒适装置:遥控防盗系统,自动空调系统,影音播放系统,卫星导航

系统……。

- 汽车操控和制动:刹车防抱死系统(abs),循迹系统(tcs),防滑系统(asr),

电子稳定系统(esp)……

汽车上的各系统繁多,且日新月异,故利用何种单片机是依各系统规格,要

求不一,但有一样可肯定是该单片机要符工业规格,才能忍受汽车应用的恶劣环

境,高温,电源干扰,可*度要求。不同档次的汽车其功能配置相对亦有差别,

故8位单片机在较低阶的系统如机械控制,遥控防盗等应该还有空间,但高阶的

系统如影音,导航……将来的无人驾驶!,就非一般单片机能实现。

因汽车工业现阶段由欧美日数个大集团所把持,相关的汽车电子配件各集团

会挑选单片机大厂合作, 故汽车内置的电子系统亦由单片机大厂把持,市场只

剩外置系统如遥控防盗,影音导航供小厂开发。

38. 在使用三星的s3c72n4时,觉得它的time/counter不够用。现在要同时用

到3个counter,该怎么办?

答:您是需要三个外部counter还是需要三个定时器?如果是三个定时器标志的

话,可以取这三个定时最基本的时基作为timer的基础计数,然后以这个时基来

计算这三个需要的计数标志的flag,在程序中只需要查询flag是否到,再采取动

作。

如果要3个外部脉冲计数的话,这个有一定的难度,如果外部脉冲不是很频

繁,可以考虑通过外部中断进行,但是这个方法必须是外部脉冲的频率与mcu

执行速度有一定的数量级差,否则mcu可能无法处理其它程序,一直在处理外

部中断。

39. 在芯片集成技术日益进步的今天,单片机的集成技术发展也很迅速,在

传统的40引脚的基础上,飞利浦公司推出20引脚的单片机系列,使很多的

引脚可以复用,这种复用技术的使用在实际应用中会不会影响其功能的执

行?

答:现在有很多品牌的单片机都有引脚复用功能,不止飞利浦一家,应该说这个

方式前几年就已经有了。在实际应用中不会影响其功能的执行,但是要注意的是,

有的mcu如果采用复用引脚的话,该引脚会有一些应用上的限制,这在相应的

datasheet里面都会有描述,所以在系统规划的时候都要予以注意。

40. delta-sigma软件测量方式,是什么概念?

答:delta-sigma原理一般应用在adc应用中。具体来说,delta-sigma adc的

工作原理是由差动器、积分器和比较器构成调制器,它们一起构成一个反馈环路。

调制器以大大高于模拟输入信号带宽的速率运行,以便提供过采样。模拟输入与

反馈信号(误差信号)进行差动 (delta)比较。该比较产生的差动输出馈送到积

分器(sigma)中。然后将积分器的输出馈送到比较器中。比较器的输出同时将反馈

信号(误差信号)传送到差动器,而自身被馈送到数字滤波器中。这种反馈环路

的目的是使反馈信号(误差信号)趋于零。比较器输出的结果就是1/0 流。该流

如果1密度较高,则意味着模拟输入电压较高;反之,0密度较高,则意味着模

拟输入电压较低。接着将1/0流馈送到数字滤波器中,该滤波器通过过采样与抽

样,将1/0流从高速率、低精度位流转换成低速率、高精度数字输出。

简而言之,delta就是差动,sigma就是积分的意思。delta-sigma软件测试,

我的理解应该是通过软件模拟差动积分的过程。具体来说,就是侦测外部输入的

电压(或者电流)信号变化,然后通过软件积分运算,得出外部信号随时间变化

的基本状况。

41. 通常采用什么方法来测试单片机系统的可*性?

答:单片机系统可以分为软件和硬件两个方面,我们要保证单片机系统可*性就

必须从这两方面入手。

首先在设计单片机系统时,就应该充分考虑到外部的各种各样可能干扰,尽

量利用单片机提供的一切手段去割断或者解决不良外部干扰造成的影响。我们以

holtek最基本的i/o单片机ht48r05a-1为例,它内部提供了看门狗定时器

wdt防止单片机内部程序乱跑出错;提供了低电压复位系统lvr,当电压低于

某个允许值时,单片机会自动reset防止芯片被锁死;holtek也提供了最佳

的外围电路连接方案,最大可能的避免外部干扰对芯片的影响。

当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项

目和方法,但是有一些是必须测试的:

① 测试单片机软件功能的完善性。 这是针对所有单片机系统功能的测

试,测试软件是否写的正确完整。

② 上电掉电测试。在使用中用户必然会遇到上电和掉电的情况,可以进

行多次开关电源,测试单片机系统的可*性。

③ 老化测试。测试长时间工作情况下,单片机系统的可*性。必要的话

可以放置在高温,高压以及强电磁干扰的环境下测试。

④ esd和eft等测试。可以使用各种干扰模拟器来测试单片机系统的

可*性。例如使用静电模拟器测试单片机系统的抗静电esd能力;

使用突波杂讯模拟器进行快速脉冲抗干扰eft测试等等。

当然如果没有此类条件,可以模拟人为使用中,可能发生的破坏情况。例如

用人体或者衣服织物故意摩擦单片机系统的接触端口,由此测试抗静电的能力。

用大功率电钻*近单片机系统工作,由此测试抗电磁干扰能力等。

42. 在开发单片机的系统时,具体有那些是衡量系统的稳定性的标准?

答:从工业的角度来看,衡量系统稳定性的标准有很多,也针对不同的产品标准

不同。下面我们大概介绍单片机系统最常用的标准。

① 电试验(esd)

参考标准: iec 61000-4-2

本试验目的为测试试件承受直接来自操作者及相对对象所产生之静电放电

效应的程度。

② 空间辐射耐受试验(rs)

参考标准:iec 61000-4-3

本试验为验证试件对射频产生器透过空间散射之噪声耐受程度。

测试频率:80 mhz~1000 mhz

③ 快速脉冲抗扰测试(eft/b)

参考标准:iec 61000-4-4

本试验目的为验证试件之电源线,信号线(控制线)遭受重复出现之快速瞬时

丛讯时之耐受程度。

④ 雷击试验(surge)

参考标准 : iec 61000-4-5

本试验为针对试件在操作状态下,承受对于开关或雷击瞬时之过电压/电流产

生突波之耐受程度。

⑤ 传导抗扰耐受性(cs)

参考标准:iec 61000-4-6

本试验为验证试件对射频产生器透过电源线传导之噪声耐受程度。

测试频率范围:150 khz~80 mhz

⑥ impulse

脉冲经由耦合注入电源线或控制线所作的杂抗扰性试验。

43. 在设计软体时,大多单片机都设有看门狗,需要在软体适当的位置去喂

狗,以防止软体复位和软体进入死循环,如何适当的喂狗,即如何精确判定

软体的运行时间?

答:大多数单片机都有看门狗定时器功能(wdt,watch dog timer)以避免程

序跑错。holtek有一款基本i/o型单片机–ht48r05a-1,我们就以它为例做

个说明吧。

首先了解一下wdt的基本结构,它其实是一个定时器,所谓的喂狗是指将

此定时器清零。喂狗分为软件和硬件两种方法。软件喂狗就是用指令来清除

wdt,即clr wdt;硬件喂狗就是硬件复位reset。当定时器溢出时,会造

成wdt复位,也就是我们常说的看门狗起作用了。在程序正常执行时,我们并

不希望wdt复位,所以要在看门狗溢出之前使用软件指令喂狗,也就是要计算

wdt相隔多久时间会溢出一次。ht48r05a-1的wdt溢出时间计算公式是:

256*div*tclock。其中div是指wdt预分频数1~128,tclock是指时钟来源周期。

如果使用内部rc振荡作为wdt的时钟来源(rc时钟周期为65us/5v),最大

的wdt溢出时间为2。1秒。

当我们得到了wdt溢出时间twdt后,一般选择在twdt/2左右的时间进行

喂狗,以保证看门狗不会溢出,同时喂狗次数不会过多。

软件运行时间是根据不同的运行路线来决定的,如果可以预见软件运行的路

线,那么可以根据t=n*t1来计算软件的运行时间。n是指运行的机器周期数,

t1是指机器

标签:, ,

相关日志


This entry was posted on 星期六, 05月 3rd, 2008 at 4:32 am and is filed under flash教程. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Reply