矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 8419|回复: 20

闲来没事弄一个模拟定时装置

  [复制链接]
     
发表于 2011-2-20 22:06:24 | 显示全部楼层 |阅读模式
视频.jpg



http://v.youku.com/v_show/id_XMjQ1MzE0MTY4.html



在倒数0和20秒处触发继电器动作,同时20秒时发出告警,10秒时发出急促告警

定时时间修改 由按键完成

/********************宏定义*****************************/
#include <AT89X52.H>
#define  K1    P0_7
#define  K2    P0_6
#define  K3    P0_5
#define  DATA  P1
#define  SLE   P3
#define  L0    P3_4
#define  L1    P3_3
#define  L2    P3_2
#define  L3    P3_1
#define  L4    P3_7
#define  L5    P3_5
#define  L6    P3_6
#define  L7    P3_0
#define  BEEP  P2_0
#define  ON    0
#define  OFF   1
#define  KM0   P2_1
#define  KM1   P2_2
#define  time_hour0   0
#define  time_hour1   0
#define  time_min0    0
#define  time_min1   0
#define  time_sec0    21
#define  time_sec1   11
#define  MEU_NUM    5  //功能键功能总数
/*******************函数声明********************************/
void     sys_int   (void);
void     beep  (void);
void     delpy    (unsigned char );
unsigned char     key(void);
void     display  (unsigned char );
void table (unsigned char x) ;

unsigned char code   led_data[]={0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14,0xfb}; //“0--9,. ”字码
  
unsigned char code led_sle[]={0x10,0x08,0x04,0x02,0x80,0x20,0x40,0x01}; //自右向左0-7位
unsigned char hour,min,sec,QQ,ID;  //时,分,秒,0.1秒级变量 ,定时器状态控制允许标志
static  bit  LED_K;   //产生0.5秒周期闪烁参变量
/********************************************************************
函数名称:按键检测
**********************************************************************/
  unsigned char key(void)
{
static unsigned char key_id; //功能键ID
unsigned char  m;
if(  K1==0 && K2!=0  && K3!=0  )  //当功能键时
    {
  beep();
  if (  K1==0 && K2!=0  && K3!=0  )
   ++key_id;
   if (key_id>MEU_NUM )  key_id=0;   //功能值超值返回

    }
if(  K1!=0 && K2==0  && K3!=0  )//当按加键时
    {
    beep();
  if (  K1!=0 && K2==0  && K3!=0  )
   {
     if(key_id==1)  hour++;
     if(key_id==2)  min++;
     if(key_id==3)  sec++;
    }
}
if(  K1!=0 && K2!=0  && K3==0  )//当按减键时
    {
  beep();
  if (  K1!=0 && K2!=0  && K3==0  )
   {
     if(key_id==1)  hour--;
     if(key_id==2)  min--;
     if(key_id==3)  sec--;
    }
}
if (key_id==5) ID=0x01; //当功能键为5时,修改定时器计时允许标志
      
else ID=0x00 ; //禁止
if (key_id==0)   sys_int();//数据初始化
if(key_id<5)
{
    if( (hour<1||hour>99)  && (min <1||min>59)  &&  (sec<1||sec>59) )  //防止时间为负
      {
    hour=0;
    min=0;
    sec=0;
    }

}
return (m=key_id);
}


/********************************************************************
函数名称:延时
  **********************************************************************/
  void  delpy(unsigned char x)
{
unsigned char j;
for(;x>0;x--)
  for (j=255;j>0;j--);
  }

