51定时器实验报告

电子信息工程学系实验报告

课程名称:单片机原理及接口应用                             

实验项目名称:51定时器实验                实验时间:2011.12.16       

班级:                      姓名:           学号:     

                                                                                                                                             

一、实:

    熟悉keil仿真软件、protues仿真软件的使用和单片机定时程序的编写。了解51单片机中定时、计数的概念,熟悉51单片机内部定时/计数器的结构与工作原理。掌握中断方式处理定时/计数的工作过程,掌握定时/计数器在C51中的设置与程序的书写格式以及使用方法。

二、实:

软件:KEIL C51单片机仿真调试软件,proteus系列仿真调试软件

三、实理:

1、51单片机定时计数器的基本情况

8051型有两个十六位定时/计数器T0、T1,有四种工作方式。 MCS-51系列单片机的定时/计数器有几个相关的特殊功能寄存器:

方式控制寄存器TMOD;

加法计数寄存器TH0、TH1 (高八位);TL0、TL1 (低八位);

定时/计数到标志TF0、TF1(中断控制寄存器TCON)

定时/计数器启停控制位TR0、TR1(TCON)

定时/计数器中断允许位ET0、ET1(中断允许寄存IE)

定时/计数器中断优先级控制位PT0、PT1(中断优IP)

2、51单片机的相关寄存器设置

方式控制寄存器TMOD:

TMOD的低四位为T0的方式字,高四位为T1的方式字。TMOD不能位寻址,必须整体赋值。

TMOD各位的含义如下:

1. 工作方式选择位M1、M0

         M1、M0的状态决定定时器的工作方式:

3、51单片机定时器的工作过程(逻辑)方式一

方式1:当M1M0=01时,定时器工作于方式1。

T1工作于方式1时,由TH1作为高8位,TL1作为低8位,构成一个十六位的计数器。若T1工作于定时方式1,计数初值为 a,晶振频率为12MHz,则T1从计数初值计数到溢出的定时时间为t =(216-a)μS。

4、51单片机的编程

使用MCS-51单片机的定时/计数器的步骤是:

4.1.设定TMOD,确定:

       工作状态(用作定时器/计数器);

       工作方式;

       控制方式。

   如:T1用于定时器、方式1,T0用于计数器、方式2,均用软件控制。则TMOD的值应为:0001 0110,即0x16。

4.2.设置合适的计数初值,以产生期望的定时间隔。由于定时/计数器在方式0、方式1和方式2时的最大计数间隔取决于使用的晶振频率fosc,如下表所示,当需要的定时间隔较大时,要采用适当的方法,即将定时间隔分段处理。

计数初值的计算方法如下,设晶振频率为fosc,则定时/计数器计数频率为fosc/12,定时/计数器的计数总次数T_all在方式0、方式1和方式2时分别为213 = 8192、216 = 65536和28 = 256,定时间隔为T,计数初值为a,则有

                  T = 12×(T_all – a)/fosc

                  a = T_all – T×fosc/12

                  a = – T×fosc/12 (注意单位)

             THx = a / 256;     TLx = a % 256;

4.3.确定定时/计数器工作于查询方式还是中断方式,若工作于中断方式,则在初始化时开放定时/计数器的中断及总中断:

               ET0 = 1;        EA = 1;

       还需要编写中断服务函数:

     void  T0_srv(void) interrupt  1  using  1

     {

           TL0 = a % 256;

           TH0 = a / 256;

            中断服务程序段   }

4.4.启动定时器:TR0(TR1)= 1。

四、实:

利用protues仿真软件设计一个可以显示秒表时间的显示电路。利用实验板上的一位led数码管做显示,利用中断法编写定时程序,控制单片机定时器进行定时,所定时间 为1s。刚开始led数码管显示9,每过一秒数码管显示值减一,当显示到0时返回9,依此反复。然后设计00-59的两位秒表显示程序。

(1)实现个位秒表,9-0

用protues进行流水灯的仿真需要的元件有AT89C51、CAP、BUTTON、LED-BLUE、RES、CRYSTAL、画出仿真图

  

                                            Protues 仿真图

使用keil仿真软件编写程序和使用c51编写并进行调试。仿真结果如下图所示

 仿真结果图

程序:

#include<reg51.h>

unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};


unsigned char a;

unsigned char i=0;

void delay(char z)

{char x,y;

for(x=z;x>0;x--)

  for(y=123;y>0;y--);

}

main()

{TMOD=0x10;

TH1=-50000/256;

TL1=-50000%256;

EA=1;ET1=1;TR1=1;

while(1);

}

void time() interrupt 3

