顾名思义,“定时炸弹”即是通过一段时间的计时,让炸弹引爆,这样的原理在生活中也有许多类似的应用,而自己做的只是计时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; }