这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 利用转灯信号制作的电动车充电器定时器——附源码【精华】(二)

共1条 1/1 1 跳转至

利用转灯信号制作的电动车充电器定时器——附源码【精华】(二)

高工
2013-09-13 16:38:03     打赏
(14)充电测试中……开始正向计时了。


(15)来张侧面的写真。


制作部分到此结束。

(16)说说悲剧的事情吧。因为要找一个单独的电源给控制板供电,翻箱倒柜没找到合适的,(现在想想,应该在坛子里入些不错的适配器以备急用。)于是把以前做的放在细胞培养室里的电子钟的电源拿来,这个电源就是上文中用的科健手机的直冲。同时,要给这个电子钟找个新的电源。又是一番搜刮,搞到一个2004年产的MP3充电器。不过,shit,这个充电插头不好用,换壳。壳子有了,板子放不下,于是,修整板子,再挤压放到壳子里。然后,插入插座,就在这一瞬间,恐怖的事情发生了,只见一道白光闪过,耳闻一声爆响,世界一片黑暗,一股焦糊味扑鼻而来,I KNOW,跳闸了,同时,这个充电器也宣布光荣牺牲了。来看一下它为的“尸首”吧。


(17)另一个角度


(18)最后上个下载工具(购买的套件,自己焊接的)及为STC11制作的转换板。


(19)转换板……



(20)转换板……


(21)源码:高手可以走路了,如果热心的话欢迎指导以提高我的编程水平,3Q。
===========================================================================//------------电动车充电器定时器-----------------------//
//转灯后延时一小时切断总电源,总的充电时间不超过8小时   //
//由3位数码管指示充电计时和倒计时,切断电源前蜂鸣器响   //
//转灯信号由光耦送至单片机外中断0,下降沿检测信号       //
//STC11F02E,12M//

#include <REGX52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit beep=P1^0;    //蜂鸣器
sbit J1=P1^1;    //继电器

//74HC595接口定义
sbit sck=P1^7;
sbit rck=P1^6;
sbit data_595=P1^5;

//共阴数码管COM口
sbit com1=P1^4;
sbit com2=P1^3;
sbit com3=P1^2;

//ISP操作相关申明
#define RdCommand 0x01
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01


