1、单片机定时器计数器实验报告单片机定时器计数器实验报告篇一:单片机计数器实验报告计数器实验报告 实验目的1. 学习单片机内部定时/计数器的使用和编程方法; 2. 进一步掌握中断处理程序的编程方法。 实验器材1. 2. 3. 4. 5.G6W仿真器一台 MCS51实验板 一台 PC机 一台 电源 一台 信号发生器 一台 实验内容及要求8051内部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数,使用8051的T1作定时器,50ms中断一次,看T0内每50ms来了多少脉冲,将计数值送显(通过LED发光二极管8421码来表示),1秒后再次测试。 实验说明 1. 本实验中内部计数器其
2、计数器的作用,外部事件计数器脉冲由P3.4引入定时器T0。单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变,这就要求被采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样,同时这就决定了输入波形的频率不能超过机器周期频率。 2. 计数脉冲由信号发生器输入(从T0端接入)。3. 计数值通过发光二极管显示,要求:显示两位,十位用L4L1的8421码表示,个位用L8L5的8421码表示4. 将脉搏检查模块接入电路中,对脉搏进行计数,计算出每分钟脉搏跳动次数并显示 实验框图(见下页)程序源代码 ORG 00000H LJMP MAINORG 001BH
3、 AJMP MAIN1 MAIN:MOV SP,#60HMOV TMOD,#15H MOV 20H,#14H MOV TL1,#0B0H MOV TH1,#3CHMOV TL0,#00H ;T0的中断入口地址 ;设置T1做定时器,T0做计数器,都于方式1工作 ;装入中断次数 ;装入计数值低8位 ;装入计数值高8位 MOV TH0,#00HSETB TR1 ;启动定时器T1 SETB TR0 ;启动计数器T0 SETB ET1 ;允许T1中断 SETB EA ;允许CPU中断 SJMP $;等待中断MAIN1: PUSH PSW PUSH ACC CLR TR0CLR TR1 MOV TL1,#
4、0B0H MOV TH1,#3CHDJNZ 20H,RETUNT MOV 20H ,#14HSHOW: MOV R0,TH0 MOV R1,TL0MOV A,R1 MOV B,#0AH DIV ABMOV C,ACC.3MOV P1.0,C MOV C,ACC.2 MOV P1.1,C MOV C,ACC.1 MOV P1.2,C MOV C,ACC.0 MOV P1.3,CMOV A,B MOV C,ACC.3MOV P1.4,C MOV C,ACC.2 MOV P1.5,C MOV C,ACC.1 MOV P1.6,C MOV C,ACC.0MOV P1.7,C ;保护现场;装入计数值低8
5、位;装入计数值高8位,50ms;允许T1中断;未到1s,继续计时 ;1s到重新开始;显示计数器T0的值;读计数器当前值 ;将计数值转为十进制;显示部分,将A中保存的十位赋给L0L3 将B中保存的各位转移到A中 ;将个位的数字显示在L4L7上;RETUNT:MOV TL0,#00H;将计数器T0清零 MOV TH0,#00HSETB TR0SETB TR1POP ACCPOP PSWRETI ;中断返回在频率为1000HZ时,L0L7显示为50;频率为300HZ时,L0L7显示为15,结果正确,程序可以正确运行。 思考与小结:有了前面的定时器实验做基础,定时器计数器的选择以及初始化已经不再是难点
6、,本次试验的重点是写入两个中断判断程序和十六进制到十进制的转化和显示。 MOV TL1,#0B0H ;装入计数值低8位MOV TH1,#3CH;装入计数值高8位,50msMOV 20H,#14H ;未到1s,继续计时 DJNZ 20H,RETUNT;1s到重新开始 RETUNT:MOV TL0,#00H;将计数器T0清零 MOV TH0,#00H由于书上详细解释了设置中断时间的问题,所以中断程序并没有什么太大的难点,主要是要思考一下程序的执行顺序问题。十六进制到十进制的转化和显示使我们这次实验遇到的比较大的困难,刚开始采用的是DA指令,由于没有搞清楚它的实质错误的使用了DA。DA用于十六进制到
7、BCD的转换,不能用于十六进制到8421的转换,于是我们思考了很久。后来终于找到了比较简单的方法用除数,十位放在A中,个位也就是余数放在B中。MOV R0,TH0 ;读计数器当前值 MOV R1,TL0MOV A,R1 MOV B,#0AHDIV AB;将计数值转为十进制由于这次的数字比较小而且要显示在L0L7上,所以可以用这种方法,如果是数字比较大的话这种方法也不奏效,需要写一段通用代码来实现。后面的问题可谓是一只强大的拦路虎,可能是基础只是不过关的缘故,我们一直在数字的显示顺序上纠结万分,用了左循环但是没有达到预期目的,在老师的指导之下才知道原来可以直接位赋值。以后一些使用的知识和技巧一定
8、要掌握。MOV C,ACC.3 ;显示部分,将A中保存的十位赋给L0L3 MOV P1.0,C MOV C,ACC.2 MOV P1.1,CMOV C,ACC.1 MOV P1.2,C MOV C,ACC.0 MOV P1.3,CMOV A,B;将B中保存的各位转移到A中 MOV C,ACC.3 ;将个位的数字显示在L4L7上 MOV P1.4,C MOV C,ACC.2 MOV P1.5,C MOV C,ACC.1 MOV P1.6,C MOV C,ACC.0MOV P1.7,C篇二:51单片机定时器实验电子信息工程学系实验报告课程名称:单片机原理实验项目名称:51定时器实验 实验时间:XX
9、-11-27班级:测控081 姓名:学号:2 实 验 目 的: 熟悉keil仿真软件、伟福仿真器的使用和C51定时程序的编写。了解51单片机中定时、计数的概念,熟悉51单片机内部定时/计数器的结构与工作原理。掌握中断方式处理定时/计数的工作过程,掌握定时/计数器在C51中的设置与程序的书写格式以及使用方法。实 验 原 理:定时分类及原理1.软件定时:即让机器执行一个程序段,这段程序本身没有具体的执行目的,只是为了磨时间。执行这段程序所需要的时间就是延时时间。这种程序前面已设计过。这种方法定时占用CPU执行时间,降低了CPU利用率。此次实验使用的是MCS-51系列单片机。2.数字电路硬件定时:采
10、用小规模集成电路器件如555,外接定时部件(电阻和电容)构成。这样的定时电路简单,但要改变定时范围,必须改变电阻和电容,这种定时电路在硬件连接好以后,修改不方便。3.可编程定时/计数器:是为方便微型计算机系统的设计和应用而研制的,它是硬件定时,又很容易地通过软件来确定和改变它的定时值,通过初始化编程,能够满足各种不同的定时和计数要求,因而在嵌入式系统的设计和应用中得到广泛的应用。8051型单片机有两个十六位定时/计数器T0、T1,有四种工作方式,跟定时/计数器相关的特殊功能寄存器有这样几个: 方式控制寄存器TMODM1、M0的状态决定定时器的工作方式,定时和外部事件计数方式选择位C/T,GAT
11、E与TR0、TR1配合决定定时/计数器的启停。加法计数寄存器TH0、TH1 (高八位)TL0、TL1(低八位); 定时/计数到标志TF0、TF1(中断控制寄存器TCON); 定时/计数器启停控制位TR0、TR1(TCON);定时/计数器中断允许位ET0、ET1(中断允许寄存IE); 定时/计数器中断优先级控制位PT0、PT1(中断优IP)。 定时/计数器的工作方式 MCS51的定时器有方式0、方式1、方式2和方式2这3种工作方式。 1.方式0当M1M0=00时,定时器工作于方式0。方式 0为13位的计数器,由TL0的低5位和TH0的8位组成,TL0低5位计数溢出时向TH0进位,TH0计数溢出时
12、 置位溢出标志TF0。若T0工作于定时方式,设计数初值为a,晶振频率为12MHz,则T0从初值开始计数到溢出的定 时时间为 t(213a)1S。 2. 方式1 当M1M0=01时,定时器工作于方式1。 T1工作于方式1时,由TH1作为高8位,TL1作为低8位,构成一个十六位的计数器。若T1工作于定时方式1,计数初值为 a,晶振频率为12MHz,则T1从计数初值计数到溢出的定时时间为t =(216a)S。3. 方式2M1M0=10时,定时器计数器工作于方式2,方式2为自动恢复初值的 8位计数器。TL1作为8位计数器,TH1作为计数初值寄存器。 t =(28a)S。单片机内部的定时计数模块,在定时
13、时,对工作频率的12分频进行计数,先记入TL后记入TH,直到溢出为止,根据TL、TH内的初值不同可以定出不同的时间;在计数工作方式时,对T0(T1)引脚的输入脉冲进行计数,将计数值记入TL、TH。当定时/计数溢出时,会引起中断。设置合适的计数初值,以产生期望的定时间隔。由于定时/计数器在方式0、方式1和方式2时的最大计数间隔取决于使用的晶振频率fosc,如下表所示,当需要的定时间隔较大时,要采用适当的方法,即将定时间隔分段处理。计数初值与定时时间的关系为:T = 12(T_all a)/fosc定时间隔为T,计数初值为a。所以有计数初值a =Tfosc/12,THx = a / 256,TLx
14、 = a % 256。定时器均有一个最大定时时间,对于长时间的定时需要,可以将定时间隔为固定的较小时间,通过另设一全局变量ah1用于计数,累加固定的较小定时时间来进行。确定定时/计数器工作于查询方式还是中断方式,若工作于中断方式,则在初始化时开放定时/计数器的中断及总中断: ET0 = 1; EA = 1;还需要编写中断服务函数:void T0_srv(void) interrupt 1 using 1TL0 = a % 256;TH0 = a / 256; 中断服务程序段4启动定时器:TR0(TR1)= 1。实 验 设 备 与 器 件硬件:微机、WAVE单片机仿真器、单片机实验板、跳帽若干
15、软件:KEIL C51单片机仿真调试软件,伟福V系列仿真调试软件实 验 内 容:利用实验板上的一位LED数码管做显示,利用中断法编写定时程序,控制单片机定时器进行定时,所定时间为1S。刚开始LED数码管显示0,每过1S数码管的显示值增加1,当显示到59时返回0,依此反复。实验的程序代码如下:#includevoid mDelay (unsigned int Delay) unsigned int b; for(;Delay0;Delay-) for(b=0;bint i,j,k,a; i=-1; j=0; k=0;unsigned char code tab10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; void main() TMOD=0x01;a=-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1