实践目的:
1、掌握中断的概念和思想。
2、掌握51单片机中断系统和相关软硬件设计。
实践内容:
1.利用单片机的P0口接数码管的字段脚,P1.0脚接共阴极,P3.2、P3.3引脚接独立按键产生外部中断信号。编写程序,当程序正常运行时数码管显示H字符,当外部中断0有中断请求信号时,数码管从0-9循环显示一次后回到正常状态。如果外部中断1有中断请求信号,则数码管从9-0循环显示一次后回到正常状态。要求中断0可以打断中断1。
2.设计硬件电路,并编写程序完成所要求的功能。
3.在Proteus中加载程序代码并运行仿真,通过操作按键观察程序功能。上电时,数码管显示H;当产生外部中断0中断时,数码管从0-9循环显示;当产生外部中断1中断时,数码管从9-0循环显示;当在外部中断1服务运行时,按下按键,数码管改为从0-9 显示。
4.参考元器件:
7SEG-COM-ANODE
问题讨论
中断函数的特殊性表现在哪里?
收到相关的输入,就可以打断当前正在执行的函数
(1)中断函数不能进行参数传递
(2)中断函数没有返回值
(3)在任何情况下都不能直接调用中断函数
(4)中断函数使用浮点运算要保存浮点寄存器的状态。
(5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。
(6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
(7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
(8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。
(9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。一般来说中断服务程序应该做最少量的工作,这样做有很多好处。
源代码如下
#include<reg52.h>
unsigned int i,j;
unsigned char code discode[12]={0x76,0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极形式。阳极取反
void delay(void){ //延迟函数
unsigned int m,n;
for(m=62;m>0;m--)
for(n=1000;n>0;n--)
;
}
void main(){
P1 = ~discode[0]; //初始化H
TCON = 0x05; //设置为下降沿有效
IE = 0x85; //8(1000)为允许总中断,5(0101)为设置两个x小中断
IP = 0x14; //1(0001)设置PS为1,PX1为1(优先级比PX0高)即S2的按钮有更高的优先级
while(1){
P1 = ~discode[0]; //程序进行状态,等待中断
}
}
void int0_int(void) interrupt 0{
//中断1,显示0~9 (优先级0)
for(i=1;i<11;i++){
P1 = ~discode[i];
delay();
}
}
void int1_int(void) interrupt 2{
//中断2,显示9~0 (优先级1)
for(j= 10;j>0;j--){
P1 = ~discode[j];
delay();
}
}
硬件图纸: