基于单片机的纯电动汽车动力电池过充保护系统设计与仿真,分享给大家,需要交流请加Q 1583-38 29 43 交流!
改变可变电阻RV1 向下模拟充电压变小,向上移模拟充电电压变大,当充电压大于24V时,认为过充电此时单片机切断充电回路,同时报警液晶屏显示充电电压,当过充时,液晶屏显示过充报警中。。。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #include <intrins.h>
- #include <math.h> //Keil library
- #include <stdio.h> //Keil library
- #include "1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar code word1[]={" a product of "};
- uchar code word2[]={"UNITED ELECTRONS"};
- uchar code word3[]={" Welcome........"};
- /***************位声明**************/
- sbit dacs=P3^4;
- sbit dawr=P3^3;
- //ADC0832的引脚
- sbit ADCS =P3^5; //ADC0832 chip seclect
- sbit ADDI =P3^7; //ADC0832 k in
- sbit ADDO =P3^7; //ADC0832 k out
- sbit ADCLK =P3^6; //ADC0832 clock signal
- sbit led =P3^2; //ADC0832 clock signal
- sbit adwr=P2^6;
- sbit out=P2^7;
- sbit beep=P1^0;//按键
- bit set_flag,disp_flag,bj_flag;
- uint ad_data;
- /***********函数声明*******************/
- void delay(unsigned int Delay);
- uchar Adc0832(unsigned char channel);
- void inittime0();
- void delay(uint z) //z为毫秒?
- {
- int a,b;
- for(a=z;a>0;a--)
- for(b=120;b>0;b--);
- }
- void Alarm1(uchar t) //报警子程序
- {
- uchar i,j;
- for(i=0;i<200;i++)
- {
- beep = ~beep;
- for(j=0;j<t;j++);
- }
- }
- /************
- 读ADC0832函数
- ************/
- //采集并返回
- uchar Adc0832(unsigned char channel) //AD转换,返回结果
- {
- uchar i=0;
- uchar j;
- uint dat=0;
- uchar ndat=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI=1;
- _nop_();
- _nop_();
- ADCS=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=channel&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿3
- ADDI=1;//控制命令结束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉低CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高数据端,回到初始状态
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad k
- }
- void InitTimer0(void)//50ms
- {
- TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0x0B0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x3C;
- TL0 = 0x0B0;
- disp_flag=1;
- //add your code here!
- }
- /*******************************************/
- void main() //主函数
- {
- uchar temp1;
- InitTimer0();
- LCD_Initial(); //液晶初始化
- led=0;
- out=0;
- GotoXY(0,0);
- Print_slow(word1);
- GotoXY(0,1);
- Print_slow(word2);
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- GotoXY(0,0);
- Print_slow(word3);
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- GotoXY(0,0); //选择温度显示位置
- Print(" CHONGDIAN VOL: "); //
- GotoXY(0,1); //选择温度显示位置
- Print(" cd_vol: V "); //
- while(1)
- {
-
- if(disp_flag&&!bj_flag)
- {
- disp_flag=0;
- temp1=Adc0832(0)*100/255;
- // ad_data =(uint)temp1; //采样值存储单元初始化为0 DAC();
- // ad_data=234;
- GotoXY(10,1); //选择温度显示位置
- Print_s(temp1/1000+0x30); //
- //Print_s(word3[8]); //
- Print_s(temp1/100%10+0x30); //
- Print_s(temp1/10%10+0x30); //
- Print_s(temp1%10+0x30);
- }
- if(temp1>24&&!bj_flag) //若第二路一氧化碳检测值大于上限值
- {
- bj_flag=1;
- GotoXY(0,0);
- Print("GUOCHONG BAOJIN..."); //
- }
- // else if(temp1<=24&&bj_flag)
- // {
- // bj_flag=0;
- // GotoXY(0,0);
- // Print(" CHONGDIAN VOL: "); //
- // }
- if(bj_flag)
- {
- Alarm1(60); //报警
- out=1;
- }
- else
- {
- beep=1;
- out=0;
- }
- }
- }
复制代码
所有资料51hei提供下载:
基于单片机的纯电动汽车动力电池过充保护系统设计与仿真.rar
(115.91 KB, 下载次数: 143)
|