找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 42213|回复: 22
收起左侧

我的电动车铅酸电池改成锂电池+我制作一个速度、里程、电压表

  [复制链接]
ID:85764 发表于 2015-7-18 19:45 | 显示全部楼层 |阅读模式
我的电动车铅酸电池改成锂电池+我制作一个速度、里程、电压表

085613qkz64ul63kon3p2z.jpg.thumb.jpg



这是我买的铅酸电池盒

085644i1ok6nkxo76np8p6.jpg.thumb.jpg


先把锂电叠加好(锂电池是20A)

085702du11rlj111yj1opd.jpg.thumb.jpg


锂电池控制板接线

085720ujjrbjjlosa2bzlj.jpg.thumb.jpg


电池盒内布置

085738ze5dvii5ijv27vik.jpg.thumb.jpg


放好,封盖固定

085424nwqqrh5wcx4gizw0.jpg.thumb.jpg


电源电压测量

085343ko1to4v44to7jgvt.jpg.thumb.jpg


我同时做了一个电压、速度、里程表

085354anjsj1ep8ips4ij9.jpg.thumb.jpg


085409x38eepbnj6vffns4.jpg.thumb.jpg


085434hshqjnsgeoxcqqhs.jpg.thumb.jpg


085448hte8iaa19b4x8if1.jpg.thumb.jpg


085501ffn9q46m6lqpm3qf.jpg.thumb.jpg


085513xkk9wkurze06yu0w.jpg.thumb.jpg


085531oaxua7dtn7dayxpi.jpg.thumb.jpg


这是我设计的时速、里程、电压表控制板

085555krjl7pplilzo7rwo.jpg.thumb.jpg


手工开孔

085626lihpywecozitorwe.jpg.thumb.jpg


无线数传4.rar (569.95 KB, 下载次数: 102)
回复

使用道具 举报