/******************************************************************
函数名称:LED数码管显示
*********************************************************************/
  void display (unsigned char k)
  {
   unsigned char h0,h1,m0,m1,s0,s1,x;  //拆字码用
   h1=hour /10 ;
   h0=hour%10;
   m1=min /10 ;
   m0=min%10;
   s1=sec /10 ;
   s0=sec%10;
   x=QQ;  //  1/10秒
   
  
   DATA=led_data[h1];//时
  if(  (k==1)||(k==4) )
  {
    SLE=0x00;
    L7= LED_K;    //0.5秒闪烁
    }
   else
     {
      SLE=led_sle[7]; //常态
      
   }
   delpy(2);
DATA=led_data[h0];
   if(  (k==1)||(k==4) )
     {
   SLE=0x00;
    L6= LED_K;   
   
      }
   else
     {
      SLE=led_sle[6];
      
   }
   delpy(2);
   


DATA=led_data[m1]; //分
   if(  (k==2)||(k==4) )
     {
    SLE=0x00;
    L5= LED_K;   
    }
   else
     {
      SLE=led_sle[5];
      
   }
     delpy(2);
  

  DATA=led_data[m0];
   if(  (k==2)||(k==4) )
     {
    SLE=0x00;
    L4= LED_K;   
      }
   else
     {
      SLE=led_sle[4];
   }
   delpy(2);


DATA=led_data[s1]; //秒
if(  (k==3)||(k==4) )
     {
    SLE=0x00;
    L3= LED_K;   
      }
   else
     {
      SLE=led_sle[3];
   }
   delpy(2);

DATA=led_data[s0];
if(  (k==3)||(k==4) )
     {
    SLE=0x00;
    L2= LED_K;   
      }
   else
     {
      SLE=led_sle[2];
   }
  delpy(2);

    DATA=led_data[x]; // 1/10秒
    SLE=led_sle[0];
    delpy(2);

    DATA=led_data[10]; //时-分小数点
    SLE=led_sle[6];
    delpy(2);
DATA=led_data[10]; // 分-秒小数点
    SLE=led_sle[4];
    delpy(2);



  }
/***********************************************
函数名称:蜂鸣音
备注:内插显示函数
***********************************************/
void     beep  (void)
{
BEEP=ON;
display(0); display(0);//display(0);display(0);display(0);
BEEP=OFF;
}

/*********************************************
函数名称:告警及控制动作
********************************************/
void table (unsigned char x)
{
if(x==5)
{
if(hour==time_hour0 &&  min==time_min0 && sec<time_sec0  )
{
KM0=ON; //继电器接通
if(sec>time_sec1)
{BEEP=ON;
display(0); display(0);display(0); //慢告警音
BEEP=OFF;
BEEP=ON;
display(0); display(0);display(0);
BEEP=OFF;
}
}

else KM0=OFF;
  if(hour==time_hour1 &&  min==time_min1 && sec<time_sec1 )
  {
  
   KM1=ON;
   BEEP=ON;
   display(0);//急速告警音
   BEEP=OFF;
   KM1=ON;
   BEEP=ON;
   display(0);
   BEEP=OFF;
   }
else  KM1=OFF;
  if   (hour==0 &&  min==0 && sec<1 ) BEEP=ON;
  }
  else
      { KM0=OFF;
     KM1=OFF;
   
    }
}
/**********************************************
函数名称:系统初始化
******************************************/
void sys_int(void)
{
  P0=0xfe;
  hour=00;
  min=00;
  sec=00;
  QQ=0;
  TMOD=0X01;
  ET0=1;
  TH0=0x3c; //重装定时初值
  TL0=0xb0;  // TL0=TL0+0xb3;
  EA =1   ;
  TR0 =1   ;
}

/*****************************************
函数名称:定时中断服务
****************************************/
void time_server(void)  interrupt  1   using 1 //周期50ms中断函数
{  static  unsigned char x0,x1,x2,a;//1000ms ,100ms,500ms 时基,临时变量

  TH0=0x4B; //重装定时初值
  TL0=0XFF;
  x0++;
  x1++;
  x2++;
  if(x1==2) //100ms时基产生
    {
  x1=0;
  if((ID!=0)&&( sec>0 ))
{  
    a++;
   QQ=10-a; //产生9--->0  1/10倒计时
    if(QQ==0)
     a=0;
    }
   
  }

  if(x2==10)//500ms时基产生
    {
     x2=0;
     LED_K=!LED_K;//闪烁标志
  //P2_0=!P2_0;
    }
  if(x0==20)//1000ms时基产生
    {
       x0=0;
     if(ID==0x01)//当允许计时时计数
             {
            
      if( hour==0 &&min==0 &&sec<1)
    {
     ID=0;
   
     }
     else  if(sec>0) { sec--;} //秒倒计时
               if(sec==0)
         {
      if(min!=0)
         {  --min;
           sec=59;
      }
      }
           else if(min==0)
          {
        if(hour!=0)
          {--hour;
          min=59;
       }
       }
               }
   }
}
/*************************************************
函数名称:主调函数
****************************************************/
main()
{
unsigned char x,y;
sys_int();//初始化
      while(1)
     {
    table(y);
     y= key();
      for(x=25;x>0;x--)
        {
          display(y);
        }
     //   if(hour==0 && min==0  && sec==0  )  y=4;
               }
}

