- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图 10?12 软件模块化层次示意图 本课程全部结束 请提意见 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 第10章单片机应用实例与系统开发 10.1 单片机应用系统实例 10.2 单片机系统的开发应用过程 10.3 单片机开发系统 10.4 单片微机系统应用开发举例 10.1单片机应用系统实例 单片机由于简单易学、成本低廉,深受各个应用领域广大科技工作者和电子爱好者的欢迎。在本节所介绍的应用实例中的程序分别用MCS-51汇编语言和Cx51环境下的C语言实现。 10.1.1 光电计数器 在很多情况下,需要对外部事件进行计数,用单片机可以方便地构成各种不同功能的计数器。 1. 硬件电路设计 图10-1 光电计数器硬件电路原理图 本例利用光敏三极管接收计数脉冲(由外部事件转换为计数输入脉冲),当光敏三极管未受光照而截止时其集电极输出高电平,受光照而导通时其集电极输出低电平,如此便在光敏三极管的集电极产生一个负脉冲。为了防止计数过程中外界的干扰信号,该负脉冲经施密特触发器进行整形后,接在单片机定时器/计数器的输入端,便可以对光电信号产生的脉冲进行计数。通过单片机的P1口外接8只发光二极管来显示当前计数值,设定0.5s显示一次。 本例中,使用单片机的定时器/计数器T0,将光电计数器的计数输入端接在单片机定时器/计数器T0的计数输入引脚T0(P3.4)上,由定时器/计数器T1加上一个软计数器完成0.5s的定时,每当定时时间到时,就从定时器/计数器T0中读出当前计数值,并送到P1口进行显示。为方便起见,采用二极管静态显示,以8位二进制方式表示计数值。硬件电路如图10-1所示。 2. 软件设计 假定单片机的晶振频率为6MHz。 定时器/计数器T0设为工作方式2、计数工作方式、禁止中断,其初始值为(TH0)=00H、(TL0)=00H。 定时器/计数器T1设为工作方式1、定时工作方式,定时时间为125ms,其初始值为(TH1)= 0BH、(TL1)=0DCH,禁止中断。 汇编语言程序清单如下: 图10-1 光电计数器硬件电路原理图 ORG 0000H AJMP MAIN ORG 0100H MAIN:MOV TMOD, #16H MOV TH0, #00H MOV TL0, #00H MOV TH1, #0BH MOV TL1, #0DCH SETB TR0 SETB TR1 LOOP: MOV R0, #04H LOOP1: JNB TF1, $ CLR TF1 MOV TH1, #0BH ; T1重新设置125ms定时初始值 MOV TL1, #0DCH DJNZ R0, LOOP1 ; 0.5s到否? CLR TR0 ; 关闭定时器T0 MOV A, TL0 ; 读出当前计数值 SETB TR0 ; 开启定时器T0 CPL A ; 取反(因发光二极管共阳极接法) MOV P1, A ; 显示当前计数值 SJMP LOOP ; 循环 END 同样功能的Cx51程序清单如下: void main( void ) { unsigned char n; unsigned char nPulseCount; IE = 0x00; TMOD = 0x16; /* T0工作方式2计数,T1工作方式1定时 */ TH0 = 0; /* T0计数初始值 */ TL0 = 0; TH1 = 0x0B; /* T1定时125ms的初始值 */ TL1 = 0xDC; TR0 = 1; /* 启动定时器T0 */ TR1 = 1; /* 启动定时器T1 */ while(1) { for( n=4; n0; n-- ) /* 0.5s到否? */ { while( TF1==0 ); /* 125ms到否? */ TF1=0; TH1 = 0x0B; /* T1重新设置125ms定时初始 值 */ TL1 = 0xDC; } TR0=0; /* 关闭定时器T0 */ nPulseCount = TL0; /* 读出当前计数值 */ TR0=1; /* 开启定时器T0 */ P1=~nPulseCount;
文档评论(0)