【广局拙作】相当够本的定时开伞
novakon2013/07/13电子技术 IP:广东
DSC_3459.jpg
DSC_3461.jpg   

STM8S103F3P6单片机

AMS1117-3.3

IRLML2502 MOS管

按键,自锁开关,小扬声器,橙色led

- 使用说明 -

自锁开关控制电源通断。电源接口有蓝黄橙三条线(有排针引出,照片中被挡住了),分别是地、3.7~4.2V(锂电池)、5~15V(方块电池、镍氢电池组),使用时只需要接其中一种电压即能工作。

开机后会发出:
嘀————————
间隔三秒

间隔三秒
……
表示电源接通,等待用户操作。

按一次按键,发出嘀嘀嘀嘀嘀,进入定时时间设置。
嘀——  嘀——  嘀——每一次代表一秒钟。当到达需要的时间,再次按按键,发出嘀嘀嘀嘀嘀,表示设置已经保存。将会以这个时间作为开伞延时。

黄色线是触发线,将引出的两条黄色线短接(或者把板上对应的排针用跳线帽短路),进入等待发射状态,发出嘀  嘀  嘀  嘀声。
在等待状态下,将黄色线分离,或者将跳线帽拔出,则进入定时状态。发出嘀嘀嘀嘀嘀……声
当时间到达预设的延时时间,将会发出嘀——————————————————的声音,MOS管将会导通,板上led会亮起(此led是mos管控制的),连接绿色线的点火头将会被电池电压通电。

通电一段时间后会回到初始状态,等待用户操作。
-------------------------------------------------------

点火最大电流:4A(前提是你的电池能提供这么大电流。如果输出电压低于2.9v单片机工作电压,或者低于稳压IC的最低工作电压4.8v,会导致重启等问题)
延时设置会被保存在单片机内置的EEPROM中,掉电不会丢失,非常实用。
+1  科创币    五成熟的牛排    2013/07/15 这跳线我瞬间笑了怎么破
来自:电子信息 / 电子技术
18
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon 作者
11年7个月前 IP:未同步
547362
引用第2楼yanli12321于2013-07-13 13:04发表的  :
小扬声器无爱.........用蜂鸣器多好
叉童鞋的焊工实在不敢恭维.........这恐怕无法承受住火箭的加速度吧

刚才试着摔了几次,正常工作。我的焊工被吐槽不是第一天了,淡定。蜂鸣器找不到,应该是没有,只好用这个。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年7个月前 IP:未同步
547528
回 7楼(13580080355) 的帖子
NE555的话,我改一次时间设置,就要改一次电阻阻值,改完还要掐秒表测试。而且,怎么指示工作状态呢?

用STM8单片机来做,用户只要按按钮就可以设置时间了,岂不快哉。
STM8很便宜的,1.7元一片,最贵的都是人工费用。

测试中出现了洞洞板焊盘脱落的情况,充分地验证了“花钱少,麻烦多”这一伟大理论。马上找了非常高级的洞洞板,重新焊了一个 ,刷上程序,万事大吉。

DSC_3465.jpg
DSC_3467.jpg
+1
科创币
kc地毯清洁员
2013-07-14
花钱少麻烦多,花钱多麻烦更多
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年7个月前 IP:未同步
547555
源汁源味
//timerchute.c

#include <stmduino.h>
uint time=0;
uint delaytimer=0;
#define buttondelay 200
#define minimumtime 1000
#define beep pwmout(t2c1,62)
#define nobeep pwmout(t2c1,0)
uint binterval=3000/8;
uint bcounter=2800/8;
uchar beepstate=0xff;

uint setting=0;
uchar state=0;
/*
states
0 wait
1 setting

3 starting
4 triggered(wire broken, wait for certain time.
5 chute(noreturn unless button.
*/

void tick()
{
  bcounter++;
  bcounter%=binterval;
  if(bcounter==0||(bcounter==2980/8&&state==0)){
    if(beepstate){
      //beep;
      timer2(COUNT);
    }else{
      //nobeep;
      timer2(STOP);
    }
    if(bcounter==2980/8&&state==0)
    {
      beepstate=0x0;
    }
    else
    {
      beepstate=!beepstate;
    }
  }
  
  if(delaytimer!=0){
    delaytimer--;
  }
  else
  {
    
    switch(state)
    {
    case 0:
      binterval=3000/8;
      if(pinread(A2))
      {
        //if high: button not pusht
        if(pinread(A3)){
          //if a3 is high:not connected
        }
        else
        {
          //if a3 is conn to gnd:start waiting for line break
          state=3;
          delaytimer=buttondelay*5/8;
        }
      }
      else
      {
        //if low: button pusht,enter setting mode
        state=1;
        time=0;
        delaytimer=500/8;
        binterval=50/8;
      }
      break;
    case 1:
      binterval=500/8;
      time++;
      if(pinread(A2)){
        //button is not pushed
      }
      else
      {
        //button is pusht
        setting=time;
        eeuint(600)=setting;
        time=0;
        state=0;
        binterval=50/8;
        delaytimer=1000/8;
      }
      break;
    case 3:
      binterval=200/8;
      if(pinread(A3)){
        //if a3 is not connected
        state=4;//enter timing mode
        time=0;
      }
      else
      {//dont do anyting.
      }
      break;
    case 4://wire broken. timing...
      binterval=50/8;
      time++;
      if(time>setting)
      {
        //triggered, please chute!
        state=5;
        delaytimer=100/8;
      }
      else
      {
        
      }
      break;
    case 5://execute chute operation
      beepstate=0xff;
      
      pinhigh(A1);
      time--;
      if(time==0){
        state=0;
        delaytimer=500/8;
        pinlow(A1);
        binterval=50/8;
      }
      
      break;
    }
  }
  
}

void main()
{
  clock(2M);
  cpudivider(2);
  
  
  timer4clock(64,249);//8ms interrput
  
  pinMode(A3,INPUT);
  //a3 is wire,shall connected to gnd
  
  pinMode(A2,INPUT);
  //a2 is button,connected to gnd
  
  pinMode(A1,OUTPUT);
  //a1 is chute ctrl
  
  timer2clock(2,124);
  unlock();
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1,DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI,DISABLE);
  pwmset(t2c1);
  pwmout(t2c1,62);
  pinlow(A1);
  
  //load settings
  if(eeuint(600)<minimumtime){
    setting=minimumtime;
  }
  else
  {
    setting=eeuint(600);
  }
  
  job mstick=employ(tick);
  linkjob (timer4tick,mstick);
  
  interrupts();
  while(1){sleep();}
}
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
novakon
学者 机友 笔友
文章
1256
回复
8386
学术分
16
2008/03/29注册,2年11个月前活动

已走,勿送

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}