[ 本帖最后由 yangcheng84 于 2011-2-20 23:35 编辑 ]
     
发表于 2011-2-21 00:10:06 | 显示全部楼层
看不懂 C ~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

     
发表于 2011-2-24 13:16:14 | 显示全部楼层
看懂一半,基本上还是看不懂!C
回复 支持 反对

使用道具 举报

     
发表于 2011-2-28 21:46:12 | 显示全部楼层
哈哈,学习啦。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-3-6 22:11:02 | 显示全部楼层
原帖由 lxa000 于 2011-2-21 00:10 发表
看不懂 C ~~~~~~~~~~~~~~~




以上程序,定时范围是24小时内,并按24小时制显示;修改程序中的常数,可改变定时范围,0--255小时之间
回复 支持 反对

使用道具 举报

发表于 2011-6-1 13:08:05 | 显示全部楼层
这个装置用的是共阴还是共阳的数码管,数码管的位选和段选分别接在单片机那个引脚上,谢谢
按程序上写的不行啊
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-6-1 20:10:29 | 显示全部楼层
这个装置用的是共阴还是共阳的数码管,数码管的位选和段选分别接在单片机那个引脚上,谢谢
按程序上写的不 ...
呵呵m 发表于 2011-6-1 13:08



    段码在P1, 位选在P3
回复 支持 反对

使用道具 举报

     
发表于 2011-6-1 20:11:05 | 显示全部楼层
回复 5# yangcheng84


    能上个汇编的不??
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-6-5 10:46:54 | 显示全部楼层
回复 8# lxa000


   汇编编写实在很繁琐,而且我写的大家很不一定能看出来编写的意思,呵呵
回复 支持 反对

使用道具 举报

     
发表于 2011-6-5 11:31:19 | 显示全部楼层
回复 9# yangcheng84


    你加上注释
估计没大问题
嘿嘿
回复 支持 反对

使用道具 举报

发表于 2011-6-7 15:02:05 | 显示全部楼层
段码在P1, 位选在P3
yangcheng84 发表于 2011-6-1 20:10



    试了试不行,最好有原理图
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-6-7 23:28:02 | 显示全部楼层
本帖最后由 yangcheng84 于 2011-6-7 23:31 编辑
试了试不行,最好有原理图
呵呵m 发表于 2011-6-7 15:02



下面是原理图。其实8*8数码管管脚顺序完全可以不喝原理一样,只要修改一下段码和位选码就OK了;上面的程序,按键使用的是P0口的,记得加上拉电阻,阻值1---10K任选即可。
原理.jpg
回复 支持 反对

使用道具 举报

发表于 2011-6-8 14:08:34 | 显示全部楼层
本帖最后由 呵呵m 于 2011-6-8 14:10 编辑

未命名.JPG 这样接,可是开机后就一直是这样,按键无反应,是不是程序有些错误,你把这个程序在下到单片机试一下
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-6-8 23:28:48 | 显示全部楼层
本帖最后由 yangcheng84 于 2011-6-8 23:31 编辑
这样接,可是开机后就一直是这样,按键无反应,是不是程序有些错误,你把这个程序在下到单片机试一下
呵呵m 发表于 2011-6-8 14:08



使用P0口通常情况下要加上拉电阻,P1直接驱动LED数码管,图中是共阳LED,因此P1也要挂上拉电阻,要不LED亮度很低的;另外,程序中,K1是功能键,K2,K3分别是加 减键;


使用时,按一下K1,小时位闪烁,可以按K2,K3调整数值;

再按一次K1,分钟位闪烁,可以按K2,K3调整数值;

再一次K1,秒位闪烁,可以按K2,K3调整数值;

如果继续按K1,则 时 分 秒同时闪烁,表示准备执行,再按一次K1则立即执行倒计时定时!

程序中BEEP是驱动外挂PNP型三极管(接蜂鸣器),KM0,KM1外挂两个三极管(均接继电器)

你看看你仿真的是不是按K1,K2,  K3  (P0.4,P0.5,P0.6)了?

程序就是上面演示的程序,没有异常。
回复 支持 反对

使用道具 举报

发表于 2011-6-9 14:08:32 | 显示全部楼层
试了试不行
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 05:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表