单片机中断实验报告

实验三 定时器中断实验

一、实验目的

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

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

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

二、实验内容

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

三、实验设备

PC 机一台、单片机实验箱

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

四、实验步骤

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

2、使用Keil设计程序;

3、联合调试仿真。

五、实验流程图

单片机中断实验报告

六、实验程序与结果

#include<reg52.h>

#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<reg52.h>

#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<reg51.h> // 包含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)

{

unit++;

counter=0;

}

if(unit>9)

{decade++;

unit=0;

}

if(decade>5)

{

avs++;

decade=0;

}

if(avs>9)

{

avs=0;

}

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

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

TF1=0;

}

单片机中断实验报告

七、实验心得

通过本次课程设计使我感受到它是一门综合性、实践性较强的课程,使我体会到要想综合运用所学的理论知识,提高我的设计能力,必须增加实际操作的环节。这次课程设计不仅培养了我们的实际动手能力,更检验了我们对本门课学习的情况,培养我们严肃认真的学习态度。真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,并能用设计报告表达设计思想和结果的能力正是我这次课程的目的。

 

第二篇:单片机定时器及外部中断实验报告

单片机实验报告(二)

实验名称:

定时器及外部中断


南京理工大学紫金学院电光系

一、 实验目的

1、学习定时/计数器的应用;

2、学习外部中断技术的基本使用方法;

3、学习中断处理程序的编程方法。

二、 实验原理

(1)以P1口作为输出口,定时器实现1s定时,实现显示数的1s加1,外部中断0键盘外接BUTTON,实现对显示数快速加1的控制。

(2)系统板上硬件连线

把“单片机系统”A2区的J61接口的P1.0~P1.6端口与D1区的J52接口相连。

把“单片机系统”A2区的INT0端口用导线连接到D1区的KEY1端口上;

三、 实验内容

利用定时器中断控制1s的输出,使用外部中断0使得显示的数加1.

程序如下:

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

void delay()

{uint x,y;

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

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

}

uchar m,flag;

void main()

{

uchar a,b;

TMOD=0x01;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EX0=1; EX1=1; PX1=1; ET0=1; EA=1; 中断开启

TR0=1;

m=0; P1=0;

while(1)

{

while(flag==0); flag=0;

if(m==100) m=0;

m++;

a=m/10;

b=m+a*6;

P1=b;

}

}

void timer0() interrupt 1 using 0

{

uchar t;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(t<20) t++;

else { flag=1; t=0; }

}

void exter0() interrupt 0 using 1

{

if(INT0==0) delay();

if(INT0==0) flag=1;

}

void exter1() interrupt 2 using 2

{

if(INT1==0) delay();

if(INT1==0) m=0;

}

将编译好的程序下载到仿真电路中

四、 小结与体会

通过本次定时器中断实验,我对定时器的工作原理有了更加深入的理解,这也是建立在向同学请教的基础上。对于目前的我来说,学习不论过程,只看结果。当然,这次的实验也给了我很多启发,集思广益才是最好的。

相关推荐