30. 如果准备估计一个算法的MIPS,有什么好的途径? 8 k7 I- M7 L$ p3 Z' r
答:算法的运行时间是指一个算法在计算机上运算所花费的时间。它大致等于计算机执行简单操作(如赋值操作,比较操作等)所需要的时间与算法中进行简单操作次数的乘积。通常把算法中包含简单操作次数的多少叫做算法的时间复杂性。它是一个算法运行时间的相对量度,一般用数量级的形式给出。度量一个程序的执行时间通常有两种方法: 8 V9 ~0 }# [1 @5 G& W
% V8 N! I; c( M2 Y* l 一种是事后统计的方法。因为很多计算机内部都有计时功能,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种事前分析估算的方法。 4 m1 ?5 z/ _+ U
9 E3 o) c h+ T# o! e6 `
 一种是事前分析估算的方法。一个程序在计算机上运行时所消耗的时间取决于下列因素:
- K+ Q; b1 T& I) \$ R! m/ O$ b' t2 d; C& S+ p% k# k( P
(1)依据的算法选用何种策略;
% J; o6 O& A5 }6 P3 u3 C(2)问题的规模。例如求100以内还是1000以内的素数;
0 v( L$ o; e' j5 y(3)书写程序的语言。对于同一个算法,实现语言的级别越高,执行效率就越低; 2 q, u' N, s5 x7 @- e! G
(4)编译程序所产生的机器代码的质量。这个跟编译器有关;
: J% y3 n7 }5 y* P(5)机器执行指令的速度。 ; N9 \- m6 D4 {7 B" G5 t( [4 F; O9 _
: l: s/ |) ?5 h- N显然,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不相同。这表明使用绝对的时间单位衡量算法的效率是不合适的。撇开这些与计算机硬件、软件有关的因素,可以认为一个特定算法"运行工作量"的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数。 6 M+ j6 h1 e3 l, B
^( p" z- v# N1 T+ ?9 m一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本运算的原操作,以该基本操作重复执行的次数作为算法的时间度量。 7 t- y6 N" |4 C4 F r7 v
7 f5 E& ~ E" G1 ^: ?算法的MIPS有专门的一门学问,可以去好好参考相关的数据结构书籍。 ' o7 D' C' o4 [5 e
) ~+ }, Z* N' T: K$ }8 N3 j31. 遥控的编解码思路和设计流程是怎样的?
9 j" f; M, r* P h答:一般来说完整的遥控码分为头码、地址码、数据码和校验码四个组成部分。头码根据不同的厂家各不相同,地址码和数据码都由逻辑“1”和逻辑“0”组成。编码的设计目的,就是按照编码规则发送不同的码值。我们最常见的码型有SONY、松下、NEC等厂家型号。遥控编码芯片最常用的是在空调、DVD、车库门等遥控器上。 / _. A" Q$ y. y
1 s& d" v3 G1 j6 t2 T
设计编码程序可以分为三个部分。 : X, [5 k1 f) e6 L$ T; ?
) b {' B$ b; h8 I9 z+ y
第一部分是了解码型的特性。遥控码的头码和地址码(也称为客户码)是固定不变的,数据码和校验码根据不同的键值而改变。 & S4 K, k8 Z0 y& L& k3 }0 s
- n# X6 l! B8 Y I第二部分是计算发码时间。遥控码大部分都是由逻辑“1”和逻辑“0”组成,也就是由一串固定占空比、固定周期的方波所组成。通常这些方波的周期是毫秒甚至微秒等级,需要在时间上计算的比较精确。所以选择发码单片机型号的时候,就要考虑到单片机的运行速度是不是够快,以及程序运行时间够不够。
/ N* b* f) N8 W! O* _8 ^4 Q
* D ]1 v. F6 h! }" z/ c# _第三部分就是程序的编写。选定单片机型号之后,开始设计程序流程。一般来说我们使用I/O口就可以做发码的输出端口。发码程序一般由几个子程序组成,头码子程序、逻辑1子程序,逻辑0子程序以及校验码的算法子程序。一旦我们得到要发送码的命令后,首先调用头码子程序,然后根据客户码和键值调用逻辑1子程序或者逻辑0子程序,最后调用校验码算法子程序输出校验码。 " ]; ` b7 w9 H1 _) E$ U
" C! }6 g3 o: g# [; Q4 @
HOLTEK公司的HT48CA0/HT48RA0、HT48CA3/HT48RA3和HT48CA6是专为遥控器设计的单片机,它们具有专门红外输出口,可以实现绝大部分发码的要求。
% v/ o. n4 G! G% Z' P
2 T4 N9 J$ Q9 J+ m8 ~. B' Z设计解码程序也可以分为三部分。
1 g5 l, l: D1 @6 E' n5 |# Q- m2 G5 t7 R
第一部分了解编码波形特性。从分析编码的高、低脉冲宽度入手,了解逻辑“1”和逻辑“0”的波形占空比、周期。了解头码的特性。 0 k3 e& P+ p0 H4 x0 w6 r4 o
; J! o' ?, F. H, A6 S第二部分确定接收方式。一般我们可以用I/O口查询方法或者INT口中断响应方法来接收编码。这两者的区别是I/O口查询方式比较耗费单片机的运行时间资源,需要不断的去侦测I/O的电平变化,以免漏掉有效的码值;而INT口中断接收方式则比较节省资源,当外部有电平变化时,单片机才需要去处理,不需要时刻进行侦测。但是INT口中断接收方式不能辨别相同周期不同占空比的波形特性,当编码所携带的逻辑“1”和逻辑“0”具有这种特性时,就无法通过INT口中断接收方式来辨别了,因为INT中断只是在上升沿或者下降沿的时候才触发。
2 I, g7 s$ w& c; U' n
2 i4 ` U8 U. N8 g第三部分将接收的码值存储并分析执行。根据判断高低电平的宽度(定时器或者延时),可以得到码值,也就是我们所说的解码。一般我们连续收到3个相同的完整码值,就确认此码的确被发出,并接收成功。当解码结束,根据码值我们可以判断出是哪个按键被按下,由此去执行相对的按键功能。
, v- N# D" q& d1 q7 y( U
) q6 y; C$ z& Q: ]; [; XHOLTEK公司的HT48以及HT49(带LCD)系列单片机,都可以符合大多数解码的任务。
* s, O3 |! x- |4 \ w; P0 g
- d) |3 c- F/ C0 P# z$ X& y: i, V: \32. 在学习单片机的过程中,如何理解预分频,12时钟模式(6时钟模型)等概念?
- L. d2 N0 n( L' O. \1 o+ M$ ?8 |答:预分频器的英文是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。 ! d8 _- _( R0 H( U- [1 P6 V4 A; f+ P. l
! a- k; g+ K- B
如果需要HT48R05A-1或者其它各类HOLTEK单片机的详细资料,可以在如下地址下载:http://www.holtek.com.cn/referanc/htk_book.htm 。
; v" m# y0 G5 G7 k# V# S2 \
, y" g& q' i! u. [12时钟模式(6时钟模型)应该就是在MCS51系列中,12个系统时钟为一个机器周期,2个系统时钟为一个状态,即一个机器周期有6个状态。
) z* `6 n# t5 G t' u7 E
- R; Y9 W7 i$ d, H/ r# r33. A/D、D/A的采样速率与其它单片机相比有什么优势?
% q, y) {7 ]7 h0 E4 X8 X# ^, a% {答:HOLTEK A/D Tyep MCU内嵌逐位逼近的A/D转换电路,精度有8bit/9bit/10bit,A/D转换时间最快为76us。
$ m% {; \; V- `6 v* ?- q" M' w! f, Q0 ~2 s
至于D/A,一般是指PWM输出,HOLTEK A/D Type MCU都带有8bit的PWM输出,但HOLTEK PWM的特点是其输出频率由系统频率决定(既系统频率选定后,PWM频率也就定了),其占空比通过对[PWM]寄存器赋值进行控制,不需要占用定时/计数器资源。
. X: M7 t5 P: V8 n; W7 m& b! U: ^5 J+ T& A! P4 s, k
34. 采用AT89S51时,出现了按了复位按钮,RAM中的数据被修改了。这是怎么回事?注:数据放在特殊寄存器之外。
) t2 @: O& c/ B2 j q, q+ b答:如果是RESET脚的复位按钮:一般MCU的RESET复位,其特殊寄存器会被重新初始化,而通用寄存器的值保持不变。
# L- T- ^! Z1 w* ]& T0 o# r+ D' x* L
如果复位按钮是电源复位:那就是MCU的上电复位,其特殊寄存器会被初始化,而通用寄存器的值是随机数。 * V" z2 j+ Z! Y( g: o! _# G
. ] q8 Y- }9 w- _35. 将P2.7用来驱动一个NPN三极管,中间串接了一个1K的电阻。问题是:当我尝试向P2.7写’1’时,发现管脚只能输出大约0.5V的一个电平。这个电路的使用得妥当么?如何正确的使用IO功能?
1 r7 M( Z& n8 t8 B0 a答:是在仿真时遇到的问题,还是烧录芯片后遇到的问题? ; R3 i! g6 q0 p& e7 t z
* U( K' P2 w: q
可以先将P2.7的外部电路断开,测量输出电压是否正常。如果断开后输出电压正常,那就说明P2.7的驱动能力不够,不能驱动NPN三极管,应该改用PNP三极管(一般在MCU应用中,都采用PNP方式驱动)。如果断开后输出电压还不正常,那有可能是仿真器(或芯片)已经损坏。
; k2 n G. C1 g$ _) c
+ Y+ K9 d# r {9 \6 u2 {( ~36. 在做充电管理的时候,提高pwm的频率往往以牺牲精度为代价,如果用的AT90S4433(avr)、78P458(elan)频率分别做到16kHz(8bit)和32kHz(8bit),而希望做到的是100kHz(8bit以上),诸如atiny15那样。怎么办?
* b5 b9 i$ E) U3 h( m I答:你所说的PWM是通过定时/计数器来控制其频率和占空比的,所以要提高频率,必然会降低精度。如果要提高PWM的频率,只能通过提高系统振荡频率来解决。 |