电子信息工程学系实验报告
课程名称:单片机原理及接口应用 实验项目名称: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单片机定时器实验
实验内容:
实验内容:
(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
电工电子实验报告555集成定时器的应用一实验目的1熟悉555定时器电路的工作原理2熟悉555时基电路逻辑功能的测试方法掌握用555…
试验九555定时器李泽电子信息科学与技术20xx118038一试验目的1掌握555定时器的基本原理与功能2掌握555定时器的应用二…
实验报告课程名称:电工电子学实验指导老师:实验名称:集成定时器及其应用一、实验目的1.了解集成定时器的功能和外引线排列。2.掌握用…
单片机实验报告(二)实验名称:定时器及外部中断南京理工大学紫金学院电光系一、实验目的1、学习定时/计数器的应用;2、学习外部中断技…
实验报告班级学号姓名同组人实验日期室温大气压成绩PINSEL00x00000000P07管脚连接GPIOPINSEL11ltlt4…
DSP定时器实验报告姓名6666666班级66666666学号6666666666专业通信工程20xx年5月一实验目的1通过实验熟…
学生实验练习使用电火花计时器或电磁打点计时器实验报告班级同组姓名时间一实验目的练习使用电火花计时器或电磁打点计时器利用打上点的纸带…
学院:专业班级:姓名:指导教师:设计时间:51单片机课程设计一、设计任务与要求1.任务:制作并调试51单片机学习板2.要求:(1)…