单片机中断实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#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;
}