⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 通过Dsp计算电池的SOC
💻 C
字号:
//Main.c
//采集板主程序
#include "SEED-DEC2407.h" 
#include "eeprom.h"
#include "eeprom.c"
#include "dpram.h"
#include "dpram.c"
#include "ads7844.h"
#include "ads7844.c"
#include "ds18b20.h"
#include "ds18b20.c"

void SystemInit();
void IOInit();
void SPI_Init();
void Timer1Init(); 
void KickDog();  

unsigned char offlag = 0; //关机标志
float temp[28];	//温度
unsigned char snn[28][8];//28个温度传感器序列号
//int result[30];			//单电压、总电压、总电流值
unsigned char* buff;		//中间值 
int i,j,loopindex;
void main()
{  
   SystemInit();         	//系统初始化
   IOInit(); 
   SPI_Init();			//SPI初始化
   Timer1Init();          	//定时器初始化


   //采集温度
   while (reset()==1){}; /* 复位等待从机应答 */
   write_byte(0xCC); /* 忽略ROM 匹配 */
   write_byte(0x44); /* 发送温度转化命令 */
   for(loopindex=0;loopindex<65535;loopindex++){;} /* 延时300ms,等待数模转换 */
   for(loopindex=0;loopindex<65535;loopindex++){;}
   for(i=0; i<28; i++)
   {
   		while(reset()==1){}; /* 再次复位,等待从机应答 */
   		write_byte(0x55);	//匹配rom命令
   		for(j=0; j<8; j++)write_byte(snn[i][j]); /* 写序列号 */
   		write_byte(0xBE); /* 发送读温度命令 */
   		read_byte(buff); /* 读出温度低8 位 */
   		read_byte(buff+1); /* 读出温度高8 位 */
   		temp[i]=transform(buff);
   		PIN_HIGH(); /* 释放总线 */
   }
   WR2DRAM(temp,0x801E,28);//将读出的数存入双口RAM
   WT2EEPROM(temp,0x001E,28);//将数据写入EEPROM
   
   //采集电压电流
   for(i=0; i<4; i++)
   {
		if(i==0)*PBDATDIR=*PBDATDIR&0xFFFE;//模拟CS0
  		if(i==1)*PBDATDIR=*PBDATDIR&0xFFFD;//模拟CS1
   		if(i==2)*PBDATDIR=*PBDATDIR&0xFFFB;//模拟CS2
   		if(i==3)*PBDATDIR=*PBDATDIR&0xFFF7;//模拟CS3
		ADConversion(i);	//读出第i个ad的转化结果-12位二进制数,并存在result数组中
   }
	//	convert(adread);		//数据转化   
   WR2DRAM(result,0x8000,30);//将读出的数存入双口RAM
   WR2EEPROM(result,0x0000,30);//将数据写入EEPROM
   
   asm(" CLRC INTM ");
   while(offlag == 0)
   {
   		
   		int j;
   		while (reset()==1){}; /* 复位等待从机应答 */
   		write_byte(0xCC); /* 忽略ROM 匹配 */
   		write_byte(0x44); /* 发送温度转化命令 */
   		for(loopindex=0;loopindex<65535;loopindex++){;} /* 延时300ms,等待数模转换 */
   		for(loopindex=0;loopindex<65535;loopindex++){;}
   		for(i=0; i<28; i++)
   		{
   			while(reset()==1){}; /* 再次复位,等待从机应答 */
   			write_byte(0x55);	//匹配rom命令
   			for(j=0; j<8; j++)write_byte(snn[i][j]); /* 写序列号 */
   			write_byte(0xBE); /* 发送读温度命令 */
   			read_byte(buff); /* 读出温度低8 位 */
   			read_byte(buff+1); /* 读出温度高8 位 */
   			temp[i]=transform(buff);
   			PIN_HIGH(); /* 释放总线 */
   		}
  		WR2DRAM(temp,0x801E,28);//将读出的数存入双口RAM
   		WT2EEPROM(temp,0x001E,28);//将数据写入EEPROM			
   }
}

void SystemInit() 
{  
 
	asm(" SETC	INTM ");	//关闭总中断 
	asm(" CLRC  SXM  ");	//禁止符号位扩展 
	asm(" CLRC  CNF  ");    // B0块映射为 on-chip DARAM
	asm(" CLRC  OVM  ");    // 累加器结果正常溢出
	*SCSR1=0x83FE;         	// 系统时钟CLKOUT=20*2=40M 
	*WDCR=0x006F;			//禁止看门狗,看门狗时钟64分频 
	KickDog();    		// 初始化看门狗  
    *IFR=0xFFFF;			// 清除中断标志 
    *IMR=0x0002;				//打开中断2      
    
}

void IOInit()
{
   *MCRA=*MCRA & 0x10FF; 	    //除IOPB4以外IOPB0-7都设为IO口模式
   *PBDATDIR=0xCF0F;        	    //置IOPB5为输入口
   *MCRC=*MCRC & 0x80FF; 	    //IOPF0-6都设为IO口模式
}

void SPI_Init()
{
	*MCRB=*MCRB|0x001C;		//SPISIMO,SPISOMI,SPICLK特殊功能方式,SPISTE配置为通用I/O引脚以作片选信号
	*PCDATDIR=*PCDATDIR|0x0020;	//置片选信号为高
	*SPICCR=0x004F;			//上升(下降)沿输出(入)16位数据
	*SPICTL=0x0006;			//主工作方式,禁止中断
	*SPIBRR=0x0027;			//1M波特率
	*SPICCR=*SPICCR|0X80;		//开始发送或接收数据
}
  
void Timer1Init()
{ 

    *EVAIMRA=0x0080;			//  定时器1周期中断使能 
    *EVAIFRA=0xFFFF;			//  清除中断标志 
    *GPTCONA=0x0000;
	*T1PR=2500;				//  定时器1初值,定时128/40us*2500=8ms 			
	*T1CNT=0;
	*T1CON=0x174E;              //增模式, TPS系数40M/128, T1使能
				
}

void interrupt c_int2()               //定时器1中断服务程序
{

    if(*PIVR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	*T1CNT=0; 
	//采集电压电流
    for(j=0; i<4; i++)
    {
		if(i==0)*PBDATDIR=*PBDATDIR&0xFFFE;//模拟CS0
  		if(i==1)*PBDATDIR=*PBDATDIR&0xFFFD;//模拟CS1
   		if(i==2)*PBDATDIR=*PBDATDIR&0xFFFB;//模拟CS2
   		if(i==3)*PBDATDIR=*PBDATDIR&0xFFF7;//模拟CS3
		AD(result,i);	//读出第i个ad的转化结果
    }
//		convert(adread);		//数据转化    
    WR2DRAM(result,0x8000,30);//将读出的数存入双口RAM
    WR2EEPROM(result,0x0000,30);//将数据写入EEPROM    
	
	*EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   
	
} 
void KickDog()				     //踢除看门狗 
{
	*WDKEY=0x5555;
	*WDKEY=0xAAAA;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -