顾名思义,“定时炸弹”即是通过一段时间的计时,让炸弹引爆,这样的原理在生活中也有许多类似的应用,而自己做的只是计时10s后,让蜂鸣器发出响声,不会是真的炸弹啦。具体的思路:
(1)分别创建好用来在发光数码管上显示具体数字和用来位选的数组(十六进制形式)
(2)编写出计时为1s的代码函数和用来延迟时间的函数,方便主函数中进行调用
(3)动态的显示数码管上的数字,设置好计时方式(代码中用到了方式0和方式1)
(4)当时间满足要求后,给蜂鸣器一个方波,让蜂鸣器发出声响
下面是实现的代码和图片:
#include<reg51.h>
#include <intrins.h>
#define dataport P2
#define sbitchoice P0
sbit beel = P1^5;
unsigned char code LED1[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //0-9
unsigned char code LED2[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07} ; //0-7 位选
unsigned char temp ;
void delay(unsigned char i)
{
unsigned char j,k ;
for(j=0;j<150;j++)
{
for(k=0;k<i;k++)
{
;
}
}
}
void interface(unsigned char first, unsigned char num)
{
unsigned char i ;
for(i = 0 ; i < num ; i++ )
{
sbitchoice = LED2[i+first] ;
dataport = LED1[temp] ;
delay(1) ;
}
}
void delayls()//1s
{
unsigned char i ;
for(i = 0 ;i<20;i++)
{
TH0 = 0X3c ;
TL0 = 0Xb0 ;
TR0 = 1 ;
while(!TF0);
TF0 = 0 ;
}
}
void main()
{
unsigned int count = 5 ;
unsigned int counter = 0 ;
EA = 1 ;
ET1 = 1 ;
TMOD = 0x11;
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
while(1)
{
delayls() ;
temp = 9 - counter ;
counter++ ;
interface(0,1) ;
if(temp == 0)
{
TH1 = 0XFF;
TL1 = 0X0C;
TR1 = 1;
while(count--) //响五秒
{
delayls();
}
TR1 = 0;
while(1);
/*while(1) //通过延时让蜂鸣器响
{
beel = ~beel;
delay(1) ;
}*/
}
}
}
void disbeel() interrupt 3
{
TH1 = 0XFF;
TL1 = 0X0C;
beel = ~beel;
}