51单片机的定时炸弹.docx
- 文档编号:4926381
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:22
- 大小:328.33KB
51单片机的定时炸弹.docx
《51单片机的定时炸弹.docx》由会员分享,可在线阅读,更多相关《51单片机的定时炸弹.docx(22页珍藏版)》请在冰豆网上搜索。
51单片机的定时炸弹
基于51单片机的
定时炸弹的设计
题目定时炸弹
学校武汉纺织大学
学院电子与电气工程学院
班级电子094班
姓名周良成(0903741161)
吴立峰(0903741152)
王璇(0903741173)
摘要:
在一次看电影的时候,我看到了一个爆炸场面。
虽然电影中是恐怖分子的不法行为引起的爆炸,但是我却想到了定时炸弹在控制和实现等各方面的优点,因而突发灵感,想要利用51单片机自己制作一个模仿的定时炸弹,一来是想要锻炼自己的实际动手能和创新思维,而来是想要提高自己的视野和团队合作精神。
关键词:
定时炸弹、控制、爆炸。
设计意义:
在实际生活中,可能大多数人都认为定时炸弹是一个危险的物体,对普通人民来说是很难见到的甚至从没见到的东西,然而,在电影中我们却从不少见,是不法分子作案的重要凭证,同时,也是造成大量人员伤亡和大面积毁灭的罪魁祸首。
当然,这仅仅是定时炸弹的反面部分,任何东西都有两面性,定时炸弹也有好的一面,他也可以反过来作为对付恐怖分子的一种手段;同时,在一些人工开凿方面,光靠人力是很难实现的,而且也存在这安全性问题,用定时炸弹来实现却要方便得多,不仅速度快、效率高、风险小,而且也便于实时性地操作,控制起来极为方便,可以满足很多方面的要求。
设计目的:
自行设计制作一个模仿的定时炸弹,锻炼自己的各方面的综合能力,包括创新、设计、焊接、调试、编程等知识水平和沟通、交流、团结协作等一些综合素质。
2.1总机控制
2.2按键部分
2.3显示电路
2.4指示电路
2.5爆炸部分
2.6电源模块
3总体电路及各模块电路
3.1总体电路框图
3.2STC89C52的引脚图
3.3时钟电路
3.4复位电路
3.5矩阵键盘
3.6译码显示电路
3.7指示电路
3.8模仿爆炸电路
3.9电源模块
3.10剪线拆弹电路
3.11整体电路原理图
3.12元件清单
4软件设计流程及描述
4.1软件结构
4.2单片机资源分配
4.2.1I/O口的分配
4.2.2定时计数器的分配
4.2.3中断资源的分配
4.3程序流程图
4.4函数模块及功能
4.5源代码
5总结
5.1设计步骤
5.2心得体会
5.3参考文献
1、设计要求
1.1、开机输入密码才可使用,此密码作为拆弹密码。
1.2、可以随意输入1小时以内的定时时间,并显示。
1.3、倒计时时间能够显示直至结束为止。
1.4、时间少于10秒进行声光提示。
1.5、每次按键时都有声光提示。
1.6、允许在指定时间内输入密码进行拆弹。
密码错误会导致提前爆炸。
1.7、也可以剪断红线或蓝线进行拆弹,剪错线都有引发爆炸的可能。
1.8、倒计时结束时进行模仿爆炸,同时有声光提示。
2、硬件选型
2.1、总机控制:
因为STC89C52的单片机具有ISP功能,可以直接利用串口进行程序的下载,使用方便。
而且该51单片机具有以下特性:
2.1.1、增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。
2.1.2、工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)。
2.1.3、工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。
2.1.4、用户应用程序空间为8K字节。
2.1.5、片上集成512字节RAM。
2.1.6、通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
2.1.7、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。
2.1.8、具有EEPROM功能。
2.1.9、具有看门狗功能。
2.1.10、共3个16位定时器/计数器。
即定时器T0、T1、T2。
2.1.11、外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒。
2.1.12、通用异步串行口(UART),还可用定时器软件实现多个UART。
2.1.13、工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)。
2.1.14、PDIP封装。
考虑到以上一些资源基本上刚好满足我的设计要求,而且没有很多浪费的资源,再加上该单片机价格比较低廉,适合我的使用,因此,选用该单片机作为控制的总机部分。
2.2、按键部分:
考虑到输入密码和拆弹密码以及输入的定时时间都包含0到9之间的数据,而且还需要一些其他功能的按键,因此,决定选用3*4的矩阵键盘作为人机交互的部分。
2.3、显示电路:
有4连体的共阴数码管和4个单个的共阴数码管可供参考。
考虑到显示的过程中可以输入密码进行拆弹,也需要进行声光提示和快速爆炸,不能一直进行动态显示;而且单片机资源刚好可供使用。
因此,采用4个数码管进行静态显示。
为了节约单片机的I/O口资源,同时提供能驱动数码管的较大电流,因此采用CD4511作为译码器来驱动数码管,还可以对10以上的数据进行消隐,以免复位时出现显示FFFF的情形。
2.4、指示电路:
本设计中涉及到两种指示,一种是按键时指示电路,一种是爆炸效果指示电路,因为都需要进行声光提示,因此可采用两个不同的发光二级管和一个蜂鸣器来指示。
2.5、爆炸部分:
因为本题目仅仅是模仿爆炸的情形,因此无需炸药等危险物品,将一个极性电容反接,当电压值超过其耐压值时,即可爆炸。
因此,需要对其提供大电压和大电流。
2.6、电源模块:
因为本题目最终的时候需要爆炸,需要较大的电压,因此本电路由20V直流电源供电,通过三端稳压器稳压成5V作为单片机和其他部分的供电来源,而将20V本身作为爆炸部分的引爆电源。
3、总体电路及各模块电路
3.1、总体电路框图:
本系统的总体框图如下所示:
定时炸弹总体电路框图
3.2、STC89C52的引脚图:
3.3、时钟电路:
该单片机正常工作时的工作频率范围为0到40MHz,甚至可到达48MHz。
当然,频率太低影响正常的工作效率,执行速度太慢;频率太高时不太稳定,影响其正常工作性能。
折中考虑,本设计采用12MHz的晶振作为时钟发生电路,采用两个30pF的电容利于晶振起振,其电路图如下所示:
3.4、复位电路:
STC89C52单片机只要RST引脚出现两个机器周期以上的高电平则执行复位操作,若晶振为12MHz,考虑到晶振的起振时间,一般需要10ms以上的高电平则可以正常复位。
一般根据正常需要,按如下图所示电路即可实现复位操作。
当复位按钮没有按下时,RST引脚为低电平,电路正常工作,当按下复位按钮时,由电阻分压知RST引脚电压值为4V,即高电平,由于电容放电需要一定的时间,高电平将会持续一段时间,这段时间足够大于2个机器周期,因此可正常复位。
具体复位电路图如下:
3.5、矩阵键盘:
考虑到本设计需要用到0到9的数据,再加上设置一些标志键等等,可能需要用到至少11个键,毫无疑问,采用矩阵键盘是上上之选。
为了节约I/O口,同时节约一些不必要的开支,只采用3*4的矩阵键盘作为输入部分。
为了能提供扫描时的电流,采用上拉电阻到5V电压作为分压电阻,电阻一般取几十到一百千欧就行,本设计就采用62K欧的贴片电阻,一来可以减少干扰,二来可以节约空间。
其电路图如下所示:
3.6、译码显示电路:
因为本电路是采用四个独立数码管静态显示作为显示时间电路,同时为了提供较大驱动能力和节约I/O口资源,采用了4个CD4511作为译码器来驱动4个共阴数码管。
考虑到数码管的每段正常工作的电压电流差不多是2.0—2.5V和5mA—20mA。
若本设计取2V和10mA作为每段数码管的正常工作电压和电流,则所需串联的电阻R=(5V-2V)/10mA=300R,因此,本设计采用330R的贴片电阻作为串联分压电阻,采用贴片的形式可以大大节约空间。
CD4511具有9以上数字消隐功能,因此不会显示一些其他非数字的字符,至于其锁存信号输入端直接接地,因为此电路无需所存。
该部分电路电路图比较直观,如下图所示:
3.7、指示电路:
本设计中由于需要用到不同的两种声光提示,因此采用红绿发光二极管各一个和蜂鸣器一个作为指示电路。
本设计采用直径3mm的发光二极管,为了防止过大的电压烧坏发光二极管,每个二极管串联一个R=(5V-2V)/10mA=300R的电阻,本电路选用两个330欧姆的插针式金属膜电阻作为分压电阻;为了提供能驱动蜂鸣器的较大电流,本设计采用了一个S9013的NPN型三极管作为放大电路来驱动蜂鸣器,采用Rb=33k,Rc=100R即可。
具体该部分电路图如下图所示:
3.8、模仿爆炸电路:
因为本电路是一个模仿的定时炸弹,爆炸部分肯定不能真正引爆炸药,这样会出现生命危险的,因此,从电学方面来选材,决定采用一个极性电容反接,直到满足爆炸条件时,给电容反向通电,只要该电压值超过电容的耐压值即可引发电容的爆炸。
根据这个原理,本设计采用一个继电器来控制电压的加载与否。
另一方面,单片机输出的电流不足以驱动一个继电器,因此还是采用S9013的三极管实现电流的放大。
因为本设计中的继电器的输入电阻为126欧姆,其阈值电压为2.3V,因此Rc<=(5V-2.3V)*126/2.3=147.9R,若取Rc=100欧,则Ic=5/(126+100)A=22.1mA,假设三极管的放大倍数为100,则Ib=221uA,Rb=(5-0.7)/221M=19.46k欧,本设计中取22k欧。
具体该部分电路图如下图所示:
3.9、电源模块:
因为本设计中的爆炸部分需要较大的电压,因此本设计采用25V电源供电,提供爆炸所需的大电压。
为了能同时为单片机提供5V电作为供电来源,本设计采用一个三端稳压器KA7815先将电压变成15V,然后进一步利用三端稳压器KA7805变成5V。
采用两级稳压既可以防止电压差距过大,而且可以减少单个稳压器的发热。
具体电源模块电路如下图所示:
3.10剪线拆弹电路:
为了模仿电影中的拆弹场景,本设计中也采用了一根红线和一根蓝线作为拆弹时可以剪断的线,当然也是像电影中一样存在一定的正确概率和剪线失败时会引发的爆炸。
此电路用外部中断0和外部中断1作为剪线的部分。
当没有剪断线时,令其为高电平,不会引发爆炸,当剪断某根线时令其为低电平,触发爆炸电路。
具体电路图如下所示:
3.11、整体电路原理图:
经过以上各部分电路的分析、解剖、以及参数计算和选择,可以得到整个系统的电路原理图,如下图所示:
3.12、元件清单:
元件清单
材料
数目
材料
数目
单片机STC89C52
1
三极管S9013
2
12M晶振
1
蜂鸣器
1
30pF瓷片电容
2
绿发光二极管
1
电解电容22uF/25V
1
红发光二极管
1
电解电容47uF/16V
1
40P锁警
1
1k排阻(一排8个)
1
液晶插槽40P
2
三端稳压器KA7815
1
金属膜电阻100欧
2
三端稳压器KA7805
1
200欧
1
继电器
1
330欧
2
独立共阴数码管
4
1k欧
3
译码器CD4511
4
22k欧
1
带锁开关
1
33k欧
1
小按钮
12
0805R的贴片电阻330欧
28
大按钮
1
62k欧
4
电源插座
1
16P底座
5
4、软件设计流程及其描述
4.1、软件结构:
本设计的软件部分主要包括以下几个部分:
延时部分、键盘扫描部分、指示部分、从键盘获取键值部分、倒计时部分、外部触发部分。
4.2、单片机资源分配:
本设计对单片机的资源使用相对比较多,基本上要用到绝大多数I/O口,要用到不少定时器和中断资源,因此,合理分配单片机的各种资源显得尤为重要。
经过再三考虑和钻研,本设计对单片机的资源分配如下:
4.2.1、I/O口的分配:
I/O口中的P0和P2口作为译码显示电路的输入、P1口中除P1.7外的7个I/O口作为矩阵键盘的接口、P3.0和P3.1作为绿灯和红灯这两个指示信号的输入、P3.2和P3.3以外部中断0和外部中断1的方式作为拆弹的红线与蓝线的接口、P3.6口作为指示电路中蜂鸣器的控制信号、P3.7口作为爆炸电路的引爆控制信号。
4.2.2、定时计数器的分配:
本设计选用的单片机STC89C52内部有3个定时计数器,即T0、T1、T2。
因此,可以选用定时器T0作为延时部分的时间驱动源(用查询的方式)、选用定时器T1作为倒计时的时间驱动源(用中断的方式)。
4.2.3、中断资源的分配:
本设计中倒计时时间不能因为拆弹密码的输入而暂停,因此要用到定时器T1的中断源ET1;因为涉及到剪线拆弹的过程,因此需要用到外部中断0和外部中断1的中断源EX0和EX1;定时计数器T0仅仅作为延时使用,采用查询方式就好。
4.3、程序流程图:
综合以上对单片机资源的分配,画出程序流程图,如下图所示:
4.4、函数模块及功能:
4.4.1、voidDelay(u16time)
延时函数。
由定时器T0作为定时资源,定时时间准确率高。
4.4.2、u8checkkey()
键盘扫描函数。
判断是否有键按下,有返回1,无返回0。
4.4.3、u8keyscan()
键值扫描函数。
有键按下返回键值,无键按下或抖动返回255。
4.4.4、voidinstruction(u16light,u16ring)
状态指示函数。
分别为绿灯亮的时间和蜂鸣器响的时间。
4.4.5、u32getkey()
获取键值函数。
从键盘上输入密码时用到的,按#号键结束,返回从头到尾键值排列所形成的多位十进制数。
4.4.6、voidtimer_1(void)interrupt3
定时器T1的中断子程序。
作为倒计时的秒时钟源,并显示剩余时间和快要爆炸时进行声光提示。
4.4.7、voidred_0(void)interrupt0
外部中断0的中断子程序。
作为剪断红线时的响应函数。
4.4.8、voidblue_1(void)interrupt2
外部中断1的中断子程序。
作为剪断蓝线时的响应函数。
4.4.9、voidmain()
主函数。
作为程序的顺序执行过程的控制函数,也执行各种初始化工作。
4.5、源代码:
#include
#defineu8unsignedchar
#defineu16unsignedint
#defineu32unsignedlong
sbitP1_0=P1^0;//定义键盘接口,P1.0-P1.3为输入,P1.4-P1.7为输出
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_3=P1^3;
sbitP1_4=P1^4;
sbitP1_5=P1^5;
sbitP1_6=P1^6;
sbitgreen=P3^0;//绿灯控制信号
sbitred=P3^1;//红灯控制信号
sbitexplosion=P3^7;//爆炸控制信号,高电平有效
sbitbuzzer=P3^6;//蜂鸣器控制信号
u8time,N=20;//T1的中断次数
u32time_value;//定时的时间值
voidDelay(u16time)//延迟100uS=0.1mS
{u16i=time;
if(i>0)
{TH0=TL0=156;
TR0=1;
do{while(TF0==0);
TF0=0;i--;}
while(i!
=0);
TR0=0;}}
u8checkkey()//检查是否有键按下,有返回1,无返回0
{P1_4=0;P1_5=0;
P1_6=0;
if((P1&0x0f)!
=0x0f)return1;
elsereturn0;}
u8keyscan()//键盘扫描函数,返回键值.无键按下或抖动返回oxff.
{u8value=0;//定义编码值
while(checkkey()==0);
Delay(100);
if(checkkey()==0)return0xff;
else{P1_4=0;
P1_5=1;
P1_6=1;
if(P1_0==0)value=0;
elseif(P1_1==0)value=1;
elseif(P1_2==0)value=2;
elseif(P1_3==0)value=3;
P1_4=1;
P1_5=0;
if(P1_0==0)value=4;
elseif(P1_1==0)value=5;
elseif(P1_2==0)value=6;
elseif(P1_3==0)value=7;
P1_5=1;
P1_6=0;
if(P1_0==0)value=8;
elseif(P1_1==0)value=9;
elseif(P1_2==0)value='$';
elseif(P1_3==0)value='#';
P1_6=1;
while(checkkey()!
=0);
Delay(100);
returnvalue;}}
voidinstruction(u16light,u16ring)//状态指示函数,输入绿灯亮的时间和蜂鸣器响的时间
{green=1;
buzzer=1;
Delay(light);
green=0;
Delay(ring-light);
buzzer=0;}
u32getkey()//从键盘上获取键值的函数,返回键值,最后按#号键结束
{u8key,i=0,j,value[32]={0};
u32Value=0,temp;
while
(1)
{key=keyscan();
if(i==0)
{if((key>0)&&(key<10))
{instruction(1000,1000);
value[i]=key;i++;}
elseif(key=='#')
{instruction(5000,10000);break;}}
else{if(key<10)
{instruction(1000,1000);
value[i]=key;i++;}
elseif(key=='#')
{instruction(5000,10000);break;}}
}
for(j=0;j
{temp=value[j];
value[j]=value[i-1-j];
value[i-1-j]=temp;}
temp=1;
for(j=0;j
{Value+=temp*value[j];
temp=temp*10;}
returnValue;}
voidmain()
{u8i,key,state=0;
u32password,pass_word;
TMOD=0x12;//定时计数器T1的方式1和T0的方式2
time=N;//T1应中断200次
P0=0xff;P2=0xff;//4个灯都熄灭
P3=0xff;P1=0xff;
P1=0x0f;
P3=0x3C;
password=getkey();//输入密码
time_value=0;
for(i=0;i<4;i++)//输入定时时间,4个数,输一个显示一个,绿灯亮一下,得到时间为多少秒
{key=keyscan();
instruction(1000,1000);
if(i==0){P0=P0&(key|0xf0);time_value+=key*600;}
elseif(i==1){P0=P0&((key<<4)|0x0f);time_value+=key*60;}
elseif(i==2){P2=(key<<4)|0x0f;time_value+=key*10;}
elseif(i==3){P2=P2&(key|0xf0);time_value+=key;}
}
do{key=keyscan();}//按#号键确认
while(key!
='#');
instruction(5000,10000);
TH1=(65536-50000)/256;//中断一次为50mS
TL1=(65536-50000)%256;
ET1=1;//允许T1中断
EX0=EX1=1;//允许外部中断
IT0=IT1=0;//外部中断为电平触发
EA=1;
TR1=1;//开始进入倒计时
while
(1)
{if(time_value==0)//计时结束关闭一切中断,开始爆炸
{TR1=0;
EA=ET1=EX0=EX1=0;
red=1;
buzzer=0;
explosion=1;
while
(1);}
if(checkkey()==1)//当按下#号键时输入拆弹密码,同时只剩下10秒
{key=keyscan();
if(key=='#')
{if(time_value>11*20/N){if(state==0){time_value=11*20/N;
state=1;}}
pass_word=getkey();
if(pass_word==password)
{TR1=0;
EA=ET1=EX0=EX1=0;
explosion=0;
P0=0x09;
P2=0x06;
for(i=0;i<4;i++)
{red=buzzer=1;
Delay(5000);
red=buzzer=0;
Delay(5000);}
while
(1);}
}
elseif(time_value>11*20/N){if(state==0){time_value=11*20/N;
state=1;}}
}
}
}
voidtimer_1(void)interrupt3
{u8fen_h,fen_l,miao_h,miao_l;
TF1=0;
TH1=(65536-50000)/256;//中断一次为50mS
TL1=(65536-50000)%256;
time--;
if(time==0)
{time_value--;
fen_h=time_value/600;
fen_l=(time_value%600)/60;
miao_h=(time_value%60)/10;
miao_l=time_value%10;
P0=fen_l*16+fen_h;
P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 定时炸弹