999秒倒计时器原理图 源程序.rar
时间:10-25 09:10
查看:4645次
下载:162次
简介:
开源制作999秒倒计时器-创新设计精简制作(只需4个元件)
滴滴滴--听到这种声音就会让人联想到电影里炸弹在倒计时后发出的声音,今天开源制作一款999秒倒计时器,当倒计时完毕蜂鸣器会发出滴滴的声音,提示倒计时完毕。
1.所需元件:STC单片机+按键+有源蜂鸣器+共阴数码管
2.说明:开机后数码管显示999,按一下开关K开始倒计时,在计时状态按一下开关则暂停计时,在暂停计时状态按一下开关又开始倒计时,再次按一下则重新设置倒计时999秒。
3.蜂鸣器选择有源蜂鸣器正极接vcc负极接P5.4
4.开关一端接P5.5另一端接地
5.单片机选有推挽输出的单片
下图为开机界面
下图为正在倒计时
下图为原理图截图
/***************************************************************
编写:刘海龙
程序名: 3位共阴数码管999秒倒计时器
编写时间: 2016年10月21日
硬件支持: STC15W408AS或者stc12c系列无说明时晶振一般选12M
接口说明: 蜂鸣器负极接P5^4,按键接P5^4
/***************************************************************/
#include <STC15W.H>//STC15W408AS单片机头文件
#include <4LED_YIN.H>//共阴数码管驱动
#include <intrins.h>
/***************************************************************/
sbit key1=P5^5;
sbit beep=P5^4;
unsigned int s;//设置秒存放区
data unsigned char cou = 0; // 软计数器,对10ms时基信号累加到1s
unsigned char MENU=0;//状态标志位
/*******************************************/
void delay1ms (unsigned int a){ // 1ms延时程序
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);//STC单片机在外部晶振为12MHz时i值上限为600
} //AT89C51单片机在外部晶振为12MHz时i值上限为125
}
/*********************************************************************************************/
void di(){//蜂鸣器驱动程序
beep=0;
delay1ms(500);
beep=1;
delay1ms(500);
beep=0;
delay1ms(500);
beep=1;
}
/**********定时器初始化*********************************/
void init_T0 (void){
TMOD = 0x11; // 定时/计数器0,1工作于方式1
TH0 = 0x3c; // 预置产生50ms时基信号
TL0 = 0xb0;
EA = 1; // 开总中断
ET0 = 1; // 定时/计数器0允许中断
TR0 = 0; // 开闭定时/计数器0
}
/*******************************************/
void tiem0(void) interrupt 1 //50毫秒@12.000MHz
{
cou++;
if (cou>19)//20个50ms到(1秒到)
{
cou=0;
s--;//秒减一
if(s<1)
{ di(); //倒计时完蜂鸣器响
TR0=0;//关闭定时器
}
}
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
}
/******************************************/
void main(){ //主函数
init();//设置相关IO口为推挽方式
init_T0();//定时器初始化
s=999;
while (1){
diplay_data (1,disdata[s/100]);
diplay_data (2,disdata[s%100/10]);
diplay_data (3,disdata[s%10]);
if(key1==0&&MENU==0){ //K1按下计时器开始计时
delay(10);
if(key1==0&&MENU==0){
s=999;
TR0 = 1;
while(!key1);
MENU=1;//开始计时的标志
}
}
if(key1==0&&MENU==1){//K1按下同时在走时状态走时暂停
delay(10);
if(key1==0&&MENU==1){
TR0 = 0;
while(!key1);
MENU=2;//暂停键按下的标志
}
}
if(key1==0&&MENU==2){//K1按下同时在暂停状态继续走时
delay(10);
if(key1==0&&MENU==2){
TR0 = 1;
while(!key1);
MENU=3;
}
}
if(key1==0&&MENU==3){//K1按下同时在走时状态清零
delay(10);
if(key1==0&&MENU==3){
TR0 = 0;
s=999;
while(!key1);
MENU=0;
}
}
}
}
/********************END*********************/