电动车充电控制器制作

来源:本站
导读:目前正在解读《电动车充电控制器制作》的相关信息,《电动车充电控制器制作》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《电动车充电控制器制作》的详细说明。
简介: 几天熬夜控制器终于完工,买别人的要几百块一套自己做只要几十块就能OK,还算是有点价值,不罗嗦直接上代码,依然是以往的风格但注释更加详细,有兴趣的骚年可以参考下。

电动车充电控制器制作

#include<reg51.h> //包含头文件

#include<intrins.h>//包函_nop_延时函数的头文件

#define uchar unsigned char//宏定义

#define uint unsigned int//宏定义

//595芯片控制脚定义

sbit SH=P1^7;//HC595移位控制

sbit ST=P1^6;//HC595锁存更新显示

sbit DS=P1^5;//HC595串行数据输入

//输入引脚定义

sbit TB=P1^4; //投币键

sbit shu1=P1^3; //第一组输入选择

sbit shu2=P1^2; //第二组输入选择

sbit shu3=P1^1; //第三组输入选择

sbit shu4=P1^0; //第四组输入选择

//输出引脚定义

sbit out1=P3^0; //第一组输出

sbit out2=P3^1; //第二组输出

sbit out3=P3^2; //第三组输出

sbit out4=P3^3; //第四组输出

//计时用变量

int cou=0; //计数器

int TIME_SS=0;//秒

int TIME_MM=0;//分

int TIME_HH=0;//时

//显示缓存数组,第一个元素为显示数据,后面两个为显示八段码的地址已经初始赋值后面的程序只要维护显示数据元素

char P_HC[4][4][3]={{{0x00,0x00,0x01},{0x00,0x00,0x02},{0x00,0x00,0x04},{0x00,0x00,0x08}},{{0x00,0x00,0x10},{0x00,0x00,0x20},{0x00,0x00,0x40},{0x00,0x00,0x80}},{{0x00,0x01,0x00},{0x00,0x02,0x00},{0x00,0x04,0x00},{0x00,0x08,0x00}},{{0x00,0x10,0x00},{0x00,0x20,0x00},{0x00,0x40,0x00},{0x00,0x80,0x00}}};

//定时器数据数组,分别代表四个输出口所剩时间值单位为分钟

int TIME[4]={0,0,0,0};

//投币器计数器,存储投币数量选择输出口时一个投币值可以增加某一输出口240分钟的定时值

int TOUBI=0;

///////////////////////////////////////////////////

void delay(unsigned char x) //延时函数

{

unsigned char i,j;

for(i = 0;i < x;i++)

for(j = 0;j < 200;j++);

}

///////////////////////////////////////////////////

//高位先入

void sendbyte(char Rdate)//HC595串口输入一个字节

{

char a;

char date=Rdate;

for(a=0;a<8;a++)

{

SH=0;

if(date&0x80)//先将最高位移入

{

DS=1;

SH=1;

}

else

{

DS=0;

SH=1;

}

date=date<<1;//输入的字节位左移

}

}

///////////////////////////////////////////////////

void print(void)

{

//显示函数功能是把显示缓存数组中的数据显示到八段码上

int i,j,k;

for(k=0;k<4;k++)

{

for(j=0;j<4;j++)

{

for(i=0;i<3;i++)

{

sendbyte(P_HC[k][j][i]);

}

ST=0;

_nop_();

_nop_();

ST=1;

}

}

}

///////////////////////////////////////////////////

void P_HC_fuzhi(int x,int y,int z )

{

//显示数组显示数据赋值函数,第一个常数为八段码组别,第二个为八段码位置 ,第三个位赋值数据(0-9)

switch(z)

{

case 0:

P_HC[x][y][0]=0xc0;

break;

case 1:

P_HC[x][y][0]=0xf9;

break;

case 2:

P_HC[x][y][0]=0xa4;

break;

case 3:

P_HC[x][y][0]=0xb0;

break;

case 4:

P_HC[x][y][0]=0x99;

break;

case 5:

P_HC[x][y][0]=0x92;

break;

case 6:

P_HC[x][y][0]=0x82;

break;

case 7:

P_HC[x][y][0]=0xf8;

break;

case 8:

P_HC[x][y][0]=0x80;

break;

case 9:

P_HC[x][y][0]=0x90;

break;

case 10:

P_HC[x][y][0]=0xff;

break;

}

}

///////////////////////////////////////////////////

void P_HC_weihu(void)