ID:85764 发表于 2015-7-18 19:46 | 显示全部楼层
  1. //单片机STC12C5A16S2//
  2. //晶振11.0592//

  3. #include<reg52.h>
  4. #include<intrins.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. #define ADC_POWER   0x80     //AD电源控制
  8. #define ADC_FLAG    0x10     //AD转换完成
  9. #define ADC_START   0x08     //AD转换控制
  10. #define ADC_SPEEDLL 0x00     //420 clocks
  11. #define ADC_SPEEDL  0x20     //280 clocks
  12. #define ADC_SPEEDH  0x40     //140 clocks
  13. #define ADC_SPEEDHH 0x60     //70 clocks
  14. #define ADC0      0x00       //P1.0
  15. #define ADC1      0x01       //P1.1

  16. sfr ADC_CONTR   =   0xBC;   //AD 转换控制寄存器        
  17. sfr ADC_RES     =   0xBD;   //AD 转换结果寄存器高         
  18. sfr ADC_RESL    =   0xBE;   //AD 转换结果寄存器低        
  19. sfr P1ASF       =   0x9D;        //P1口模数转换功能控制寄存器

  20. sbit RS=P0^0;                     //寄存器
  21. sbit CS=P0^1;                     //片选
  22. sbit SCLK=P0^2;                     //串行时钟输入
  23. sbit SID=P0^3;                     //串行数据输入
  24. sbit LCD=P0^7;               //LED背光灯电源

  25. uint AD_Result;
  26. uint data AD_RecSBUF[10];         //接收数据
  27. uchar data AD_Point;
  28. uchar data Rec,num,state;    //变量  

  29. uchar data round=131; //车轮周长——测量得出,按CM计算,不大于255;
  30. uint data licheng_cm=0;             //里程厘米级为单位
  31. uint data licheng_bm=0;      //里程百米级为单位
  32. uint data sudu;              //定义速度
  33. bit time1s;                                 //定义1秒钟标志
  34. uchar data speed;                     //接收1秒钟产生的脉冲数
  35. uchar data count;                 //count:计脉冲数
  36. uchar data num;                             //定时器变量
  37. uchar xdata AD_SBUF[13];

  38. uchar xdata display_buf[32]=0x20;
  39. //显示存贮器安排        第一行           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15
  40. //
  41. //显示值                                           V   2   8    .  9   k   /   h       B   T   5   8   .   3   v  

  42. //                  第二行     16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
  43. //
  44. //显示值                                           L   0   6   2        .   6  k   m           N   2    5   .  3   k   m
  45. #define SP01_ADD  1           //按照上述显示缓存区定义的速度显示第一位位置
  46. #define AD01_ADD 10           //按照上述显示缓存区定义的AD值显示第一位位置
  47. #define LC01_ADD 17           //按照上述显示缓存区定义的总里程显示第一位位置
  48. #define NOW_LC01 26    //按照上述显示缓存区定义的当前里程显示第一位位置


  49. //********************延时子程序***********//
  50. void delay(uint i)
  51. {
  52.         uint j,k;
  53.         for(j=0;j<i;j++)
  54.         for(k=0;k<50;k++);
  55. }
  56. //*******初始化子程序********* //
  57. void Serial_init()                      //初始化
  58. {
  59.            TMOD=0X01;                              //启用定时器0 工作方式1
  60.         TH0=0x4c;                      //定时50毫秒数
  61.     TL0=0x00;
  62.         EX0=1;                                      //外部中断0中断允许位; 1表示允许中断,0表示禁止中断
  63.         IT0=1;                                  
  64.         TR0=1;                                  //启动定时器TR0
  65.         ET0=1;                                      //开定时器0中断
  66.         EA=1;                                      //开总中断
  67.    
  68. }  

  69. //*******(定时器用速度)******************//
  70. void T0_time() interrupt 1  //T0中断子程序开始
  71. {        TH0=0x4c;                        //重新装初值50ms
  72.         TL0=0x08;
  73.         num++;
  74.         if(num>=40)              //20次,即20X50ms=1秒
  75.         {
  76.                 speed=count;                 //speed接收1秒钟产生脉冲数
  77.             count=0;                         //计数器清零
  78.                 time1s=1;                         //1秒中到,设一个标志
  79.                 num=0;                                 //定时清零
  80.         }
  81. }
  82. //*******中断子程序(计数器用里程)******************//
  83. external0() interrupt 0          
  84. {                    
  85.   count++;
  86.   
  87. }


  88. void licheng_change()
  89. {
  90. uchar i;
  91. uint t;

  92.     licheng_cm=licheng_cm+speed*round;           //里程=万位数后四位+脉冲数X轮周长
  93.        
  94.         if(licheng_cm>9999)                                    //如果厘米级大于9999,则百米级加1
  95.          {                                                                    
  96.                 licheng_bm++;
  97.                 if(licheng_bm>9999)        licheng_bm=0;   //如果百米级大于9999超出显示范围,测清零
  98.                 licheng_cm=licheng_cm-10000;            //如果百米级大于9999,测减去万位,保留万位以下后四位数
  99.          }
  100.    
  101.    i=licheng_bm/1000;
  102.    t=licheng_bm%1000;
  103.    display_buf[LC01_ADD]=i+0x30;       //取百位数
  104.    i=t/100;
  105.    t=t%100;
  106.    display_buf[LC01_ADD+1]=i+0x30;       //取十位数
  107.    i=t/10;
  108.    display_buf[LC01_ADD+2]=i+0x30;        //取个位数
  109.    display_buf[LC01_ADD+3]='.';           
  110.    i=t%10;
  111.    display_buf[LC01_ADD+4]=i+0X30;               //后一位数
  112.    display_buf[LC01_ADD+5]='k';
  113.    display_buf[LC01_ADD+6]='m';
  114.      
  115.    sudu=((round*(uint)speed)/100)*18;                  //speed定义成char(一个字节占8位)溢出,所以转换成int型(2个字节占8位)
  116.    i=sudu/100;
  117.    t=sudu%100;
  118.    display_buf[SP01_ADD]=i+0x30;        //取百位数
  119.    i=t/10;
  120.    display_buf[SP01_ADD+1]=i+0x30;      //取十位数
  121.    display_buf[SP01_ADD+2]='.';
  122.    i=t%10;
  123.    display_buf[SP01_ADD+3]=i+0X30;       //取个位数
  124.    display_buf[SP01_ADD+4]='k';               //后一位数
  125.    display_buf[SP01_ADD+5]='/';
  126.    display_buf[SP01_ADD+6]='h';

  127. }
  128. //***************写指令到LCD模块***********//
  129. void tranfser_command(int data1)
  130. {
  131.         char i;
  132.         CS=0;
  133.         RS=0;
  134.         for(i=0;i<8;i++)
  135.         {
  136.                 SCLK=0;
  137.                 if(data1&0x80)
  138.                        SID=1;
  139.                 else   SID=0;
  140.                 delay(5);
  141.                 SCLK=1;
  142.                 delay(5);
  143.                 data1=data1<<=1;
  144.         }

  145. }

  146. //****************写数据到LCD模块***********//
  147. void tranfser_data(int data2)
  148. {
  149.    char i;
  150.    CS=0;
  151.    RS=1;
  152.    for(i=0;i<8;i++)
  153.         {
  154.                 SCLK=0;
  155.                 if(data2&0x80)   SID=1;
  156.                 else             SID=0;
  157.                 delay(1);
  158.                 SCLK=1;
  159.                 delay(1);
  160.                 data2=data2<<=1;
  161.         }
  162. }

  163. //*********LCD模块初始化***********//
  164. void initial_lcd()
  165. {
  166.         CS=0;
  167.         delay(10);
  168.         tranfser_command(0x38);           //设置16X2显示,5X7点阵,8位数据接口
  169.         delay(10);
  170.         tranfser_command(0x0c);           //显示模式设置:显示开,无光标,光标不闪烁
  171.         delay(10);
  172.         tranfser_command(0x01);           //清屏幕指令,将以前的显示内容清除
  173.         delay(10);
  174.         tranfser_command(0x06);           //显示模式设置:光标右移,字符不移
  175.         delay(10);
  176. }

  177. //*******在指定的列和位显示指定的字母、数字、符号****//
  178. void disp_char()
  179. {
  180.         uint i;
  181.         tranfser_command(0x80+0+0);
  182.         for(i=0;i<16;i++)
  183.         {
  184.                 tranfser_data(display_buf[i]);
  185.         }
  186.         tranfser_command(0x80+0x40+0);
  187.         for(i=16;i<32;i++)
  188.         {
  189.                 tranfser_data(display_buf[i]);
  190.         }
  191. }
  192. void clr_screen()
  193.         {
  194.         uchar i;
  195.         for(i=0;i<32;i++) display_buf[i]=0x20;
  196.        
  197.         disp_char();
  198.         }
  199. void Delay_ADC(uint n)
  200. {
  201.     uint x;

  202.     while (n--)
  203.     {
  204.         x = 5000;
  205.         while (x--);
  206.     }
  207. }

  208. void InitADC()
  209. {
  210.     P1ASF = 0x01;                                  //选择P1.0作为A/D输入通道
  211.     ADC_RES = 0x00;                                           //清0
  212.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;  //0x10|0x00=0x10:开电源和设置A/D转换速度
  213.     Delay_ADC(2);            
  214. }
  215. GetADCResult()           
  216. {
  217.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC0 | ADC_START;        //打开电源,420CLK周期转换,选择P1.0作输入,AD转换控制
  218.     _nop_();                   //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器            
  219.     _nop_();
  220.     _nop_();
  221.     _nop_();
  222.     while (!(ADC_CONTR&ADC_FLAG));       //等待转换结束=0x10 ADC_FLAG 位=1
  223.     ADC_CONTR &= ~ADC_FLAG;              //清零转换结束标志位(ADC_FLAG 位=0)
  224.            AD_RecSBUF[AD_Point]=(ADC_RES*4+ADC_RESL+0X03);         //返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
  225.     AD_Point++;
  226.         if(AD_Point>9)  AD_Point=0;              
  227. }
  228. void AD_change()
  229. {
  230.    uchar s;
  231.    AD_Result=0;
  232.    for(s=0;s<10;s++) AD_Result= AD_Result+ AD_RecSBUF[s];

  233.    display_buf[AD01_ADD]=AD_Result/1000+0x30;
  234.    display_buf[AD01_ADD+1]=(AD_Result%1000/100)+0x30;
  235.    display_buf[AD01_ADD+2]='.';
  236.    display_buf[AD01_ADD+3]=(AD_Result%100/10)+0x30;               
  237.    display_buf[AD01_ADD+4]=(AD_Result%10)+0x30;
  238.    display_buf[AD01_ADD+5]='V';
  239.             
  240. }
  241. void main()
  242. {
  243.            LCD=0;
  244.         initial_lcd();              //LCD屏初始化
  245.     Serial_init();                        //中断初始化
  246.         clr_screen();                         //LCD清屏
  247.         while(1)
  248.         {  GetADCResult();
  249.                 if(time1s==1)                    //如果1秒中到,则里程、速度刷新显示一次
  250.                   {          
  251.                           time1s=0;
  252.                           disp_char();
  253.                           licheng_change();
  254.                           AD_change();
  255.                   }
  256.         }  
  257. }
