实验目的:
1.掌握外部中断的工作原理;
2.学会中断程序设计。
任务:
1.运行Keil开发环境,完成外部中断响应软件编程;
2.外部中断接口分别接按键K1、K2设置为下降沿触发方式,自然优先级,观察中断响应效果。
1.仿真电路设计;
2. 编写C51程序实现如下功能:开机后D1灭灯,LED1黑屏,随后单击K1→D1状态反转,单击K2 →LED1从0开始循环显示0~F字符。
实验步骤:
1.运行Keil uVision5 开发环境,按照“模块化单片机教学实验平台配套的实验指导书1.2.3 节”介绍的方法建立程esimlab5. uvproj,CPU 为AT89S51,包含启动文件STARTUP.A51。
2.输入源程序,在Keil uVision5 开发环境中,建立源程序esimlab5.c,将上述程序加入该程序文件。并将该文件加入工程esimlab5.uvproj。
3.设置工程esimlab5. uvproj 属性,将其晶振频率设置为12MHz,选择输出可执行文件(HEX 文件),仿真方式为“Use Simulator”。
4.构造(Build)工程esimlab5.uvproj。如果输入有误进行修改,直至构造正确,生成可执行程序 esimlab5.hex 为止。
实验步骤:
1.运行Proteus 开发环境,建立工程,新建原理图设计文件esimlab5. Pdsprj,参考图一。
图一 原理图实例
2.设置单片机属性,将其晶振频率设置为12MHz,载入KEIL生成的文件esimlab5.hex。
3.运行仿真并观察结果。
esimlab5.c
- #include
-
- sbit D1=P0^0;
- unsigned char Number[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
- 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
-
- unsigned char i;
-
- void Delay(unsigned int t) //延时函数
- {
- unsigned char i, j;
- while(t){
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- t--;
- }
- }
-
- void main(){
-
- //中断初始化
- EX0 = 1;//允许外部中断0中断
- EX1 = 1;//允许外部中断0中断
-
- IT0 = 1;//外部中断0为跳沿触发
- IT1 = 1;//外部中断1为跳沿触发
- IE0 = 0;//外部中断0的请求标志位
- IE1 = 0;//外部中断1的请求标志位
-
- EA = 1;//中断总允许
-
- PX0 = 0;//外部中断0为低优先级
- PX1 = 0;//外部中断1为高优先级
-
- while(1){
- P2 = 0x00;//数码管初始化
- }
- }
-
- void Int0_Routine(void) interrupt 0 using 1//外部中断0中断服务函数
- {
- D1 = ~D1;//LED灯状态取反
- }
-
- void Int1_Routine(void) interrupt 2 using 2//外部中断1中断服务函数
- {
- unsigned char count = 3;
- while(count != 0)//中断开始执行,数码管循环显示0~F 3次
- {
- for(i = 0;i<16;i++)
- {
- P2 = Number[i];
- Delay(100);
- }
- count--;
- }
-
- }
仿真结果
单片机的中断是由单片机片内的中断系统来实现的。当中断请求源(简称中断源)发出中断请求时,如果中断请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断服务程序处理中断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。