我们是玩电子的,搞搞单片机,最近很多次烧饭中途接电话,结果厨房就惨了。所以决定给自己做个报警声音很大的定时器。可以定时1-99分钟,采用倒计时方式,不可以逆转。
取材:硬件部分简单,一个4.5V电池盒带开关、一个AT89c2051单片机、一个双位数码管(2个单的也行)、一个按键、配套晶振12M、30P电容2个、4.7k电阻3个、390欧电阻8个、9015三极管3个,高响度蜂鸣器1个、复位电阻电容。
连接电路和我的开发板差不多,很简单,这里就不描述了。也可以找其他连接方法。我这里用原来的旧板子改动了一下,原来是我用来把普通洗衣机改成自动洗衣机是做的,没丢,正好拿来改。程序也是开发板现成的,稍调试一下就可以了。
这里说一下基本思路,上电以后蜂鸣器短响,数码管显示00,其中一个小数点和蜂鸣器通频率闪烁。按键数字增加,到99停止,无需启动,进入倒计时状态,到0是蜂鸣器响,程序也非常简单,这里贴出来供参考。
//99秒倒计时,两个数码管显示0-99,两个按键做加减操作,定时到蜂鸣器响
#include
sbit SEG1=P3^4;// 定义外接端口
sbit SEG2=P3^5;
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit BEEP="P3"^7;
code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
//共阳数码管 0-9
unsigned char Dis_Shiwei;//定义全局变量
unsigned char Dis_Gewei;
unsigned char minute;
bit Flashbit;
void delay(unsigned int cnt)//延时函数
{
while(--cnt);
}
main()//主函数
{
minute=0;
TMOD=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE=0x82;
TR0=1;
while(1)//主循环
{
/////////////////////////////////////////////////////////////////
if(!KEY1) //按键1去抖以及动作
{
delay(30000);
if(!KEY1)
{
if(minute<99)
99> minute++;
}
}
////////////////////////////////////////////////////////////////
if(!KEY2) //按键2去抖以及动作
{
delay(30000);
if(!KEY2)
{
if(minute>0)
minute--;
}
}
////////////////////////////////////////////////////////////////
if(minute==0)//条件满足蜂鸣器闪响
{
BEEP="Flashbit";
}
else
BEEP="1"; //不满足时关掉
////////////////////////////////////////////////////////////////
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char second,count;//定义内部静态变量
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if(!SEG1)//数码管扫描
{
SEG1=1;
SEG2=0;
P1=Dis_Gewei;
}
else
{
SEG1=0;
SEG2=1;
P1=Dis_Shiwei;
}
switch(count)
{
case 10:
case 20:
case 30:
case 40:
case 50:
case 60:
case 70:
case 80:
case 90:Flashbit=!Flashbit;break;//在这些时候取反标志位,主要用于闪烁和蜂鸣器
default:break;
}
if (count==100)
{
count="0";
Flashbit=!Flashbit;
second++;//秒加1
if(second==60)
{
second="0";
if(minute>0)//倒计时条件
minute--;
}
}
Dis_Shiwei=tab[minute/10];//十位显示值处理
Dis_Gewei=tab[minute%10]; //个位显示处理
if(Flashbit)//个位小数点部分每秒闪烁
Dis_Gewei &=0x7f;
}
文章评论(0条评论)
登录后参与讨论