📄 test._c
字号:
//使用内部RC振荡,PB6-G,PB7-DP短路块连接
//使用INT0/INT1按键切换ADC通道
#include <iom48v.h>
#include <macros.h>
#define osccal 0x9A //内部RC校正常数
#define Vref 500 //参考电压值
#define Red PD2 //红色指示灯
#define Green PD3 //绿色指示灯
#define P0 PB1 //第0路电流控制
#define P1 PD5 //第1路电流控制
#define P2 PB7 //第2路电流控制
#define P3 PB6 //第3路电流控制
#define SDA 4
#define SCL 5
#define ack 0
#define a 1
#define LED_Indi 2
#define LED_Indi_2 7
#define LED_yes 3 //允许红灯闪烁
#define plus_charge 4 //允许进行14.4V/0.8A(1HZ)脉冲充电标志位
#define anther 5
#define Charge_Sel 6 //Charge_Sel=1 home_charger Charge_Sel=0; warmup_charger
#define _nop_() asm("nop")
//ABC[124] 针对14.3V查表 -40 ~ 84
const signed int ABC[81]={735,735,735,735,735,735,736,737,738,740,742,744,746,748,749,750,752,753,755,757,758,760,762,764,766,766,768,769,770,772,773,775,777,779,780,782,784,786,787,789,790,792,794,796,797,798,799,800,802,804,805,807,809,810,812,813,814,815,817,819,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820};
//ABC[124] 针对13.8V查表 005 006 007 8 9 10 11 12 13 14 15 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085
const signed int ABC_2[91]={752,753,754,756,758,760,762,764,766,767,768,770,772,774,775,776,778,780,782,783,784,786,788,790,792,793,795,797,798,799,800,802,804,806,807,808,810,812,813,814,815,817,819,821,822,823,824,826,828,829,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831};
//ABC[124] 针对13.8V查表 -05 -04 -03 -02 -01 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085
unsigned int adc_old;
unsigned int xxyy;
unsigned int temp_start;
signed char temp_step;
unsigned char temp_dange;
unsigned char temp;
unsigned char cycle; //存放从第五步到第一步之间的循环次数
extern void delay_ms(unsigned int time);
unsigned int adc_rel; //AD转换结果
unsigned int Second_count_1; //秒计数1
unsigned int Second_count_2; //秒计数2
unsigned int Second_count_3; //秒计数1
unsigned int Second_count_4; //秒计数2
unsigned char adc_mux; //AD通道
unsigned char DA_result; //将需要转换的D/A数据写入其中再进行调用D/A子程序
signed int now_temp;
signed temp_rep;
unsigned int abc;
unsigned int xyz;
//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value: 1.000Sec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xE1; //setup
TCNT1L = 0x7C;
OCR1AH = 0x1E;
OCR1AL = 0x84;
OCR1BH = 0x1E;
OCR1BL = 0x84;
ICR1H = 0x1E;
ICR1L = 0x84;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
unsigned char temp1;
#pragma interrupt_handler timer1_compa_isr:12
void timer1_compa_isr(void)
{
//compare occured TCNT1=OCR1A
}
#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
TCNT1H = 0xF0; //reload counter high value
TCNT1L = 0xBE; //reload counter low value
if((temp&(1<<plus_charge))==0x10) //为第一步脉冲充电做准备
{temp &= ~(1<<plus_charge);}
else{temp |= (1<<plus_charge);}
Second_count_1++;
if(Second_count_1==120) //如果有改动,请改回原来值60
{
Second_count_2++;
Second_count_1=0;
}
Second_count_3++;
if(Second_count_3==120) //如果有改动,请改回原来值60
{
Second_count_4++;
Second_count_3=0;
}
if((temp&(1<<LED_yes))==0x08)
{
_nop_();
if((temp&(1<<LED_Indi))==0)
{PORTD &= ~(1<<Red);
PORTD &= ~(1<<Green); //绿色指示灯灭
temp |= (1<<LED_Indi);}
else
{PORTD |= (1<<Red);
PORTD &= ~(1<<Green); //绿色指示灯灭
temp &= ~(1<<LED_Indi);
};
}
else
_nop_();
}
//ADC初始化
void adc_init(void)
{
ADCSRA = 0x00; //设置前,先关闭ADC
//ADMUX =(1<<REFS0); //选择内部AVCC为基准,单端输入口为ADC0
ADMUX &= ~(1<<REFS0);
ADMUX &= ~(1<<REFS1);
ACSR =(1<<ACD); //关闭模拟比较器,禁止位P148
//ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
ADCSRA |= (1<<ADEN);
ADCSRA |= (1<<ADIE);
ADCSRA |= (1<<ADPS2);
ADCSRA |= (1<<ADPS1);
ADCSRA |= (1<<ADSC);
}
//ADC完成中断
#pragma interrupt_handler adc_isr:22
void adc_isr(void)
{
adc_rel=ADC&0x3ff;
//ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
//ADMUX=ADMUX |(adc_mux&0x0f);
//ADMUX |=(adc_mux&0x0f);
ADMUX=0;
ADMUX |=(adc_mux&0x0f);
ADCSRA|=(1<<ADSC); //启动AD转换
}
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{
PORTC |= (1<<SDA);
_nop_();
PORTC |= (1<<SCL);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
PORTC &= ~(1<<SDA);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
PORTC &= ~(1<<SCL);
_nop_();
_nop_();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{
PORTC &= ~(1<<SDA); /*发送结束条件的数据信号*/
_nop_(); /*发送结束条件的时钟信号*/
PORTC |= (1<<SCL); /*结束条件建立时间大于4μs*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
PORTC |= (1<<SDA); /*发送I2C总线结束信号*/
_nop_();
_nop_();
_nop_();
_nop_();
}
/*******************************************************************
字节数据传送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80){PORTC |= (1<<SDA);} /*判断发送位*/
else {PORTC &= ~(1<<SDA);}
_nop_();
PORTC |= (1<<SCL); /*置时钟线为高,通知被控器开始接收数据位*/
_nop_();
_nop_(); /*保证时钟高电平周期大于4μs*/
_nop_();
_nop_();
_nop_();
_nop_();
PORTC &= ~(1<<SCL);
}
_nop_();
_nop_();
_nop_();
PORTC |= (1<<SDA); /*8位发送完后释放数据线,准备接收应答位*/
_nop_();
_nop_();
_nop_();
PORTC |= (1<<SCL);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if((PINC&(1<<SDA))==1){temp &= ~(1<<ack);}
else {temp |= (1<<ack);} /*判断是否接收到应答信号*/
PORTC &= ~(1<<SCL);
_nop_();
_nop_();
_nop_();
_nop_();
}
/*******************************************************************
向有子地址器件发送多字节数据函数
函数原型: bit TC1321_SET(unsigned int DA_SET);
功能: 设定TC1321的DATA寄存器,从而控制输出所设定的电压值:(DA_SET/1024)*VREF.
注意:
****************************14.3V时候的D/A输出值*******************************/
TC1321_SET(unsigned int DA_SET)
{
unsigned char i;
unsigned char tem[4];
temp_det();
_nop_();
temp_det();
_nop_();
xxyy=now_temp-5;
DA_SET=ABC[xxyy];
if(now_temp <6)
{
DA_SET=735;
}
tem[0]=0x90;
tem[1]=0x00;
tem[2]=DA_SET/4;
tem[3]=DA_SET%4;
tem[3]=tem[3]<<6;
Start_I2c();
for(i=0;i<4;i++)
{
SendByte(tem[i]);
if((temp&(1<<ack))==0)return(0);
}
Stop_I2c();
return(1);
}
/**********************13.8V时候的D/A输出值 ***************************/
TC1321_SET_138(unsigned int DA_SET)
{
unsigned char i;
unsigned char tem[4];
temp_det();
_nop_();
temp_det();
_nop_();
xxyy=now_temp+5;
DA_SET=ABC_2[xxyy];
if(now_temp <-4 ) //温度小于-30°时候输出15.3V
{
DA_SET=752;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -