利用转灯信号制作的电动车充电器定时器——附源码【精华】(二)
(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)电路原理图
结束!谢谢赏评!
关键词:
利用
转灯
信号
制作
电动车
充电器
定时器
源