单片机定时器计数器实验报告文档格式.docx
《单片机定时器计数器实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《单片机定时器计数器实验报告文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
装入计数值高8位
MOVTH0,#00H
SETBTR1;
启动定时器T1SETBTR0;
启动计数器T0SETBET1;
允许T1中断SETBEA;
允许CPU中断SJMP$;
等待中断
MAIN1:
PUSHPSWPUSHACCCLRTR0
CLRTR1MOVTL1,#0B0HMOVTH1,#3CH
DJNZ20H,RETUNTMOV20H,#14H
SHOW:
MOVR0,TH0MOVR1,TL0
MOVA,R1MOVB,#0AHDIVAB
MOVC,ACC.3MOVP1.0,CMOVC,ACC.2MOVP1.1,CMOVC,ACC.1MOVP1.2,CMOVC,ACC.0MOVP1.3,C
MOVA,BMOVC,ACC.3MOVP1.4,CMOVC,ACC.2MOVP1.5,CMOVC,ACC.1MOVP1.6,CMOVC,ACC.0
MOVP1.7,C;
保护现场
;
装入计数值低8位
装入计数值高8位,50ms;
允许T1中断
未到1s,继续计时;
1s到重新开始
显示计数器T0的值;
读计数器当前值;
将计数值转为十进制
显示部分,将A中保存的十位赋给L0~L3将B中保存的各位转移到A中;
将个位的数字显示在L4~L7上
RETUNT:
MOVTL0,#00H;
将计数器T0清零MOVTH0,#00H
SETBTR0SETBTR1POPACCPOPPSW
RETI;
中断返回
在频率为1000HZ时,L0~L7显示为50;
频率为300HZ时,L0~L7显示为15,结果正确,程序可以正确运行。
思考与小结:
有了前面的定时器实验做基础,定时器计数器的选择以及初始化已经不再是难点,本次试验的重点是写入两个中断判断程序和十六进制到十进制的转化和显示。
MOVTL1,#0B0H;
MOVTH1,#3CH;
装入计数值高8位,50ms
MOV20H,#14H;
未到1s,继续计时DJNZ20H,RETUNT;
1s到重新开始RETUNT:
由于书上详细解释了设置中断时间的问题,所以中断程序并没有什么太大的难点,主要是要思考一下程序的执行顺序问题。
十六进制到十进制的转化和显示使我们这次实验遇到的比较大的困难,刚开始采用的是DA指令,由于没有搞清楚它的实质错误的使用了DA。
DA用于十六进制到BCD的转换,不能用于十六进制到8421的转换,于是我们思考了很久。
后来终于找到了比较简单的方法用除数,十位放在A中,个位也就是余数放在B中。
MOVR0,TH0;
读计数器当前值MOVR1,TL0
MOVA,R1MOVB,#0AH
DIVAB;
由于这次的数字比较小而且要显示在L0~L7上,所以可以用这种方法,如果是数字比较大的话这种方法也不奏效,需要写一段通用代码来实现。
后面的问题可谓是一只强大的拦路虎,可能是基础只是不过关的缘故,我们一直在数字的显示顺序上纠结万分,用了左循环但是没有达到预期目的,在老师的指导之下才知道原来可以直接位赋值。
以后一些使用的知识和技巧一定要掌握。
MOVC,ACC.3;
显示部分,将A中保存的十位赋给L0~L3MOVP1.0,CMOVC,ACC.2MOVP1.1,C
MOVC,ACC.1MOVP1.2,CMOVC,ACC.0MOVP1.3,C
MOVA,B;
将B中保存的各位转移到A中MOVC,ACC.3;
将个位的数字显示在L4~L7上MOVP1.4,CMOVC,ACC.2MOVP1.5,CMOVC,ACC.1MOVP1.6,CMOVC,ACC.0
MOVP1.7,C
篇二:
51单片机定时器实验
电子信息工程学系实验报告
课程名称:
单片机原理
实验项目名称:
51定时器实验实验时间:
XX-11-27
班级:
测控081姓名:
学号:
2
实验目的:
熟悉keil仿真软件、伟福仿真器的使用和C51定时程序的编写。
了解51单片机中定时、计数的概念,熟悉51单片机内部定时/计数器的结构与工作原理。
掌握中断方式处理定时/计数的工作过程,掌握定时/计数器在C51中的设置与程序的书写格式以及使用方法。
实验原理:
定时分类及原理
1.软件定时:
即让机器执行一个程序段,这段程序本身没有具体的执行目的,只是为了磨时间。
执行这段程序所需要的时间就是延时时间。
这种程序前面已设计过。
这种方法定时占用CPU执行时间,降低了CPU利用率。
此次实验使用的是MCS-51系列单片机。
2.数字电路硬件定时:
采用小规模集成电路器件如555,外接定时部件(电阻和电容)构成。
这样的定时电路简单,但要改变定时范围,必须改变电阻和电容,这种定时电路在硬件连接好以后,修改不方便。
3.可编程定时/计数器:
是为方便微型计算机系统的设计和应用而研制的,它是硬件定时,又很容易地通过软件来确定和改变它的定时值,通过初始化编程,能够满足各种不同的定时和计数要求,因而在嵌入式系统的设计和应用中得到广泛的应用。
8051型单片机有两个十六位定时/计数器T0、T1,有四种工作方式,跟定时/计数器相关的特殊功能寄存器有这样几个:
方式控制寄存器TMOD
M1、M0的状态决定定时器的工作方式,定时和外部事件计数方式选择位C/T,GATE与TR0、TR1配合决定定时/计数器的启停。
加法计数寄存器TH0、TH1(高八位)TL0、TL1(低八位);
定时/计数到标志TF0、TF1(中断控制寄存器TCON);
定时/计数器启停控制位TR0、TR1(TCON);
定时/计数器中断允许位ET0、ET1(中断允许寄存IE);
定时/计数器中断优先级控制位PT0、PT1(中断优IP)。
定时/计数器的工作方式MCS-51的定时器有方式0、方式1、方式2和方式2这3种工作方式。
1.方式0
当M1M0=00时,定时器工作于方式0。
方式0为13位的计数器,由TL0的低5位和TH0的8位组成,TL0低5位计数溢出时向TH0进位,TH0计数溢出时置位溢出标志TF0。
若T0工作于定时方式,设计数初值为a,晶振频率为12MHz,则T0从初值开始计数到溢出的定时时间为t=(213-a)×
1μS。
2.方式1
当M1M0=01时,定时器工作于方式1。
T1工作于方式1时,由TH1作为高8位,TL1作为低8位,构成一个十六位的计数器。
若T1工作于定时方式1,计数初值为a,晶振频率为12MHz,则T1从计数初值计数到溢出的定时时间为t=(216-a)μS。
3.方式2
M1M0=10时,定时器/计数器工作于方式2,方式2为自动恢复初值的8位计数器。
TL1作为8位计数器,TH1作
为计数初值寄存器。
t=(28-a)μS。
单片机内部的定时计数模块,在定时时,对工作频率的12分频进行计数,先记入TL后记入TH,直到溢出为止,根据TL、TH内的初值不同可以定出不同的时间;
在计数工作方式时,对T0(T1)引脚的输入脉冲进行计数,将计数值记入TL、TH。
当定时/计数溢出时,会引起中断。
设置合适的计数初值,以产生期望的定时间隔。
由于定时/计数器在方式0、方式1和方式2时的最大计数间隔取决于使用的晶振频率fosc,如下表所示,当需要的定时间隔较大时,要采用适当的方法,即将定时间隔分段处理。
计数初值与定时时间的关系为:
T=12×
(T_all–a)/fosc定时间隔为T,计数初值为a。
所以有计数初值a=–T×
fosc/12,THx=a/256,TLx=a%256。
定时器均有一个最大定时时间,对于长时间的定时需要,可以将定时间隔为固定的较小时间,通过另设一全局变量ah1用于计数,累加固定的较小定时时间来进行。
确定定时/计数器工作于查询方式还是中断方式,若工作于中断方式,则在初始化时开放定时/计数器的中断及总中断:
ET0=1;
EA=1;
还需要编写中断服务函数:
voidT0_srv(void)interrupt1using1{
TL0=a%256;
TH0=a/256;
中断服务程序段
}
4.启动定时器:
TR0(TR1)=1。
实验设备与器件
硬件:
微机、WAVE单片机仿真器、单片机实验板、跳帽若干软件:
KEILC51单片机仿真调试软件,伟福V系列仿真调试软件
实验内容:
利用实验板上的一位LED数码管做显示,利用中断法编写定时程序,控制单片机定时器进行定时,所定时间为1S。
刚开始LED数码管显示0,每过1S数码管的显示值增加1,当显示到59时返回0,依此反复。
实验的程序代码如下:
#include
voidmDelay(unsignedintDelay){unsignedintb;
for(;
Delay>
0;
Delay--){for(b=0;
b inti,j,k,a;
i=-1;
j=0;
k=0;
unsignedcharcodetab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voidmain(){TMOD=0x01;
a=-0.1*6*1000000/12;
TH0=a/256;
TL0=a%256;
EA=1;
ET0=1;
TR0=1;
while
(1);
}
voidt0()interrupt1{TH0=a/256;
k++;
if(k==10){k=0;
i++;
if(i==10){i=0;
j++;
}if(j==6){i=0;
j=0;
}{P2=0xfe;
P0=tab[i];
mDelay(6000);
P2=(P2 实验结果及分析:
本题实验的记数结果如下:
实验分析如下:
本实验是通过定时器来达成在LED数码管从00秒到59秒的显示过程的。
首先,利用定时器先实现定时100ms,在累计记数到10次后就得到了1秒的效果,接着在LED数码管上相应的显示01,当到09时把十位记上1,以此类推得到在LED数码管上从00显示到59,最后,再置00。
这样就达到了实验效果。
实验心得:
通过本次LED数码管进行51定时器实验,让我知道了对教材应该熟悉,因为教材是基础的,只有把基础的搞好了才能够进行其它层次的学习。
其次此次试验我还懂得了有时候可以通过软件的仿真来验证书上的一些理论行的东西。
通过C语言的编程,对LED灯的控制及51定时器的应用让我对单片机理解更加明了。
附录:
延时函数:
voidmDelay(unsignedintDelay){unsignedinti;
Delay--){for(i=0;
i篇三:
单片机定时器实验报告
定时器实验报告
㈠实验目的
1.掌握单片机内部计数器的使用和编程方法;
2.掌握中断处理程序的编程方法。
G6W仿真器一台MCS—51实验板一台PC机一台电源一台示波器一台
1.在使用12MHz晶振的条件下,由8051内部定时器1按方式1工作,即作为16位定时器使用,每0.05秒钟T1溢出中断一次。
P1口的P1.0~P1.7分别接发光二极管的L1~L8。
(用连线连接J2、J3)。
要求:
编写程序模拟一循环彩灯。
彩灯变化花样为:
①L1、L2、…L8依次点亮;
②L1、L2、…L8依次熄灭;
③L1、L2、…L8全亮、全灭。
各时序间隔为0.5秒。
让发光二极管按以上规律循环显示下去。
2.编写一个救护车警笛声程序,要求:
高低两种音调交替出现,交替周期1~1.5S。
㈣实验框图
循环彩灯代码
ORG0000HLJMPMAIN
ORG000BH;
T0的中断入口地址
MAIN:
MOVTMOD,#01H;
设置T1工作于方式一MOV20H,#0AH;
装入中断次数MOVTL0,#0B0H;
装入计数值低8位MOVTH0,#3CH;
装入计数值高8位SETBTR1;
启动定时器T1SETBET1SETBEASJMP$
CAIDENG:
PUSHPSW
PUSHACCMOVTL0,#0B0HMOVTH0,#3CHJUDGE:
DJNZ20H,RETUNTMOV20H,#0AH
HUAYANG1:
MOVR0,#08HMOVP1,#00HMOVA,#01HLOOP:
MOVP1,A
LCALLDELAYLCALLDELAYLCALLDELAYRLA
DJNZR0,LOOP
NEXT1:
MOVTL0,#0B0HMOVTH0,#3CHJUDGE1:
DJNZ20H,NEXT1MOV20H,0AH
允许T1中断;
允许CPU中断;
等待中断;
装入计数值高8位;
0.5秒未到,返回;
重置中断次数;
花样一
设置花样一循环次数;
装入(本文来自:
小草范文网:
单片机定时器计数器实验报告)计数值低8位;
装入计数值高8位;
0.5秒未到,返回
HUAYANG2:
;
花样二
MOVR0,#08H;
设置花样二循环次数MOVP1,#0FFHMOVA,#0FEHLOOP1:
MOVP1,ALCALLDELAYLCALLDELAYLCALLDELAY
RLA
DJNZR0,LOOP1
NEXT2:
MOVTL0,#0B0HMOVTH0,#3CHJUDGE2:
DJNZ20H,NEXT2MOV20H,0AH
HUAYANG3:
MOVP1,#00H
LCALLDELAYLCALLDELAYLCALLDELAY
MOVP1,#0FFHLCALLDELAYLCALLDELAYLCALLDELAYNEXT3:
MOVTL0,#0B0HMOVTH0,#3CHJUDGE3:
DJNZ20H,NEXT3MOV20H,0AHJMPRETUNT
DELAY:
MOVR2,#0FFHDELAY1:
MOVR1,#0FFH
延时子程序
DJNZR1,$
DJNZR2,DELAY1RET
POPACCPOPPSW
中断返回END
救护车警笛声程序
ORG0000H
AJMPMAIN
ORG001BHAJMPS1ORG0040HMAIN:
MOVSP,#70HMOVR1,#100MOVR2,#10MOVR3,#20
MOVTMOD,#10HMOVTH1,#0FCHMOVTL1,#18HSETBTR1SETBET1SETBEASJMP$S1:
JBF0,S2MOVTH1,#0FCHMOVTL1,#18H
CPLP1.0DJNZR1,ENDSMOVR1,#100DJNZR2,ENDSMOVR2,#10
SETBF0SJMPENDS
T0的中断入口地址;
设置T1为定时器,工作方式1;
启动定时器T1;
允许T1中断;
高音部分;
取反;
F0赋值