uchar b,c,d,num,num1,num2,count_time_s,remain_time;
uchar bai,shi,ge;
uchar code led_disp_buffer[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uint count_time_m;

//ISP有关函数
void ISP_IAP_enable(void)
{
    EA=0;
    ISP_CONTR=ISP_CONTR&0x18;
    ISP_CONTR=ISP_CONTR|WaitTime;
    ISP_CONTR=ISP_CONTR|0x80;
}

void ISP_IAP_disable(void)
{
    ISP_CONTR=ISP_CONTR&0x7f;
    ISP_TRIG=0x00;
    EA=1;
}

void ISPgoon()
{
    ISP_IAP_enable();
    ISP_TRIG=0x5a;
    ISP_TRIG=0xa5;
    _nop_();
}

unsigned char byte_read(uint byte_addr)
{
    ISP_ADDRH=(unsigned char)(byte_addr>>8);
    ISP_ADDRL=(unsigned char)(byte_addr & 0x00ff);
    ISP_CMD=ISP_CMD & 0xf8;
    ISP_CMD=ISP_CMD | RdCommand;
    ISPgoon();
    ISP_IAP_disable();
    return(ISP_DATA);
}

void SectorErase(uint sector_addr)
{
    uint iSectorAddr;
    iSectorAddr=(sector_addr&0xfe00);
    ISP_ADDRH=(unsigned char)(iSectorAddr>>8);
    ISP_ADDRL=0x00;
    ISP_CMD=ISP_CMD&0xf8;
    ISP_CMD=ISP_CMD|EraseCommand;
    ISPgoon();
    ISP_IAP_disable();
}

void byte_write(uint byte_addr,uchar original_data)
{
    ISP_ADDRH=(unsigned char)(byte_addr>>8);
    ISP_ADDRL=(unsigned char)(byte_addr&0x00ff);
    ISP_CMD=ISP_CMD&0xf8;
    ISP_CMD=ISP_CMD|PrgCommand;
    ISP_DATA=original_data;
    ISPgoon();
    ISP_IAP_disable();
}

void delayms(uint xms)      //延时xms
{
    uchar k;
    uint j;
    for(j=xms;j>0;j--)
    {
        for(k=110;k>0;k--);
    }
}

void send_595(uchar dat)
{
     uchar i;
     sck=0;
     rck=0;
     for(i=8;i>0;i--)
     {
         data_595=dat&0x80;
        dat<<=1;
        sck=0;
        _nop_();
        _nop_();
        sck=1;
        _nop_();
        _nop_();
        sck=0;
    }
    rck=0;
    _nop_();
    _nop_();
    rck=1;
    _nop_();
    _nop_();
    rck=0;
}        

void led_disp(uchar bai,shi,ge)
{
    if(bai!=0)
    {
    send_595(led_disp_buffer[bai]);
    com1=0;
    delayms(5);
    com1=1;
    }

    if(bai!=0||shi>0)
    {
    send_595(led_disp_buffer[shi]);
    com2=0;
    delayms(5);
    com2=1;
    }

    send_595(led_disp_buffer[ge]);
    com3=0;
    delayms(5);
    com3=1;
}

void main()
{
    uint a,count1,count2,last_charg_time;
    J1=0;
    beep=0;
    delayms(300);
    beep=1;
    count1=byte_read(0x0000);
    count2=byte_read(0x000f);
    last_charg_time=count1+count2;
    bai=last_charg_time/100;
    shi=last_charg_time%100/10;
    ge=last_charg_time%10;
    for(a=0;a<10000;a++)     //1T单片机,a值要大一点才有较长延时。这里一方面为了看上次充电时间
    {                         //另一方面为了在充电器刚开始时1秒左右的绿灯动作
        led_disp(bai,shi,ge); 
    }
    remain_time=60;            //转灯后1H
    TMOD=0x11;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    EA=1;      //开总中断
    ET0=1;      //TO允许
    ET1=1;      //T1允许
    EX0=1;      //外中断0允许
    IT0=1;      //外中断0下降沿触发
    TR1=1;      //启动T1

    while(1)
    {
        if(TR0==0)                      //充电状态时正向计时
        {
            bai=count_time_m/100;
            shi=count_time_m%100/10;
            ge=count_time_m%100%10;
        }
        else
        {
            bai=10;                     //倒计时时在分钟前显示“-”
            shi=remain_time/10;
            ge=remain_time%10;
        }
        led_disp(bai,shi,ge);
        if(remain_time<1||count_time_m>480)
        {
            beep=0;
            delayms(1000);
            beep=1;
            J1=1;
            while(1)
            {
            beep=0;
            delayms(1000);
            beep=1;
            delayms(3000);
            }
            
        }

    }
}

void times_up() interrupt 0
{
    TR0=1; //开定时器0
    EX0=0; //关外中断0
    SectorErase(0x0000);              //擦除EEPROM第一扇区
    if(count_time_m<=255)
    {
        byte_write(0x0000,count_time_m);
        byte_write(0x000f,0);
    }
    else
    {
        byte_write(0x0000,255);
        byte_write(0x000f,count_time_m-255);
    }


void T0_time() interrupt 1     //传统12分频定时模式
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    num++;
    if(num==20)
    {
        num=0;
        num1++;
        if(num1==60)
        {
            num1=0;
            remain_time--;
        }
    }
}

void T1_time() interrupt 3
{
    TH1=(65536-50000)/256;    //定时50ms
    TL1=(65536-50000)%256;
    num2++;
    if(num2==20)            //1S
    {
        num2=0;
        count_time_s++;
        if(count_time_s==60)
        {
            count_time_s=0;
            count_time_m++;
        }
    }

}

=========================================================================

(22)电路原理图


 
结束!谢谢赏评!



关键词: 利用     转灯     信号     制作     电动车     充电器     定时器         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]