{TH1=-50000/256;

TL1=-50000%256;

a++;

if(a==10)

{a=0;

P2=0xfe;

P0=tab[9-i];

i++;

if(i==10)

i=0;

}

}


(2)实现两位秒表,00-59

使用keil仿真软件编写程序和使用c51编写并进行调试。仿真结果如下图所示

                                仿真结果图

程序:

#include<reg51.h>

unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};


unsigned char a;

unsigned char i=0;

void delay(char z)

{char x,y;

for(x=z;x>0;x--)

  for(y=123;y>0;y--);

}

main()

{TMOD=0x10;

TH1=-50000/256;

TL1=-50000%256;

EA=1;ET1=1;TR1=1;

while(1)

{P2=0xfe;

 P0=tab[i/10];

 delay(5);

 P2=0xfd;

 P0=tab[i%10];

 delay(5);

}

}

void time() interrupt 3

{TH1=-50000/256;

TL1=-50000%256;

a++;

if(a==10)

{a=0;

i++;

if(i==60)

 {i=0;

}

}}


五、实得:

通过实验熟悉keil仿真软件、protues仿真软件的使用和单片机定时程序的编写。了解51单片机中定时、计数的概念,熟悉51单片机内部定时/计数器的结构与工作原理。掌握中断方式处理定时/计数的工作过程,掌握定时/计数器在C51中的设置与程序的书写格式以及使用方法。

 

第二篇:51单片机定时器实验报告

51单片机定时器实验

实验内容:

实验内容:

(1)编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。 C语言程序

#include<reg52.h>

#define uint unsigned int

#define ucahr unsigned char

sbit FM=P0^0;

void main()

{

TMOD=0x01;

TH0=(65535-50000)/256;

TH0=(65535-50000)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1;

while(1);

}

void T0_time()interrupt 1

{

}

汇编程序

ORG 0000H JAMP MAIN ORG 000BH TH0=(65535-50000)/256; TH0=(65535-50000)%256; FM=~FM;

LJMP INT0_INT ORG 0100H

MIAN: SETB EA

SETB ET0 AJMP $

INT0_INT:MOV R2,#0FAH

MOV R3,#0C8H DJNZ R3,$ DJNZ R2,INT0_INT RETI

(2)编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

#include<reg52.h>

#define uint unsigned int

#define ucahr unsigned char

uint num,num1;

sbit FM=P0^7;

int shi,ge,a;

void delay(uint);

void shumaguan();

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表

void main()

{

TMOD=0x01;

TH0=(65535-50000)/256;

TH0=(65535-50000)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1;

while(1)

}

void T0_time()interrupt 1 {

}

void shumaguan() {

P3=0x01;

P2=table[shi]; delay(5);

P3=0x02;

P2=table[ge]; delay(5); TH0=(65535-50000)/256; TH0=(65535-50000)%256; num1++; if(num1==10) { } num1=0; num++; shi=num/10; ge=num%10; if(num==100) { num=0; } { } shumaguan();

}

void zuoyi()

{

}

void delay(uint x)

{

}

(3)编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

#include<reg52.h>

#define uint unsigned int

#define ucahr unsigned char

uint num,num1;

int shi,ge,a;

void delay(uint);

void shumaguan();

void zuoyi();

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表

void main() int i,j; for(i=0;i<x;i++) for(j=0;j<110;j++); a=~P3; a=a<<1; P3=~a; if(P3==0xfb) { P3=0xfe; }

{

TMOD=0x02;

TH0=255-200;

TH0=255-200;

EA=1; //开总中断

ET0=1; //开定时器0中断 TR0=1;

P3=0x01;

while(1)

}

void T0_time()interrupt 1 {

}

void shumaguan() { num1++; if(num1==2500) { num1=0; num++; shi=num/10; ge=num%10; if(num==100) { num=0; } } { shumaguan(); }

zuoyi();

P2=table[shi];

delay(5);

zuoyi();

P2=table[ge];

delay(5);

}

void zuoyi()

{

}

void delay(uint x)

{

}

思考:

(1)定时器的方式2和方式1有何不同之处?

答:定时器的方式2初值是装在TH0或者TH1的,每次中断执行完TH0或者TH1会把初值自动装入TL0或者TL1,不需要软件装初值。而方式1是,当每次中断执行完都需要装初值。

(2)定时器的初值如何计算?

方式1:T的单位是us, int i,j; for(i=0;i<x;i++) for(j=0;j<110;j++); a=P3; a=a<<1; P3=a; if(P3==0x04) { P3=0x01; }

TH0=(65535-T*fosc/12)/256

TL0=(65535-T*fosc/12)%256

方式2:

TH0=256-T*fosc/12

TL0=256-T*fosc/12

实验人:王贯华

学号:201240650150

相关推荐