矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 6177|回复: 18

单片机定时开关

[复制链接]
     
发表于 2016-5-21 11:13:37 | 显示全部楼层 |阅读模式
本帖最后由 bxyyhan 于 2016-5-21 11: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;
}

正面

正面

背面

背面

内部

内部

原理图

原理图

PCB

PCB

评分

2

查看全部评分

发表于 2016-5-21 11:39:25 来自手机 | 显示全部楼层
楼主:这个定时总长为多少?能改个倒时总长为9999分钟的吗
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2016-5-21 12:11:07 | 显示全部楼层
撕书人家 发表于 2016-5-21 11:39
楼主:这个定时总长为多少?能改个倒时总长为9999分钟的吗


总时间99分钟,可以扩展到655分钟,不过没什么意义,99分钟足够了,至于你需要的9999分钟等于一星期了,你要做什么用?
截图01.jpg
回复 支持 反对

使用道具 举报

     
发表于 2016-5-21 17:23:32 | 显示全部楼层
短期内精度达到ms级很轻松
回复 支持 反对

使用道具 举报

发表于 2016-5-21 20:02:21 | 显示全部楼层
楼主学习能力真快。。。
这么快会单片机编程了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2016-5-21 21:00:55 来自手机 | 显示全部楼层
本帖最后由 bxyyhan 于 2016-5-21 21:04 编辑
hotdll 发表于 2016-5-21 20:02
楼主学习能力真快。。。
这么快会单片机编程了。


别损我了,你那电桥成功没有?早就做好了,只是现在才发帖给大家分享,工作又忙了,周六一定不休息,周日休息不一定。
回复 支持 反对

使用道具 举报

发表于 2016-5-21 21:28:03 | 显示全部楼层
bxyyhan 发表于 2016-5-21 21:00
别损我了,你那电桥成功没有?早就做好了,只是现在才发帖给大家分享,工作又忙了,周六一定不休息,周 ...

电桥没空弄,要开发4个项目,目前只完成1个。。等项目完了,有时间了再弄。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2016-5-21 21:36:43 | 显示全部楼层
amo 发表于 2016-5-21 17:23
短期内精度达到ms级很轻松

那个很简单,只是我并不需要那么高,1分钟就可以了,代码里有注释,修改那个参数就可以。
回复 支持 反对

使用道具 举报

发表于 2016-5-23 15:52:27 | 显示全部楼层
继续努力。。
回复 支持 反对

使用道具 举报

     
发表于 2016-5-24 08:34:39 来自手机 | 显示全部楼层
楼主这个很好,不过程序有个小问题。每按下按键加减时分钟数不能准确地加减1,可能加减了3,4……。并且加减按键一直按下时,数码管是没有显像示的释放后就出现加减书不准了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2016-5-24 20:31:10 | 显示全部楼层
依依不舍 发表于 2016-5-24 08:34
楼主这个很好,不过程序有个小问题。每按下按键加减时分钟数不能准确地加减1,可能加减了3,4……。并且加减 ...

按键会停止显示是真的,但不可能加3加4,无论是仿真还是我做的成品都不存在这个问题。本人初学单片机,可能有些疏漏,还恳请大家多多帮助。再次谢谢坛友提醒。
回复 支持 反对

使用道具 举报

发表于 2016-6-1 06:46:19 来自手机 | 显示全部楼层
bxyyhan 发表于 2016-5-21 12:11
总时间99分钟,可以扩展到655分钟,不过没什么意义,99分钟足够了,至于你需要的9999分钟等于一星期了, ...

我想制一个充电器定时器,现在己找到一个10小时的定时器。
你的这个电路有秒显,我也会烧录试试,但不知用的是否共阳显示管?
回复 支持 反对

使用道具 举报

     
发表于 2016-6-1 09:12:20 来自手机 | 显示全部楼层
bxyyhan 发表于 2016-5-24 20:31
按键会停止显示是真的,但不可能加3加4,无论是仿真还是我做的成品都不存在这个问题。本人初学单片机,可 ...

我下来用共阳数码管修改了字段试过,原因大概是在长按按键时一直会在一个时钟中断循环,显示中断不起作用所以没有显示的。加减数不确定是有的,语句中的键盘扫描只要按键一直为真就会一直加减数。
回复 支持 反对

使用道具 举报

发表于 2016-6-1 12:02:02 | 显示全部楼层
本帖最后由 飞越无限 于 2016-6-1 12:12 编辑
撕书人家 发表于 2016-6-1 06:46
我想制一个充电器定时器,现在己找到一个10小时的定时器。
你的这个电路有秒显,我也会烧录试试,但不知 ...


用恒压恒流的开关电源充电吧,不用设定时间,调好电压电流值后充满自停,不会有过充和欠充的问题,
蓄电池都可以这样充电。
共阴和共阳对单片机来说不是什么问题,通常改一下程序就可以互换使用,我通常是在程序里设置一个开
关来实现。
回复 支持 反对

使用道具 举报

发表于 2016-6-6 09:22:14 | 显示全部楼层
楼主,我编译之后,有3K之多,正常吗?能不能麻烦你给一个HEX文件。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 15:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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