找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4276|回复: 11
打印 上一主题 下一主题
收起左侧

纯电动汽车动力电池过充保护系统设计单片机代码+Proteus仿真

  [复制链接]
跳转到指定楼层
楼主
ID:90648 发表于 2019-3-9 19:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于单片机的纯电动汽车动力电池过充保护系统设计与仿真,分享给大家,需要交流请加Q 1583-38 29 43 交流!
改变可变电阻RV1 向下模拟充电压变小,向上移模拟充电电压变大,当充电压大于24V时,认为过充电此时单片机切断充电回路,同时报警液晶屏显示充电电压,当过充时,液晶屏显示过充报警中。。。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>    //Keil library
  4. #include <stdio.h>       //Keil library
  5. #include "1602.h"
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. uchar code word1[]={"  a product of  "};
  9. uchar code word2[]={"UNITED ELECTRONS"};
  10. uchar code word3[]={" Welcome........"};
  11. /***************位声明**************/
  12. sbit dacs=P3^4;
  13. sbit dawr=P3^3;
  14. //ADC0832的引脚
  15. sbit ADCS =P3^5;  //ADC0832 chip seclect
  16. sbit ADDI =P3^7;  //ADC0832 k in
  17. sbit ADDO =P3^7;  //ADC0832 k out
  18. sbit ADCLK =P3^6;  //ADC0832 clock signal
  19. sbit led =P3^2;  //ADC0832 clock signal
  20. sbit adwr=P2^6;
  21. sbit out=P2^7;
  22. sbit beep=P1^0;//按键
  23. bit set_flag,disp_flag,bj_flag;
  24. uint ad_data;
  25. /***********函数声明*******************/
  26. void delay(unsigned int Delay);        
  27. uchar Adc0832(unsigned char channel);
  28. void inittime0();
  29. void delay(uint z)                              //z为毫秒?
  30. {
  31. int a,b;
  32. for(a=z;a>0;a--)
  33. for(b=120;b>0;b--);
  34. }
  35. void Alarm1(uchar t)                  //报警子程序
  36. {
  37.          uchar i,j;
  38.         for(i=0;i<200;i++)
  39.         {
  40.                  beep = ~beep;
  41.                 for(j=0;j<t;j++);
  42.         }
  43. }
  44. /************
  45. 读ADC0832函数
  46. ************/

  47. //采集并返回
  48. uchar Adc0832(unsigned char channel)     //AD转换,返回结果
  49. {
  50.     uchar i=0;
  51.     uchar j;
  52.     uint dat=0;
  53.     uchar ndat=0;

  54.     if(channel==0)channel=2;
  55.     if(channel==1)channel=3;
  56.     ADDI=1;
  57.     _nop_();
  58.     _nop_();
  59.     ADCS=0;//拉低CS端
  60.     _nop_();
  61.     _nop_();
  62.     ADCLK=1;//拉高CLK端
  63.     _nop_();
  64.     _nop_();
  65.     ADCLK=0;//拉低CLK端,形成下降沿1
  66.     _nop_();
  67.     _nop_();
  68.     ADCLK=1;//拉高CLK端
  69.     ADDI=channel&0x1;
  70.     _nop_();
  71.     _nop_();
  72.     ADCLK=0;//拉低CLK端,形成下降沿2
  73.     _nop_();
  74.     _nop_();
  75.     ADCLK=1;//拉高CLK端
  76.     ADDI=(channel>>1)&0x1;
  77.     _nop_();
  78.     _nop_();
  79.     ADCLK=0;//拉低CLK端,形成下降沿3
  80.     ADDI=1;//控制命令结束
  81.     _nop_();
  82.     _nop_();
  83.     dat=0;
  84.     for(i=0;i<8;i++)
  85.     {
  86.         dat|=ADDO;//收数据
  87.         ADCLK=1;
  88.         _nop_();
  89.         _nop_();
  90.         ADCLK=0;//形成一次时钟脉冲
  91.         _nop_();
  92.         _nop_();
  93.         dat<<=1;
  94.         if(i==7)dat|=ADDO;
  95.     }  
  96.     for(i=0;i<8;i++)
  97.     {
  98.         j=0;
  99.         j=j|ADDO;//收数据
  100.         ADCLK=1;
  101.         _nop_();
  102.         _nop_();
  103.         ADCLK=0;//形成一次时钟脉冲
  104.         _nop_();
  105.         _nop_();
  106.         j=j<<7;
  107.         ndat=ndat|j;
  108.         if(i<7)ndat>>=1;
  109.     }
  110.     ADCS=1;//拉低CS端
  111.     ADCLK=0;//拉低CLK端
  112.     ADDO=1;//拉高数据端,回到初始状态
  113.     dat<<=8;
  114.     dat|=ndat;
  115.     return(dat);            //return ad k
  116. }
  117. void InitTimer0(void)//50ms
  118. {
  119.     TMOD = 0x01;
  120.     TH0 = 0x3C;
  121.     TL0 = 0x0B0;
  122.     EA = 1;
  123.     ET0 = 1;
  124.     TR0 = 1;
  125. }
  126. void Timer0Interrupt(void) interrupt 1
  127. {
  128.     TH0 = 0x3C;
  129.     TL0 = 0x0B0;
  130.           disp_flag=1;
  131.     //add your code here!
  132. }
  133. /*******************************************/
  134. void main()                                                 //主函数
  135. {
  136.         uchar temp1;
  137.   InitTimer0();
  138.   LCD_Initial();    //液晶初始化
  139.         led=0;
  140.         out=0;
  141.   GotoXY(0,0);
  142. Print_slow(word1);
  143. GotoXY(0,1);
  144. Print_slow(word2);
  145. LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  146.   GotoXY(0,0);
  147.   Print_slow(word3);
  148. LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  149. GotoXY(0,0);                                       //选择温度显示位置
  150. Print(" CHONGDIAN VOL:  ");                     //
  151. GotoXY(0,1);                                       //选择温度显示位置
  152. Print(" cd_vol:      V  ");                     //         
  153. while(1)
  154.   {                                                                        
  155.                         
  156.                         if(disp_flag&&!bj_flag)
  157.                         {
  158.                                 disp_flag=0;
  159.                                         temp1=Adc0832(0)*100/255;
  160. //                                 ad_data =(uint)temp1;   //采样值存储单元初始化为0        DAC();
  161. //                                 ad_data=234;
  162.                                 GotoXY(10,1);                                       //选择温度显示位置
  163.                                 Print_s(temp1/1000+0x30);                     //        
  164.                                 //Print_s(word3[8]);                      //
  165.                                 Print_s(temp1/100%10+0x30);                     //        
  166.                                 Print_s(temp1/10%10+0x30);                     //        
  167.                                 Print_s(temp1%10+0x30);
  168.                         }
  169.                 if(temp1>24&&!bj_flag)  //若第二路一氧化碳检测值大于上限值
  170.          {
  171.                  bj_flag=1;
  172.      GotoXY(0,0);                  
  173.      Print("GUOCHONG BAOJIN...");                     //                          
  174.          }        
  175. //   else if(temp1<=24&&bj_flag)        
  176. //         {
  177. //                  bj_flag=0;
  178. //      GotoXY(0,0);                 
  179. //      Print(" CHONGDIAN VOL:  ");                     //                  
  180. //         }               
  181.          if(bj_flag)
  182.          {
  183.              Alarm1(60); //报警
  184.             out=1;
  185. }
  186.          else
  187.          {
  188.                  beep=1;        
  189.                  out=0;
  190.             }

  191.         }

  192. }
