单片机理论与实践的十大误区_第1页
单片机理论与实践的十大误区_第2页
单片机理论与实践的十大误区_第3页
单片机理论与实践的十大误区_第4页
单片机理论与实践的十大误区_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机理论与实践的十大误区元增民2007年电子报合订本发表单片机是计算机的一个分支,是计算机向控制方向发展的一个产物。二十年来,单片机已经从只有少数人才能掌握的技术演变为大众化的工具,成为很多专业技术人员必不可少的基本工具。如果说技术人员出行离不开汽车,那么就可以说搞开发离不开单片机。但是,单片机技术对很多人来说似乎还是深奥玄妙高不可攀的。不仅很多专科生在单片机面前胆怯了,而且很多本科生也难闯单片机课程这一关,甚至一些人考研时因为感觉单片机课程难而不得不选考其他课程甚至忍疼调换别的研究方向。造成这个被动局面的原因既有客观的,又有主观的,又有客观与主观相搀杂的。如果说客观原因往往是人们所处环境造

2、成的而不容易改变,那么主观原因往往是人们自己造成的,是自我设下的陷阱,就是说由于受到来自教科书等渠道的一些陈腐观念的引导而不幸走进了一些认识上的误区。有时候还因为认识上的误区而埋怨客观条件不好。系统性地认识目前的一些陈腐观念,消除单片机理论与实践的误区,有利于学校调整课程内容、改进教学方法,有利于学生改善学习效果,有利于学生用较少的精力学到较多的知识,有利于专业技术人员更好地掌握单片机技术。本文首先介绍单片机理论与实践的十大误区,并给出一种基于反复执行指令的模式而设计的无机器周期误差的高精度液晶电子钟。一、单片机理论与实践的十大误区1单片机调试必用仿真器单片机程序存贮器最早采用掩膜ROM。掩膜

3、ROM只能一次性编程,一般程序一旦固化后就不可能更改。因此通常用一个程序可更改的、逻辑功能及管脚都与所用单片机芯片一样的电路来代替单片机芯片进行试验,直到把程序试验成功时,才把调试好的程序固化到单片机程序存贮器中。把这样的程序可更改的、逻辑功能及管脚都与所用单片机芯片一样的电路叫做仿真器。如果不用仿真器而是直接把尚没有调试完毕的程序固化到掩膜ROM中,那么每调试一次就要消耗一个掩膜ROM芯片或带掩膜ROM的单片机芯片。8051就是一款带掩膜ROM的单片机芯片即掩膜型单片机,流行时8051单价上百元。如果每调试一次就消耗一片8051,就要损失100元左右,这个代价实在有点高。因此,仿真器对于掩膜

4、ROM结构的程序存贮器的价值比较大。采用掩膜ROM时,购买一个仿真器,一般经过若干次研制工作,就能收回成本。后来程序存贮器发展为紫外线擦除的可编程ROM,即EPROM,以及电可擦除的可编程ROM,即EEPROM,也叫E2PROM。8751就是一款内含EPROM的单片机。EPROM和E2PROM可以反复写入擦除达成百上千次。EPROM和EEPROM出现后,仿真器的价值就大打折扣。因为用户可以试着把程序写入EPROM或EEPROM,然后试机。若失败,则一方面用紫外线擦抹器擦除EPROM,或用电擦除EEPROM,均为统统改为1,另一方面根据故障现象分析程序错误所在并修正程序,然后重新写入EPROM或

5、EEPROM进行下次试验。如此进行若干次试验,一般就能将程序调试成功。近几年程序存贮器发展为闪存(FLASH)。FLASH可以反复写入擦除达成千上万次。FLASH出现后,仿真器的价值更是大打折扣。用户可以试着把程序写入FALSH,然后试机。若失败则一方面在编程器上直接擦除FLASH,亦是统统改为1,另一方面根据故障现象分析程序错误以及硬件错误所在并修正程序和硬件,然后重新写入FLASH进行下次试验。如此进行若干次试验,一般就能够调试成功。一些人没有注意到程序存贮器结构特性的发展,还是一味地追求仿真器,结果是得不偿失。实际上,笔者从1982年开始研制Z80微机控制系统、MCS48系列单片机控制系

6、统、MCS51系列单片机控制系统以及AT89C51和AT89S51系列单片机控制系统以来,所用的程序存贮器或单片机内含的程序存贮器刚开始就是EPROM,后来从EPROM直接过渡到FLASH,其间没有用过仿真器。现在更不用仿真器。不是不用,实在是没有什么必要。复杂系统调试时,硬件故障与软件故障搀杂在一起,往往使人如临荆棘而无从下手。此时可以暂时简化硬件和软件,如能试成,则至少说明单片机芯片正常,硬件故障范围缩小了,调试难度大大减轻了,调试人员信心倍增。2LED比LCD电路简单价格便宜因而LED为首选发光二极管显示器(LED)与液晶显示器(LCD)在20世纪70年代同时出现。LED基于电子源源不断

