单片机中断实验报告

  • 格式:doc
  • 大小:161.62 KB
  • 文档页数:4

下载文档原格式

  / 4
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三定时器中断实验

一、实验目的

1、掌握51单片机定时器基本知识;

2、掌握定时器的基本编程方法;

3、学会使用定时器中断。

二、实验内容

1、利用定时器设计一个秒表,计数范围为0—59,并在数码管实时显示。

三、实验设备

PC 机一台、单片机实验箱

主要器件:AT89C52、7SEG-BCD、

四、实验步骤

1、使用Proteus设计仿真原理图;

2、使用Keil设计程序;

3、联合调试仿真。

五、实验流程图

六、实验程序与结果

#include

#define uint unsigned int

#define uchar unsigned char

sbit F=P2^1;

void timer1_init()

{

TMOD=0x10;//将定时器1设置为工作方式1

TH1=(65536-6000)/256;//定时器每加一时间为1/fsoc,定时时间为1/500

//(1/500)s/(1/3000000)s=6000

TL1=(65536-6000)%256;//fsoc=3000000,所以装入16位定时器中值为65536-6000 EA=1;

ET1=1;

TR1=1;

}

void main()

{

timer1_init();

while(1);

}

void timer1() interrupt 3

{

TH1=(65536-6000)/256;//每次进入中断,重装初值TL1=(65536-6000)%256;

F=~F;//每次进入中断P1.1口取反

}

#include

#define uint unsigned int

#define uchar unsigned char

sbit F=P2^1;

void timer0_init()

{TMOD=0x01;//将定时器0设置为工作方式1

TH0=(65536-83)/256;//定时器每加一时间为1/fsoc,定时时间为2Khz,既500us

//500us/6us=83.3333

TL0=(65536-83)%256;//fsoc=6000000,所以装入16位定时器中值为65536-83

EA=1;

ET0=1;

TR0=1;

}void main()

{

timer0_init();

while(1);

}

void timer0() interrupt 1

{

TH0=(65536-83)/256;//每次进入中断,重装初值

TL0=(65536-83)%256;

F=~F;//每次进入中断P1.1口取反,表示定时时间到

}

#include // 包含51单片机寄存器定义的头文件

#define seg_data P1

#define seg_data2 P3

#define uint unsigned int

sbit D1=P2^0; //将D1位定义为P2.0引脚

uint counter=0;

unsigned int unit=0,decade=0,avs=0;//time=0;

/************************************************************** 函数功能:主函数

**************************************************************/ void main(void)

{

uint time,time1,temp1,temp2,temp3;

seg_data=0;

seg_data2=0;

TMOD=0x11; //使用定时器T0的模式2

TH0=0xFC; //定时器T0的高8位赋初值 1000-500

TL0=0x18; //定时器T0的低8位赋初值

TH1=(65536-50000)/256; //定时器T1的高8位赋初值TL1=(65536-50000)%256; //定时器T1的低8位赋初值

EA=1; //开总中断

ET0=1; //定时器T0中断允许

ET1=1;

TR0=1; //启动定时器T0

TR1=1;

while(1)//无限循环等待中断

{

temp1=(decade&0x0F)<<4;

temp2=unit&0x0F;

time=temp2|temp1;

seg_data=time;

temp3=avs&0x0F;

time1=temp3;

seg_data2=time1;

}

}

{

D1=~D1; //按位取反操作,将P2.0引脚输出电平取反TH0=0xFF; //定时器T0的高8位赋初值 1000-500

TL0=0x06; //定时器T0的低8位赋初值

}

void Time1(void) interrupt 3

{

counter++;

if(counter>19)

{