一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 1879|回复: 7
收起左侧

[51单片机] 单片机定时开关

[复制链接]
发表于 2017-10-21 19:24 | 显示全部楼层 |阅读模式
用感光法做电路板需要控制曝光时间,以前看表计时十分麻烦,于是做了个用单片机控制的定时开关。由于对精度要求不高,精度1分钟足够了,每按一次分钟加减1分钟就可以了,灵感来自微波炉。外壳用报废的卫星电视接收机壳改的,单片机用的STC89C52,晶振12M,4位共阳数码管显示。按一次加、减时间改变1分钟。设定好定时时间,按开始键,定时器开始工作,在工作时也可以调节定时时间,如果需要中途停止定时,按停止键即可,工作完成后按复位键,即可开始下一次定时。下面是程序

#include<reg51.h>
#define KeyPort P1

unsigned char KeyV,TempKeyV,num;                                                            
sbit P26=P2^3;//数码管第1位
sbit P29=P2^2; //数码管第2位
sbit P27=P2^1;//数码管第3位
sbit P28=P2^0;// 数码管第4位

sbit Key_UP=P1^1; ///开始
sbit Key_DOWN=P1^2;///停止
sbit P12=P1^3;//时间加
sbit P13=P1^4; //时间减

   sbit JDQ=P3^2;  //继电器
   sbit FMQ=P3^5;  ///蜂鸣器
   sbit LED=P1^7;  ///LED指示
unsigned int js;
unsigned int ds=100,x,y;//倒计时初始时间, 1分钟
unsigned char jsflag;
static unsigned int i;
unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
  unsigned char KeyScan(void);//键盘扫描
  void tiaojie(void);
void Delay(unsigned int ii)        //1MS
{
unsigned int jj;
for(;ii>0;ii--)
for(jj=0;jj<125;jj++);
}
void main()
{
           EA = 1;                                        //允许CPU中断
        ET0 = 1;                                 //定时器0中断打开
        ET1=1;                                        //定时器1中断打开
        TMOD = 0x11;                        //设定时器0 1为模式1,16位模式
        TH0=0xB8;
        TL0=0x00;                                //设定时值为(20ms)
        TH1=0xdc;                                        //设定时值为(10ms)
        TL1=0x00;
        TR0 = 1;
        TR1=1;
     
        KeyV = 0;
        TempKeyV = 0;
        jsflag=0;
while(1);
}

//定时器0中断外理中键扫描和显示
void Key_Time0(void) interrupt 1 using 2
{
  TH0=0xB8;
        TL0=0x00;                                //设定时值为20000us(20ms)
  if (!Key_UP)
    KeyV = 1;
  if (!Key_DOWN)
    KeyV = 2;
        
          if(P12==0)
          {
           Delay(20);
           if(P12==0)
            ds=ds+100;//定时加1分钟         (调节精度)
                while(!P12);
          }
          if(P13==0)
          {
           Delay(20);
           if(P13==0)
           ds=ds-100; //定时减1分钟
           while(!P13);
          }
   if (KeyV!= 0)      //有键按下
    {
      Delay(10);   //延时防抖  按下10ms再测
      if (!Key_UP)
        TempKeyV = 1;
      if (!Key_DOWN)
        TempKeyV = 2;
                 if (KeyV == TempKeyV)   //两次值相等为确定接下了键
           {
                      if (KeyV == 1)
                   {
                                   jsflag=0;
                                                      if(ds==0)
                                                   {
                                                   ds=100;
                                                   }
                                                         js=js+1;
                                                        JDQ=0;   //继电器吸合
                                                        FMQ=1;
                                                        LED=0;
                                                
                               if(js==50)
                                   {
                                 js=0;
                                 ds=ds-1;
         
                             }
           }
if(KeyV==2)
{
          jsflag=1;
        }
}
}
   if(jsflag==1)
   {
   JDQ=1;
   FMQ=0;
   LED=1;

   }
   if(ds==0)
   {
   JDQ=1;
   FMQ=0;
   LED=1;
   jsflag=1;
   KeyV=0;
   }

}

void disp_Time1(void) interrupt 3 using 3
{
        TH1=0xdc;
        TL1=0x00;
        x=ds/10000;

          y=(ds%10000)/1000;//分钟十位
      P0=LEDDis[y];
      P26=0;
      Delay(2);
      P26=1;

     P0=LEDDis[((ds%10000)%1000)/100];//分钟各位
     P29=0;
     Delay(2);
     P29=1;                                

P0=0xbf; //分钟与秒的间隔符
  P0=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
  if(((ds%1000)%100)/10>=6)          //满60,百位减一
  {
  ds=ds-10;
  P0=LEDDis[6];
  }
  P27=0;
  Delay(2);
  P27=1;

  P0=LEDDis[(((ds%10000)%1000)%100)%10]; //秒个位
  P28=0;
  Delay(2);
  P28=1;
}

http://www.crystalradio.cn/data/attachment/forum/201605/21/111156lyujxc0ewmm7oue0.jpg

评分

参与人数 1一乐金币 +100 收起 理由
yleee + 100 很给力!

查看全部评分

发表于 2017-10-21 19:45 | 显示全部楼层
帮上电路图
9F757E15-52AC-445E-AF55-561791BBBF69.jpeg

发表于 2017-10-21 20:11 | 显示全部楼层
不错!赞一个
发表于 2017-10-21 21:39 | 显示全部楼层
用带按键的编码开关调节时间比按键方便些。
 楼主| 发表于 2017-10-25 19:58 | 显示全部楼层
ain365 发表于 2017-10-21 21:39
用带按键的编码开关调节时间比按键方便些。