复制代码
回复

使用道具 举报

ID:86090 发表于 2015-7-18 22:37 | 显示全部楼层
如果有试用图就好了
回复

使用道具 举报

ID:58502 发表于 2015-7-19 12:25 | 显示全部楼层
厉害啊
回复

使用道具 举报

ID:70042 发表于 2015-7-20 19:40 | 显示全部楼层
不错啊,支持一下                                             
回复

使用道具 举报

ID:66302 发表于 2015-7-21 14:01 | 显示全部楼层
厉害啊
回复

使用道具 举报

ID:78005 发表于 2015-7-27 08:54 | 显示全部楼层
你这个好像不是动力锂电池吧!

回复

使用道具 举报

ID:19947 发表于 2015-8-6 10:31 | 显示全部楼层
厉害呀
回复

使用道具 举报

ID:51348 发表于 2015-8-26 18:47 | 显示全部楼层
你们懂的,楼主好人
回复

使用道具 举报

ID:44523 发表于 2015-8-28 14:47 | 显示全部楼层
这个不得了啊,好好学习下
回复

使用道具 举报

ID:92556 发表于 2015-10-15 22:24 | 显示全部楼层
测速用什么做传感器
回复

使用道具 举报

ID:87499 发表于 2015-10-16 15:14 | 显示全部楼层
这样的电池,不亚于一个煤气瓶式的炸蛋吧?
回复