7、地从高能级跌落到低能级而连续释放出多余能量的机理来发光,LCD基于液晶材料在电压控制下光学特性的变化来实现显示。LED发光方式的效率及寿命虽然优于白炽灯发光方式,但是LED工作时仍旧在消耗电能。相比之下LCD工作时电能消耗甚微。LCD工作时基本上不消耗电能,且可以借助外界自然光。虽然LCD综合优势明显大于LED,但是长期以来,LED在各行各业广泛采用,LCD仅见于计算器和电子手表等少数领域。直到现在还有一些人推崇LED而轻视LCD,其理由一是客观上LED发光效率逐渐提高,已经有高亮度LED品种,二是主观认为LED控制电路比LCD简单。LCD构造与驱动技术的确比LED复杂。构造与驱动技术复杂是L

8、CD很长时间以来没有能够广泛应用的根本原因。但是正是因为LCD构造与驱动技术复杂,才使一些急需LCD的用户要求液晶显示器生产厂家把LCD裸屏、导电橡胶(俗称斑马条)等连接件、专用IC控制器和PCB板,甚至包括背光源等统统制作为一个组件,形成所谓液晶显示模块,LCD Module,简称LCM。我国长沙太阳人电子有限公司从1995年就开始生产LCM。最初LCM是特殊定货专供某些厂家使用,因此市场上很难见到。后来随着经验积累和技术进步,厂家开始设计生产通用型LCM,例如可显示若干位数码的LCM,可显示若干行数码的LCM,可显示若干点阵的LCM等。LCM研发、设计和制造已经成为一个新产业。这些通用型L

9、CM具有标准的并行或串行通信接口,作为一个外围电路,与单片机的硬件连接非常方便,控制软件编制也非常简单。众所周知,编制LED显示控制软件时要考虑显示方式是静态还是动态。对比之下,选用LCM时主要看显示效果,编制LCM控制软件时根本不需要考虑所用LCM究竟是采用静态显示还是采用动态显示。动态LED控制软件主要内容是字模输出,静态LED控制软件是单纯字模输出,LCM控制软件也是单纯字模输出。因此,单片机控制LCM与控制静态LED一样简单,单片机控制LCM比控制动态LED更简单。只要往LCM控制器中的映像寄存器写入字模就可以实现液晶显示。对用户来说,在硬件使用方面,LCM甚至比LED还简单。LED显

10、示电路一直没有现成的商品可购,需要用户自行设计。对比之下,市场上各种LCM已经琳琅满目,用户买来就可以使用。认为LED控制电路比LCD简单的观点不符合实际。另外,LCD数码管的价格与LED数码管已经是旗鼓相当。例如字高12mm的LCD数码管每位价格已经降到1元上下,而同尺寸的LED数码管每位价格也在1元上下。最便宜的45位LCM价格只要20元上下,亦与功能相似的LED电路不相上下。认为LCD价格比LED高的观点也已过时。液晶显示器还有一个优点,那就是可以根据用户和市场需要设计任意复杂字符,并且任意复杂字符在控制时都当成一个笔画考虑,控制复杂字符就像控制一个小数点一样非常简便。例如,长沙太阳人电

11、子有限公司生产的SMS0501C型电子秤专用LCM,除了有5位数码管以显示5位数字之外,还能显示“kg公斤”以及“元”,其中“kg 公斤”、“元”都各作为一个笔画考虑。还有,液晶裸屏与控制器的连接件已经不单纯是排线或斑马条,方便实用的金属针脚LCD商品已经推向市场。金属针脚LCD商品的出现,为广大电子技术和单片机爱好者直接涉猎LCD控制大开方便之门。最初的一位LCD数码管以及CD4056控制的一位数码型LCM目前都已经趋于被淘汰。市场上的LCD数码管以及数码型LCM至少是3.5位或4位以上的。即使有高亮度LED产品,也改变不了LED在显示领域降格为LCD的附属物即LED为LCD提供背光的现实。

12、无论从整体效果,从用户硬件软件设计,还是从价格来看,LCD都优于LED。总之,液晶显示器为当今各种机电产品、电子产品等显示器首选品种。具体进行液晶显示设计时,LCM一般都应当是首选品种。只有若干位数码时,还可以考虑采用普通单片机直接驱动LCD,以提高控制灵活性并降低成本。3认为11.0592MHz是无理数而随意舍去尾数串行通信双方应当以相同的数据传输速率即波特率工作。串行通信双方的波特率误差大到一定程度时,势必影响串行通信的正常可靠进行。下面首先分析串行通信双方波特率允差。异步通信发送方开始数据发送前,首先发送一个低电平起始位,告诉接受方,发送数据的过程马上要开始,然后每隔一个波特率周期发送一

13、个数据位,7到8个数据位发送完毕后,可以发送一个奇偶校验位或地址数据识别位,最后发送一个高电平停止位。图1 11位格式的异步通信数据传输将低电平起始位、若干数据位、可能的奇偶校验位和高电平停止位组成的数据流称为一帧数据。同步通信不需要起始位、奇偶校验位或停止位。接收方以16倍波特率的速率连续检测数据传输线电平,以探测数据传输线上有无起始位到来。起始位到来时刻的检测误差为检测速率的倒数。检测速率越高,检测误差就越小。当检测结果为高电平时,判断为无数据传输。一旦检测到低电平,就在过半个波特率周期后即在应有的起始位中点b和左边点a、右边点c,见图1,再连续检测三次,a到b、b到c时间差均等于检测速率