家里有微波炉吧,按一下加热键是30秒钟。这个和微波炉一样,不过按一下是1分钟,按一下多少时间可以在程序里改,编码开关不可能这么灵活,
发表于 2017-10-25 20:36 | 显示全部楼层
韩小蕾2 发表于 2017-10-25 19:58
家里有微波炉吧,按一下加热键是30秒钟。这个和微波炉一样,不过按一下是1分钟,按一下多少时间可以在程 ...

有空,又有心情时,想找数码管仿玩一个。但是,俺又不懂编程……
如果要改「按一下是30秒」——俺家的微波炉就是这种……习惯了很方便——具体在程序里改哪里?
谢谢先!
发表于 2017-11-12 09:02 | 显示全部楼层
开源的帖不错。谢楼主分享。
发表于 2017-11-12 11:06 | 显示全部楼层
学习了,感谢楼主!
用感光法做电路板需要控制曝光时间,以前看表计时十分麻烦,于是做了个用单片机控制的定时开关。由于对精度要求不高,精度1分钟足够了,每按一次分钟加减1分钟就可以了,灵感来自微波炉。外壳用报废的卫星电视接收机壳改的,单片机用的STC89C52,晶振12M,4位共阳数码管显示。按一次加、减时间改变1分钟。设定好定时时间,按开始键,定时器开始工作,在工作时也可以调节定时时间,如果需要中途停止定时,按停止键即可,工作完成后按复位键,即可开始下一次定时。下面是程序

#include<reg51.h>
#define KeyPort P1

unsigned char KeyV,TempKeyV,num;                                                            
sbit P26=P2^3;//数码管第1位
sbit P29=P2^2; //数码管第2位
sbit P27=P2^1;//数码管第3位
sbit P28=P2^0;// 数码管第4位

sbit Key_UP=P1^1; ///开始
sbit Key_DOWN=P1^2;///停止
sbit P12=P1^3;//时间加
sbit P13=P1^4; //时间减

   sbit JDQ=P3^2;  //继电器
   sbit FMQ=P3^5;  ///蜂鸣器
   sbit LED=P1^7;  ///LED指示
unsigned int js;
unsigned int ds=100,x,y;//倒计时初始时间, 1分钟
unsigned char jsflag;
static unsigned int i;
unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
  unsigned char KeyScan(void);//键盘扫描
  void tiaojie(void);
void Delay(unsigned int ii)        //1MS
{
unsigned int jj;
for(;ii>0;ii--)
for(jj=0;jj<125;jj++);
}
void main()
{
           EA = 1;                                        //允许CPU中断
        ET0 = 1;                                 //定时器0中断打开
        ET1=1;                                        //定时器1中断打开
        TMOD = 0x11;                        //设定时器0 1为模式1,16位模式
        TH0=0xB8;
        TL0=0x00;                                //设定时值为(20ms)
        TH1=0xdc;                                        //设定时值为(10ms)
        TL1=0x00;
        TR0 = 1;
        TR1=1;
     
        KeyV = 0;
        TempKeyV = 0;
        jsflag=0;
while(1);
}

//定时器0中断外理中键扫描和显示
void Key_Time0(void) interrupt 1 using 2
{
  TH0=0xB8;
        TL0=0x00;                                //设定时值为20000us(20ms)
  if (!Key_UP)
    KeyV = 1;
  if (!Key_DOWN)
    KeyV = 2;
        
          if(P12==0)
          {
           Delay(20);
           if(P12==0)
            ds=ds+100;//定时加1分钟         (调节精度)
                while(!P12);
          }
          if(P13==0)
          {
           Delay(20);
           if(P13==0)
           ds=ds-100; //定时减1分钟
           while(!P13);
          }
   if (KeyV!= 0)      //有键按下
    {
      Delay(10);   //延时防抖  按下10ms再测
      if (!Key_UP)
        TempKeyV = 1;
      if (!Key_DOWN)
        TempKeyV = 2;
                 if (KeyV == TempKeyV)   //两次值相等为确定接下了键
           {
                      if (KeyV == 1)
                   {
                                   jsflag=0;
                                                      if(ds==0)
                                                   {
                                                   ds=100;
                                                   }
                                                         js=js+1;
                                                        JDQ=0;   //继电器吸合
                                                        FMQ=1;
                                                        LED=0;
                                                
                               if(js==50)
                                   {
                                 js=0;
                                 ds=ds-1;
         
                             }
           }
if(KeyV==2)
{
          jsflag=1;
        }
}
}
   if(jsflag==1)
   {
   JDQ=1;
   FMQ=0;
   LED=1;

   }
   if(ds==0)
   {
   JDQ=1;
   FMQ=0;
   LED=1;
   jsflag=1;
   KeyV=0;
   }

}

void disp_Time1(void) interrupt 3 using 3
{
        TH1=0xdc;
        TL1=0x00;
        x=ds/10000;

          y=(ds%10000)/1000;//分钟十位
      P0=LEDDis[y];
      P26=0;
      Delay(2);
      P26=1;

     P0=LEDDis[((ds%10000)%1000)/100];//分钟各位
     P29=0;
     Delay(2);
     P29=1;                                

P0=0xbf; //分钟与秒的间隔符
  P0=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
  if(((ds%1000)%100)/10>=6)          //满60,百位减一
  {
  ds=ds-10;
  P0=LEDDis[6];
  }
  P27=0;
  Delay(2);
  P27=1;

  P0=LEDDis[(((ds%10000)%1000)%100)%10]; //秒个位
  P28=0;
  Delay(2);
  P28=1;
}

http://www.crystalradio.cn/data/attachment/forum/201605/21/111156lyujxc0ewmm7oue0.jpg

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-19 09:50 , Processed in 0.070926 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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