单片机原理与应用实验——外部中断(C语言&汇编),每次中断使蜂鸣器响3次

(基于51核的STC12C5A60S2,keil uvision5 mdk 5.25 编译)

 

 

1. C语言版

#include <STC12C5A60S2.h>


sbit LED1 = P2 ^ 4; 
sbit LED2 = P2 ^ 5;
sbit LED3 = P2 ^ 6;
sbit LED4 = P2 ^ 7;

sbit BEEP = P1 ^ 0;     //置1则响

sbit KEY1 = P3 ^ 2;
sbit KEY2 = P3 ^ 4;


void delay_2ms(unsigned long int time) //2ms的基
{
	unsigned long int i;
	for (i = 0; i < time * 100; i++);
}

void ISR_Init()
{  
	IT0 = 0;    //设置中断触发方式:0——低电平触发 1——下降沿触发  (测试方法:长按效果)
  
	EX0 = 1;    //打开外部中断
  EA = 1;     //打开总中断
}

void INT0_ISR() interrupt 0
{
	EX0 = 0;    //关闭外部中断
  
  delay_2ms(5);
  if(KEY1==0)
  {
    unsigned char i;
    for(i=0;i<3;i++)
    {
      BEEP=1;
      delay_2ms(250);
      BEEP=0;
      delay_2ms(250);
    }
  }
  
  EX0 = 1;    //打开外部中断
}

//----------------------------------------------------------

void main()
{
  BEEP=0;
  ISR_Init();		// 中断初始化…代码略去
  
	while(1)
  {
    delay_2ms(250);
    LED1=0;LED2=1;LED3=1;LED4=1;
    
    delay_2ms(250);
    LED1=1;LED2=0;LED3=1;LED4=1;
    
    delay_2ms(250);
    LED1=1;LED2=1;LED3=0;LED4=1;
    
    delay_2ms(250);
    LED1=1;LED2=1;LED3=1;LED4=0;
  }

}

 

2. 汇编语言版

LED1 BIT P2.4
LED2 BIT P2.5
LED3 BIT P2.6
LED4 BIT P2.7

KEY1 BIT P3.2
BEEP BIT P1.0

;-----------------------------------------------------------------------------------------------------
KEY1_State	DATA  69H	 	   ; 将地址69H用伪指令命名为KEY1_State
TEMPVAL_1   DATA  70H
DelayTimes_100MS EQU 6FH   ; 将地址6FH用伪指令命名为DelayTimes_100MS 
;----------------------------------------------------------------------------------------------------

    ORG 0000H
    LJMP MAIN
    ORG 0003H
    LJMP INT0_ISR
    
    ORG 0100H
MAIN:
    LCALL ISR_INIT
    CLR BEEP
LOOP:    
    CLR  LED1
    SETB LED2
    SETB LED3
    SETB LED4
    MOV DelayTimes_100MS,#5
    LCALL Delay100MS
    
    SETB LED1
    CLR  LED2
    SETB LED3
    SETB LED4
    MOV  DelayTimes_100MS,#5
    LCALL Delay100MS
    
    SETB LED1
    SETB LED2
    CLR  LED3
    SETB LED4
    MOV  DelayTimes_100MS,#5
    LCALL Delay100MS
    
    SETB  LED1
    SETB LED2
    SETB LED3
    CLR LED4
    MOV DelayTimes_100MS,#5
    LCALL Delay100MS
    
    AJMP LOOP
 
;--------------------------------------------------------------------------------------------------------


//中断服务函数
INT0_ISR: 
    PUSH 04H
    PUSH 05H
    PUSH 06H
    PUSH 07H
    
    MOV TEMPVAL_1,#0
BEEPSTART:
    SETB BEEP
    MOV DelayTimes_100MS,#5
    LCALL Delay100MS
    CLR BEEP
    MOV DelayTimes_100MS,#5
    LCALL Delay100MS 
    
    INC TEMPVAL_1
    
    MOV A,TEMPVAL_1
    CJNE A,#3,BEEPSTART 

		POP 07H
    POP 06H
    POP 05H
    POP 04H
    RETI


//中断初始化函数
ISR_INIT:  
    SETB EA
    CLR IT0  ;0——低电平触发 1——下降沿触发
    SETB EX0
    RET
   
 
//延时函数 
Delay100MS:                
    MOV R7,DelayTimes_100MS                
Delay100MS_1:        
    MOV R6,#10
Delay100MS_2:        
    MOV R5,#150
Delay100MS_3:          
    MOV R4,#200
Delay100MS_4:        
    DJNZ R4, Delay100MS_4
    DJNZ R5, Delay100MS_3
    DJNZ R6, Delay100MS_2
    DJNZ R7, Delay100MS_1
    RET                        ;子程序返回
     
END

 

 

 

 

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是STC12C5A60S2单片机蜂鸣器音乐同时led亮的代码示例: ```c #include <reg52.h> sbit beep=P3^5; //控制蜂鸣器的IO口,可根据实际连接修改 sbit led=P2^0; //控制LED的IO口,可根据实际连接修改 unsigned char code music[]={0x3c,0x3c,0x42,0x42,0x81,0x81,0x81,0x81,0xff,0x81,0x81,0x81,0x81,0x42,0x42,0x3c}; //定义音乐数据 unsigned char code beat[]={4,4,8,8,4,4,4,4,8,4,4,4,4,8,8,4}; //定义音符节拍数据 void delay(unsigned int x) //延时函数 { unsigned int i,j; for(i=0;i<x;i++) for(j=0;j<120;j++); } void init() //初始化函数 { TMOD=0x11; //设置定时器0和1为工作模式1 TH0=0xff; //设置定时器0的初始值 TL0=0xff; TH1=0xff; //设置定时器1的初始值 TL1=0xff; ET0=1; //打开定时器0中断 ET1=1; //打开定时器1中断 TR0=1; //启动定时器0 TR1=1; //启动定时器1 EA=1; //打开总中断 } void main() { init(); //初始化 while(1) { led=1; //LED亮 beep=1; //蜂鸣器发声 delay(10); //延时 led=0; //LED灭 beep=0; //蜂鸣器不发声 delay(10); //延时 } } void timer0() interrupt 1 //定时器0中断服务函数 { static unsigned char count=0; //静态变量,用于计数 TH0=0xff; //重新设置定时器0的初始值 TL0=0xff; if(count==0) //如果count为0,则播放音乐 { P0=music[count]; //输出音乐数据 TH1=256-beat[count]; //设置定时器1的重载值,实现节拍控制 TL1=TH1; } count++; //计数器加1 if(count>=16) //如果计数器达到16,重置为0 count=0; } void timer1() interrupt 3 //定时器1中断服务函数 { P0=0xff; //关闭蜂鸣器 } ``` 说明: 该代码实现了单片机蜂鸣器音乐和LED同时亮的效果。其中,音乐数据和音符节拍数据存储在代码中,通过定时器0和定时器1实现节拍控制和音乐输出,同时通过控制LED和蜂鸣器的IO口实现LED和蜂鸣器的控制。需要根据实际情况修改蜂鸣器和LED的IO口定义。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值