14、的倒数。若连续3次检测结果中至少有2次为低电平,就判断为起始位0来到,否则认为是一个干扰而不理会。判断起始位来到后,每过一个波特率周期,就连续3次检测数据位,并以3取2的规则判断检测结果是0还是1。每个数据位的检测都在数据脉冲中间段进行,并且以3取2方法滤除可能的干扰,是保证异步串行通信可靠性的基本手段。异步通信收发双方只是约定使用相同的波特率,实际双方各自有波特率发生器且自产自用,因此异步通信收发双方的波特率只是理论上要求相等,实际上不可能相等。就是说,异步通信收发双方的波特率实际上总有差异,这就是异步通信名称的由来。若收方波特率与发方波特率相差甚大,则将使收方数据采集逐渐偏离发送数据中位,

15、甚至在发送数据有效范围的边沿采集。收方波特率与发方波特率相差越大,采集位置误差就越大。一帧数据位数越多,采集位置误差就越大。设一帧数据总位数为n,发方波特率为f1,收方波特率为f2。从图1可看出,接收方过1.5/f2时间读bit0,过2.5/f2时间读bit1,过(n-0.5)/f2时间读停止位。累积误差影响最大的是停止位的读取。若(n-0.5)/f2n/f1,欲读停止位,实际读的却是空闲位1甚至是下一帧数据的起始位0。总之,要保证正确地读取停止位,应当有即有从中解出接收方波特率f2应当满足的条件 (a)从上式可解出一帧数据为10,11位时接收方波特率f2应当满足的条件。n=10时,接收方波特

16、率f2应当满足条件,允差5.6%。n=11时,接收方波特率f2应当满足条件,允差5.0%。可以看出,一帧数据的总位数n越大,收方波特率与发方波特率允差就越小。上述分析只是粗略估计。实际上应当考虑的因素更多,例如接收方检测一帧数据起始位的频率不是无穷大,而是有限的16倍波特率,故时间分割不是无穷小,因此存在起始位检测误差,使异步通信接收方波特率与发送方波特率允差比上述数值更小。串行通信常见一帧数据以10位、11位居多,因此可认为串行通信双方波特率允差为6%。早期的MCS48单片机没有串行口。在很多工业设备已经使用串行通信的情况下,为了拓宽市场,MCS51单片机设置了串行口。此时串行通信波特率已经

17、标准化,工业设备常用波特率有300bps,600bps,1200bps,2400bps,4800bps,9600bps,19200bps等。因此MCS51单片机串行口只能向已有标准靠拢。因此就存在一个问题,用多大的晶振频率fosc和时间常数X来实现工业设备常用波特率300bps,600bps,1200bps,2400bps,4800bps,9600bps, 19200bps。设SMOD=0,晶振频率fOSC=12MHz,代入到51单片机串行通信方式1、3 异步通信波特率计算公式中有 (b) 从中可求出实现波特率B所需要的时间常数X (c) 将B=1200bps代入到式(c),可计算理论时间常数

18、X=229.96,实际时间常数X只能取整数,取X=230,代入到式(b)可计算实际所获得波特率B=1201.9bps,与标准值1200bps相比,波特率误差为0.16%。表1 fosc=12MHz条件下实现的波特率及其误差要求波特率BX理论值X实际值实际波特率波特率误差1200229.962301201.90.16%2400242.982432403.80.16%4800249.492494464.37%9600252.7425310416.78.5%同理根据B=2400bps,4800bps,9600bps可计算理论时间常数、实际时间常数、实际所得波特率以及波特率误差,见表1。可以看出,采用

19、12MHz晶振频率时,要求波特率1200bps和2400bps,实际波特率各为1201.9bps、2403.8bps,波特率误差远远小于6%,故设备能正常工作;要求波特率4800bps和19200bps,实际波特率各为4464.3bps、10416.7bps,波特率误差明显超出允许的6%范围,设备就不能工作了。事实上的确如此。同时也证明了式(a)符合实际。设SMOD=1,再将fOSC=11.0592MHz代入方式1、3 异步通信波特率计算公式中有表2 fosc=11.0592MHz条件下实现的波特率及其误差要求波特率BX值波特率实际值300643006001606001200208120024

20、00232240048002444800960025096001920025319200可以看出,方式1,3下的波特率计算公式中的分母,而,除了能除尽外,还剩余,因此用作晶振频率时,51单片机串行口选工作方式2、定时器工作于组合模式2时可以产生工业设备常用波特率300bps,600bps,1200bps,2400bps,4800bps, 9600bps,19200bps。现在可以总结常用的6MHz、12MHz、11.0592MHz晶振频率的优点:6MHz晶振频率的机器周期是整数,12MHz晶振频率的机器周期是整数,进行时间控制时程序设计很方便。11.0592MHz晶振频率的优点是适合产生300

