问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Keil5+Proteus实现中断系统(流水灯为例子)

创作时间:
作者:
@小白创作中心

Keil5+Proteus实现中断系统(流水灯为例子)

引用
CSDN
1.
https://blog.csdn.net/NTMIAOD/article/details/137075859

实验目的

熟悉中断系统运用
掌握状态转换

实验设备

Keil5与Peoteus8 电脑

实验内容和结果

实验内容:

  1. 利用开关控制8个LED的闪烁与点亮:当开关拨到1时,LED闪烁;当开关拨到0 时,LED点亮。
  2. 利用开关控制8个LED的闪烁与流水:当开关拨到1时,LED流水;当开关拨到0 时,LED闪烁。

实验1

(1)实验代码与连线截图:

代码:

#include <REGX52.H>  
#define MAIN_Fosc 24000000UL  
sbit BUTTON=P3^2;  
#define LED P2  
unsigned char ledArr[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  
void delay_ms(unsigned int ms)  
{  
unsigned int i;  
do{  
i = MAIN_Fosc / 6030;  
while(--i);  
}while(--ms);  
}  
void main(){  
IT0=1; //外部0中断边沿触发  
EA=1; //开总中断  
EX0=1; //开外部0中断  
while(1){  
LED=0xff;  
delay_ms(10);  
LED=0x00;  
delay_ms(10);  
}  
}  
void ex0_int() interrupt 0{  
if(BUTTON==0){  
int i;  
for(i=0;i<8;i++){  
LED=~ledArr[i];  
delay_ms(5);  
}  
}  
}  

实现效果截图:

启动八个灯自动闪烁。

  • 按钮按下开始流水

实验2

(2)实验2实验代码与连线截图:

连线:

代码:

#include <REGX52.H>  
#define MAIN_Fosc 24000000UL  
sbit BUTTON=P3^2;  
#define LED P2  
unsigned int count=0;  
unsigned char ledArr[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  
void delay_ms(unsigned int ms)  
{  
unsigned int i;  
do{  
i = MAIN_Fosc / 6030;  
while(--i);  
}while(--ms);  
}  
void button(){  
if(BUTTON==0){  
count++;  
}  
}  
void main(){  
IT0=1; //外部0中断边沿触发  
EA=1; //开总中断  
EX0=1; //开外部0中断  
button();  
while(1){  
if(count%2==0){  
LED=0xff;  
delay_ms(10);  
LED=0x00;  
delay_ms(10);  
}  
else if(count%2!=0){  
int i;  
for(i=0;i<8;i++){  
LED=~ledArr[i];  
delay_ms(5);  
}  
}  
}  
}  
void ex0_int() interrupt 0{  
count++;  
}  

结果:

按下流水灯:

再次按下闪烁状态:

再次按下全灯闪烁:

实验问题思考

  1. 单片机驱动继电器和蜂鸣器的电路设计

继电器电路设计
继电器通常需要较大的电流来驱动,因此单片机的I/O口通常不足以直接驱动继电器。为了解决这个问题,可以使用一个驱动芯片,例如ULN2003,它是一个大电流驱动阵列,常用于单片机控制电路中以驱动继电器等负载。ULN2003内部包含了七路达林顿管,可以提供足够的电流来驱动继电器。

电路设计时,单片机的I/O口连接到ULN2003的输入端,然后ULN2003的输出端连接到继电器的线圈。当单片机输出高电平时,ULN2003会导通,从而驱动继电器吸合。

蜂鸣器电路设计
蜂鸣器的驱动方式取决于是使用有源蜂鸣器还是无源蜂鸣器。有源蜂鸣器内部带有振荡电路,只需接入直流电源即可发声。无源蜂鸣器则需要外部提供方波信号才能发声。

对于有源蜂鸣器,可以直接通过单片机的I/O口输出高低电平来控制蜂鸣器的发声。而对于无源蜂鸣器,需要通过单片机输出特定频率的方波信号来驱动蜂鸣器发声。

  1. 单片机的准双向口和双向口的区别

单片机的I/O口根据其电气特性可以分为准双向口和双向口。

准双向口:这种类型的口在输出模式下只能输出高电平,不能输出低电平。在输入模式下,它们可以读取高低电平。这种设计通常用于那些不需要输出低电平的应用场景。

双向口:双向口可以在输出模式下输出高低电平,也可以在输入模式下读取高低电平。这种设计提供了更大的灵活性,因为它允许I/O口在不同的操作模式下工作。

关于P0~P3口是否是准双向口还是双向口,这取决于具体的单片机型号。不同的单片机型号可能会有不同的I/O口配置。例如,某些8051系列单片机的P0口是双向口,而其他一些型号的P0口可能是准双向口。因此,需要查阅特定单片机型号的数据手册来确定其I/O口的类型。

心得体会

通过使用Keil C51编程软件编写程序,并通过仿真软件模拟了中断请求和中断服务程序的执行过程。深刻体会到了中断服务程序的重要性。在中断服务程序中,需要快速、准确地处理中断请求,然后尽快返回,以便单片机能够继续执行其他任务。如果中断服务程序编写不当,可能会导致单片机无法及时响应其他中断请求,从而影响整个系统的性能。

中断在电流下降沿触发所以不能判断按钮按下抬起。直接按钮按下即可

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号