一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: benxiong22
收起左侧

[其他综合] 有大虾能帮我做个单片机延时开关么

[复制链接]
 楼主| 发表于 2014-8-21 13:41 来自手机 | 显示全部楼层
384065902是不是你球球号?加我聊吧550566558
发表于 2014-8-21 17:01 | 显示全部楼层
用stm8s003  1块多钱搞定
发表于 2014-8-21 23:36 | 显示全部楼层
用一个电压比较器 再加单片机比较简单
 楼主| 发表于 2014-8-22 17:43 来自手机 | 显示全部楼层
哪位朋友做pcb的,请联系我
发表于 2014-9-19 17:06 | 显示全部楼层
本帖最后由 mfkyygt 于 2014-9-19 22:34 编辑

呵呵,貌似时间过去很久了,晚上的时间东拼西凑,一时要陪孩子,一时又陪总理,家里一屋子的女人,没办法静下心来做点自己喜欢的。。。。
用proteus仿真了一下,可能有些细节需要进一步落实和修改:
监测电压达到设定电压后启动延时,延时时间到了如果监测电压还等于设定电压的话,是否一直接通继电器?
待修改完善后再上传资料,到时再欢迎指正。

上不了gif图???那抓个图看看吧

延时继电器仿真图

延时继电器仿真图
发表于 2014-9-19 20:21 | 显示全部楼层
奇怪?请问如何上gif图片?上了看不到
发表于 2014-9-19 21:32 | 显示全部楼层
要便宜又稳定的 ,台湾的松瀚2711B,8脚或14脚,12位ADC,不超过一元,OTP,比flash搞干扰能力强多了吧
发表于 2014-9-21 14:00 | 显示全部楼层
本帖最后由 mfkyygt 于 2014-9-21 14:03 编辑

//=============================
//项目名称:监测电压延时控制
//主控芯片: T13
//晶振频率: 内部9.6000Mhz
//Design by MFK
//Start  2014-09-10
//Modify 2014-09-16
//=============================
#include <iot13v.h>
#include <AVRdef.h>

#define RLY PB0
#define LED PB1

#define uint unsigned int
#define uchar unsigned char
#define input DDRB &=0b11111011
#define output DDRB |=0b00000100

volatile uint t1,t2,tdelay,v_real,v_set,v_delay;
volatile uchar l_ch,l_adok,l_timer;

//---- 主程序 ----
void main(void)
{
        uint i;
        PORTB =0xFE;    //PB初始端口置高
        DDRB  =0xE3;    //1110 0011  PB2,3,4设为AD输入,其他设为输出

         ADCSRA =0x00;   //关闭 ADC
         ADMUX  =0x21;   //使用VCC作为参考电压,采用ADC1 PB2,左对齐
         ACSR   =0x80;   //禁止模拟比较器
         ADCSRB =0x00;   //连续转换模式
         ADCSRA =0xE9;   //打开 ADC

        timer0_init();  //定时器初始化
        
        MCUCR = 0x00;
        TIMSK0 = 0x02;  //timer interrupt sources
        GIMSK = 0x00;   //interrupt sources
        SEI();          //允许中断
        
        l_adok =0;      //初始化ADC转换标志
        l_ch =1;        //默认AD通道为1
        //tdelay =2;      //延时默认为5秒,可通过设置eeprom记录

  while (1)       //等待中断
        {
                delay_ms(100);    //每隔100ms扫描一次AD通道
                if ((l_adok==1)&&(l_ch==1))
                {
                        l_adok =0;      //清除AD转换完成标志
                        l_ch =2;        //切换AD通道
                        ADMUX  =0x22;   //使用VCC作为参考电压,采用ADC2 PB4,左对齐
                        ADCSRA = 0xE9;  //再次启动AD转换
                }
                //----
                if ((l_adok==1)&&(l_ch==2))
                {
                        l_adok =0;      //清除AD转换完成标志
                        l_ch =3;        //切换AD通道
                        ADMUX  =0x23;   //使用VCC作为参考电压,采用ADC2 PB4,左对齐
                        ADCSRA = 0xE9;  //再次启动AD转换
                }
                //----
                if ((l_adok==1)&&(l_ch==3))
                {
                        l_adok =0;      //清除AD转换完成标志
                        l_ch =1;        //切换AD通道
                        ADMUX  =0x21;   //使用VCC作为参考电压,采用ADC2 PB4,左对齐
                        ADCSRA = 0xE9;  //再次启动AD转换
                }
                //---计算延时时间,由时间变阻器获取
                tdelay =v_delay * 30/255;
                //---监测电压是否达到设定值  
                if (v_real>=v_set)
                {
                      l_timer =1;       //设置定时器启动标志
                      TCCR0B = 0x05;    //启动定时器
                      CLR(PORTB,LED);   //指示灯亮
                      SET(PORTB,RLY);   //启动继电器
                }
        }
}

//---- 定时器初始化 ----
//TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:  9.920mSec (0.8%)
void timer0_init(void)
{
        TCCR0B = 0x00; //stop
        OCR0A = 0x5D;
        OCR0B = 0x5D;
        TCNT0 = 0xA3; //set count
        TCCR0A = 0x00;
        //TCCR0B = 0x05; //start timer
}

//---- 10ms定时中断 ----
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
        TCNT0 = 0xA3;        //定时器重新赋值
        if (l_timer==1)
        {
                if (t2<tdelay)       //延时时间到否
                {        
                        if (t1<100)
                        {t1++;}
                        else
                        {
                                t1 =0;
                                t2++;
                        }
                }
                else                 //延时时间到
                {
                        t2 =0;
                        if (v_real<v_set)
                        {
                                TCCR0A = 0x00;     //停止定时器
                                TCNT0 = 0xA3;
                                CLR(PORTB,RLY);    //断开继电器
                                SET(PORTB,LED);    //指示灯灭
                                l_timer =0;        //清除定时器启动标志
                        }
                }
        }
}

//---- AD转换完成中断相应程序 ----
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)   
{
        if (l_ch==1)
        {v_real =ADCH;}
        if (l_ch==2)
        {v_set =ADCH;}
        if (l_ch==3)
        {v_delay =ADCH;}
        l_adok =1;    //标记为AD转换完成
}

//---- ms级延时 ----
delay_ms(unsigned int s) //这里ms级延时,可以用仿真测试频率
{
  unsigned int a,b,c;
  for (a=1; a<=s; a++)
  { for (b=0; b<4; b++)
          { for (c=0;c<240;c++)
            {;}
          }
   }
}

延时控制器仿真图及源码.rar

40.11 KB, 下载次数: 5, 下载积分: 一乐金币 -1

售价: 1 人民币  [记录]

欢迎交流,源码打赏个金币吧

发表于 2014-11-12 20:42 | 显示全部楼层
mfkyygt 发表于 2014-9-21 14:00
//=============================
//项目名称:监测电压延时控制
//主控芯片: T13

谢谢您的源码,想学单片机,下来学习学习。
发表于 2020-12-20 22:33 | 显示全部楼层
我的箅子都么有了吗

本版积分规则

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

GMT+8, 2024-5-7 21:00 , Processed in 0.051769 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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