原创 给自己做个定时器简单有效

2008-8-4 20:53 2593 2 2 分类: MCU/ 嵌入式

         我们是玩电子的,搞搞单片机,最近很多次烧饭中途接电话,结果厨房就惨了。所以决定给自己做个报警声音很大的定时器。可以定时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;


}


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条