新闻  |   论坛  |   博客  |   在线研讨会
《删繁就简-单片机入门到精通》答李老师
sjdai | 2010-03-16 21:40:28    阅读:3810   发布文章

晚上刚刚看到内蒙古工业大学李老师发的邮件,写得非常认真仔细,字里行间能让人感受到李老师的热心,在此向李老师表示衷心的感谢。
我不想对邮件做出修饰,直接将邮件发出来。呵呵,这可没先请示李老师,希望不要见怪。

————————————————————————————————————————

  刚刚拜读了你的大作,时间关系读得不够仔细,但看得出你在单片机开发方面见识较广,有不少宝贵的体会和经验,你的写作也是用了心的。我支持你的写作,并相信你会越写越好。

  为此,说出我的几点看法供你参考:  
1、"2.15. 键盘扫描"一节,没能让我看明白你为什么要这样设计。在我看来,那6个接地电阻是可以去掉的。就让Pm悬空,依次向Pm.0-Pm.5发出低电位,读Pn口的5bit,按键按下的将读到0,没按下的会读到1,同时就会得到5个按键的状态。(为了叙述方便,是以你的原图解说。实际上应该PmPn互换,5次扫描即可得出30个按键的状态)。我猜想,你们当初这样设计时或许是在为了避免悬空,其实这种顾虑也是个普遍存在的理解误区。
对于一位长期从事硬件开发的技术人员,可能只是一直没顾上细想,只要一想就会明白。

--->对于输入口,如果内部没有上下拉电阻选择,产品设计最好另外加上拉或下拉电阻,这样做事为了防止你已经提到的问题(悬空),IO口如果是输入悬空,没有上下拉电阻就会处于高阻浮动状态,这样一是读回的状态不确定,有可能高也有可能低,就有可能做出按键误判,当然这种情况发生的几率非常小,另外是不能很好的抗外界干扰信号,这些辐射干扰电流驱动能力都很小,有了上下拉电阻就可以消除其影响,否则有可能无法通过电磁兼容测试。

补充说明:刚才有人找我出去了一下,对你的回复有点仓促,你的做法是反向输出进行扫描判别,先前的回复我没看清楚这一点。这样做因为Pn口有上拉电阻不用担心读到的状态不稳,从而不会出现误判的情况,但要留意此时你将Pm口设置成了输出口,没有二极管保护的矩阵同一时间只能有一条IO为输出,其它IO都要设置成输入,假如现在扫描Pm.0,Pm.1~Pm.5就要设为输入口,所以它们还是存在抗干扰能力不够的问题。还忘了提示一点,键盘扫描这部分内容主要是为了强调要防止多个键同时按下形成的状态冲突。

  2、"2.13. 寄存器也可当RAM"一节,用特殊功能寄存器来当RAM用,或可作为某些特殊情况的的权宜措施,但不建议作为经验推广,更应强调除非万不得已尽量不要这样做。因为这不仅会破坏程序的可读性,还会影响以后的代码移植复用。我认为很多时候利用形参空间的办法比这更有效更合理。

--->你的说法非常正确,我应该强调这一点,避免读者误会成空间足够也可以这么做,我会加上注释解释“权宜之计”。另外你提到会影响到程序可读性的问题,不用过多担心,不管特殊功能寄存器还是通用寄存器,一般都是程序预先定义好的地址,如果需要使用特殊功能寄存器,是不会用已经定义好的特殊功能寄存器名称,需要另外定义一个新的变量名,但需要在定义的时候加上注释,程序中使用新定义的变量名进行访问。至于形参空间的方法,肯定是节约RAM空间一个行之有效的方法,文中所说方法是假定一切有效的方法都已经使用,空间还是不够,在没有办法的情况可以这样做,我的目的也不是把这个当做经验直接推广,而是想启发大家在好像没有路的时候能跳出常规思维寻找新的解决方法。
已经于3月20日在文中增加了提示说明文字


  3、第94页:“这个问题同样可以用高速公路的例子来理解,汽车的速度可以继续提高,收费站也可以撤掉,但实际生活中高速公路不可能设计成笔直宽阔的大道,所以还是不能满足汽车速度的需求”。这段比喻不太妥当。实际上高速公路上的弯道很多是有意为之的,几公里就得稍弯一下,目的是避免长时间直道行驶对驾驶员产生的反应松怠。

