INT0及INT1中断计数.docx
《INT0及INT1中断计数.docx》由会员分享,可在线阅读,更多相关《INT0及INT1中断计数.docx(8页珍藏版)》请在冰豆网上搜索。
![INT0及INT1中断计数.docx](https://file1.bdocx.com/fileroot1/2023-1/9/d7f13705-46a9-4acc-9e5f-bb955ccba1f0/d7f13705-46a9-4acc-9e5f-bb955ccba1f01.gif)
INT0及INT1中断计数
科技大学潇湘学院
课程设计
课程设计名称:
《单片机接口技术》课程设计
题目:
INT0及INT1的中断计数
学生姓名:
学院:
专业及班级:
学号:
指导教师:
2016年12月19日
摘 要
单片机的外部中断有两种触发方式可选:
电平触发和边沿触发。
电平触发方式时,中断标志寄存器不锁存中断请求信号。
也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。
标志寄存器对于请求信号来说是透明的。
这样当中断请求被阻塞而没有得到及时响应时,将被丢失。
换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。
因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。
同样,当CPU在执行不可被中断的指令(如
RETI)时,产生的电平触发中断如果时间太短,也得不到执行。
边沿触发方式时,中断标志寄存器锁存了中断请求。
中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。
因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。
在该中断退出后,将被响应执行。
如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。
一个中断如果在没有到响应之前就已经被手工清除,则该中断将被CPU忽略。
就如同没有发生一样。
1设计要求及目的.........................................................1
1.1 设计要求INT0及INT1中断计数.................................................1
1.2 设计目的...........................................................................1
2 方案设计和选择............................................................1
2.1原件选择..........................................................................1
2.1.1单片机的选择...................................................................1-3
3调试过程.......................................................................3
3.1软件调试.........................................................................3-6
4心得体会.......................................................................6
5参考文献.......................................................................7
第一章设计要求和目的
1.1 设计要求
INT0及INT1中断计数
(1)每次按下第1个计数键时,第1组计数值累加并显示在右边3只数码管上
(2) 每次按下第2个计数键时,第2组计数值累加并显示在左边3只数码管上 (3) 后两个按键分别清零 1.2 设计目的
本设计的目的是为提高自己的实际动手能力以及对外部中断的原理和单片机C51语言的相关知识有更深刻理解。
第二章 方案设计和选择
根据本次设计的要求,方案的选择应力用性强,性价比高,使用简单,定位为入门级的产品
2.1元件选择
2.1.1单片机的选择
AT89C51是一个低电压,高性能CMOS 8位单片机,片含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
主要特性:
·与MCS-15兼容
·4k字节可编程闪烁存储器
·寿命;100写/擦循环
·数据保留时间:
10年
·全静态工作:
OHz-24MHz
·三级程序储存器锁定
·128×8位部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低耗电的闲置和掉电模式
·片振荡器和时钟电路
管脚说明:
VCC:
供电电压
GND:
接地
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚 备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有部程序存储器。
注意加密方式1时,/EA将部锁定为RESET;当/EA端保持高电平时,此间部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
③振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
第三章调试过程
3.1 软件调试
软件调试主要通过仿真软件Proteus 8Professional 和keil 来实现。
keil 用来对程序编写和修改,Proteus 8Professional 则用来对电路进行仿真。
Keil程序如下:
#include//文件头
#defineucharunsignedchar
#defineuintunsignedint
sbitK3=P3^4;
sbitK4=P3^5;//定义K3为P3.4(单片机引脚)sbitK4=P3^5;//定义K4为P3.5(单片机引脚)
//下面为数码管段码与位码定义,使用一维数组存放其值
ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
ucharcodeDSY_Scan_Bits[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//共阴数码管的位选码
//ucharcodeDSY_Scan_Bits[]={0x20,0x10,0x08,0x04,0x02,0x01};//共阳数码管的位选码
uchardataBuffer_Counts[]={0,0,0,0,0,0};
uintCount_A,Count_B=0;//计数单元赋初值
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
voidShow_Counts()
{
uchari;
Buffer_Counts[2]=Count_A/100;//取某位上的数
Buffer_Counts[1]=Count_A%100/10;//取某位上数
Buffer_Counts[0]=Count_A%10;//取某位上显示数
Buffer_Counts[5]=Count_B/100;//取某位上显示数
Buffer_Counts[4]=Count_B%100/10;//取某位显示数
Buffer_Counts[3]=Count_B%10;//取某位上显示数
for(i=0;i<6;i++)//for循环
{
P2=DSY_Scan_Bits[i];
P1=DSY_CODE[Buffer_Counts[i]];
DelayMS
(1);
}
}
voidmain()//主函数
{
IE=0x85;
PX0=1;//中断优先
IT0=1;
IT1=1;
while
(1)
{
if(K3==0)Count_A=0;
if(K4==0)Count_B=0;
Show_Counts();//调用子函数
}
}
voidEX_INT0()interrupt0//中断函数计数加1
{
Count_A++;
}
voidEX_INT1()interrupt2//中断函数计数加1
{
Count_B++;
}
end;
Proteus仿真如图3.1所示:
图3.1
心得体会
为期两周的单片机课程设计实训很快就结束了,在这次设计过程里我们体验了从设计、画板、编程、焊板到调试的整个过程。
本次实训在操作过程中还是比较简单的,没出现什么重大的问题,可是在电路整体调试的时候出现了一些问题,这说明硬件结构和软件编程还有待完善的地方,这就需要结合所学的知识,有创造性地不断改进电路,以达到电路结构和软件性能的最优化。
积极参与单片机课程设计,不仅让我们充分的体会到自己动手实践的乐趣,获得哪怕是前进一小步时候的那种成功的喜悦,还能学到很多我们在理论中学不到的知识。
有利于我们学习能力的提高。
表达能力等很多方面,有利于我们团队精神的培养。
我们都是一起共同完成项目,这就要求我们必须互相信任、互相配合、分工合作。
我们顺利完成了设计作业。
通过这次课设,对以前学过的知识进行了巩固,加深了理解,提高了应用的能力,而且提高了我们的发现、分析、解决问题的能力。
经历了从最初的设计到最后做出产品的开发过程,提高了对专业的认识及兴趣,对于我们工科来说,对以后就业有及其重大的影响。
参考文献
《单片机实验与课程设计Proteus仿真版》
《单片机课程设计指导》
《单片机原理与应用实验实训和课程设计》
《单片机项目式教程基于Proteus虚拟仿真技术》