{

//显示缓存显示数据元素维护函数,负责维护和更新各组定时器的显示数据

int y,z;

for(z=0;z<4;z++)

{

y=0;

if(TIME[z]>=1000)

{

if(TIME[z]%10000==0)

P_HC_fuzhi(z,y,0); //如此位为0则直接填0避免造成除0错误

else

P_HC_fuzhi(z,y,(TIME[z]%10000/1000)); //更新千位值

}else

{

P_HC_fuzhi(z,y,10);//如无此位则填空

}

y++;

if(TIME[z]>=100)

{

if(TIME[z]%1000==0)

P_HC_fuzhi(z,y,0); //如此位为0则直接填0避免造成除0错误

else

P_HC_fuzhi(z,y,(TIME[z]%1000/100)); //更新百位值

}else

{

P_HC_fuzhi(z,y,10); //如无此位则填空

}

y++;

if(TIME[z]>=10)

{

if(TIME[z]%100==0)

P_HC_fuzhi(z,y,0); //如此位为0则直接填0避免造成除0错误

else

P_HC_fuzhi(z,y,(TIME[z]%100/10));//更新十位值

}else

{

P_HC_fuzhi(z,y,10); //如无此位则填空

}

y++;

if(TIME[z]>0)

{

P_HC_fuzhi(z,y,(TIME[z]%10)); //更新个位值

}else

{

P_HC_fuzhi(z,y,0);

}

}

}

///////////////////////////////////////////////////

void key(void)

{

//按键选择控制函数

TB=1;shu1=1;shu2=1;shu3=1;shu4=1;

if(shu4!=1||shu3!=1||shu2!=1||shu1!=1||TB!=1)

{

delay(20);

TB=1;shu1=1;shu2=1;shu3=1;shu4=1;

if(shu4!=1||shu3!=1||shu2!=1||shu1!=1||TB!=1)

{

if(TB!=1)//投币键按下弹起一次后TOUBI变量加1,1投币值可转为240定时器值

{

for(;TB!=1;){_nop_();} //取上升沿,避免出现多次扫描的现象

TOUBI+=1;

}else if(shu1!=1) //选通第一组充电接口,定时器值加240

{

for(;shu1!=1;){_nop_();} //取上升沿,避免出现多次扫描的现象

if(TOUBI>0&&TIME[0]<2400)

{

TIME[0]+=240;

TOUBI-=1;

}

}else if(shu2!=1) //选通第二组充电接口,定时器值加240

{

for(;shu2!=1;){_nop_();} //取上升沿,避免出现多次扫描的现象

if(TOUBI>0&&TIME[1]<2400)

{

TIME[1]+=240;

TOUBI-=1;

}

}else if(shu3!=1) //选通第三组充电接口,定时器值加240

{

for(;shu3!=1;){_nop_();} //取上升沿,避免出现多次扫描的现象

if(TOUBI>0&&TIME[2]<2400)

{

TIME[2]+=240;

TOUBI-=1;

}

}else if(shu4!=1) //选通第四组充电接口,定时器值加240

{

for(;shu4!=1;){_nop_();} //取上升沿,避免出现多次扫描的现象

if(TOUBI>0&&TIME[3]<2400)

{

TIME[3]+=240;

TOUBI-=1;

}

}

}

}

}

///////////////////////////////////////////////////

void out(void)

{

//更新输出状态

if(TIME[0]>0)out1=1; else out1=0;

if(TIME[1]>0)out2=1; else out2=0;

if(TIME[2]>0)out3=1; else out3=0;

if(TIME[3]>0)out4=1; else out4=0;

}

///////////////////////////////////////////////////

void init (void)

{

//上电初始化

TMOD = 0x11; // 定时/计数器0,1工作于方式1

TH0 = 0x3c; // 预置产生50ms时基信号

TL0 = 0xb0;

EA = 1; // 开总中断

ET0 = 1; // 定时/计数器0允许中断

TR0 = 1; // 开闭定时/计数器0

//TIME_HH=22;时

//TIME_MM=13; 分

//TIME_SS=40; 秒

}

///////////////////////////////////////////////////

void tiem0(void) interrupt 1

{ // T/C0中断服务程序(产生50ms时基信号)

cou++; // 软计数器加1

if(cou > 19){ // 计数值到100(1s)

cou = 0; // 软计数器清零

TIME_SS++; // 秒计数器加1(进位10ms*100=1s)

/////////////////////////////////////////////////////////

//按秒扣除定时器值

if(TIME[0]>0)TIME[0]-=1;

if(TIME[1]>0)TIME[1]-=1;

if(TIME[2]>0)TIME[2]-=1;

if(TIME[3]>0)TIME[3]-=1;

/////////////////////////////////////////////////////////

if(TIME_SS > 59){ // 秒计数值到60

TIME_SS = 0; // 秒计数器清零

TIME_MM++; // 分计数器加1(进位60s=1m)

if(TIME_MM > 59){ // 分计数到60

TIME_MM = 0; // 分计数器清零

TIME_HH++; // 时计数器加1(进位60m=1h)

if(TIME_HH > 23){ // 时计数到23

TIME_HH = 0; // 时计数器清零

}

}

}

}

TH0 = 0x3c; // 重置定时常数

TL0 = 0xb0;

}

///////////////////////////////////////////////////

void main(void) //主函数

{

/////////////////////////////////

//初始化

out1=0;

out2=0;

out3=0;

out4=0;

/////////////////////////////////

init();

//主循环

while(1)

{

key();

P_HC_weihu();

print();

out();

}

}

提醒:《电动车充电控制器制作》最后刷新时间 2024-03-14 01:14:37,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《电动车充电控制器制作》该内容的真实性请自行鉴别。