21、19200bps之间的常用倍增波特率。51单片机采用fOSC=11.0592MHz晶振频率的目的就是用工作于组合模式2的自重装定时器T1的整数初值获得300,600,1200,2400,4800,9600,19200等常用整数波特率,以保证异步通信接发双方的波特率至少在名义上相等,为在晶振频率误差不大的条件下保证异步通信接发双方的波特率尽可能接近打下基础。尽管这样,也不是所有的51单片机晶振频率都采用11.0592MHz。这是因为,很多51单片机仅仅使用双机串行通信或同步通信方式,两个情况下都没有必要采用标准波特率30019200bps。4使用液晶显示时液晶驱动专用单片机必用液晶驱动专用单片机

22、与液晶显示模块都是基于解决液晶驱动难的问题而设计的,两者差不多同时问世。单片机的一个发展趋势是把越来越多的功能模块集成在单片机芯片内。把液晶显示模块集成在单片机芯片内,并设计必要的接口,就形成液晶驱动专用单片机。液晶显示模块已经形成巨大的市场和规模效益,对比之下,市场上很少能见到液晶驱动专用单片机产品。因此,综合看来,使用液晶驱动专用单片机方案的成本要明显高于使用液晶显示模块方案的成本。要看到,液晶显示模块在与液晶驱动专用单片机的竞争中明显处于上风,新兴的普通单片机直接驱动LCD技术对液晶显示模块是一个冲击。总之,选择液晶显示方案时液晶驱动专用单片机必用的观点一般并不合适。选择液晶显示方案时首

23、选品种一般应为液晶显示模块LCM。如果液晶显示为数码型,甚至可以考虑直接用普通单片机,如51单片机,直接驱动LCD裸屏。5输入接口电路上拉电阻必用上拉电阻指接在正电源与I/O口线之间的电阻。51单片机除了P0口没有上拉电阻,属于漏极开路结构之外,P1、P2、P3口内部都设有上拉电阻。设有上拉电阻的准双向I/O口作输出时,可以直接提供高电平或低电平输出,作输入时若无按键按下,也能提供高电平输入;若有接在口线与地之间的按键按下,则能提供低电平输入。很明显,51单片机P1、P2、P3作输入时不需要外接上拉电阻。但是很不幸,在一些单片机教科书里,甚至个别流行比较广的号称是“十一五”国家级规划教材的单片

24、机教科书里,51单片机P1口作输入时统统都外接上拉电阻,真是有些画蛇添足。学生用这样的教科书学习单片机,不仅学不到知识,反而是越学越糊涂。漏极开路结构的P0口最适合直接提供灌电流输出,提供电压输出或输入时才需要外接上拉电阻。上拉电阻结构的P1、P2、P3口最适合直接提供电压输出或输入,当然也可以提供灌电流输出。为节省外接元件,达到最佳设计效果,安排I/O口时,应当优先用P0口提供灌电流输出,优先用P1、P2、P3口供电压输出或输入。这里还有一个51单片机P0口外接上拉电阻阻值多大为宜的问题。早期的MCS51单片机P1、P2、P3口内部上拉电阻大约在,而近期的AT89C/S51单片机P1、P2、

25、P3口内部上拉电阻大约在。经验也表明,通常上拉电阻有些大,而上拉电阻有些小。总之,只考虑电平电压问题时,单片机外接上拉电阻以为好,电阻额定功率1/8W就足以。651单片机程序存贮器0323H单元必留大家知道,51单片机程序存贮器0323H单元可以留给中断服务子程序入口使用,不用中断功能时也可以留给主程序使用。就是说,不用中断时主程序可以从程序存贮器0单元开始一直存放下去,而不必避开0323H单元。这样的程序结构最简单,特别适合初学者使用。不幸的是,一些人不管是否使用中断,总是要把程序存贮器0323H单元留给中断服务子程序入口用。这样做看似正规,其实呆板。因为这样做把主程序割裂成两部分,无形中增

26、加了初学者的困难。灵活的做法应当是,使用中断功能时主程序绕开0323H单元,不用中断功能时主程序从程序存贮器0单元开始一直存放下去,而不必避开0323H单元。7反复执行指令的定时方式的计时精度最低很多人一直认为反复执行指令的定时方式的计时精度最低,并认为基于定时器中断的定时方式的计时精度最高。有人甚至说,基于反复执行指令的单片机控制电子钟日走时误差将达到不可思议的几十分钟。不用定时器和中断时,程序中反复执行的指令及执行次数无论有多少,执行的逻辑顺序以及执行过程中消耗的机器周期(时间)也是可数的。执行过程中消耗的机器周期可数,为精确设计计算奠定了基础。因此基于反复执行指令的定时方式可以做到没有机

