<?xml version="1.0" encoding="GBK"?>
<?xml-stylesheet href="/style/rss.css" type="text/css"?>
<rss version="2.0" xmlns:eb="http://blog.tom.com/">
<channel>
  <title>冰河世界----51单片机</title>
  <link>http://blog.tom.com/hbh9</link>
  <description><![CDATA[有时候，不幸会让人黯然，不过我相信阳光和前路，相信只要用心生活，每个人的路，走时重重，回眸云淡风清。 ]]></description>
  <language>zh</language>
  <generator>newblog.tom.com RSS</generator>
  <pubDate></pubDate>    <item>
		<title><![CDATA[ 重要声明 ]]></title>
		<link>http://blog.tom.com/hbh9/article/452.html</link>
		<description><![CDATA[ <div >基于单片机的时钟电路的设计 </div><div ></div><div >在网上看到你们的留言,很感谢大家.我把我做的课程设计给各位发过去,个位参考下,完整可以打印版的已经丢失,这是相对完整的,当然没有开题部分,对与参考程序可以将电路搭建起来调试,其实很简单的,我有做好的板子,只是没有照片,不然大家也可以参照了.<br />&nbsp; 认真都懂程序,汇编是基础,其实电路图就在程序中.<br />时钟可以显示时间,也可以显示年月日,由于数码管少,所以显示需要手动.后来我改成用lcd显示了,这都全显示出来了.呵呵,花了我45快银子呀.所以还是好好都程序<br /><br />有需要完整设计文档的留下联系方式<br />或者给我邮电：h_9b@163.com<br />qq:277841827</div><div ></div><div >由于tom公司的网站速度太慢了,我打算把资料都搬到新的博客上：<a href="http://hanbinghe.52rd.net">http://hanbinghe.52rd.net</a></div><div >收集的电子资料,单片机资料以及pcb资料,各位有需要的联系,希望能多多交流</div><div >以下是pcb设计样板</div><div ></div><div ><img src="http://html.blog.tom.com/fileserver/img/3/87/38744/20070526/1180149720.jpg" alt="" /></div><div ></div><div >多多交流呀</div><div ><img src="http://pic14.album.tom.com/album_pic/2005/05/21/451b5eaf98263911b1df57fd13b0dec9" alt="" /></div> ]]></description>
		<eb:creationDate>2007-05-26 11:14:31</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ 我的照片 ]]></title>
		<link>http://blog.tom.com/hbh9/article/451.html</link>
		<description><![CDATA[ <img src="http://html.blog.tom.com/fileserver/img/3/87/38744/20070424/1177379845.jpg" alt="" /> ]]></description>
		<eb:creationDate>2007-04-24 09:57:34</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ 稳压二极管测试 ]]></title>
		<link>http://blog.tom.com/hbh9/article/449.html</link>
		<description><![CDATA[ 稳压二极管应用及其广泛，这里介绍一种能准确测量稳压二极管稳压值的简易方法：如图1-1①，测量稳压值在15V以下的稳压管，可用二只9V的电池，用封口胶带布将其粘在一起。留出四个输出端。将两只电池的各一只输出端（一正一负）用一个4.5K的电阻连接起来，另外的两只输出端即可用于测试。<br>测试方法：将万用表调至25V直流挡。两表笔分别接于电池的测试端，万用表即显示出两电池的串联电压（18V）。将待测稳压管的正负极分别接触到表笔正负极上。万用表所显示的电压值则为稳压管的稳压值。若万用表所显示的电压不变，则说明稳压管的稳压值高于电池的电压或内部断路。若万用表显示的电压大大低于预测值，接近0V，说明稳压管内部已短路损坏，或极性接错。可调换极性再测。稳压值大于15V的稳压管。可以增加电池只数和电阻，或按图1-1②组装，将万用表及稳压管先接好。万用表的电压挡由高至低调整，分数次测试。<br>由于以上两种电路的测试电流均在稳压管的工作电流之下，所以不会损坏稳压二极管，但按图1-1②测试时，人体不要接触带电部分，，每次测量后将电容放电完毕再进行下一次测量。<br><DIV align=center><img src=http://images.blog.tom.com/file/4/4/17/f_38744_35364.jpg name=pic Border=0 ></DIV> ]]></description>
		<eb:creationDate>2006-04-19 21:35:10</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ 二极管的检测 ]]></title>
		<link>http://blog.tom.com/hbh9/article/448.html</link>
		<description><![CDATA[ （一）普通二极管的检测 （包括检波二极管、整流二极管、阻尼二极管、开关二极管、续流二极管）是由一个PN结构成的半导体器件，具有单向导电特性。通过用万用表检测其正、反向电阻值，可以判别出二极管的电极，还可估测出二极管是否损坏。　　1．极性的判别&amp;nbsp; 将万用表置于R×100档或R×1k档，两表笔分别接二极管的两个电极，测出一个结果后，对调两表笔，再测出一个结果。两次测量的结果中，有一次测量出的阻值较大（为反向电阻），一次测量出的阻值较小（为正向电阻）。在阻值较小的一次测量中，黑表笔接的是二极管的正极，红表笔接的是二极管的负极。　　2．单负导电性能的检测及好坏的判断&amp;nbsp; 通常，锗材料二极管的正向电阻值为1kΩ左右，反向电阻值为300左右。硅材料二极管的电阻值为5 kΩ左右，反向电阻值为∞（无穷大）。正向电阻越小越好，反向电阻越大越好。正、反向电阻值相差越悬殊，说明二极管的单向导电特性越好。　　若测得二极管的正、反向电阻值均接近0或阻值较小，则说明该二极管内部已击穿短路或漏电损坏。若测得二极管的正、反向电阻值均为无穷大，则说明该二极管已开路损坏。　　3．反向击穿电压的检测&amp;nbsp; 二极管反向击穿电压（耐压值）可以用晶体管直流参数测试表测量。其方法是：测量二极管时，应将测试表的“NPN/PNP”选择键设置为NPN状态，再将被测二极管的正极接测试表的“C”插孔内，负极插入测试表的“e”插孔，然后按下“V（BR）”键，测试表即可指示出二极管的反向击穿电压值。　　也可用兆欧表和万用表来测量二极管的反向击穿电压、测量时被测二极管的负极与兆欧表的正极相接，将二极管的正极与兆欧表的负极相连，同时用万用表（置于合适的直流电压档）监测二极管两端的电压。如图4-71所示，摇动兆欧表手柄（应由慢逐渐加快），待二极管两端电压稳定而不再上升时，此电压值即是二极管的反向击穿电压。　　<br>（二）稳压二极管的检测&amp;nbsp; &amp;nbsp;  1．正、负电极的判别&amp;nbsp; 从外形上看，金属封装稳压二极管管体的正极一端为平面形，负极一端为半圆面形。塑封稳压二极管管体上印有彩色标记的一端为负极，另一端为正极。对标志不清楚的稳压二极管，也可以用万用表判别其极性，测量的方法与普通二极管相同，即用万用表R×1k档，将两表笔分别接稳压二极管的两个电极，测出一个结果后，再对调两表笔进行测量。在两次测量结果中，阻值较小那一次，黑表笔接的是稳压二极管的正极，红表笔接的是稳压二极管的负极。　　若测得稳压二极管的正、反向电阻均很小或均为无穷大，则说明该二极管已击穿或开路损坏。　　2．稳压值的测量&amp;nbsp; 用0~30V连续可调直流电源，对于13V以下的稳压二极管，可将稳压电源的输出电压调至15V，将电源正极串接1只1.5kΩ限流电阻后与被测稳压二极管的负极相连接，电源负极与稳压二极管的正极相接，再用万用表测量稳压二极管两端的电压值，所测的读数即为稳压二极管的稳压值。若稳压二极管的稳压值高于15V，则应将稳压电源调至20V以上。　　也可用低于1000V的兆欧表为稳压二极管提供测试电源。其方法是：将兆欧表正端与稳压二极管的负极相接，兆欧表的负端与稳压二极管的正极相接后，按规定匀速摇动兆欧表手柄，同时用万用表监测稳压二极管两端电压值（万用表的电压档应视稳定电压值的大小而定），待万用表的指示电压指示稳定时，此电压值便是稳压二极管的稳定电压值。　　若测量稳压二极管的稳定电压值忽高忽低，则说明该二极管的性不稳定。　　图4-72是稳压二极管稳压值的测量方法。　<br>　（三）双向触发二极管的检测　　1．正、反向电阻值的测量 用万用表R×1k或R×10k档，测量双向触发二极管正、反向电阻值。正常时其正、反向电阻值均应为无穷大。若测得正、反向电阻值均很小或为0，则说明该二极管已击穿损坏。　　2．测量转折电压&amp;nbsp; 测量双向触发二极管的转折电压有三种方法。　　第一种方法是：将兆欧表的正极（E）和负极（L）分别接双向触发二极管的两端，用兆欧表提供击穿电压，同时用万用表的直流电压档测量出电压值，将双向触发二极管的两极对调后再测量一次。比较一下两次测量的电压值的偏差（一般为3~6V）。此偏差值越小，说明此二极管的性能越好。　　第二种方法是：先用万用表测出市电电压U，然后将被测双向触发二极管串入万用表的交流电压测量回路后，接入市电电压，读出电压值U1，再将双向触发二极管的两极对调连接后并读出电压值U2。　　若U1与U2的电压值相同，但与U的电压值不同，则说明该双向触发二极管的导通性能对称性良好。若U1与U2的电压值相差较大时，则说明该双向触发二极管的导通性不对称。若U1、U2电压值均与市电U相同时，则说明该双向触发二极管内部已短路损坏。若U1、U2的电压值均为0V，则说明该双向触发二极管内部已开路损坏。　　第三种方法是：用0~50V连续可调直流电源，将电源的正极串接1只20kΩ电阻器后与双向触发二极管的一端相接，将电源的负极串接万用表电流档（将其置于1mA档）后与双向触发二极管的另一端相接。逐渐增加电源电压，当电流表指针有较明显摆动时（几十微安以上），则说明此双向触发二极管已导通，此时电源的电压值即是双向触发二极管的转折电压。　　图4-73是双向触发二极管转折电压的检测方法。　　<br>（四）发光二极管的检测　　1．正、负极的判别&amp;nbsp; 将发光二极管放在一个光源下，观察两个金属片的大小，通常金属片大的一端为负极，金属片小的一端为正极。　　2．性能好坏的判断　　用万用表R×10k档，测量发光二极管的正、反向电阻值。正常时，正向电阻值（黑表笔接正极时）约为10~20kΩ，反向电阻值为250kΩ~∞（无穷大）。较高灵敏度的发光二极管，在测量正向电阻值时，管内会发微光。若用万用表R×1k档测量发光二极管的正、反向电阻值，则会发现其正、反向电阻值均接近∞（无穷大），这是因为发光二极管的正向压降大于1.6V（高于万用表R×1k档内电池的电压值1.5V）的缘故。　　用万用表的R×10k档对一只220μF/25V电解电容器充电（黑表笔接电容器正极，红表笔接电容器负极），再将充电后的电容器正极接发光二极管正极、电容器负极接发光二极管负极，若发光二极管有很亮的闪光，则说明该发光二极管完好。　　也可用3V直流电源，在电源的正极串接1只33Ω电阻后接发光二极管的正极，将电源的负极接发光二极管的负极（见图4-74），正常的发光二极管应发光。或将1节1.5V电池串接在万用表的黑表笔（将万用表置于R×10或R×100档，黑表笔接电池负极，等于与表内的1.5V电池串联），将电池的正极接发光二极管的正极，红表笔接发光二极管的负极，正常的发光二极管应发光。　　<br>（五）红外发光二极管的检测　　1．正、负极性的判别&amp;nbsp; 红外发光二极管多采用透明树脂封装，管心下部有一个浅盘，管内电极宽大的为负极，而电极窄小的为正极。也可从管身形状和引脚的长短来判断。通常，靠近管身侧向小平面的电极为负极，另一端引脚为正极。长引脚为正极，短引脚为负极。　　2．性能好坏的测量&amp;nbsp; 用万用表R×10k档测量红外发光管有正、反向电阻。正常时，正向电阻值约为15~40kΩ（此值越小越好）；反向电阻大于500kΩ（用R×10k档测量，反向电阻大于200 kΩ）。若测得正、反向电阻值均接近零，则说明该红外发光二极管内部已击穿损坏。若测得正、反向电阻值均为无穷大，则说明该二极管已开路损坏。若测得的反向电阻值远远小于500kΩ，则说明该二极管已漏电损坏。　　<br>（六）红外光敏二极管的检测　　将万用表置于R×1k档，测量红外光敏二极管的正、反向电阻值。正常时，正向电阻值（黑表笔所接引脚为正极）为3~10 kΩ左右，反向电阻值为500 kΩ以上。若测得其正、反向电阻值均为0或均为无穷大，则说明该光敏二极管已击穿或开路损坏。　　在测量红外光敏二极管反向电阻值的同时，用电视机遥控器对着被测红外光敏二极管的接收窗口（见图4-75）。正常的红外光敏二极管，在按动遥控器上按键时，其反向电阻值会由500 kΩ以上减小至50~100 kΩ之间。阻值下降越多，说明红外光敏二极管的灵敏度越高。　　<br>七）其他光敏二极管的检测　　1．电阻测量法&amp;nbsp; 用黑纸或黑布遮住光敏二极管的光信号接收窗口，然后用万用表R×1k档测量光敏二极管的正、反向电阻值。正常时，正向电阻值在10~20kΩ之间，反向电阻值为∞（无穷大）。若测得正、反向电阻值均很小或均为无穷大，则是该光敏二极管漏电或开路损坏。　　再去掉黑纸或黑布，使光敏二极管的光信号接收窗口对准光源，然后观察其正、反向电阻值的变化。正常时，正、反向电阻值均应变小，阻值变化越大，说明该光敏二极管的灵敏度越高。　　2．电压测量法&amp;nbsp; 将万用表置于1V直流电压档，黑表笔接光敏二极管的负极，红表笔接光敏二极管的正极、将光敏二极管的光信号接收窗口对准光源。正常时应有0.2~0.4V电压（其电压与光照强度成正比）。　　3．电流测量法&amp;nbsp; 将万用表置于50μA或500μA电流档，红表笔接正极，黑表笔接负极，正常的光敏二极管在白炽灯光下，随着光照强度的增加，其电流从几微安增大至几百微安。　　<br>（八）激光二极管的检测　　1．阻值测量法&amp;nbsp; 拆下激光二极管，用万用表R×1k或R×10k档测量其正、反向电阻值。正常时，正向电阻值为20~40kΩ之间，反向电阻值为∞（无穷大）。若测得正向电阻值已超过50kΩ，则说明激光二极管的性能已下降。若测得的正向电阻值大于90kΩ，则说明该二极管已严重老化，不能再使用了。　　2．电流测量法&amp;nbsp; 用万用表测量激光二极管驱动电路中负载电阻两端的电压降，再根据欧姆定律估算出流过该管的电流值，当电流超过100mA时，若调节激光功率电位器（见图4-76），而电流无明显的变化，则可判断激光二极管严重老化。若电流剧增而失控，则说明激光二极管的光学谐振腔已损坏。　　<br><br>（九）变容二极管的检测　　1．正、负极的判别&amp;nbsp; 有的变容二极管的一端涂有黑色标记，这一端即是负极，而另一端为正极。还有的变容二极管的管壳两端分别涂有黄色环和红色环，红色环的一端为正极，黄色环的一端为负极。　　也可以用数字万用表的二极管档，通过测量变容二极管的正、反向电压降来判断出其正、负极性。正常的变容二极管，在测量其正向电压降时，表的读数为0.58~0.65V；测量其反向电压降时，表的读数显示为溢出符号“1”。在测量正向电压降时，红表笔接的是变容二极管的正极，黑表笔接的是变容二极管的负极。　　2．性能好坏的判断&amp;nbsp; 用指针式万用表的R×10k档测量变容二极管的正、反向电阻值。正常的变容二极管，其正、反向电阻值均为∞（无穷大）。若被测变容二极管的正、反向电阻值均有一定阻值或均为0，则是该二极管漏电或击穿损坏。　　<br>（十）双基极二极管的检测　　1．电极的判别 将万用表置于R×1k档，用两表笔测量双基极二极管三个电极中任意两个电极间的正反向电阻值，会测出有两个电极之间的正、反向电阻值均为2~10kΩ，这两个电极即是基极B1和基极B2，另一个电极即是发射极E。再将黑表笔接发射极E，用红表笔依次去接触另外两个电极，一般会测出两个不同的电阻值。有阻值较小的一次测量中，红表笔接的是基极B2，另一个电极即是基极B1。　　2．性能好坏的判断&amp;nbsp; 双基极二极管性能的好坏可以通过测量其各极间的电阻值是否正常来判断。用万用表R×1k档，将黑表笔接发射极E，红表笔依次接两个基极（B1和B2），正常时均应有几千欧至十几千欧的电阻值。再将红表笔接发射极E，黑表笔依次接两个基极，正常时阻值为无穷大。　　双基极二极管两个基极（B1和B2）之间的正、反向电阻值均为2~10kΩ范围内，若测得某两极之间的电阻值与上述正常值相差较大时，则说明该二极管已损坏。　　<br>（十一）桥堆的检测　　1．全桥的检测&amp;nbsp; 大多数的整流全桥上，均标注有“+”、“-”、“~”符号（其中“+”为整流后输出电压的正极，“-”为输出电压的负极，“~”为交流电压输入端），很容易确定出各电极。　　检测时，可通过分别测量“+”极与两个“~”极、“-”极与两个“~”之间各整流二极管的正、反向电阻值（与普通二极管的测量方法相同）是否正常，即可判断该全桥是否已损坏。若测得全桥内鞭只二极管的正、反向电阻值均为0或均为无穷大，则可判断该二极管已击穿或开路损坏。　　2．半桥的检测&amp;nbsp; 半桥是由两只整流二极管组成，通过用万用表分别测量半桥内部的两只二极管的正、反电阻值是否正常，即可判断出该半桥是否正常。　　<br>（十二）高压硅堆的检测　　高压硅堆内部是由多只高压整流二极管（硅粒）串联组成，检测时，可用万用表的R×10k档测量其正、反向电阻值。正常的高压硅堆，其正向电阻值大于200kΩ，反向电阻值为无穷大。若测得其正、反向均有一定电阻值，则说明该高压硅堆已软击穿损坏。　　（十三）变阻二极管的检测　　用万用表R×10k档测量变阻二极管的正、反向电阻值，正常的高频变阻二极管的正向电阻值（黑表笔接正极时）为4.5~6kΩ，反向电阻值为无穷大。若测得其正、反向电阻值均很小或均为无穷大，则说明被测变阻二极管已损坏。　　（十四）肖特基二极管的检测　　二端型肖特基二极管可以用万用表R×1档测量。正常时，其正向电阻值（黑表笔接正极）为2.5~3.5Ω，投向电阻值为无穷大。若测得正、反电阻值均为无穷大或均接近0，则说明该二极管已开路或击穿损坏。　　三端型肖特基二极管应先测出其公共端，判别出共阴对管，还是共阳对管，然后再分别测量两个二极管的正、反向电阻值。<br> ]]></description>
		<eb:creationDate>2006-04-19 21:25:41</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ 单片机C51编程几个有用的模块 ]]></title>
		<link>http://blog.tom.com/hbh9/article/447.html</link>
		<description><![CDATA[  要包含一个单片机硬件的资源头文件。<br>各模块使用了定义在Common.h中的一些数据类型。如:BIT(bit) BYTE(unsigned char)等，具体请参见源程序。<br>时钟模块<br>　　在单片机软件设计中, 时钟是重要资源, 为了充分利用时钟资源, 故设计本时钟模块。 本模块使用定时器0，在完成用户指定功能的同时, 还能够自动处理一些其它模块中与时钟相关的信息。<br>　　时钟模块由声明文件Timer.h以及实现文件Timer.c组成。<br>　　用户应该在Config.h中定义宏TIMER_RELOAD来设定定时器0的重装载初值。推荐的定时器0的中断时间大于1毫秒。<br>　　在程序的初始化阶段调用时钟模块的初始化函数InitTimerModule()之后，就可以使用时钟模块所以支持的各种功能。具体描述如下：<br>延时：当用户需要进行一定时间的延时时，可以通过调用Delay()来进行，参数为时钟中断的次数。如时钟中断周期为1ms， 想进行100ms的延时， 则可以调用Delay(100)。<br>注意：<br>如果延时的绝对时间小于时钟中断的周期，则不能够用本方法做到延时。<br>定时：当程序中需要使用定时功能时，如等待某外部事件，如果在一定时间内发生则继续执行，如果在这段时间内发生，则认为出现错误，转向错误处理机制。<br>在此推荐一种编程模式，但用户可以用自己认为更合理的方式处理此类问题。<br>这里简单说明一下关于阻塞式函数及非阻塞式函数。简单说，阻塞式函数就是当检测完成条件，如果不能够完成则等待，如：<br>void CheckSomething()<br>{<br>　　// gbitSuccessFlag is a global variable<br>　　while(gbitSuccessFlag == FALSE)<br>　　{<br>　　　　// do nothing but waiting<br>　　}<br>}<br>可以看到，当bitSuccessFlag没有被设置为TRUE时，函数保持等待状态不返回，这样就是阻塞式的函数。<br>另外一种情况：<br>BIT CheckSomething()<br>{<br>　　if(gbitSuccessFlag == TRUE)<br>　　{<br>　　　　// …<br>　　　　return TRUE;<br>　　}<br>　　return FALSE;<br>}<br>在这里，如果所检测的事件有没有完成，函数进行检测之后，立刻返回，通过返回值报告完成情况，如果没有完成，则等待调用者分配再次执行的机会。这样的函数就是非阻塞函数。<br>在应用定时功能时，首先要将检测函数定义成非阻塞函数。如上面的第二个版本的CheckSomething。<br>然后下面模式：<br>BIT bitDone = FALSE;<br>ResetClock(); // clear timer interrupt times counter<br>while(GetClock() &lt; MAX_WAITINGTIME)<br>{<br>　　if(CheckSomething() == TRUE)<br>　　{<br>　　　　bitDone = TRUE;<br>　　　　break;<br>　　}<br>}<br>if(bitDone == FALSE)<br>{<br>　　// process time out<br>}<br>或者简单写成：<br>BIT bitDone = FALSE;<br>ResetClock();<br>while(GetClock() &lt; MAX_WAITINGTIME &amp;&amp; (bitDone = CheckSomething));<br>if(bitDone == FLASE)<br>{ <br>　　// …<br>}<br>软件看门狗：实现具有局限性的看门狗功能。在程序中合适的地方加入对软件看门狗的复位函数ResetWatchDog()，在Config.h中加入宏 TIMER_WATCHDOGTIMEOUT。当程序运行时，如果在发生TIMER_WATCHDOGTIMEOUT次时钟中断之内没有复位软件看门狗，则系统复位。<br>注意：<br>如果没有加入TIMER_WATCHDOGTIMEOUT宏，程序中的ResetWatchDog没有任何用处，不用删除。<br>如果系统不能实现时钟中断，则软件看门狗也同时失去功能。<br>目前版本的的时钟模块的复位功能并不是完全复位，主要表现在当复位之后，系统将不再响应任何中断。所以软件看门狗只是一个程序的调试功能，不应该将它用于正式工作的程序，此时应该使用硬件看门狗。<br>用户自定义任务：如果想在时钟中断内执行一些耗时较短的任务，可以定义回调函数OnTimerInterrupt。函数原形为：void OnTimerInterrupt();<br>如果想在发生时钟中断时执行一些功能，而这些功能又耗时相对较长，不合适放在中断响应函数内部，则可以在程序中的主循环中的任意地方添加: ImpTimerService()，同时提供原形为void OnTimerEvent()的回调函数。具体的程序如下所示：<br>void main()<br>{<br>　　Initialize();<br>　　while(TRUE)<br>　　{<br>　　　　// … working<br>　　　　ImpTimerService();<br>　　　　// … working<br>　　}<br>}<br>void OnTimerEvent()<br>{<br>　　// do some task<br>}<br>对通讯模块提供支持：如通讯中的各种超时等，见通讯模块中的详细说明。<br>对键盘扫描模块提供支持：可以自动调用键盘扫描模块，见键盘扫描模块中的详细说明。<br>对程序调试提供支持：在程序开发过程中，有时为了判断程序是不是在工作，常用利用单片机系统的某一空闲引脚通过一个限流电阻接一个发光二极管，在程序中间隔固定时间交替控制发光管的明暗。实现这个功能只要在Config.h文件中定义TIMER_FLASHLED宏，如：<br>#define TIMER_FLASHLED　　　　　　　　P1_0<br>则当时钟中断发生256次之后，改变发光管的状态。<br>通讯模块<br>　　串口资源做为单片机与外界通信的常用手段，通讯模块提供了完全缓冲的串口通讯底层机制，适用于长度不大的数据包的发送及接收。如果处理关键数据，需要用户自己提供纠错协议。<br>　　通讯模块由声明文件SComm.h及实现文件SComm.c组成。<br>　　初始化：调用函数InitSCommModule()来初始化通讯模块：<br>　　void InitSCommModule(BYTE byTimerReload, BIT bitTurbo)<br>　　参数说明：<br>byTimerReload: 定时器1的重装载初始值。<br>bitTurob: 当此参数为TRUE时，串行通讯在定时器1的溢出速率基础上加倍。为FALSE时，串行通讯速率为定时器1的溢出速率。<br>　　缓冲区：模块使用了由宏SCOMM_SENDBUFSIZE、SCOMM_RECEBUFSIZE及SCOMM_PKGBUFSIZE所指定长度的三个缓冲区，分别为发送、接收及数据包(用于处理接收到的数据)缓冲区(如果没有使用异步接收功能，则不需要使用数据包缓冲区)。<br>　　在缺省时，这三个宏都被定义为10，但用户可以自已按照系统的RAM资源占用情况在Config.h中重定义缓冲区的大小。需要注意的是，如果缓冲的长度不够，当发送或接收长数据包的时候可能会发生问题，关于数据缓冲区的最小值的设置可以参考下面的说明。<br>　　注意：需要尽快取出接收缓冲区中的数据，否则当缓冲区满之后，新的数据将被简单的丢掉。<br>　　字节级服务函数： 在Config.h文件中定义了宏SCOMM_DriverInterface(如：#define SCOMM_DriverInterface)，则可以使用字节级服务函数，即通讯模块的底层函数。<br>　　共有两个函数可以使用：<br>　　void SendByte(BYTE byData);<br>　发送一个字节，如果当前缓冲区满，则等待。参数byData为要发送的数据。<br>BYTE ReceByte();<br>接收一个字节，如果当前缓冲区中没有数据，则此函数阻塞，直到接收到数据为止。接收到数据通过返回值返回。<br>可以通过调用IsSendBufEmpty() IsSendBufFull() IsReceBufEmpty() IsReceBufFull()　　宏来判断缓冲区的空或满，以防系统阻塞。<br>不推荐直接使用这一级的服务函数，应该使用高层次上的服务函数或者在这一级服务函数的基础上构造自己的通讯函数。<br>　　　数据包级服务函数：在Config.h文件中定义宏SCOMM_PackageInterface(如: #define SCOMM_PackageInterface)则可以使用数据包级服务函数。<br>　　共有两个函数可以使用：<br>void SendPackage(BYTE* pbyData, BYTE byLen);<br>发送数据包，参数pbyData为将要发送的数据包缓冲区(数组)的指针，byLen为将要发送的数据包的长度。<br>当没有定义SCOMM_DriverInterface时，数据被完全缓冲。即不能够发送长度超过发送缓冲区长度的数据包。当定义了SCOMM_DriverInterface时，采用单字节发送，这时不限制需要发送的数据的长度。<br>BYTE RecePackage(BYTE* pbyData, BYTE byLen);<br>接收数据包，参数pbyData为存放将要接收的数据的缓冲区，byLen为缓冲区长度。返回值为接收到的字节数，当模块的接收缓冲区为空时，函数非阻塞，立即返回，返回值为零。<br>同步发送接收服务函数:<br>比如在一个串行总线多机通讯系统中，主机需要定时循检各从机的状态，往往是发一个包含从机地址及指令的数据包给从机，之后等待一定的时间，从机需要在这段时间之内给主机一个应答，如果没有这个应答，则认为从机工作状态出错，转去进行相应的处理。在这个模型里，主机不能够不进行等待而给另一台从机发送指令，也不能够不管从机在很久没有应答的情况下继续等待。还有一种情况，比如当使用485总线进行通信时，如果是两条通讯线则系统只能工作在半双工模式下，总线在同一时间内只能工作在发送或接收，为了防止发送和接收相互干扰，这时的通讯常常需要使用同步发送和接收。<br>当在Config.h文件中定义宏SCOMM_SyncInterface后，则可以使用通讯模块提供同步发送接收函数：<br>void SendPackage(BYTE* pbyData, BYTE byLen);<br>发送数据包，参数pbyData为将要改善的数据包的缓冲区指针，byLen为将要发送的数据包的长度。<br>这个函数可以保证等待一个完整的数据包完全发送出去之后，它才返回，在这段时间内，它会阻塞运行。<br>BYTE SyncRecePackage(BYTE* pbyBuf, BYTE byBufLen, WORD wTimeout, BYTE byParam);<br>接收数据包。返回值为接收到的数据包长度。参数pbyBuf为将要接收数据包的缓冲区的指针，byBufLen为提供的缓冲区的长度，wTimeout为通信超时值，如果在发生了由wTimeout所指定次数的时钟中断而还没有接收到或没有接收到完整的数据包时，函数返回零，最后一个参数byParam的含义见后面的解释。<br>异步发送接收服务函数：<br>在一个简单的系统或多机通讯系统中的从机上，一般情况下不需要复杂的停等的工作模式，而且往往单片机需要对硬件进行控制和检测，不允许长时间的停下来检测通讯，但又要求当需要通讯时需要尽快的反应速度，这时就需要使用异步发送和接收服务函数。<br>使用异步发送和接收服务函数需要在Config.h文件中定义SCOMM_AsyncInterface宏。<br>同样提供两个服务函数：<br>void SendPackage(BYTE* pbyData, BYTE byLen);<br>发送数据包，参数pbyData为将要改善的数据包的缓冲区指针，byLen为将要发送的数据包的长度。<br>这里的函数的接口与同步发送和接收的服务函数相同。关于这里的细节，见后面对同步和异步服务函数的说明。<br>void AsyncRecePackage(BYTE byParam);<br>接收数据包，参数byParam的意义见后面的描述。<br>使用异步通讯需要用户定义一个回调函数，原型如下：<br>void OnRecePackage(BYTE* pbyData, BYTE byBufLen);<br>当异步接收服务函数接收到数据包之后，调用OnRecePackage回调函数，在pbyData指定的缓冲区中存放数据包，byBufLen为数据包的长度。<br>在Config.h文件中定义宏SCOMM_TIMEOUT可以设定异步接收的超时值，当开始接收数据包，但没有收完数据而发生了SCOMM_TIMEOUT次时钟中断后，认为接收超时，将已接收到的数据删除。<br>同步和异步通讯服务函数:<br>有些情况下，比如一个通讯系统中，由一台计算机通过串口控制主机，主机通过串口连接很多从机，主机的串口采用分时复用，在这样的模型中，主机和控制计算机之间的通讯可以使用，异步通讯方式，而主机与从机可以使用同步通讯方式。而同步和异步的发送函数接口是相同的，在这样的情况下，发送都是同步的。在这样的模型中，当使用不同的接收函数之前，需要注意清除接收缓冲区中的内容，通讯模块提供函数:ClearReceBuffer来做到这一点，此函数原型如下：<br>void ClearReceBuffer()；<br>通讯过程中，数据包往往是有固定的格式的，这种格式需要根据用户所使用的协议的不同而不同。同步和异步接收服务函数支持从接收到的数据中识别出一定格式的数据包。<br>举例说明：目前使用的协议决定数据包的格式为固定的包头0xff，固定的长度4个字节。其它的细节在这里不重要，所以忽略掉。<br>为了能够使用用SyncRecePackage或AsyncRecePackage函数从接收到的数据中识别出如上格式的数据包，有两种方法：<br>第一种办法是在Config.h文件中定义宏SCOMM_SimplePackageFormat，说明数据包为一种简单格式，比如上面的协议。<br>之后还要定义两个宏分别用来识别数据包头和数据包尾，两个宏分别是：<br>IsPackageHeader(x)和IsPackageTailer(x, y, z)<br>接收函数(SyncRecePackage和AsyncRecePackage)在没有开始接收数据包(准确的说是还没有从接收到的数据包中找到包头的时候)，会对接收到的每一个字节的数据调用IsPackageHeader宏，将相应的数据作为参数，如果IsPackageHeader宏的结果为 TRUE，则认为找到了数据包头，否则继续对下一个字节进行判断。<br>上面的协议对应的IsPackageHeader宏可以写为:<br>#define IsPackageHeader(x)　　　　((x) == 0xff)<br>当接收到包头之后，接收函数会对接下来的每一个字节数据调用IsPackagTailer宏来判断是不是已经接收完数据包，三个参数分别为：<br>x: 当前判断的数据。<br>y: 从包头开始到当前被判断的数据止的计数值，即当前已经接收到的字节数。<br>z：用户在调用SyncRecePackage或AsyncRecePackage时指定的byParam参数。<br>与IsPackageHeader相似，如果宏IsPackageTailer的运算结果为TRUE，则认为接收到完整的数据包，则调用相应的回调函数(对于异步接收函数)或返回(对于同步接收函数)。如果运算结果为FALSE则继续判断下一个字节的数据。<br>上面的协议对应的IsPackageTailer宏可以写为：<br>#define IsPackageTailer(x, y, z)　　((y) &gt;= (z))<br>当然，用户也可以将IsPackageHeader和IsPackageTailer定义成为函数，通过BIT类型的返回值来向调用者提供与相应宏相同的信息。<br>另一种办法需要在Config.h文件中定义宏SCOMM_ComplexPackageFormat。(需要注意的是，不能够同时定义 SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏，否则会造成严重的不可预见性错误。<br>这时需要提供回调函数QueryPackageFormat，原形如下：<br>BYTE QueryPackageFormat(BYTE byData, BYTE byCount, BYTE byParam);<br>函数中三个参数的含义与使用简单数据包格式时判断数据包尾的宏的参数相同。<br>函数通过返回值来通知作为调用者的接收函数对接收到的数据如何处理，但目前这种方法仅为需要处理复杂数据包格式时的一种可选方法，但不推荐。用户如果想使用这种方法可以自己更改接收函数中相应的<br>#ifdef SCOM_ComplexPackageFormat<br>#endif // SCOMM_ComplexPackageFormat<br>预编译指令之间的内容。<br>例如指定QueryPackageFormat的返回值的含义：<br>0：继续找数据包头或继续找数据包尾。<br>1：找到数据包头。<br>2：找到数据包尾。<br>3：数据包出错，需要抛弃。<br>然后更改源代码来实现上面的协议。<br>注意：当用户需要使用字符串的时候，可以利用简单的包装函数将字符串转换为字节数组。所以没有必要提供专用的字符串处理函数。<br>键盘扫描模块<br>　　键盘扫描模块有两种工作方式, 一种为自动的由时钟模块调用, 另一种是由程序员自行调用。<br>1) 由时钟模块自动调用的方式<br>将时钟模块实现文件(Timer.h)及键盘扫描模块的实现文件(KBScan。c)包含进工程, 在Config.h 文件中添加TIMER_KBSCANDELAY宏。时钟模块自动对时钟中断进行计数, 当达到TIMER_KBSCANDELAY宏所定义的值后, 自动调用键盘扫描模块中的函数KBScanProcess()进行键盘扫描，也就是说，这个宏的值可以决定按键消抖动的时间。 <br>用户应该提供两个回调函数OnKBScan()及onKeysPressed()。 在函数OnKBScan中进行键盘扫描, 并返回扫描码。扫描码的类型缺省为BYTE, 当键盘规模较大时, BYTE不能够完全包含键盘信息时, 可在Config.h文件中重定义宏KBVALUE, 如下:<br>#define KBVALUE　　　　　　WORD<br>这样, 就可以使用16位的键盘扫描码, 如果此时还达不到要求, 可以将键盘扫描码定义成一个结构, 但这样做将会增加代码量及消耗更多的RAM资源, 故不推荐。 <br>　　扫描模块调用OnKBScan取得扫描码, 并调用用户可以重定义的宏IsNoKeyPressed来判断是否有键按下, 缺省的IsNoKeyPressed实现如下:<br>#define IsNoKeyPressed(x)　　　　　　((x) == 0x00)　　<br>即认为OnKBScan返回0扫描码时为没有键按下,　如果扫描函数返回其它非零扫描码做为无键按下的扫描码时, 可以在Config.h文件中重定义IsNoKeyPressed宏的实现。<br>　　8位键盘扫描码(缺省值)时, 相应的扫描函数为:<br>BYTE OnKBScan()<br>　　当扫描模块经过软件消抖动之后, 发现有键按下, 就会调用另一个回调函数onKeysPressed。 函数的声明应该如下:<br>void onKeyPressed(BYTE byKBValue, BYTE byState)<br>其中中的参数byKBValue的类型为BYTE, 此为缺省值, 如果使用其它类型的扫描码, 就将此参数变为相应类型。这个值由OnKBScan返回。另一个参数byState在通常情况下为零。但当用户在Config.h中定义宏KBSCAN_BRUSTCOUNT，同时键盘上的某键被按住不放时, 扫描模块对它自己的调用(注意这里和TIMER_KBSCANDELAY宏不同, TIMER_KBSCANDELAY是时钟中断足够的次数后调用扫描模块, 而KBSCAN_BRUSHCOUNT为扫描模块自身的被调用次数)进行计数，当达到KBSCAN_BRUSTCOUNT时，扫描模块调用 onKeysPressed，此时第一个参数的含义不变，而byState变成1, 同时计数器复位，又经过一段时间后，用值为3的byState 调用onKeysPressed。 这样就可以很方便的实现多功能键或者检测某键的长时间被按下。<br>2)由用户自行调用<br>由用户自行在程序中调用扫描模块，而不是由时钟中断自行调用。其它与方式1相同。<br>注意：<br>1) 函数KBScanProcess为非阻塞函数，它将在很快的时间内返回，等待再次分配给它执行的机会。<br>2) 函数KBScanProcess是在时钟中断外部运行的，它的过程可以被任何中断打断，但不影响系统运行。<br>3) byState的最大值为250，之后被复位为零。<br>应用举例<br>　　现在来举例说明上述几个模块的使用方法。<br>　　硬件环境描述：<br>　　为了控制一盏灯，需要单片机提供一个做控制功能的开关量，这里不描述外部接口电路，只说明当单片机的P10脚为高电平时，灯灭，当P10脚为低电平时，灯亮。<br>可以通过计算机由串口发送命令来控制，或通过一个按键(push button不是自锁式的按键)来手动控制(按键接在P11脚上，当键没有按下时，P11电平为高，键按下时，引脚电平被接低)，当使用按键手动控制的时候，需要给计算机发送通知。<br>设定串口通讯指令如下：<br>数据包由0xff做包头，4个字节长，第二个字节为命令代码，第三个字节为数据，最后一个字节为校验位。<br>命令和数据代码有如下组合：<br>(计算机发给单片机)<br>0x10 0x01: 计算机控制灯亮。(数据位是非零值即可)<br>0x10 0x00: 计算机控制灯灭。<br>(单片机发给计算机)<br>0x11 0x01：单片机正常执行控制指令，返回。(数据位是非零值即可)<br>0x11 0x00: 单片机不能够正常执行控制指令，或控制指令错(不明含义的数据包或校验错等)。<br>0x12 0x01：手动控制灯亮。(数据位是非零值即可)<br>0x12 0x00: 手动控制灯灭。<br>　　建立工程：<br>　　在硬盘上建立文件夹Projects，在Projects下建立Common文件夹及Example文件夹。将各模块的头文件及实现文件拷贝到 Common文件夹下(推荐使用这样的文件组织结构，其它工程也可以建立在Projects下，各工程共享Common文件夹中的代码)。<br>启动KeilC的IDE，在Example下建立新工程，将各模块的实现文件包含进工程。<br>　　在Example文件夹下建立Output文件夹，更改工程设置，将Output作为输出文件和List文件的输出文件夹(推荐使用这样的结构，当保存工程文件时，可以简单的删除Output文件夹中的内容而不会误删有用的工程文件)。<br>　　建立工程配置头文件Config.h及工程主文件Example.c，并将Exmaple.c文件加入工程。<br>　　输入代码：<br>　　代码的具体编写过程略。下面是最后的Config.h文件及Example.c文件。<br>//<br>// file: Config.h<br>//<br>#ifndef _CONFIG_H_<br>#define _CONFIG_H_<br>＃i nclude &lt;Atmel/At89x52.h&gt;　　　　　　　　 // 使用AT89C52做控制<br>＃i nclude “../Common/Common.h”　　　　　　　　// 使用自定义的数据类型<br>#define TIMER_RELOAD　　　　　　922　　　　// 11.0592MHz晶振，1ms中断周期<br>#define TIMER_KBSCANDELAY　　40　　　　// 40ms重检测按键状态，即40ms消抖<br>#define SCOMM_AsyncInterface　　　　　　　　// 使用异步通讯服务<br>#define IsPackageHeader(x)　　　　((x) == 0xff)　　// 判断包头是不是0xff<br>#define IsPackageTailer(x, y, z)　　((y) &lt;= (z))　　// 判断包的长度是不是足够<br>#endif // _CONFIG_H_<br>//<br>// file: Example.c<br>//<br>＃i nclude &lt;Atmail/At89x52.h&gt;<br>＃i nclude “../Common/Common.h”<br>＃i nclude “../Common/Timer.h”<br>＃i nclude “../Common/Scomm.h”<br>＃i nclude “../Common/KBScan.h”<br>BIT gbitLampState = 1;　　　　　　　　　　　　// 灯的状态，缺省为off<br>static void Initialize()<br>{<br>　　InitTimerModule();　　　　　　　　　　　　// 初始化时钟模块<br>　　InitSCommModule(0xfd, TRUE);　　　　　　// 初始化通讯模块，11.0592MHz晶振，<br>　　　　　　　　　　　　　　　　　　　　// 波特率为19200<br>　　EA = 1；　　　　　　　　　　　　　　　　// 开中断<br>}<br><br>void main()<br>{<br>　　Initialize();　　　　　　　　　　　　　　// 初始化<br>　　while(TRUE)　　　　　　　　　　　　　　// 主循环<br>　　{<br>　　　　ImpTimerService();　　　　　　　　　　// 实现时钟中断服务，如键盘扫描<br>　　　　AsyncRecePackage(4);　　　　　　　　// 接收4个字节长的数据包<br>}<br>}<br><br>// 在中断外部响应时钟中断事件<br>void OnTimerEvent()　　　　　　　　　　　　<br>{<br>　　// do nothing<br>}<br><br>// 控制外部灯<br>static void TriggerLamp(BIT bEnable)　　<br>{<br>　　P10 = ~bEnable;　　　　　　　　　　　　// 需要反相控制<br>}<br><br>// 键扫描回调函数<br>BYTE KBScan()　　<br>{<br>　　BIT b;<br>　　P11 = 1;　　　　　　　　　　　　　　　　// 读之前拉高引脚电平<br>　　b = P11;　　　　　　　　　　　　　　　　// 读入引脚状态<br>　　return ~b;　　　　　　　　　　　　　　　　// 数据反相做扫描码<br>}<br><br>// 计算校验和<br>static BYTE CalcCheckSum(BYTE* pbyBuf, BYTE byLen)<br>{<br>　　BYTE by, bySum = 0;<br>　　for(by = 0; by &lt; byLen; by++)<br>　　　　bySum += pbyBuf[by];<br>　　return 0 – bySum;<br>}<br><br>// 接收到键盘消息回调函数<br>void onKeyPressed(BYTE byValue, BYTE byState)<br>{<br>　　BYTE by[4];<br>　　if(byState == 0)<br>　　{<br>　　　　switch(byValue)<br>　　　　{<br>　　　　case 0x01:<br>　　　　　　gbitLampState = ~g　　bitLampState;　　// 灯状态取反<br>　　　　　　TriggerLamp(gbitLampState);　　// 执行控制<br>　　　　　　by[0] = 0xff;　　　　　　　　　　// 构造数据包<br>　　　　　　by[1] = 0x12;<br>　　　　　　by[2] = (BYTE)gbitLampState;<br>　　　　　　by[3] = CalcCheckSum(by, 3);　　// 求校验和<br>　　　　　　SendPackage(by, 4);　　　　　　// 发送数据包<br>　　　　　　break;<br>　　　　// 处理其它扫描码<br>　　　　default:<br>　　　　　　break;<br>　　}<br>}<br><br>// 接收到数据包回调函数<br>void OnRecePackage(BYTE* pbyBuf, BYTE byBufLen)<br>{<br>　　BYTE by[4];<br>　　by[0] = 0xff;<br>　　by[1] = 0x11;<br>　　if(byBufLen != 4 || pbyBuf[3] != CalcCheckSum(pbyBuf, 3))<br>　　{<br>　　　　by[2] = 0;<br>　　　　by[3] = CalcCheckSum(by, 3);<br>　　　　SendPackage(by, 4);　　　　　　　　 // 处理长度或校验和不正确<br>　　}<br><br>　　switch(pbyBuf[1])<br>　　{<br>　　case 0x10:<br>　　　　gbitLampState = (BIT)pbyBuf[2];<br>　　　　TriggerLamp(gbitLampState);<br>　　　　by[2] = 1;<br>　　　　by[3] = CalcCheckSum(by, 3);<br>　　　　SendPackage(by, 4);　　　　　　　　// 发送成功执行通知<br>　　　　break;<br><br>　　default:　　　　　　　　　　　　　　　　// 不知道的命令<br>　　　　by[2] = 0;<br>　　　　by[3] = CalcCheckSum(by, 3);<br>　　　　SendPackage(by, 4);　　　　　　　　// 发送没有成功执行通知<br>　　　　break;<br>　　}<br>} <br> ]]></description>
		<eb:creationDate>2006-01-02 12:50:27</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ “精度”与“分辨率” ]]></title>
		<link>http://blog.tom.com/hbh9/article/446.html</link>
		<description><![CDATA[ 我们搞电子开发的，经常跟“精度”与“分辨率”打交道，这个问题不是三言两语能搞得清楚的，在这里抛块砖头，希望能吸引各位高人来指导一二^_^<br>简单点说，“精度”是用来描述物理量的准确程度的，而“分辨率”是用来描述刻度划分的。从定义上看，这两个量应该是风马牛不相及的。（是不是有朋友感到愕然^_^）。很多卖传感器的JS就是利用这一点来糊弄人的了。简单做个比喻：有这么一把常见的塑料尺（中学生用的那种），它的量程是10厘米，上面有100个刻度，最小能读出1毫米的有效值。那么我们就说这把尺子的分辨率是1毫米，或者量程的1%；而它的实际精度就不得而知了（算是0.1毫米吧）。当我们用火来烤一下它，并且把它拉长一段，然后再考察一下它。我们不难发现，它还有有100个刻度，它的“分辨率”还是1毫米，跟原来一样！然而，您还会认为它的精度还是原来的0.1毫米么？<br>回到电子技术上，我们考察一个常用的数字温度传感器：AD7416。供应商只是大肆宣扬它有10位的AD，分辨率是1/1024。那么，很多人就会这么欣喜：哇塞，如果测量温度0-100摄氏度，100/1024……约等于0.098摄氏度！这么高的精度，足够用了。但是我们去浏览一下AD7416的数据手册，居然发现里面赫然写着：测量精度0.25摄氏度！所以说分辨率跟精度完全是两回事，在这个温度传感器里，只要你愿意，你甚至可以用一个14位的AD，获得1/16384的分辨率，但是测量值的精度还是0.25摄氏度^_^<br>看到这里，大家在下次再选取传感器什么的时候该知道留意什么了吧^_^<br>  ]]></description>
		<eb:creationDate>2006-01-02 12:09:46</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ ADC0809调试程序 ]]></title>
		<link>http://blog.tom.com/hbh9/article/445.html</link>
		<description><![CDATA[ #include &lt;absacc.h&gt;<br>#include &lt;reg51.h&gt;<br>#include&amp;nbsp; &lt;math.h&gt;<br>#define uchar unsigned char<br>#define uint unsigned int<br>#define ADC0809&amp;nbsp; XBYTE[0x0B000]&amp;nbsp; //P2.6选通&amp;nbsp; &amp;nbsp;  <br>float sum=0,fjg;<br>uint i,j,*q,*p,sd=5;<br>sbit p1_0=P1^0; <br>void wait(uint n);<br>void main(void)<br>{&amp;nbsp;  j=0;<br>&amp;nbsp; &amp;nbsp; TMOD=0X01;//设置定时器0<br>&amp;nbsp; &amp;nbsp;  TH0=0XFC;//定时时间设为1ms <br>&amp;nbsp; &amp;nbsp;  TL0=0X18;<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; EA=0;//先关中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; EA=1;//开总中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; ET0=1;&amp;nbsp; <br>&amp;nbsp; &amp;nbsp; &amp;nbsp; //TR0=1;<br>&amp;nbsp; &amp;nbsp;  for(; ;)<br>&amp;nbsp; &amp;nbsp; {<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; if(j=20){<br> do{}while(!TF0);<br>&amp;nbsp;  q=0x30;<br>for(i=0;i&lt;20;i++)&amp;nbsp;  //转化后的数值求均方根<br> {sum=sum+(*q)*(*q);<br>&amp;nbsp; q++;<br>&amp;nbsp;  }<br>&amp;nbsp; &amp;nbsp; sum=sum/20;<br>&amp;nbsp;  fjg=sqrt(sum);<br>if(fjg&gt;sd)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //判断是否跳闸<br>&amp;nbsp;  p1_0=1;<br>&amp;nbsp;  j=0;<br>}}<br>}<br>void power(void)<br>{&amp;nbsp; uchar x;<br>&amp;nbsp;  for(;;)<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {ADC0809=0x01;<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  wait(1000);<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  x=ADC0809;<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  P2=x;<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  }<br>}<br><br>void wait(uint n)<br>{&amp;nbsp;  uint i,j;<br>&amp;nbsp; &amp;nbsp; for(i=0;i&lt;n;i++)<br>&amp;nbsp; &amp;nbsp; for(j=0;j&lt;100;j++);<br>}<br>timer0()interrupt 1 using 1<br>{*p=ADC0809;<br>&amp;nbsp;  p++; <br>&amp;nbsp; TH0=0XFC;<br>&amp;nbsp; TL0=0X18;<br>&amp;nbsp; TR0=1;<br>&amp;nbsp; j++; <br>}<br> ]]></description>
		<eb:creationDate>2006-01-02 12:18:36</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ 单片机C程序员的n层境界 ]]></title>
		<link>http://blog.tom.com/hbh9/article/444.html</link>
		<description><![CDATA[ 第一层 只见树木，不见森林<br>目标代码的长度和执行效率，忘记了采用C语言的本意。<br>其实有时斤斤计较个别语句，意义并不大，52的FLASH是51的2倍，价格贵不了多少。速度不够，可以选用6T, 2T, 甚至1T的51，或者选用某些非51系列。速度一下就上去了。成本并不增加。<br>速度和代码长度主要取决于算法，比如象查找表，计算sin(x)等。<br><br>第二层 模块化和结构化思想<br>功能划分合理，相关的函数放在一个文件里，每个文件尽量不超过1千行。<br>合理设置和分配函数功能，每个函数尽量不超过一页。<br><br>第三层 可读性和可修改性<br>多少次读自己以前写的程序发现看不懂了，痛定思痛<br>详尽的注释<br>认真定义每个变量名和函数名<br>定义常量代替立即数<br>合理利用宏定义<br>有时候，为了可读性好甚至不惜牺牲代码长度和执行速度。<br><br>第四层 写出不容易出错的程序，出错也能比较容易的找到错误点<br>程序比较大，尤其是几个人分工合写的程序，一个很小的错误可能找上三天三夜，最后发现错误出在意想不到的地方。<br>尽量避免全局变量，必要的全局变量尽量放在一个struct里<br>合理定义和使用数据结构<br>C++封装的思想，用文件封装Private变量和函数，.c对应的.h文件里只放Public函数原型和Public变量的extern说明。<br>严格检查每个输入参数，尤其是人机界面。<br>防范意外，比如数据区出界(C编译不检查)。编程的重点由主线转移到处理意外。<br>增加调试代码。<br><br>第n层<br>正在探索中...<br> <br> ]]></description>
		<eb:creationDate>2006-01-02 12:16:45</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ keil c6.20c 直接嵌入汇编的方法 ]]></title>
		<link>http://blog.tom.com/hbh9/article/443.html</link>
		<description><![CDATA[ //&lt;asm.h&gt;<br>#ifdef ASM<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  unsigned long shiftR1(register unsigned long);<br>#else&amp;nbsp; &amp;nbsp; <br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  extern unsigned long shiftR1(register unsigned long);<br>#endif<br>//end of asm.h<br><br>//&lt;asm.c&gt;<br>#define ASM<br>#include &lt;asm.h&gt;<br>#include &lt;reg52.h&gt;<br>#pragma OT(4,speed)<br>unsigned long&amp;nbsp; &amp;nbsp; shiftR1(register unsigned long&amp;nbsp; &amp;nbsp; x)<br>{<br>&amp;nbsp; &amp;nbsp; #pragma asm<br>&amp;nbsp; &amp;nbsp; clr c<br>&amp;nbsp; &amp;nbsp; mov a,r4<br>&amp;nbsp; &amp;nbsp; rrc a<br>&amp;nbsp; &amp;nbsp; mov r4,a<br><br>&amp;nbsp; &amp;nbsp; mov a,r5<br>&amp;nbsp; &amp;nbsp; rrc a<br>&amp;nbsp; &amp;nbsp; mov r5,a<br><br>&amp;nbsp; &amp;nbsp; mov a,r6<br>&amp;nbsp; &amp;nbsp; rrc a<br>&amp;nbsp; &amp;nbsp; mov r6,a<br><br>&amp;nbsp; &amp;nbsp; mov a,r7<br>&amp;nbsp; &amp;nbsp; rrc a<br>&amp;nbsp; &amp;nbsp; mov r7,a<br>&amp;nbsp; &amp;nbsp; <br>&amp;nbsp; &amp;nbsp; #pragma endasm<br>&amp;nbsp; &amp;nbsp; return(x);<br>}<br>//end of asm.c<br>/*将此源文件加入要编译的工程文件，<br>//将光标指向此文件，选择右键菜单“option for file 'asm.c'”,<br>//将属性单“properties”中的“Generate Assembler SRC File”“Assemble SRC File”<br>//两项设置成黑体的“√”将“Link Public Only”的“√”去掉，再编译即可。<br>//用此方法可以在c源代码的任意位置用#pragma asm和#pragma endasm嵌入汇编语句。<br>//但要注意的是在直接使用形参时要小心，在不同的优化级别下产生的汇编代码有所不同，<br>//可以察看对应的.lst文件看一看，得到正确的优化级别后，#pragma OT(x,speed)锁定<br>//优化级别（这里的值是0-9）。 ]]></description>
		<eb:creationDate>2006-01-02 11:32:53</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
    <item>
		<title><![CDATA[ 基于单片机的时钟电路的设计 ]]></title>
		<link>http://blog.tom.com/hbh9/article/442.html</link>
		<description><![CDATA[ <br>&amp;nbsp;  LED数码管电子时钟电路采用24h记时方式,日期和时间用6位数码管显示。该电路采用AT98c2051单片机，使用5V电池供电，只要使用一个按键开关即可以进入调时、省电（不显示LED 数码管）和正常显示三种状态。<br>一、	电子时钟的技术指标<br>显示范围：年份99年，如2001-2099；日月正常显示，能识别闰年闰月；时间采用24小时制<br>显示格式：日期按年月日排列，年取后两位显示如2005年12月20日显示为：051220；时间按时分秒排列，显示如12点30分55秒显示为123055<br>显示位数：6位8段LED数码管作正常、调时和节电显示<br>时钟误差：24小时误差3~5秒<br>二、	硬件电路的选择<br>1、单片机的选择	&amp;nbsp; 选用AT89C2051单片机，配备11.0592MHz晶振，复位电路采用上电复位<br>&amp;nbsp; &amp;nbsp; 2、显示电路选择&amp;nbsp;  采用软件译码动态显示，P3.0-P3.5作数码管的位选口，P1.0-P1.6作数<br>码管的段选口。考虑直接用单片机I/O口作位选时可能驱动功率不够，可采用三极管9012作驱动，<br>共阳极数码管显示。<br>&amp;nbsp; &amp;nbsp; 3、电源选择&amp;nbsp;  采用直流5V电源供电，可用7805将9V电池转换成5V<br>三、设计分析<br>&amp;nbsp; &amp;nbsp; 1、定时计数的误差分析 <br>主要误差来源及补偿 ：<br>[1]、硬件电路在线路手工焊接时可能存在虚焊，或者有接触不良的情况，以及外界环境的影<br>响，通过使用印刷电路板机器焊接，可以减少硬件误差影响。<br>[2]、采用11.0592MHz晶振计算定时计数初值时存在小数舍入误差<br>公式： ,定时器/计数器采用工作方式1，定时器T0、T1溢出周期为50ms,计<br>算得到N=19456=4C00H,TH0=4CH,TL0=00H.若仍采用理论上的12MHz计算初值，则有：<br>N1=3CB0H，那么用11.0592MHz，N1不变，益出周期约为54.25ms，每次溢出比实际的要慢4.3ms，<br>那么一秒钟要慢85ms，从而影响24h比实际的要慢122min。修正后误差处理通过软件实现，最终<br>的时钟误差测得值为3-5s。<br>补偿方法：<br>1）、精确定时计数时可采用12MHz的晶振。<br>2）、用软件补偿，通用方法如下：<br>　　 MCS-51单片机的中断响应延迟时间，取决于其它中断服务程序是否在进行，或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3～8个机器周期。无论是哪一种原因引起的误差，在精确定时的应用场合，必须考虑它们的影响，以确保精确的定时控制。根据定时中断的不同应用情况，应选择不同的精确定时编程方法。以定时器T1工作在定时方式1为例，晶振频率为12MHz 。在定时器溢出中断得到响应时，停止定时器计数，读出计数值(反映了中断响应的延迟时间)，根据此计数值算出到下一次中断时，需多长时间，由此来重装载和启动定时器。例如定时周期为1ms，则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的精确重装载值时，考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号，分别表示-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。<br> <br>CLR EA ；禁止所有中断<br>CLR TR1 ；停止定时器T1<br>MOV A，#LOW(-1000+7) ；期望数的低位字节<br>ADD A，TL1 ；进行修正<br>MOV TL1，A ；重装载低位字节<br>MOV A，#HIGH(-1000+7) ；对高位字节处理<br>ADDC A，TH1 <br>MOV TH1，A <br>SETB TR1 ；重启动定时器<br>SETB EA ；重开中断<br>……&amp;nbsp; &amp;nbsp; <br>；本次设计的软件误差补偿<br>CLR&amp;nbsp;  ET0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；关T0中断允许<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CLR&amp;nbsp;  TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；关闭定时器T0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp;  A,#0B7H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；中断响应时间同步修正<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ADD&amp;nbsp;  A,TL0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；低8位初值修正<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp;  TL0,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；重装初值（低8位修正值）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp;  A,#3CH&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；高8位初值修正<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ADDC&amp;nbsp; A,TH0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp;  TH0,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；重装初值（高8位修正值）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SETB&amp;nbsp; TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；开启定时器T0<br>………<br> <br>&amp;nbsp;  2、按键消除抖动的设计分析<br>由于键的按下与释放是通过机械触点的闭合与断开来实现的，因机械触点的弹性作用，在闭合与断开的瞬间均有一个抖动过程，所以键闭合与断开会产生如附图所示的电压波形，抖动时间一般在5~10ms。这个抖动对判断键是否按下或释放有较大影响，因此必需消除键的抖动，只有这样，才能可靠地判断键的状态。<br><br><br><br><br>在单片机应用系统中，消除抖动有硬件和软件两种方法。硬件去抖动方法主要有利用R-S触发器和滤波器电路，如图所示。软件去抖动通常是程序检测到键被按下时，延时10ms后再检测键是否仍然闭合，若是则确认是一次真正的闭合，否则就忽略次此按键。<br>本次设计时采用的软件消抖程序<br>CLOSE:JB&amp;nbsp;  	 P3.7,CLOSE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；无按键按下，等待。<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LCALL&amp;nbsp;  DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；有键按下，调显示子程序延时消抖<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; JB&amp;nbsp; &amp;nbsp; &amp;nbsp; P3.7,CLOSE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；是干扰返回CLOSE等待<br>3、驱动电路的设计<br>9012三极管为NPN型小功率管，可作共阳数码管的驱动，也可用9013PNP型驱动共阴数码管<br>4、数码管及其限流电阻的选用<br>数码管共阳型和共阴型的外型相同，共阴极是把所有的发光二极管的阴极俩在一起，通常接地，通过控制每一只的阳极电平来使其发光或者熄灭。阳极为高电平发光，为低电平熄灭。共阳极是把所有的阳极连在一起，通常接高电平（+5V），通过控制每一只的阴极电平使其发光或者熄灭，阴极为低电平发光，为高电平熄灭。COM口作为位选端，8只发光二极管被分成两个组，所以有两个COM端，在使用时把它们并联起来。<br>为了保证发光二极管经久耐用而不被烧毁，需要外接限流电阻。取值一般是流经的电流在10~20mA，由于高亮度数码管的使用，电流还可以取得小一些。发光二极管开启电压，红色在1.6~1.8V之间，绿色约为2.0V。设导通电压为 =1.6V，正向电流为5~20mA ，限流电阻R取值在170 ~680 ，考虑单片机本身的驱动能力很大，实际设计取值560 。计算如下：<br>&amp;nbsp; 				&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  <br>5、数码管显示技术<br>（1）静态显示技术<br>静态显示技术就是当数码管显示某一字符时,相应的发光二极管连续恒定地处于点亮或熄灭状态,直到更换显示内容为止。采用这种显示方式占用的硬件资源多，以七段LED显示器为例，如果用软件进行字段译码，每显示一个字符就需要一个锁存器，如果用硬件进行字段译码，每显示一个字符就需要一个锁存译码器。静态显示的数码管由于连续地工作，因此功耗大，但程序简单，亮度高。随着高度数码管的出现，动态显示同样可以达到很好的显示效果，所以在多数应用情况，不会采用静态显示方式，而采取动态显示方式。<br>（2）动态显示技术<br>在多位LED显示时，为了降低成本和功耗，将所有位的段选线并联起来，由一个8位口控制，由另一个端口进行显示位的控制。但是，由于段选是公用的，要让各位数码管显示不同的字符，就必须采用扫描方式，即动态扫描显示方式。首先从段选线上送出字段码，再控制位选线，字符就显示在指定位置上，持续1~5ms时间，然后关闭所有显示；接下来又送出新的字段码，按照上述过程又显示在新的位置上，直到每一位数码管都扫描完为止，即为一个扫描周期。由于人的视觉停留效应，因此当扫描周期小到一定程度时，人就感觉不出字符的移动或闪烁，觉得每位数码管到一直在显示，达到一种稳定的视觉效果。<br>动态扫描显示的扫描方式有程序控制和定时中断扫描两种。程序控制扫描方式要占用许多CPU时间，在计算机的任务较重时，难以得到好的效果，所以在实际中常采用定时中断扫描方式，这种方式是每隔一定时间（如1ms）显示一位数码管，假设有8位数码管，显示扫描周期为8ms,显示效果十分良好。本次设计采用这种方法。<br>（3）数码管的字型码设计<br>八段LED显示器由8个发光二极管组成。基中7个长条形的发光管排列成&quot;日&quot;字形，另一个贺点形的发光管在显示器的右下角作为显示小数点用，它能显示各种数字及部份英文字母。LED显示器有两种不同的形式：一种是8个发光二极管的阳极都连在一起的，称之为共阳极LED显示器；另一种是8个发光二极管的阴极都连在一起的，称之为共阴极LED显示器。如下图所示。`共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管导通时，相应的笔划段发亮，由发亮的笔划段组合而显示的各种字符。8个笔划段HGFEDCBA对应于一个字节（8位）的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就可以表示欲显示字符的字形代码。例如，对于共阴LED显示器，当公共阴极接地（为零电平），而阳极HGFEDCBA各段为0111011时，显示器显示&quot;P&quot;字符，即对于共阴极LED显示器，&quot;P&quot;字符的字形码是73H。如果是共阳LED显示器，公共阳极接高电平，显示&quot;P&quot;字符的字形代码应为10001100（8CH）。这里必须注意的是：很多产品为方便接线，常不按规则的方法去对应字段与位的关系，这时字形码就必须根据接线来自行设计了。数码管的管脚对照图如附图1(中间两个长的为选通端com,连接只需要连接一个)<br>设为共阳型，也就是相应的输出位为0时笔段亮，则字型码为：<br>位选口		P1.6	P1.5	P1.4	P1.3	P1.2	P1.1	P1.0	字型码<br>显示字符	H	E	D	C	G	F	A	B	<br>0	1	0	0	0	1	0	0	0	88H<br>1	1	1	1	0	1	1	1	0	EEH<br>2	1	0	0	1	0	1	0	0	94H<br>3	1	1	0	0	0	1	0	0	C4H<br>4	1	1	1	0	0	0	1	0	E2H<br>5	1	1	0	0	0	0	0	1	C1H<br>6	1	0	0	0	0	0	0	1	81H<br>7	1	1	1	0	1	1	0	0	ECH<br>8	1	0	0	0	0	0	0	0	80H<br>9	1	1	0	0	0	0	0	0	C0H<br>不亮	1	1	1	1	1	1	1	1	FFH<br>6、AT89C2051单片机的性能简介<br>AT89C2051是一个低电压，高性能CMOS 8位单片机，片内含2k bytes的可反复擦写的只读Flash程序存储器和128 bytes的随机存取数据存储器（RAM），器件采用ATMEL公司的高密度、非易失性存储技术生产，兼容标准MCS-51指令系统，片内置通用8位中央处理器和Flash存储单元，功能强大AT89C2051单片机可为您提供许多高性价比的应用场合。<br> AT89C2051是一个功能强大的单片机，但它只有20个引脚，15个双向输入/输出（I/O）端口，其中P1是一个完整的8位双向I/O口，两个外中断口，两个16位可编程定时计数器,两个全双向串行通信口，一个模拟比较放大器。 同时AT89C2051的时钟频率可以为零，即具备可用软件设置的睡眠省电功能，系统的唤醒方式有RAM、定时/计数器、串行口和外中断口，系统唤醒后即进入继续工作状态。省电模式中，片内RAM将被冻结，时钟停止振荡，所有功能停止工作，直至系统被硬件复位方可继续运行。<br>主要功能特性：<br>·兼容MCS51指令系统<br>·15个双向I/O口<br>·两个16位可编程定时/计数器<br>· 时钟频率0-24MHz<br>· 两个外部中断源<br>· 可直接驱动LED<br>· 低功耗睡眠功能<br>· 可编程UARL通道<br>· 2k可反复擦写(&gt;1000次）Flash ROM<br>· 6个中断源<br>· 2.7-6.V的宽工作电压范围&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; <br>· 128x8bit内部RAM<br>· 两个串行中断										<br>· 两级加密位<br>· 内置一个模拟比较放大器<br>· 软件设置睡眠和唤醒功能<br> <br>7、主要程序设计分析<br>（1）	主程序&amp;nbsp; 设计中采用定时器T0中断完成，其余状态循环调用显示子程序，当P3.7端口<br>或者P1.7端口开关按下时，转入调整时间或者调整日期功能程序。系统主流程图如附图2所示：<br>（2）	显示子程序<br>数码管显示的数据存放在内存单元70H-75H中,其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能，显示用十进制BCD码数据的对应段码存放在ROM表中。显示时，先取出70H~75H某一地址中的数据，然后查的对应的显示段码从P1口输出。P3口将对应的数码管选中，就是显示该地址单元的数据值。<br>（3）	定时器T0中断服务程序<br> 定时器T0用于时间计时。定时溢出中断周期设为50ms，中断累计20次（即1s）时对秒计数<br>单元进行加1操作。时间计数单元地址分别在70H~71H（s）、76H~77H（min）、78H~79H（h），7AH单元存放“熄灭符”数据（#0AH）。在计数单元中采用十进制BCD码计数，满60进位。T0中断服务程序流程图3所示。<br>（4）T1中断服务程序<br> T1中断服务程序应用于指示调整单元数字的亮闪。在时间调整状态下，每过0.3秒，将对应<br>单元的显示数据换成熄灭符数据（#0AH）。这样，在调整时间时，对应调整单元的显示数据就会间隔闪亮。<br>（5）调时功能程序<br>调时功能程序的设计方法是：按下按键，若按下时间小于1秒，进入省电状态（数码管不亮，<br>时钟不停），否则进入调分状态，等待操作，此时计时器停止走动。当再次按下按钮时，若按下的时间小于0.5秒，则时间加1分钟；若按下时间大于0.5秒，则进入小时调整状态。在小时调整状态下，当按键按下的时间大于0.5秒时退出调整状态，时钟继续走动。<br>四、时钟电路硬件设计<br>数码管时钟电路硬件附图。采用AT98c2051单片机最小化应用设计，LED显示采用动态扫描方式实现，P1口输出段码数据，P3.0-P3.5口作扫描输出，P3.7口接时间按钮开关，P1.7口接日期按钮开关。为了提供LED数码管的驱动电流，用三极管9012作电源驱动输出。实际设计按情况采用11.0592MHz的晶振。<br>五、程序设计<br>；&amp;nbsp; 定时器T0、T1溢出周期为50MS，T0为秒计数用， T1为调整时闪烁用，<br>；&amp;nbsp;  P3.7为调整按钮，P1口 为字符输出口，采用共阳显示管。<br>； ******************************************<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  中断入口程序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>； ******************************************<br>ORG 0000H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；程序执行开始地址<br>LJMP&amp;nbsp; &amp;nbsp; &amp;nbsp; START&amp;nbsp; ；跳到标号START执行<br>ORG 0003H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；外中断0中断程序入口<br>RETI&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；外中断0中断返回<br>ORG 000BH&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；定时器T0中断程序入口<br>LJMP&amp;nbsp; &amp;nbsp; &amp;nbsp; INTT0&amp;nbsp; ；跳至INTTO执行<br>ORG 0013H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；外中断1中断程序入口<br>RETI&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；外中断1中断返回<br>ORG 001BH&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；定时器T1中断程序入口<br>LJMP&amp;nbsp; &amp;nbsp; &amp;nbsp; INTT1&amp;nbsp; ；跳至INTT1执行<br>ORG 0023H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；串行中断程序入口地址<br>RETI&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；串行中断程序返回<br>； ******************************************<br> ；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  主 程 序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；；<br>； ******************************************<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START: MOV&amp;nbsp;  R0,#70H&amp;nbsp; &amp;nbsp; &amp;nbsp; 	；清70H-7AH共11个内存单元<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  R7,#0BH&amp;nbsp; &amp;nbsp; &amp;nbsp; 	；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLEARDISP:&amp;nbsp; MOV&amp;nbsp;  @R0,#00H&amp;nbsp; &amp;nbsp; &amp;nbsp; 	；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  INC&amp;nbsp;  R0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DJNZ&amp;nbsp; R7,CLEARDISP&amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  20H,#00H&amp;nbsp; &amp;nbsp;  	；清20H（标志用）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  7AH,#0AH&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；放入&quot;熄灭符&quot;数据<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 	 TMOD,#11H&amp;nbsp; &amp;nbsp; &amp;nbsp; ；设T0、T1为16位定时器<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  TL0,#00H&amp;nbsp;  	；50MS定时初值（T0计时用）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  TH0,#4CH&amp;nbsp;  	；50MS定时初值<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  TL1,#00H&amp;nbsp;  	；50MS定时初值（T1闪烁定时用）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  TH1,#4CH&amp;nbsp; &amp;nbsp; 	；50MS定时初值<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; EA&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；总中断开放<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; ET0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；允许T0中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；开启T0定时器<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  R4,#14H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；1秒定时用初值（50MS×20）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  START1: LCALL DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；调用显示子程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JNB 	 P3.7,SETMM1&amp;nbsp; &amp;nbsp; ；P3.7口为0时转时间调整程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SJMP&amp;nbsp; START1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；P3.7口为1时跳回START1<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SETMM1:&amp;nbsp; &amp;nbsp; &amp;nbsp; LJMP SETMM&amp;nbsp; &amp;nbsp;  ；转到时间调整程序SETMM<br>； ******************************************<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  1秒计时程序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>； ******************************************<br>；T0中断服务程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; INTT0: PUSH&amp;nbsp; ACC&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；累加器入栈保护<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  PUSH&amp;nbsp; PSW&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；状态字入栈保护<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  ET0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；关T0中断允许<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；关闭定时器T0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  A,#0B7H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；中断响应时间同步修正<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ADD&amp;nbsp;  A,TL0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；低8位初值修正<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  TL0,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；重装初值（低8位修正值）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  A,#4CH&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；高8位初值修正<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ADDC&amp;nbsp; A,TH0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  TH0,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；重装初值（高8位修正值）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；开启定时器T0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DJNZ&amp;nbsp; R4, OUTT0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；20次中断未到中断退出<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ADDSS:&amp;nbsp; MOV	 R4,#14H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；20次中断到（1秒）重赋初值<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 	 R0,#71H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；指向秒计时单元（71H-72H）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL ADD1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；调用加1程序（加1秒操作）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  A,R3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；秒数据放入A（R3为2位十进制数组合）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR	 C&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；清进位标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CJNE&amp;nbsp; A,#60H,ADDMM&amp;nbsp; &amp;nbsp; &amp;nbsp; ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ADDMM:&amp;nbsp; JC&amp;nbsp; 	 OUTT0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；小于60秒时中断退出<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL CLR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；大于或等于60秒时对秒计时单元清0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV	 R0,#77H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；指向分计时单元（76H-77H）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL ADD1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；分计时单元加1分钟<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 	 A,R3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；分数据放入A<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  C&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；清进位标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CJNE&amp;nbsp; A,#60H,ADDHH&amp;nbsp; &amp;nbsp; &amp;nbsp; ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ADDHH: JC	 OUTT0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；小于60分时中断退出<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL CLR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；大于或等于60分时分计时单元清0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV	 R0,#79H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；指向小时计时单元（78H-79H）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL ADD1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；小时计时单元加1小时<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  A,R3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；时数据放入A<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  C&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；清进位标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CJNE&amp;nbsp; A,#24H,HOUR&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  HOUR: JC&amp;nbsp; &amp;nbsp; OUTT0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；小于24小时中断退出<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL CLR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；大于或等于24小时小时计时单元清0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; OUTT0: MOV&amp;nbsp;  72H,76H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；中断退出时将分、时计时单元数据移<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  73H,77H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；入对应显示单元<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  74H,78H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  75H,79H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  POP 	 PSW&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；恢复状态字（出栈）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  POP&amp;nbsp;  ACC&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；恢复累加器<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; ET0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；开放T0中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RETI&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；中断返回<br>； ******************************************<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  闪动调时 程 序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>； ******************************************<br>；T1中断服务程序，用作时间调整时调整单元闪烁指示<br>INTT1:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH&amp;nbsp; &amp;nbsp; ACC&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；中断现场保护<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH&amp;nbsp; &amp;nbsp; PSW&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  TL1,&amp;nbsp;  #00H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；装定时器T1定时初值<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  TH1,&amp;nbsp;  #4CH&amp;nbsp;  		；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DJNZ&amp;nbsp; &amp;nbsp; R2,INTT1OUT&amp;nbsp;  		；0.3秒未到退出中断（50MS中断6次）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  R2,#06H&amp;nbsp; &amp;nbsp; &amp;nbsp;  		；重装0.3秒定时用初值<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CPL&amp;nbsp; &amp;nbsp;  02H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  		；0.3秒定时到对闪烁标志取反<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; JB&amp;nbsp; &amp;nbsp; &amp;nbsp; 02H,FLASH1&amp;nbsp; &amp;nbsp; 		；02H位为1时显示单元&quot;熄灭&quot;<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  72H,76H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；02H位为0时正常显示<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  73H,77H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  74H,78H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  75H,79H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>INTT1OUT:&amp;nbsp; &amp;nbsp; &amp;nbsp;  POP&amp;nbsp; &amp;nbsp;  PSW&amp;nbsp;  	&amp;nbsp; &amp;nbsp; &amp;nbsp; ；恢复现场<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; POP&amp;nbsp; &amp;nbsp;  ACC&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RETI&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；中断退出<br>FLASH1:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JB&amp;nbsp; &amp;nbsp; &amp;nbsp; 01H,FLASH2&amp;nbsp; &amp;nbsp; ；01H位为1时，转小时熄灭控制<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  72H,7AH&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；01H位为0时，&quot;熄灭符&quot;数据放入分<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  73H,7AH&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；显示单元（72H-73H），将不显示分数据<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  74H,78H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  75H,79H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AJMP&amp;nbsp; &amp;nbsp; INTT1OUT&amp;nbsp; &amp;nbsp; &amp;nbsp; ；转中断退出<br>FLASH2:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp; &amp;nbsp;  72H,76H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；01H位为1时，&quot;熄灭符&quot;数据放入小时<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  73H,77H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；显示单元（74H-75H），小时数据将不显示<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  74H,7AH&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV&amp;nbsp; &amp;nbsp;  75H,7AH&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AJMP&amp;nbsp; &amp;nbsp; INTT1OUT&amp;nbsp; &amp;nbsp; &amp;nbsp; ；转中断退出<br>； ******************************************<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  加1子 程 序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>； ******************************************<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ADD1: MOV	 A,@R0&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；取当前计时单元数据到A<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DEC	 R0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；指向前一地址<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SWAP&amp;nbsp; A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；A中数据高四位与低四位交换<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ORL 	 A,@R0&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；前一地址中数据放入A中低四位<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ADD	 A,#01H&amp;nbsp; &amp;nbsp; &amp;nbsp; ；A加1操作<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DA 	 A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；十进制调整<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp;  R3,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；移入R3寄存器<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ANL 	 A,#0FH&amp;nbsp; &amp;nbsp; &amp;nbsp; ；高四位变0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 	 @R0,A&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；放回前一地址单元<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV	 A,R3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；取回R3中暂存数据<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  INC	 R0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；指向当前地址单元<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SWAP	 A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；A中数据高四位与低四位交换<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ANL 	 A,#0FH&amp;nbsp; &amp;nbsp; &amp;nbsp; ；高四位变0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV	 @R0,A&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；数据放入当削地址单元中<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RET&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；子程序返回<br>； ******************************************<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  清零程序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>； ******************************************<br>；对计时单元复零用<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR0: CLR 		A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；清累加器<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		@R0,A&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；清当前地址单元<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DEC 		R0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；指向前一地址<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		@R0,A&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；前一地址单元清0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RET&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；子程序返回<br>； ******************************************<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  时钟调整程序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>； ******************************************<br>；当调时按键按下时进入此程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETMM:&amp;nbsp; cLR&amp;nbsp; 	ET0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；关定时器T0中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp; 	TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；关闭定时器T0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL&amp;nbsp; 	DL1S&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；调用1秒延时程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JB&amp;nbsp; 		P3.7,CLOSEDIS&amp;nbsp; ；键按下时间小于1秒，关闭显示（省电）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV&amp;nbsp; 	R2,#06H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；进入调时状态，赋闪烁定时初值<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB 	ET1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；允许T1中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB 	TR1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；开启定时器T1<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SET2:&amp;nbsp; JNB 		P3.7,SET1&amp;nbsp; &amp;nbsp; &amp;nbsp; ；P3.7口为0（键未释放），等待<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; 	00H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；键释放，分调整闪烁标志置1<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SET4:&amp;nbsp; JB&amp;nbsp; 		P3.7,SET3&amp;nbsp; &amp;nbsp; &amp;nbsp; ；等待键按下<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL&amp;nbsp;  	DL05S&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；有键按下，延时0.5秒<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JNB&amp;nbsp; &amp;nbsp; 	P3.7,SETHH&amp;nbsp; &amp;nbsp;  ；按下时间大于0.5秒转调小时状态<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		R0,#77H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；按下时间小于0.5秒加1分钟操作<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL 	ADD1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；调用加1子程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		A,R3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；取调整单元数据<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR 		C&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；清进位标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CJNE 	A,#60H,HHH&amp;nbsp; &amp;nbsp;  ；调整单元数据与60比较<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HHH: JC 		SET4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；调整单元数据小于60转SET4循环<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL 	CLR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；调整单元数据大于或等于60时清0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR 		C&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；清进位标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  AJMP&amp;nbsp; 	SET4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；跳转到SET4循环<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CLOSEDIS:&amp;nbsp; SETB 	 ET0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；省电（LED不显示）状态。开T0中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB 	 TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；开启T0定时器（开时钟）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CLOSE:&amp;nbsp; &amp;nbsp;  JB&amp;nbsp;  	 P3.7,CLOSE&amp;nbsp; &amp;nbsp; ；无按键按下，等待。<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL	 DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；有键按下，调显示子程序延时削抖<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JB&amp;nbsp; &amp;nbsp; 	P3.7,CLOSE&amp;nbsp; &amp;nbsp;  ；是干扰返回CLOSE等待<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WAITH:&amp;nbsp; &amp;nbsp;  JNB&amp;nbsp;  	P3.7,WAITH&amp;nbsp; &amp;nbsp;  ；等待键释放<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LJMP&amp;nbsp; 	START1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；返回主程序（LED数据显示亮）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETHH:&amp;nbsp; CLR&amp;nbsp; 	 00H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；分闪烁标志清除（进入调小时状态）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SETHH1:&amp;nbsp; JNB 		P3.7,SET5&amp;nbsp; &amp;nbsp; &amp;nbsp; ；等待键释放<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  01H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；小时调整标志置1<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SET6:&amp;nbsp; JB&amp;nbsp; 		P3.7,SET7&amp;nbsp; &amp;nbsp; &amp;nbsp; ；等待按键按下<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL&amp;nbsp;  	DL05S&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；有键按下延时0.5秒<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JNB&amp;nbsp; &amp;nbsp; 	P3.7,SETOUT&amp;nbsp; &amp;nbsp; ；按下时间大于0.5秒退出时间调整<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV		 R0,#79H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；按下时间小于0.5秒加1小时操作<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL 	 ADD1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；调加1子程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV		 A,R3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR 		C&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CJNE 	A,#24H,HOUU&amp;nbsp; &amp;nbsp; &amp;nbsp; ；计时单元数据与24比较<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HOUU:&amp;nbsp; JC 		SET6&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；小于24转SET6循环<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL 	CLR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；大于或等于24时清0操作<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  AJMP&amp;nbsp; 	SET6&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；跳转到SET6循环<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETOUT: JNB&amp;nbsp;  	P3.7,SETOUT1&amp;nbsp; &amp;nbsp;  ；调时退出程序。等待键释放<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL 	DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；延时削抖<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JNB&amp;nbsp;  	P3.7,SETOUT&amp;nbsp; &amp;nbsp; &amp;nbsp; ；是抖动，返回SETOUT再等待<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  	01H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；清调小时标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  	00H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；清调分标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  	02H&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；清闪烁标志<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  	TR1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；关闭定时器T1<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CLR&amp;nbsp;  	ET1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；关定时器T1中断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; 	TR0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；开启定时器T0<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETB&amp;nbsp; 	ET0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；开定时器T0中断（计时开始）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LJMP 	START1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；跳回主程序<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SET1:&amp;nbsp; LCALL&amp;nbsp; &amp;nbsp; DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；键释放等待时调用显示程序（调分）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  AJMP&amp;nbsp; &amp;nbsp;  SET2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；防止键按下时无时钟显示<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SET3:&amp;nbsp; LCALL&amp;nbsp; &amp;nbsp; DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；等待调分按键时时钟显示用<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  AJMP&amp;nbsp; &amp;nbsp;  SET4<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SET5:&amp;nbsp; LCALL&amp;nbsp; &amp;nbsp; DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；键释放等待时调用显示程序（调小时）<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  AJMP&amp;nbsp; &amp;nbsp;  SETHH1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；防止键按下时无时钟显示<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SET7:&amp;nbsp; LCALL&amp;nbsp; &amp;nbsp; DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；等待调小时按键时时钟显示用<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  AJMP&amp;nbsp; &amp;nbsp;  SET6<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  SETOUT1:&amp;nbsp; LCALL&amp;nbsp; &amp;nbsp; DISPLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；退出时钟调整时键释放等待<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AJMP&amp;nbsp; &amp;nbsp; SETOUT&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；防止键按下时无时钟显示<br>； ******************************************<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  显示程序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>； ******************************************<br>； 显示数据在70H-75H单元内，用六位LED共阳数码管显示，P1口输出段码数据，P3口作<br>； 扫描控制，每个LED数码管亮1MS时间再逐位循环。<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DISPLAY: MOV 		R1,#70H&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；指向显示数据首址<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		R5,#0FEH&amp;nbsp; &amp;nbsp; &amp;nbsp; ；扫描控制字初值<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  PLAY: MOV 		A,R5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；扫描字放入A<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		P3,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；从P3口输出<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		A,@R1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；取显示数据到A<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		DPTR,#TAB&amp;nbsp; &amp;nbsp;  ；取段码表地址<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOVC		A,@A+DPTR&amp;nbsp; &amp;nbsp;  ；查显示数据对应段码<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		P1,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；段码放入P1口<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL 	DL1MS&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；显示1MS<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  INC 		R1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；指向下一地址<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		A,R5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；扫描控制字放入A<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  JNB 		ACC.5,ENDOUT&amp;nbsp; &amp;nbsp; ；ACC.5=0时一次显示结束<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RL 		A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；A中数据循环左移<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		R5,A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；放回R5内<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  AJMP 	PLAY&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；跳回PLAY循环<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ENDOUT: SETB 	P3.5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；一次显示结束，P3口复位<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  MOV 		 P1,#0FFH&amp;nbsp; &amp;nbsp; &amp;nbsp;  ；P1口复位<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RET&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；子程序返回<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH<br>；共阳段码表&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;0&quot;&quot;1&quot;&quot;2&quot;&quot;3&quot;&quot;4&quot;&quot;5&quot;&quot;6&quot;&quot;7&quot;&quot;8&quot;&quot;9&quot;&quot;不亮&quot;<br>；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；<br>；；&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  延时程序&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ；；<br>；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；；<br>；1MS延时程序，LED显示程序用<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DL1MS: MOV 	R6,#14H<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DL1:&amp;nbsp;  MOV 	R7,#19H<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DL2:&amp;nbsp;  DJNZ 	R7,DL2<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DJNZ 	R6,DL1<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RET<br>；20MS延时程序，采用调用显示子程序以改善LED的显示闪烁现象<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DS20MS: ACALL 	 DISPLAY<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL	 DISPLAY<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ACALL	 DISPLAY<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RET<br>；延时程序，用作按键时间的长短判断<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DL1S:&amp;nbsp;  LCALL&amp;nbsp; &amp;nbsp; &amp;nbsp; DL05S<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  LCALL&amp;nbsp; &amp;nbsp; &amp;nbsp; DL05S<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RET<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DL05S:&amp;nbsp;  MOV&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; R3,#20H&amp;nbsp; &amp;nbsp; &amp;nbsp; ；8毫秒*32=0.196秒<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DL05S1:&amp;nbsp; LCALL&amp;nbsp; &amp;nbsp; &amp;nbsp; DISPLAY<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  DJNZ&amp;nbsp; &amp;nbsp; &amp;nbsp;  R3,DL05S1<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RET<br>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  END&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  ；程序结束<br>教学参考书目<br>1、汪德彪主编,《MCS-51单片机原理及接口技术》，电子工业出版社2003年8月第1版第1次印刷<br>2、丁元杰主编，《单片微机原理及应用》，机械工业出版社2005年1月第2版第10次印刷<br>3、聂毅&amp;nbsp; &amp;nbsp; &amp;nbsp;  单片机定时器中断时间误差的分析及补偿[J]. 微计算机信息，2002,18(4):37~38<br>4、楼然苗 李光飞，《51系列单片机设计实例》，北京航空航天大学出版社2003年3月第1版<br> ]]></description>
		<eb:creationDate>2005-12-05 17:14:21</eb:creationDate>
		<eb:modificationDate></eb:modificationDate>
    </item>
</channel>
</rss>