概述
实验五 中断和定时器实验
姓 名:郑旅军 学 号:0656061
指导老师:邹慧兰 成 绩:
如有疑问,请zlj800800@163.com 探讨
题目:通过外部中断0,触发一个延时过程,假定延时时间为1秒,延时期间可以点亮一个LED或让蜂鸣器发出声音。已知单片机晶振频率为6 .00MHz。
提示:可以使用定时器中断,也可以不使用定时器中断。如果使用定时器中断,则把中断重新启动工作放在外部中断服务程序中,一旦定时器从新启动,延时固定的时间。程序的写法可以参考上次上机的题目,但是必须使用C语言。本程序必须包含两个中断子程序,一个是外部中断0,一个是定时器中断。在外部中断0子程序中设置定时器使之工作,完成延时,时间达到后再禁止定时器中断,这个工作应该在定时器中断子程序本身中完成。
上面的方法可以完成一个“重复触发问题”,即定时时间没有到的时候又来一个触发信号,应该怎么办?
程序流程图:
硬件电路:
首先确定各种中断的中断号,其值从0 开始,编号从0~4,分别对应外中断0、定时器0中断、外中断1、定时器1 中断和串行口中断。
源程序如下:
/*主函数设置定时器0的工作模式,外中断的触发模式(本实验使用的是脉冲触
发),允许总中断和外中断*/
/*外部中断服务程序的工作是:禁止外中断,启动定时器0,允许定时
器0中断,led取反*/
/*定时器中断服务程序的工作是:重载TH0和TL0的初值,延迟1s后,关闭定
时器0,禁止定时器0中断,允许外部中断,改变LED状态*/
#include <reg51.h>
#define uint unsigned int
uint num=8;
void inter0(void) interrupt 0 using 1
{
EX0=0; //禁止外部中断
P1=0xFF; //延时期间使灯亮
ET0=1; //允许定时0中断
TR0=1; //重启动定时0
}
void time0(void) interrupt 1 using 2
{
num--; //记数
TH0=0x0b;
TL0=0xdc;
if(num==0)
{
TR0=0; //关闭定时器0
ET0=0; //禁止定时器0中断
num=8;
EX0=1; //允许外部中断0
P1=0x00; //LED灯灭
}
}
void main()
{
P1=0x00;
TH0=0x0b;
TL0=0xdc;
EA=1;
TMOD=0x01;
IT0=1;
EX0=1;
while(1);
}
实验结果:
预期结果:程序运行后,LED灯是灭的。当有外部脉冲进入P3.2口时,LED灯进入亮状态。持续1s后,LED灯变灭,等待下一个外部脉冲。在LED灯亮的期间,再次给P3.2口送入一脉冲,LED灯依旧亮,说明程序没有响应外中断,因为如果响应外中断0服务程序,LED应该进入灭状态。
实际结果:给一次脉冲,灯亮,经历1s后灯灭;但在这一秒内持续给脉冲,灯就一直亮着,最后一个脉冲给过后,灯亮一秒后再灭去。这不符合预期的试验结果,从程序上来看是没有问题的,因为在进入外中断函数后,外中断已经被关闭了,外部中断信号不可能进来的。原因可能出在内部电路上,也就是1s内有脉冲输入时,中断信息被存在锁存器里,但由于此时外中断被关,没有送进CPU,所以没有响应,但这我们没有现象觉察到;一旦定时程序跳出,外中断被打开,中断请求数据被送入,CPU响应,于是又开始新的一轮中断+定时服务,这个过程很短暂,人眼很难从LED的变化中觉察到。
最后
以上就是刻苦向日葵为你收集整理的中断和定时器实验的全部内容,希望文章能够帮你解决中断和定时器实验所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复