27、器周期误差,达到最高计时精度。用某种方法确定系统实际计时误差后,还可以根据实际使用的晶振微调程序,进一步提高计时精度。相比之下,用定时器进行时间控制时,其实存在一些不确定因素。请看下面的例子试在fosc=6MHz晶振条件下用51单片机定时器T0编制延时1秒子程序。解:显然一次定时不足以完成1秒延时,需要多次定时。为计算方便,取一次定时时间,则需要定时次数为次。T0应当选用组合模式1。计数器计数次数计数器送入初值程序算法:每次定时100ms,循环10次定时1s。T0选软件启动、定时工作方式、组合模式1,TMOD控制字各位为GATE=0,M1M0=00。T1闲置不用,TMOD控制字高4位按一般做法

28、设为0,则整个TMOD控制字应为TMOD=B本程序用查询方式。单片机复位后正好处在查询即非中断模式,符合需要,因此不用理会中断控制字IE。程序占用:T0,R7子程序:DELAY:MOV R7,#10 ;定时10次MOV TMOD,#B;设T0为组合模式1SETB TR0 ;T0软线圈通电,启动定时器L1: MOV TL0,#0B0H ;送初值低位 MOV TH0,#3CH ;送初值高位JNB TF0,$ ;原地踏步等待100ms定时结束 CLR TF0 ;软件清除CTC进位标志,为下次100ms定时作好准备 DJNZ R7,L1 ;循环10次定时1秒RET首先,程序执行主要消耗在其中的JNB

29、TF0,$上,但是其余指令也要消耗时间而造成误差,这就造成一些不确定因素,影响定时精度。再看下面的程序段:SETB TR0 ;T0软线圈通电,启动定时器MOV TL0,#0FFH ;送初值低位 MOV TH0,#3CH ;送初值高位该程序要求计数器从3CFFH基础上加1成为3D00H。实际上计数器低位0FFH加1即向高位进位,2个机器周期后初值高位3CH在进位后才送入计数器高位,使得进位无效,产生定时误差。如果使用定时器配合中断完成时间控制,则由于中断响应要在38个机器周期内进行,其中有5个不确定机器周期,因此要造成更大的计时误差。实践已证明,认为反复执行指令的定时方式的计时精度最低的观点实在

30、有些主观臆断。实际情况是,使用定时器配合中断定时精度最低,使用定时器查询方式定时精度比较低,而反复执行指令的定时方式的计时精度可以达到最高。本文第二部分介绍的电子钟控制程序就采用了反复执行指令的定时方式的计时方式,其精度达到了无机器周期误差,用精度的晶振,达到了日走时误差小于半秒的精度,很多表实际达到了日走时误差0.1秒的精度。8定时器必讲必学必用定时器是计算机(包括单片机)的一个附加功能模块。有了定时器,在某些场合下计算机能以更高的效率完成更多更复杂的任务,但是定时精度不一定有多高。受定时器定时精度高等观点的影响,单片机教学中存在一种定时器必讲必学必用的误区。这个误区主观增加了学生的学习难度

31、。产生这个误区的原因是主观上认为定时器计时精度高,所以一定要讲要学要用定时器。殊不知定时器计时程序中可能存在不确定因素,因此定时器计时精度比不上反复执行指令的简单方式。9中断必讲必学必用受定时器配合中断定时精度高等错误观点的影响,单片机教学中还存在一种中断必讲必学必用的误区。这个误区更增加了学生的学习难度。其实在很多控制系统中,中断不是必须。笔者在19861989年用Z80汇编语言和MCS51汇编语言编制了4部机电一体化控制程序。其中只有塑料制袋机的电子控制程序采用中断功能,其余3部程序,即切削力采集显示打印控制程序、机械传动效率数据记录程序以及振动攻丝机控制程序,都没有使用中断功能。不用中断

32、,不仅没有影响工作任务的完成,连程序代码质量也没有影响。众所周知,定时器和中断都属于计算机的附属功能。把附属功能误认为是主要的必不可少的功能,就容易走进本末倒置的误区。总之,要明确定时器和中断都属于计算机的附属功能。这些附属功能可以放在稍后讲授。课时比较少时,这些附属功能可以安排为自学,少讲甚至不讲。10 51单片机主程序从非0地址开始存放任何一种计算机,包括单片机,都规定主程序从特定单元开始存放,机器复位后即从特定单元取指令开始执行主程序。51单片机规定主程序从0单元开始存放,机器复位后即从0单元取指令开始执行主程序。但是一些教师指导实验时,却让学生从2000H等非零单元开始存放主程序。幸运

33、的是,这种不合适的做法实际并不影响主程序的正常执行,于是这种不合适的做法在一段时间内竟然还堂而皇之地“合法化”了。通常程序存贮器不写入的单元事先都默认为B。程序从2000H单元写入,就使0000H1FFFH单元内容统统保留B。而机器码B代表指令MOV R7,A,即把累加器A内容送到寄存器R7。因此,主程序从2000H单元开始存放,相当于前边有2000H条MOV R7,A指令。不过再多的MOV R7,A指令也只影响寄存器R7内容。而一般主程序都不直接使用R7内容。所以51单片机主程序即使从非零地址开始存放,一般也不影响主程序的执行。但是,51单片机主程序从非零地址开始存放的消极影响很多。51单片

