




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.2单片机计时器/计数器应用程序,3.2.1小时r0中断生成1秒延迟,多个码管显示秒计数,这种情况主要是为了熟悉单片机内部Timer0或Timer1的编程控制方法,使用Timer0或Timer1中断中断中断正确的计时。同时掌握数码管动态显示原理,学习6位数字显示编程。在这种情况下使用的电路是图3-1-3。一,编程,# includecodunsignedcharseven _ seg10= 0 xc0,0 xf9,0 xa4,0 XB,0 x99,0x92,0Unsignedcharcp,I;/全局变量void timer 0 _ ISR(void)interrupt 1/timer 0中断服务函数 TR0=0;/停止计数TL0=0 X11/TL0重新预设TH0=0 xee/TH0重置TR0=0;/CP计算开始;/timer0中断一次,变量CP 1if(cp=200)/200次,时间正好1秒 CP=0;I; if(I=10)I=0;P0=seven_segi/P0输出显示数据,void timer 0 _ initialize(void)/timer 0中断初始化函数 EA=0;/允许中断设置寄存器IE中的EA位,/中断主开关TMOD=0 x01关闭;关闭。/计时器模式控制寄存器设置,/Time0在计时器方法1TR0=0中操作。/计时器控制寄存器设置TCON寄存器/TR0位为0,Timer0/停止计数TL0=0 X11TH0=0 xee/Timer0的16位计数器初始值为/0 xee11,12MHz晶体振动/频率,单芯片微型计算机的机器周期为1微妙,/Timer0每1微秒计算一次,/整个溢出/在中断优先级寄存器IP中设置/PT0位,Timer0中断优先级ET0=1;/允许中断设置寄存器IE中ET0的/位,打开中断小开关EA=1;/打开中断主开关TR0=1。/启动计数,初始化void main(void) timer 0 _ initialize()/timer 0以准备中断的while(1)。/正在等待中断,第二,程序说明,1 .在中断服务函数名称中,interruput是关键字,1是timer0中断编号。在Reg51.h头文件中定义,表3.2.1是单片机常用的中断号。使用中断服务函数时,只需在名称后紧跟interruput和中断编号。在表3.2.1REG51.H中,定义单片机的典型中断号,计算或计时2.timer0,使用TMOD寄存器确定的计数器时,允许单片机的外部插针P3.4输入脉冲加计数;用作计时器时,接收单片机内部的机器循环脉冲。如果单片机的振动频率是,振动周期是,机器周期是。在这种情况下,微秒,时间r0是模式1为16,计数器为0 xee11,则从启动计数开始生成中断所需的时间为0 xffff0 xee11微秒,即5毫秒。在这种情况下,还可以使用以下语句执行TIMER0的初始安装:# defined temor 0 _ COUNT 10xe 11 tl0=TEMOR0_COUNT/temo r0 _ COUNT向左移动8位,使用计时器/计数器计时将低字节加载到temo r0 _ COUNT时,设置操作模式并初始Timer0操作最多可以在65535微秒内中断一次,例如在模式1下中断操作模式2,中断最多256微秒1。3.如果程序仅涉及一个中断,则可以不设置中断的优先级,因此在这种情况下,可以省略PT0=1语句。如果程序有多个中断,但没有优先级设置,则微控制器中断优先级默认按端子号增加,按顺序减少。4.数码管显示门放置在timer0中断服务函数中,在5毫秒中断一次,因此数码管显示的数据每5毫秒更新一次。每秒更新200次将复盖原始数据,但每秒显示一次更改的数据。3.2.2使用4个数码管进行秒信号相加计数,1,电路原理图3-2-1所示的电路中,4个7段数码管由4个单数码管组成,0000到9999,数据输入端并行显示P0端口,比特选择显示每个数码管的每个阳极的P2端口,中间显示非门驱动。P2端口反向驱动,因此,如果显示千位数码管,则P2 P2.7输出较低的级别,P2的其他端口输出较高的级别,此时P0输出千位数据。,使用Proteuse软件仿真时,数码管SEVEN_SEG使用7SEG-MPX4-CA,非语句NOT使用74HCseries类型中的gatescoducharseg _ scan 4=0xef/与每个数字管道相对应的位选择数据uchar counter 4=0,0,0 ;/位、10位、100位和数千位uintcp、I;void timer 0 _ ISR(void)interrupt 1/timer 0中断服务函数 ucharjTR0=0;/停止计数TL0=0 X11/TL0重新预设TH0=0 xee/TH0重置TR0=0;/CP计算开始;/timer0中断一次,变量CP 1if(cp=200)/200次,时间正好1秒 CP=0;counter0;/位数,每秒加一,if(counter0=10) counter0=0;counter1; if(counter1=10) counter1=0;counter2; if(counter2=10) counter2=0;counter3; if(counter3=10)counter3=0;P0=seven _ segcounterj;/P0输出数据编码P2=seg _ scanj;/P2输出位选择信号j;if(j=4)j=0; void timer 0 _ initialize(void)/timer 0中断初始化函数 EA=0;TMOD=0 x01;TR0=0;TL0=0 X11TH0=0 xeePT0=1;ET0=1;EA=1;TR0=1; void main(void) timer 0 _ initialize()while(1);,iii,程序说明,1。ime r0第一次中断,j=0,显示位,5毫秒显示后1.imer0第二次中断,j=1,显示10位,随后根据中断按100位、千位的顺序显示,最后再显示一位。每个标记保留5毫秒。4中断4次,20毫秒,1秒显示4位数码管扫描50次。根据人类的视觉持续性特性,4位数据同时显示。此显示方法是动态扫描显示。2.如果变量j=0,则counter0是位十进制数,运行P0=seven_segcounter0,并且P0端口输出位显示数据编码。数码管的比特选择信号仅使用P2的高4位,并运行P2=seg_scan0,P2=0 xef,以执行非门偶反转,然后添加到数码管的比特选择信号只有一个比特高的级别,此时仅显示一个比特。3.数组counterj也可以用一个变量替换,显示时可以按如下方式处理:uintx;P0=seven _ segx/1000;/P0输出千位数据编码P2=seg _ scan3;/千位数码管总阳极为高电平P0=seven _ segx00/100;设定为/P0输出100位元资料编码P2=seg _ scan2;/千位数码管总阳极为高电平P0=seven _ segx00 0 0/10;设置为。/P0输出10位数据编码P2=seg _ scan1;/千位数码管总阳极为高水平P0=seven _ segx00 0;设置为/P0输出千位数据编码P2=seg _ scan0;/千位数码管都设置在两极较高的水平,请考虑考试问题。(1)在打开电路电源时,如何更改数据以使数字管显示1230?(2)为什么不使用P2端口直接驱动数字管?(3)在这种情况下,即使200微秒内中断一次,也能达到1个计时,结果会怎样呢?3.2.3设计使用6位数码管显示时间、显示时间/分/秒、显示格式00.00.00-23.59.59的6位数码管时间显示程序。其中小时和分钟之间的小数点总是亮的,分和秒之间的小数点以秒为单位闪烁。参考程序: # include # definedcharucharcodecharseven _ seg10= 0 xc0,0 xf9,0 xa4,0 X60,0x99,000Coducharseg _ scan 6=0 xfb,0 xf7,0 xef,0 xdf,0b f,0x7f ;/与每个数字管道相对应的位选择数据ucharcounter3=0,0,0 ;/小时、分钟和秒uchartick,cp,I,j;/tick:秒信号,CP:中断数累积,void dispaly(void) uchard;D=d *刻度;/d值在一秒内变更一次,或0 x00或0 xffd=d | 0 x7f/d的值在一秒内更改一次,或者0 x7f或0 xff swich(I) case 0333690 p 0=seven _ segcounter0;Break/1秒位case 13360 p 0=seven _ segcounter0/10;标记Break/10秒case 2330p 0=d显示,void timer 0 _ ISR(void)interrupt 1/timer 0中断服务函数 TR0=0;/停止计数TL0=0 X11/TL0重新预设TH0=0 xee/TH0重置TR0=0;/CP计算开始;/timer0中断一次,变量CP 1if(cp=100)/100次,时间正好为0.5秒 CP=0;刻度=刻度;/秒脉冲信号j;if(j=2)/精确1秒 j=0;counter0;/一位,每秒1 if(counter0=60) counter0=0;counter1; if(counter1=60) counter1=0;counter2; if(counter2=24)counter2=0;display();,void timer 0 _ initialize(void)/timer 0中断初始化函数 EA=0;TMOD=0 x01;TR0=0;TL0=0 X11TH0=0 xeePT0=1;ET0=1;EA=1;TR0=1;初始化void main(void) timer 0 _ initialize()/timer 0,为中断准备while(1)。,iii,程序说明,1。使用变量counter2、counter1和counter0表示以小时、分钟和秒为单位的数字大小,或者typedefstruct ucarhour可以使用类似的结构定义这些变量。UcarminUcarsec timeTimenow;/now是数据类型为time的变量,因此counter2、counter1和counter0。您可以使用now.hour、now.sec和now.sec代替变量。2.在运行timer0中断服务函数时,可以使用dispaly()函数将dispaly()函数体程序直接写入中断函数,但中断服务函数看起来很富庶。Timer0每5毫秒停止一次,然后调用dispaly()函数运行一次,在执行dispaly()的过程中,i=0时只显示秒,i=1时只显示秒10位,依此类推。显示时间位以使时间小数点始终变亮时,将编码数据的前8位设置为0。要使1秒的小数位数闪烁,可以将1个小数位数设置为周期变化量。3.程序和复杂,使用的变量越多,在程序分析和设计中需要小心使用的变量最好用具有特定含义的文字表示。待讨论的事项,1 .使用模式2的主要优点是,不再在timer0中断服务函数中预先设置TL0和TH0,程序变得更简单,下面使用timer0实现一秒计时本地程序,进行分析和重写,以实现与此方案相同
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海水淡化处理中的蒸发技术应用考核试卷
- 火力发电厂施工信息技术应用考核试卷
- 电机在实验仪器中的应用考核试卷
- 装饰材料企业产品创新与市场接受度考核试卷
- 营养食品在极端环境适应中的研究考核试卷
- 物联网智能电网数据分析考核试卷
- 轻质建筑材料制造续考核试卷
- 稀土金属提炼过程中的政策引导与市场机制构建研究分析考核试卷
- 肿瘤表观遗传学研究进展
- 情感出轨方独立承担担保责任及财产分割协议
- 2024年高考真题-地理(河北卷) 含答案
- 单位驾驶员劳务派遣投标方案投标文件(技术方案)
- 资本经营-终结性考试-国开(SC)-参考资料
- 2024年浙江省中考科学试卷
- 拆除工程地坪拆除施工方案
- 软件授权书范本
- 招聘笔试题与参考答案(某大型国企)2025年
- DB34∕T 2570-2015 祁红香螺加工技术规程
- 安徽合肥滨湖投资控股集团有限公司招聘笔试题库2024
- 2024年四年级英语下册 Module 4 Things we enjoy Unit 12 The ugly duckling第3课时教案 牛津沪教版(三起)
- 2024年铁路职业技能竞赛(线路工)理论考试题库及答案
评论
0/150
提交评论