复制代码

所有资料51hei提供下载:
基于单片机的纯电动汽车动力电池过充保护系统设计与仿真.rar (115.91 KB, 下载次数: 142)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:489816 发表于 2019-3-13 11:57 | 只看该作者
试试,看着很厉害
回复

使用道具 举报

板凳
ID:486846 发表于 2019-3-22 14:33 | 只看该作者
请问能在上实物测试吗?
回复

使用道具 举报

地板
ID:486846 发表于 2019-3-22 14:42 | 只看该作者
可否进行实物仿真?
回复

使用道具 举报

5#
ID:409381 发表于 2019-3-23 10:28 | 只看该作者
感谢真诚奉献
回复

使用道具 举报

6#
ID:65956 发表于 2019-3-25 09:00 | 只看该作者
用8位的0832作采集精度有点低吧,再说现在大多单片机都带ADC功能,而且是10位以上了,还用得着这个?不过设计思路还是值得参考的
回复

使用道具 举报

7#
ID:507559 发表于 2019-4-9 09:18 | 只看该作者
欢迎下载分享!
回复

使用道具 举报

8#
ID:228939 发表于 2019-5-30 15:27 | 只看该作者
谢谢。7收下了
回复

使用道具 举报

9#
ID:427923 发表于 2020-3-7 23:25 | 只看该作者
再加一个24V的稳压模块就完美了
回复

使用道具 举报

10#
ID:798689 发表于 2020-7-8 19:28 | 只看该作者
你好,为啥我下载过来,液晶屏不显示啊
回复

使用道具 举报

11#
ID:495287 发表于 2020-7-9 20:21 | 只看该作者
谢谢楼主分享,我准备把他改为48伏的,看看能不能成功。

动力世界无边界,
存储冲放都观测,
智能调节用处多,
扎实测试方不怯!
回复

使用道具 举报

12#
ID:381903 发表于 2020-11-11 15:17 | 只看该作者
感谢分享!但是仿真没有效果,也没有体现出充放电,只能看看了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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