- 实验目的
熟悉中断系统运用
掌握状态转换
- 实验设备
Keil5与Peoteus8 电脑
- 实验内容和结果
实验内容:
1. 利用开关控制8个LED的闪烁与点亮:当开关拨到1时,LED闪烁;当开关拨到0 时,LED点亮。
2. 利用开关控制8个LED的闪烁与流水:当开关拨到1时,LED流水;当开关拨到0 时,LED闪烁。
(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实验代码与连线截图:
连线:
![]() | |
代码:
#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口输出高低电平来控制蜂鸣器的发声。而对于无源蜂鸣器,需要通过单片机输出特定频率的方波信号来驱动蜂鸣器发声。
2. 单片机的准双向口和双向口的区别
单片机的I/O口根据其电气特性可以分为准双向口和双向口。
**准双向口**:这种类型的口在输出模式下只能输出高电平,不能输出低电平。在输入模式下,它们可以读取高低电平。这种设计通常用于那些不需要输出低电平的应用场景。
**双向口**:双向口可以在输出模式下输出高低电平,也可以在输入模式下读取高低电平。这种设计提供了更大的灵活性,因为它允许I/O口在不同的操作模式下工作。
关于P0~P3口是否是准双向口还是双向口,这取决于具体的单片机型号。不同的单片机型号可能会有不同的I/O口配置。例如,某些8051系列单片机的P0口是双向口,而其他一些型号的P0口可能是准双向口。因此,需要查阅特定单片机型号的数据手册来确定其I/O口的类型。
····心得体会:
Keil C51编程软件编写程序,并通过仿真软件模拟了中断请求和中断服务程序的执行过程。我深刻体会到了中断服务程序的重要性。在中断服务程序中,我们需要快速、准确地处理中断请求,然后尽快返回,以便单片机能够继续执行其他任务。如果中断服务程序编写不当,可能会导致单片机无法及时响应其他中断请求,从而影响整个系统的性能。
中断在电流下降沿触发所以不能判断按钮按下抬起。直接按钮按下即可