c51定时器中断

上传人:dax****eng 文档编号:245121902 上传时间:2024-10-07 格式:PPT 页数:24 大小:229KB
返回 下载 相关 举报
c51定时器中断_第1页
第1页 / 共24页
c51定时器中断_第2页
第2页 / 共24页
c51定时器中断_第3页
第3页 / 共24页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,*,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,3.2,单片机定时器,/,计数器应用,3.2.1,利用,Timer0,中断产生,1,秒延时,让数,1,个码管显示秒计数,本案例主要目的是熟练掌握单片机内部,Timer0,或,Timer1,的编程控制方法,会利用,Timer0,或,Timer1,中断精确定时。同时掌握数码管动态显示原理,学会,6,位数字显示的程序设计。本案例使用的电路为图,3-1-3,。,一、程序设计,#include,code unsigned char seven_seg10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;,unsigned char cp,i;/,声明全局变量,void timer0_isr(void)interrupt 1 /timer0,中断服务函数,TR0=0;/,停止计数,TL0=0 x11;/TL0,重新预置,TH0=0 xee;/TH0,重新预置,TR0=0;/,开始计数,cp+;/timer0,中断,1,次,变量,cp,加,1,if(cp=200)/,中断,200,次,时间刚好为,1,秒,cp=0;i+;,if(i=10)i=0;,P0=seven_segi /P0,输出显示数据,void timer0_initialize(void)/timer0,中断初始化函数,EA=0;/,设置中断允许寄存器,IE,中的,EA,位,,/,关闭中断总开关,TMOD=0 x01,;,/,设置计时器模式控制寄存器,,/Time0,工作在定时方式,1,TR0=0;/,设置计时器控制寄存器,TCON,寄存器,/,的,TR0,位为,0,,,Timer0,/,停止计数,TL0=0 x11;,TH0=0 xee;/Timer0,的,16,位计数器初始值为,/0 xee11,,,12MHz,晶体振,/,频率,单片机的机器周期为,1,微妙,,/Timer0,每,1,微秒加,1,计数,,/,加满溢出变产生中断,,/,从计数到中断刚好为,5,毫秒,PT0=1;/,设置中断优先次序寄存器,IP,中的,/PT0,位,,Timer0,中断优先,ET0=1;/,设置中断允许寄存器,IE,中,ET0,的,/,位,开启中断小开关,EA=1;/,打开中断总开关,TR0=1;/,开始计数,void main(void),timer0_initialize(),/timer0,初始化,为中断做好准备,while(1);/,等待中断,二、程序说明,1.,中断服务函数名中,,interruput,为关键字,,1,为,timer0,中断号。在,reg51.h,头文件中已经定义,表,3.2.1,为单片机常用中断的中断号。在使用中断服务函数时,直接在名后加,interruput,和中断号即可。,表,3.2.1 REG51.H,中单片机常用中断号定义,2.timer0,可以用作计数,也可以用来定时,由由,TMOD,寄存器中,为决定,作为计数器使用时,接受单片机外部引脚,P3.4,输入的脉冲加计数;作为定时器使用时,接受单片机内部的机器周期脉冲。如果单片机的振荡频率为,,振荡周期为,,则机器周期为,。本案例中,MHz,,则,微秒,,timer0,工作在模式,1,为,16,为加计数器,当计数器初始值为,0 xee11,时,则从开始计数到产生中断需要的时间为,0 xffff 0 xee11,个微秒,刚好为,5000,微秒,也即,5,毫秒。,本案例,TIMER0,的初装也可以利用下面语句完成:,#defined TEMOR0_COUNT 0 xee11,TL0=TEMOR0_COUNT /,取,TEMOR0_COUNT,的低字节并装入,TL0,TH0=TEMOR0_COUNT 8;/TEMOR0_COUNT,左移,8,位,并将低字节装入,TEMOR0_COUNT,利用定时器,/,计数器定时时,需要现设置工作模式,并计算它的初装值,计算初装值不好计算,常利用计算机中的计算器工具辅助。,timer0,工作在模式,1,可以最大,65535,微秒中断,1,次,如工作模式,2,,最大,256,微秒中断,1,次。,3.,当程序中只涉及一个中断时,可以不对中断的优先级进行设置,因此在本案例中语句,PT0=1,可以省略。程序中有多个中断但没有进行优先级设定的情况下,单片机中断优先级默认按终端号递增而依次降低。,4.,数码管显示语句放在了,timer0,中断服务函数里面,由于,5,毫秒中断,1,次,因此数码管显示的数据会每,5,毫秒更新,1,次。,1,秒内更新,200,次,更新过程是把原来的数据覆盖,但显示数据,1,秒内变化,1,次。,3.2.2,利用,4,个数码管,实现秒信号加计数,一、电路原理,图,3-2-1,所示的电路中,,4,位七段数码管采用,4,只单个数码管组成,可以显示,00009999,,数据输入端并联后接,P0,口,位选即每个数码管的阳极分别接,P2,口,中间加非门驱动。因为,P2,口反相驱动,因此,如果千位数码管显示,,P2.7,输出低电平,,P2,的其它端口输出高电平,并且此时,P0,输出千位数据。,在利用,Proteuse,软件仿真时,数码管,SEVEN_SEG,使用,7SEG-MPX4-CA,,非门,NOT,选用,74 HC series,类型中,Gates&Inverters,分类下的,74HC04,。电阻,R29,是限流电阻。,二、程序设计,#include,#defined unsigned char uchar,#defined unsigned int uint,code uchar seven_seg10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;,code uchar seg_scan4=0 xef,0 xdf,0 xbf,0 x7f;/,各个数码管对应的位选数据,uchar counter4=0,0,0,0;/,个位、十位、百位和千位数,uint cp,i;,void timer0_isr(void)interrupt 1 /timer0,中断服务函数,uchar j;,TR0=0;/,停止计数,TL0=0 x11;/TL0,重新预置,TH0=0 xee;/TH0,重新预置,TR0=0;/,开始计数,cp+;/timer0,中断,1,次,变量,cp,加,1,if(cp=200)/,中断,200,次,时间刚好为,1,秒,cp=0;,counter0+;/,个位数,,1,秒加,1,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 timer0_initialize(void)/timer0,中断初始化函数,EA=0;,TMOD=0 x01,;,TR0=0;,TL0=0 x11;,TH0=0 xee;,PT0=1;,ET0=1;,EA=1;,TR0=1;,void main(void),timer0_initialize(),while(1);,三、程序说明,1,imer0,第,1,次中断,,j=0,,显示个位,显示,5,毫秒后,,timer0,第,2,次中断,,j=1,,显示十位,以后随着中断依次显示百位和千位,最后重新显示个位。每位显示停留的时间为,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,也可以用,1,个变量代替,在显示时需做下面处理,uint x,;,P0=seven_segx/1000;/P0,输出千位数据编码,P2=seg_scan3;/,千位数码管共阳极设置为高电平,P0=seven_segx%1000/100;/P0,输出百位数据编码,P2=seg_scan2;/,千位数码管共阳极设置为高电平,P0=seven_segx%1000%100/10;/P0,输出十位数据编码,P2=seg_scan1;/,千位数码管共阳极设置为高电平,P0=seven_segx%1000%100%10;/P0,输出千位数据编码,P2=seg_scan0;/,千位数码管共阳极设置为高电平,思考题,(,1,)要让数码管在电路加电开始就显示,1230,,怎样更改有关数据?,(,2,)为什么不用,P2,口直接驱动数码管?,(,3,)本案例如果,200,微秒中断,1,次,也可以实现,1,定时,显示结果会怎样?,3.2.,3,设计一个,6,位数码管时间显示程序,本案例使用,6,位数码管显示时间,能显示时,/,分,/,秒,显示格式是,00.00.00,到,23.59.59,。其中小时和分钟之间的小数点常亮,分钟和秒之间的小数点进行秒闪烁。,参考程序,:,#include,#defined unsigned char uchar,code uchar seven_seg10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;,code uchar seg_scan6=0 xfb,0 xf7,0 xef,0 xdf,0bf,0 x7f;/,各个数码管对应的位选数据,uchar counter3=0,0,0;/,时位、分位和秒位,uchar tick,cp,i,j;/tick,:秒信号,,cp,:中断次数累计,void dispaly(void),uchar d,;,d=d*tick;/d,的值,1,秒内改变,1,次,要么,0 x00,,要么,0 xff,d=d|0 x7f;/d,的值,1,秒内改变,1,次,要么,0 x7f,,要么,0 xff,swich(i),case 0:P0=seven_segcounter0%10;break;/,显示秒个位,case 1:P0=seven_segcounter0/10;break;/,显示秒十位,case 2:P0=d /,数据高,8,位,1,秒改变,1,次,实现小,/,数点秒闪烁,case 3:P0=seven_segcounter0/10;break;/,显示分十位,case 4:P0=0 x7f /,显示数据高,8,位为低电平,小数点常亮,case 5:P0=seven_segcounter0/10;break;/,显示时十位,break;,P2=seg_scani;,i+;,if(i=6)i=0;,void timer0_isr(void)interrupt 1 /timer0,中断服务函数,TR0=0;/,停止计数,TL0=0 x11;/TL0,重新预置,TH0=0 xee;/TH0,重新预置,TR0=0;/,开始计数,cp+;/timer0,中断,1,次,变量,cp,加,1,if(cp=100)/,中断,100,次,时间刚好为,0.5,秒,cp=0;,tick=tick;/,秒脉冲信号,j+;,if(j=2)/,刚好,1,秒,j=0;,count
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!