34、机主程序从非零地址开始存放,不仅造成很多误解,还要减小程序存贮器可利用容量。51单片机主程序从非零地址开始存放的错误做法的来源,应当是一些人不加思考地全盘照搬20年前风行全国的TP801单板机的一些模式。计算机一般都有一个外壳,用户看不到计算机内部元器件及线路板等结构,暴露在外边的通常只有显示屏和键盘。美国科学家独辟蹊径,设计了一种教学用的Z80单板微型机,采用了Z80CPU和LED数码管显示器,并把LED数码管显示器和简易键盘做在主板上,所有元器件及线路板结构都对用户一览无遗,非常适合教学及扩展应用。1978年北京工业大学消化吸收改进美国这种教学用的Z80单板微型机,然后命名为TP801单板

35、机并由北京工业大学电子厂批量生产。TP801单板机像一丝新风吹遍全国。TP801单板机为全国各地厂矿企业、研究所及高校普遍认可。例如当时清华大学一下子就购买了100块TP801单板机。紧跟在北京工业大学后边,当时国内还有很多单位研制生产各种型号的Z80单板机。LED数码管就是随着TP801单板机的研制生产而迅速为人们认可并广泛应用的。北京工业大学引进并改进生产TP801单板机,对微机在我国的应用以及稍后单片机的引进和普及功不可没。笔者1977年考入河北工学院(今河北工业大学,211工程院校之一)后,曾经在学校计算中心的克罗曼科型Z80微电脑上用FORTRAN语言和BASIC语言进行科学计算和绘

36、图,但始终看不到Z80CPU芯片。单板机揭开了微型机的面纱。笔者就读大学时在黄孝安老师的TP801单板机上首次看到Z80CPU芯片,参加工作后有了一台自己可以操作的TP801单板机。那时全国各地厂矿企业、研究所及高校的机电技术人员几乎没有不接触TP801单板机的。很多人都是以TP801单板机和Z80汇编语言为入门开始向微机微电子技术包括单片机技术的大进军的。北京工业大学、北京工业大学电子厂以及TP801单板机在我国的影响如此大,以至于一些人把TP801单板机的一些模式错误地照搬到后来的51单片机中。通常微机可以用高级语言或WORD等应用程序输入用户程序,但TP801单板机只能在监控程序控制下输

37、入十六进制机器码用户程序。TP801单板机上的十六进制机器码用户程序与监控程序之间是一种顺序关系。监控程序好像BIOS,用户程序需要监控程序来引导。因此规定十六进制机器码用户程序从程序存贮器2000H号地址开始存放。51单片机采用的模式与TP801单板机不同。在51单片机中,通常不再有系统监控程序(BIOS)概念、用户程序概念以及两者之间的区别。从市场上购进的51单片机芯片和实验机上的51单片机都属于裸机。用户或者学员编制的程序,都是原始程序,自然应当按照规定从裸机程序存贮器0单元开始存放。二、基于反复执行指令的无机器周期误差可调整液晶电子钟在12小时计时制中,小时十位不是1就是前零,即无用的

38、零。通常要求熄灭前零。灭前零时,小时十位不是1就是灭,因此小时十位只要b、c两段就足矣。通常把只有b、c两段、只能显示1的数码管称为半位数码管。就是说,能够熄灭前零的12小时计时制计时LCD数码管通常为三位半即3.5位。图2 普通单片机直接驱动LCD玻璃板3.5位直接驱动位液晶电子钟电路3.5位数码管的半位中的b、c两段要么都亮要么都灭,在图2中统一用字母k表示,用1根信号线控制。按下Hour钮,可使小时加1,按下Minute钮,可使分钟加1。Hour钮、Minute 钮持续按下,可分别连续调整小时和分钟。用于计时的3.5位数码管通常在小时个位与分钟十位之间设置两个点,两个点每秒闪亮一次作为秒

39、计数。双点同时亮同时灭,因此双点在图2中统一用字母p表示,也用1根信号线控制。用AT89C52单片机直接控制专用3.5位计时LCD数码管,可以用15元左右的成本制成能显示小时分钟和闪亮的双秒点的液晶电子钟,其电路见图2。图2中的3.5位LCD计时数码管所有各段用的是同一个公共极com。对于每位数码管各有一个公共极的3.5位LCD数码管,可以把各段的公共极连接在一起作为总公共极。51单片机4个并行I/O口P0P3中,P0口线内部无上拉电阻,不能直接输出电压, P1P3内部有上拉电阻,能直接输出电压。因此,用单片机直接驱动液晶显示器时,应当优先选用P1P3。图2液晶电子钟电路,小时个位、分钟十位、

40、个位各需要7根口线,小时十位、秒钟双点及公共极各需要1根口线,总共需要根口线,P1P3恰好够用。因此选用P1P3直接驱动液晶数码管,P1、P2和P3口分别控制小时个位、分钟十位和分钟个位,其中P1.7、P2.7和P3.7各用于控制小时十位、闪亮双点和公共极(背极)。P0.7用于小时调整的命令输入、P0.6用于分钟调整的命令输入,整个单片机控制电路只用了2只上拉电阻,见图2。每次计时过后,用位传送指令将小时十位BCD数的个位送到P1.7,自动实现灭前零和显示1,将半秒计数器的个位送到P2.7,自动实现双点闪亮。在每个半秒内,每次输出复合字模后延时5ms,然后将复合字模取反后刷新输出,如此循环10