--->你的说法是对的,其实我是实在想不到一个更好的例子来做比喻,这个例子我自己都修改过几次,现在不说高速公路不能修成直路原因,就是收费站的比喻都有点问题,接下来我会想想看能不能用一个更恰当的例子进行说明。
经检查发现修改稿已经将这个例子改为“好比我们设计了速度可以达到120公里/小时的汽车,可公路却限速60公里,这样再好的汽车也无法跑出快的速度来。”


  我知道给人指出不足不是件受欢迎的事,但我真心希望你好,所以还是说出了我的真实感受。仅供参考,

--->非常欢迎你指出这些问题,非常感谢你如此认真热情,非常感谢!
 

 

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
hhwwjj  2010-08-23 17:16:10 

接下来是一段奇妙的代码,也许会给你一种不可思议的感觉,但实际结果确实如此,如果你理 解了这段代码,我想你对C 语言运算表达式中的自动转换规则已经是非常清楚。 signed char x; x=128; //注意signed char 有效范围为-128~127 if(x==128) { x=128; //程序不会进入此处 } if(x==-128) { x=0; //程序会进入此处 } 是不是有点奇妙?明明用C 代码给x 的值是128,在后面进行比较就变成了-128。 用新华龙的单片机 在IDE上实验 哪段程序都不会执行 结果与博主讲的不一样?????

zhwt  2010-04-05 10:10:11 

学习!

林友兰  2010-03-30 19:53:31 

多多请教

cy1981  2010-03-30 10:49:42 

写的好

sjdai  2010-03-21 14:38:55 

复位包括上电复位、软件复位、硬件复位、异常复位等方式,复位的意思就是将整个系统(硬件或软件)恢复到预定的初始状态,这样就能保证程序开始运行的起始状态一致。一般来说上电复位最为彻底,其它的几种复位都有可能只是系统部分资源复位。要解释机制还真有点难度,看我这个例子能不能让你明白,现在有几个木桶挂在空中,这些木桶不同于普通木桶,底板可以抽出,在底板另外一边装有弹簧,这样你一抽底板就会抽出,一放手弹簧又会讲底板拉回去,一开始木桶都是空的,你呢一会给这个木桶舀一瓢水进去,一会又从有水的桶里舀一瓢出来,过了一段时间这些木桶里面就有了水,具体有多少水都是你决定的,如果你能记得所有的过程,现在你是知道每个桶里有多少水,但是你自己忘记了,老板要你给桶装上指定瓢数的水,于是你在每个桶的底板上接了一条绳子,把绳子一拉,里面的水就全流光了。拉绳子就相当于复位,水流光就相当于复位结果,接下来你给每个桶装上指定瓢数的水就完成了任务。单片机硬件的复位和此类似,只不过是由硬件电路实现。

john-deng  2010-03-21 13:11:16 

想请教一下复位的问题,以及实现的机制,现在也在做手机,一直没有弄明白这个东西,谢谢

maj0308  2010-03-20 08:57:26 

sjdai  2010-03-19 16:13:16 

我希望是能敞开沟通,做技术一定要客观,不能自己有错还坚持

jackwang  2010-03-18 14:50:37 

好,这样的氛围好~~~

shsat  2010-03-17 08:19:32 

都是牛人,佩服!

啰嗦一些以单片机应用为主的电子技术问题,偶尔发点牢骚。如果您想我了,邮件(daishangju@163.com)和MSN(sj_dai@hotmail.com)都能找到我。本博客提供《删繁就简-单片机入门到精通》一书下载链接,点击最底部的“查看更多”可翻页。
推荐文章
最近访客