嵌入式定时器实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

昆明理工大学信息工程与自动化学院学生实验报告(2013—2014学年第2学期)课程名称:嵌入式技术及应用开课实验室:信自楼5042014年5月9日年级、专业、班2011级计科111学号201110405138姓名成绩实验项目名称定时器实验(十进制计数器)指导教师江虹教师评语该同学是否了解实验原理:A.了解□B.基本了解□C.不了解□该同学的实验能力:A.强□B.中等□C.差□该同学的实验是否达到要求:A.达到□B.基本达到□C.未达到□实验报告是否规范:A.规范□B.基本规范□C.不规范□实验过程是否详细记录:A.详细□B.一般□C.没有□教师签名:年月日一、实验目的掌握定时器T0、T1的方式选择和编程方法,了解中断服务程序的设计方法,学会实时程序的调试技巧。二、实验原理89C51单片机有五个中断源(89C52有六个),分别是外部中断请求0、外部中断请求1、定时器/计数器0溢出中断请求、定时器/计数器0溢出中断请求及串行口中断请求。每个中断源都对应一个中断请求位,它们设置在特殊功能寄存器TCON和SCON中。当中断源请求中断时,相应标志分别由TCON和SCON的相应位来锁寄。五个中断源有二个中断优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务程序嵌套。在同一优先级别中,靠内部的查询逻辑来确定响应顺序。不同的中断源有不同的中断矢量地址。中断的控制用四个特殊功能寄存器IE、IP、TCON(用六位)和SCON(用二位),分别用于控制中断的类型、中断的开/关和各种中断源的优先级别。中断程序由中断控制程序(主程序)和中断服务程序两部分组成:1)中断控制程序用于实现对中断的控制;2)中断服务程序用于完成中断源所要求的中断处理的各种操作。C51的中断函数必须通过interruptm进行修饰。在C51程序设计中,当函数定义时用了interruptm修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。三、实验内容在实验板上完成如下功能:用定时器T0的方式1,实现第一个发光二极管以200ms的间隔闪烁;用定时器T1的方式1,实现数码管前两位59s循环计时。实验板数码管电路原理如图1所示。计算初值公式定时模式1th0=(216-定时时间)/256tl0=(216-定时时间)%256图1LED数码管电路原理图四、实验步骤1、按实验要求在KeilC中创建项目,编辑、编译程序。2、将编译生成的目标码文件(后缀为.Hex)下载到实验板电路中。3、在实验板中运行程序,观察实验运行结果并记录。1.实验原理补充:89C51的定时计数器的结构及工作方式2.工作方式定时器方式:设置为定时工作方式时,定时器计数89C51片内振荡器输出经12分频后的脉冲,即每个机器周期使定时器(T0或T1)的数值加1直至计满溢出。当89C5l采用12MHz晶体时,一个机器周期为1μs,计数频率为1MHz。计数器方式:设置为计数工作方式时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号计数。当输入脉冲信号产生由1至0的下降沿时,计数器的值加1。在每个机器周期的S5P2期间采样T0或T1引脚的输入电平,若前一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的数值装入计数器。所以,检测一个1至0的跳变需要二个机器周期,故最高计数频率为振荡频率的二十四分之一。除了可以选择定时器或计数器工作方式外,每个定时器/计数器还有四种工作模式,也就是每个定时器可构成四种电路结构模式。其中,0~2模式对T0和T1都是一样的,模式3对两者是不同的。定时器共有两个控制字,由软件写入TMOD和TCON两个8位寄存器,用来设置T0或T1的操作模式和控制功能。当89C51系统复位时,两个寄存器所有位都被清0。MODE0工作方式(Timer0为例)3.实验代码:#includereg52.h#defineuintunsignedint#defineucharunsignedcharsbitU1=P2^6;sbitU2=P2^7;sbitLED=P1^0;ucharcount,count1,second,shi,ge;ucharcodetable[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x51,0x79,0x71};voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voidinit(){TMOD=0x11;//0001'0001TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;}voiddisplay(ucharaa,ucharbb){U2=1;P0=0xfe;//1111'1110U2=0;U1=1;P0=table[aa];U1=0;delay(5);U2=1;P0=0xfd;//1111'1101U2=0;U1=1;P0=table[bb];U1=0;delay(5);}voidmain(){init();while(1){shi=second/10;ge=second%10;display(shi,ge);}}voidtimer0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==4){count=0;LED=~LED;}}voidtimer1()interrupt3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;count1++;if(count1==20){count1=0;second++;if(second==60)second=0;}}4.实验截图五、思考1.若用定时器1方式2,程序如何修改?由于使用定时器1的方式2的话,tmax=256us。而且由于方式2的机器特性不用进行重新赋值。所以更改代码21行:TMOD=0x21;//0002'0001删除24、25两行。TH1=(65536-50000)/256;(24行)TL1=(65536-50000)%256;(25行)删除75、76两行。TH1=(65536-50000)/256;TL1=(65536-50000)%256;2.若显示从“99”开始递减,程序如何修改?由于要从99倒计时,所以修改起始值,然后修改递减状态,修改循环回复状态。修改第9行second=99;修改81、82、83行second--;if(second==0)second=99;六、试验总结经过这个试验我学习到了许多关于定时器实验(十进制计数器)知识,不过我这个试验的程序编辑、编译不太熟悉,搞了好久也没有得到结果,最后在同学的帮助下完成了这个程序,并开始将编译生成的目标码文件传入实验板中。在一个困难的问题又来到了,我对试验板又不知道如何操作,经过同学们的帮助我最终完成了这个试验

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功