41、0次,完成0.5秒计时和显示。51单片机EST引脚对地之间内部有一个下拉电阻,因此图2省去了外接下拉电阻。硬件资源占用:累加器A工作寄存器:图3 3.5位LCD电子钟控制程序框图R7:小时数;R6:分钟数;R5:半秒钟数;R4:计数器;R3:小时复合字模;R2:分钟十位复合字模;R1:分钟个位复合字模。根据以上算法和硬件资源分配可画出计时程序框图。3.5位高精度可调整LCD电子钟控制程序: MOV R7, #07H ; 小时预置7时 MOV R6, A ; 分钟清零 MOV R5, A ; 半秒钟清零 MOV DPTR, #WMTAB ; 设字模表指针TIME:JB P0.7, HOUR0 ;

42、2 若调时键未按则检测调分键MOV A, R7 ; 调时键按下,小时数取到A ADD A, #1 ; 小时加1计数 DA A ; 十进制调整 MOV R7, A ; 小时数送回 CJNE A, #13H,HOUR0; 若没有计到13,则转去计半秒 MOV R7, #1 ; 计到13时,小时数回1HOUR0:JB P0.6, SSEC ;2 若调分键未按则转去计半秒MOV A, R6 ; 调分键按下,分钟数取到A ADD A, #1 ; 分钟加1计数 DA A ; 十进制调整 MOV R6, A ; 分钟数送回 CJNE A,#60H, SSEC ; 若没有计到60分则转去检测调时键MOV R6

43、, #0 ; 分钟数回0SSEC: INC R5 ;1 半秒加1计数 MOV A, R5 ;1 半秒数取到A CJNE A, #120, ADJ1;2 若没有计到120个半秒即60秒则转去字模处理 MOV R5, #0 ;1 计到60秒,半秒数回0MINU: MOV A, R6 ;1 分钟数取到A ADD A, #1 ;1 分钟加1计数 DA A ;1 十进制调整 MOV R6, A ;1 分钟数送回 CJNE A, #60H, ADJ2;2 若没有计到60分则转去字模处理 MOV R6, #0 ;1 分钟数回0HOUR: MOV A, R7 ;1 小时数取到A ADD A, #1 ;1 小时

44、加1计数 DA A ;1 十进制调整 MOV R7, A ;1 小时数送回 CJNE A, #13H, ADJ3;2 若没有计到13,则转去字模处理 MOV R7, #1 ;1 计到13时,小时数回1 SJMP WMC ;2ADJ1: 7-NOP ;(7)时间均衡,CJNE A,#120,ADJ1以下六条指令执行时间ADJ2: 7-NOP ;(7)时间均衡,CJNE A,#60H,ADJ2以下六条指令执行时间ADJ3: 3-NOP ;(3)时间均衡,CJNE A,#13H,ADJ3以下两条指令执行时间WMC: MOV A, R7 ;1 小时数送到累加器A MOV C, ACC.4 ;1 取小时

45、十位数字模到位累加器C ANL A, #0FH ;1 分离出小时个位数 MOVC A, A+DPTR ;2 查表取小时个位字模 MOV ACC.7, C ;2 小时十位字模与个位字模复合 MOV R1, A ;1 小时复合字模暂存到R1 MOV A, R5 ;1 取半秒钟数 MOV C, ACC.0 ;1 半秒钟个位(双点字模)送位累加器CMOV A, R6 ;1 一取分钟数 ANL A, #0F0H ;1 分离出分钟十位数 SWAP A ;1 分钟十位数送到个位位置 MOVC A, A+DPTR ;2 查表取分钟十位字模 MOV ACC.7, C ;2 分钟十位字模与双点字模复合 MOV R

46、2, A ;1 分钟十位复合字模暂存到R2 MOV A, R6 ;1 二取分钟数 ANL A, #0FH ;1 分离出分钟个位数 MOVC A, A+DPTR ;2 查表取分钟个位字模及COM信号 MOV R3, A ;1 分钟个位字模及COM信号暂存到R3 MOV R0, #22 ;1 以下2条指令系根据计时精度要求增加DJNZ R0, $ ;MOV R4, #100 ;1 电压极性循环次数,兼延迟次数DISP: MOV P3, R3 ; 输出分钟个位字模及COM信号 MOV P2, R2 ; 输出分钟十位复合字模 MOV P1, R1 ; 输出小时复合字模 MOV 30H, #5 ;LOO

47、P: MOV R0, #246 ; DJNZ R0, $ ; DJNZ 30H, LOOP ; 5-NOP ; 根据计时精度要求增加 MOV A, R1 ; 取分钟个位字模 CPL A ; 字模取反 MOV R1, A ; 改变驱动电压极性 MOV A, R2 ; 取分钟十位复合字模 CPL A ; 字模取反 MOV R2, A ; 改变驱动电压极性 MOV A, R3 ; 取小时复合字模 CPL A ; 字模取反 MOV R3, A ; 改变驱动电压极性 DJNZ R4, DISP ;MOV A,#0FFH ;1MOV P1, A ;1 暂时关掉LCD,保证50%占空比 MOV P2, A

