标题:
262电源的mega48单片机源代码带Protues仿真
[打印本页]
作者:
iop273252933
时间:
2017-1-5 15:06
标题:
262电源的mega48单片机源代码带Protues仿真
分享一个电源的mega48程序带Protues仿真和源代码
下面是262电源的仿真原理图:
0.png
(37.51 KB, 下载次数: 127)
下载附件
2017-1-6 03:00 上传
部分单片机源码预览:
//ICC-AVR application builder : 2016/12/5 8:30:38
// Target : m48p
// Crystal: 1.0000Mhz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <math.h>
//void _delay_us (double __us); //微秒级
//void _delay_ms (double __ms); //毫秒级
/*******************指示灯宏定义*******************/
#define z_LED_ON() (PORTB|=0x08) //主电灯亮 PB3
#define z_LED_OFF() (PORTB&=0xE7) //主电灯灭
#define b_LED_ON() (PORTB|=0x20) //备电灯亮 PB5
#define b_LED_OFF() (PORTB&=0xDF) //备电灯灭
#define r_LED_ON() (PORTD|=0x01) //弱电灯亮 PD0
#define r_LED_OFF() (PORTD&=0xFE) //弱电灯灭
#define o_LED_ON() (PORTD|=0x02) //输出灯亮 PD1
#define o_LED_OFF() (PORTD&=0xfD) //输出灯灭
#define c_LED_ON() (PORTD|=0x08) //充电灯亮 PD3
#define c_LED_OFF() (PORTD&=0xf7) //充电灯灭
#define c_LED_STATE() (PORTD^=(1<<PD3)) //充电灯灭
#define M10_OFF() (PORTD&=0xBF) //PD6置0 M10
#define M10_ON() (PORTD|=0x40) //PD6置1 M10
#define M32_OFF() (PORTD&=0xFB) //PD2置0 M32
#define M32_ON() (PORTD|=0x04) //PD2置1 M32
/*******************电压采集通道宏定义*******************/
#define Spare_ele_via 0x40 //ADC0-PC1备电
#define Main_ele_via 0x41 //ADC1-PC0主电
#define uchar unsigned char
#define uint unsigned int
/*******************************************
函数名称: IO口初始化程序
功 能: 实现IO初始化
参 数: 无
返 回 值: 无
********************************************/
void port_init(void)
{
PORTC = 0x00;//上拉电阻不使能
DDRC = 0x00; //PC0作为AD的输入
PORTB = 0x00;//输出置0
DDRB = 0xFF;//输出
DDRD = 0xFF;//AIN1设置为输入
PORTD = 0x01;//上拉电阻不使能
}
/*****************************************************
函数名称: 定时器1初始化函数
功 能: 分频数1024,定时1秒,误差为0.0%,TOP=0xFFFF
参 数: 无
返 回 值: 无
****************************************************/
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF0; //setup
TCNT1L = 0xBE;
OCR1AH = 0x0F;
OCR1AL = 0x42;
OCR1BH = 0x0F;
OCR1BL = 0x42;
ICR1H = 0x0F;
ICR1L = 0x42;
TCCR1A = 0x00;
}
/*******************************************
函数名称: 定时器1中断处理函数
功 能: flag标志位来指示状态
参 数: 无
返 回 值: 无
********************************************/
ISR(TIMER1_OVF_vect)
{
static unsigned int m;
TCNT1H = 0xF0; //setup
TCNT1L = 0xBE;
++m;
if(m==1||m==2||m==3)
{
c_LED_ON();
}
else
{
m=0;
c_LED_OFF();
}
//c_LED_STATE();
}
/*******************************************
函数名称: 设备初始化函数
功 能: 对AVR单片机进行初始化
参 数: 无
返 回 值: 无
********************************************/
void init_devices(void)
{
cli(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;//允许引脚电阻上拉
EICRA = 0x00; //外部中断
EIMSK = 0x00;//外部中断失能
TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x01; //T/C1 溢出中断使能
TIMSK2 = 0x00; //timer 2 interrupt sources
PCMSK0 = 0x00; //pin change mask 0 引脚电平变化中断禁用
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PCICR = 0x00; //pin change enable 引脚电平变化中断控制寄存器禁用
SMCR = 0x00; //power controller
sei(); //开总中断
}
/*************************************************************
函数名称: AD采样函数。
功 能: 实现电压的AD采样。
参 数: 无
返 回 值: temp--AD采样的值。
************************************************************/
unsigned int mega48_ad(unsigned char channel)
{
volatile static unsigned int ad_value[64]; //AD转换缓冲
volatile static unsigned char ch=0x40;
unsigned int temp;
unsigned char i;
static unsigned int max_value;
ADMUX = channel; //5V电压 AVCC
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); //开启AD转换功能单次模式,32分频
if(ch==channel)
{
ADCSRA |= (1<<ADSC); //启动转换
while(ADCSRA&_BV(ADSC)); //查询是否转换结束
temp = ADCL;
temp|= (unsigned int)(ADCH<<8);
temp=temp&0x3FF;
return temp;
}else
{
for(i=0;i<64;i++)
{
ADCSRA |= (1<<ADSC); //启动转换
while(ADCSRA&_BV(ADSC)) //查询是否转换结束
{
_delay_us(500);
}
temp = ADCL;
temp|= (unsigned int)(ADCH<<8);
ad_value[i] = temp&0x3FF;
}
max_value = ad_value[0];
for(i=1;i<64;i++)
{
if(ad_value[i]>max_value)
{
max_value =ad_value[i];
}
}
max_value =(long int)(max_value/M_SQRT2);
return max_value;
}
//ADCSRA &= 0x7F;
}
/********************************************
函数名称: 主函数
功 能:
参 数: 无
返 回 值: 无
********************************************/
int main(void)
{ uint ad[2];
volatile static unsigned int cutflag;
float z_voltage, b_voltage;
init_devices();
while(1)
{
ad[0]=mega48_ad(Main_ele_via); //读出AD的采样值
z_voltage=(ad[0]*5.0)/1024.0;
ad[1]=mega48_ad(Spare_ele_via);
b_voltage=(ad[1]*5.0)/1024.0;
if((cutflag==0) && z_voltage>=1.05 && b_voltage>=2)//主电正常,备电正常
{
o_LED_OFF();//主电输出
b_LED_ON();//备电灯亮
z_LED_ON();//主电灯亮
if(b_voltage<=2.8)//主电正常,备电正常,脉冲充电
{
M32_OFF();
cutflag=0;
TCCR1B = 0x05; //start Timer
}else
{
c_LED_OFF();//充电灯灭
TCCR1B = 0x00; //stop
}
}
else if(z_voltage>=1.05&&b_voltage<=2)//主电正常,备电不正常
{
TCCR1B = 0x00; //stop
r_LED_ON();//
o_LED_OFF();//主电输出
b_LED_OFF();//备电灯灭
c_LED_OFF();//充电灯灭
z_LED_ON();//主电灯亮
}
else if(z_voltage<1.05&&b_voltage>=2)//主电不正常,备电正常
{
TCCR1B = 0x00; //stop
z_LED_OFF();
o_LED_ON();//输出
cutflag=1;
b_LED_ON();//备电灯亮
c_LED_OFF();//充电灯灭
r_LED_ON();//弱电灯亮
_delay_ms(1);
M32_ON();
}
else if(z_voltage<1.05&&b_voltage<1.8)//主电不正常,备电电池耗尽
{
TCCR1B = 0x00; //stop
z_LED_OFF();//主电灯灭
b_LED_OFF();//备电灯灭
c_LED_OFF();//充电灯灭
r_LED_OFF();//弱电灯灭
o_LED_OFF();//不输出
}
else//备电电压1.8<备电<2 and 主电不正常
{
TCCR1B = 0x00; //stop
c_LED_OFF();//充电灯灭
b_LED_ON();//备电灯亮
z_LED_OFF();//主电灯灭
o_LED_ON();//备电输出
}
if((cutflag==1) && z_voltage>=1.3 && b_voltage>=2)
{
_delay_us(1);
if((cutflag==1) && z_voltage>=1.3 && b_voltage>=2)
{
cutflag=0;
}
}
}
}
复制代码
0.png
(69.07 KB, 下载次数: 154)
下载附件
2017-1-6 03:00 上传
所有资料下载(包含仿真工程文件和源程序):
262电源程序MEGA48.rar
(406.74 KB, 下载次数: 18)
2017-1-5 15:04 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
020202000
时间:
2017-5-17 18:51
现在正在用这个开发,感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1