![](http://img.mydigit.net/Mon_1205/76_24184_65993c9cab519c1.jpg?117)
(15)来张侧面的写真。
![](http://img.mydigit.net/Mon_1205/76_24184_9ebc353de9c57d4.jpg?121)
制作部分到此结束。
(16)说说悲剧的事情吧。因为要找一个单独的电源给控制板供电,翻箱倒柜没找到合适的,(现在想想,应该在坛子里入些不错的适配器以备急用
![](http://bbs.mydigit.cn/images/post/smile/my1/teeth.gif)
![](http://img.mydigit.net/Mon_1205/76_24184_4852b2c746d1c0e.jpg?79)
(17)另一个角度
![](http://img.mydigit.net/Mon_1205/76_24184_87ca80f1b419999.jpg?96)
(18)最后上个下载工具(购买的套件,自己焊接的)及为STC11制作的转换板。
![](http://img.mydigit.net/Mon_1205/76_24184_56119a9f10d683b.jpg?150)
(19)转换板……
![](http://img.mydigit.net/Mon_1205/76_24184_6df30b7d7467260.jpg?87)
(20)转换板……
![](http://img.mydigit.net/Mon_1205/76_24184_896eaccac4e8683.jpg?95)
(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)电路原理图
![](http://img.mydigit.net/Mon_1205/76_24184_a15baae0e930d02.jpg?110)
结束!谢谢赏评!