48、;1MOV P3, A ;1AJMP TIME ;2WMTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END“7-NOP”等在此是简化写法,用伟福等汇编器汇编前应改写为7条NOP指令。注释后的数字代表参与正常计时的指令所用机器周期数。从标号TIME到WMC(不含WMC)之前参加计时循环的指令共19条,总共消耗个机器周期。从标号WMC到DISP(不含DISP)之前的以及标号WMTAB之前的21条指令,以及MOV A,#0FFHAJMP TIME 共5条指令,参加计时显示循环的指令共26条,总共消耗个机器周期。外层计时循环共消耗31+69=100个机

49、周。从标号DISP到DJNZ R4,DISP之间的中、内层循环共用个机器周期耗时半秒的整个循环共用 +100=个机器周期。晶振频率fosc=6MHz时,机周等于2,个机器周期,折合,折合500ms即半秒。本3.5位液晶电子钟电源电流约4mA,折合功耗20mW。本液晶电子钟程序实现了无机器周期误差。本3.5位液晶电子钟硬件软件均已经过调试,并且经过长时间考机,可靠性和精度均得到验证。本文作者使用频率精度的6MHz晶振制作了一批液晶电子钟,对其中4机考机验证,结果实际日走时误差各为+0.5秒、-0.1秒、-0.2秒、-0.4秒,达到实用要求。参加考机4个液晶电子钟的平均误差基本为0,说明控制程序确

50、实没有机器周期误差。若使用精度高于的晶振,走时误差会更低。AT89系列51单片机电源电压36V,液晶板电源电压4.5V.市售价格10元左右的万能手机充电器输出电压4.34.4V,能作为本液晶电子钟的工作电源。传统的MCS51系列单片机芯片工作时发热很厉害,手模芯片热感很强。AT8951系列51单片机功率消耗很小,工作时手模芯片很难有热感。我们制作的液晶电子钟的单片机芯片就卧在液晶玻璃板下边的空当中,整个板子只有大小,读者制作时可咨询。晶振频率改为12MHz,并调整程序,可进一步提高计时精度。本文部分内容节选自元增民、张文希编著、国防科技大学出版社2006年6月出版的单片机原

51、理与应用基础一书,在此谨致谢意。附件1:给电子报编辑部的说明对稿件的出处补充说明如下,以供审稿专家参考。文中所说将有理数11.0592MHz误认为是无理数的谬误,发生在很多单片机教材中,其中有李朝青编、北航出版的单片机原理与接口技术(第三版),还有中国机械工业教育协会组编、机械工业出版社出版的单片机原理与应用。文中所说上拉电阻必用的谬误,也发生在很多单片机教材中,其中以李朝青编、北航出版的单片机原理与接口技术最为明显。该书大约三分之二的插图中都有滥用上拉电阻的毛病,使人越学越糊涂,误导作用极坏。文章介绍的液晶电子钟控制程序就是用反复执行指令方式计时的,实际表明这种电子钟用普通晶振就能具有很高的

52、计时精度,达到了实用要求。我们的学生已经制作了一批这样的电子钟,配上一个万能手机充就可以工作。附件2:李朝青单片机原理及接口技术第3版教材若干重大错误(仅供长沙学院学生内部使用)一般讲,教材中个别文字及数字错漏在所难免。尽管已经是第3版,李朝青单片机原理及接口技术教材还是存在个别文字及数字错漏。但是,李朝青单片机原理及接口技术教材的主要问题已经不仅仅是个别文字及数字错漏,而是系统性的错误问题。下面的讨论不涉及个别文字及数字错漏,只讨论影响比较大的系统性的概念性的错误。一 插图错误错误不仅发生在接口电路图,而且大量发生在程序。这里仅讨论容易鉴别的接口电路,不涉及程序框图和程序。这样的接口电路(不

53、含I2C部分)共有约30幅,其中23幅有错误,其中更有10幅是根本性错误。总之,该书所述接口电路中有问题的占同类电路的将近80%,对学员的误导作用是非常大的,必须引起足够的警惕。1第127页图5-14以下三处错:(1) 四只4.7k上拉电阻多余,因为单片机P1口内部已经有上拉电阻;(2) 四只200限流电阻阻值太小,使LED工作电流,远远超过本书第47页所介绍P1“端口只能提供几毫安的输出电流”的比较合适的说法,将烧毁单片机,这是一条根本性错误即不能容忍的错误;(3) 两只1k上拉电阻阻值嫌小。2第128页图5-15该图出现根本性错误,因为51单片机P1口只适合提供灌电流输出。按照该图设计电路,即使限流电阻阻值取最小,LED也只能获得约0.15mA的电流,根本不足以使LED正常发光。3第148页图7-1(a)并行通信缺读信号和写信号线各一根。4第157页图7-10时钟脉冲信号上升沿没有对准数据有效阶段,没有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论