(基于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