使用道具 举报

ID:73762 发表于 2015-10-20 18:07 | 显示全部楼层

这个不得了啊,好好学习下,但是M不够啊
回复

使用道具 举报

ID:140081 发表于 2016-9-21 22:07 | 显示全部楼层
怎么看不到。。。。。。。。。。。。
回复

使用道具 举报

ID:140081 发表于 2016-9-21 22:11 | 显示全部楼层
楼主  材料哪里有得买
回复

使用道具 举报

ID:140370 发表于 2016-9-25 03:44 | 显示全部楼层
那电池看着害怕
回复

使用道具 举报

ID:141077 发表于 2016-10-1 19:17 | 显示全部楼层
太腻害了
回复

使用道具 举报

ID:169421 发表于 2017-3-9 16:15 | 显示全部楼层
制作的挺好的,学习了。
回复

使用道具 举报

ID:172773 发表于 2017-3-19 16:15 | 显示全部楼层
还是下不了
回复

使用道具 举报

ID:68429 发表于 2017-9-25 17:50 | 显示全部楼层
正好需要这方面的资料谢谢
回复

使用道具 举报

ID:486881 发表于 2019-3-8 16:26 | 显示全部楼层
非常感谢楼主的分享,正好需要这样的资料
回复

使用道具 举报

ID:472506 发表于 2019-3-11 22:49 | 显示全部楼层
非常非常好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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