📄 final1.c
字号:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <avr/bit.h>
#define Dis_port PORTB
#define Alert_io PB2
#define Work_io PB3
#define Pwm_port PORTA
#define Posi_io PA0
#define Nega_io PA1
#define Key_port PORTD
#define Key_int0 PD2
uint16_t ADC_rel = 0, flag = 1;
/*****************************************************
SPWM调制波形表.
*****************************************************/
uint8_t sintab[] = //spwm波形延时时间表
{
1, 1, 1, 1, 1, 1, 2, 2, 2, 3,
3, 3, 4, 4, 5, 5, 6, 7, 7, 8,
9, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 23, 24, 25, 27, 28, 29,
31, 32, 34, 35, 37, 38, 40, 41, 43, 45,
46, 48, 50, 52, 53, 55, 57, 59, 61, 63,
64, 66, 68, 70, 72, 74, 76, 78, 80, 82,
85, 87, 89, 91, 93, 95, 97, 99,102,104,
106,108,110,113,115,117,119,121,124,126,
128,130,132,135,137,139,141,143,146,148,
150,152,154,157,159,161,163,165,167,169,
171,174,176,178,180,182,184,186,188,190,
192,193,195,197,199,201,203,204,206,208,
210,211,213,215,216,218,219,221,222,224,
225,227,228,229,231,232,233,235,236,237,
238,239,240,241,242,243,244,245,246,247,
247,248,249,249,250,251,251,252,252,253,
253,253,254,254,254,255,255,255,255,255,
255,255,255,255,255,255,254,254,254,253,
253,253,252,252,251,251,250,249,249,248,
247,247,246,245,244,243,242,241,240,239,
238,237,236,235,233,232,231,229,228,227,
225,224,222,221,219,218,216,215,213,211,
210,208,206,204,203,201,199,197,195,193,
192,190,188,186,184,182,180,178,176,174,
171,169,167,165,163,161,159,157,154,152,
150,148,146,143,141,139,137,135,132,130,
128,126,124,121,119,117,115,113,110,108,
106,104,102, 99, 97, 95, 93, 91, 89, 87,
85, 82, 80, 78, 76, 74, 72, 70, 68, 66,
65, 63, 61, 59, 57, 55, 53, 52, 50, 48,
46, 45, 43, 41, 40, 38, 37, 35, 34, 32,
31, 29, 28, 27, 25, 24, 23, 21, 20, 19,
18, 17, 16, 15, 14, 13, 12, 11, 10, 9,
9, 8, 7, 7, 6, 5, 5, 4, 4, 3,
3, 3, 2, 2, 2, 1, 1, 1, 1, 1,
};
void Delay(uint32_t i)
{
while (i)
{
i--;
}
}
/**********************************************
停止程序
*************************************************/
void Sys_stop(void)
{
Pwm_port = 0xFF;
DDRA = 0x00;
cbi(Pwm_port, Nega_io);
cbi(Pwm_port, Posi_io);
Dis_port = 0xFF;
DDRB = 0x00;
}
/**********************************************
开始程序
**********************************************/
void Sys_start(void)
{
Pwm_port = 0xFF;
DDRA = 0x7F;
Dis_port = 0xF7;
DDRB = 0x0F;
}
void KEY(uint8_t f)
{
switch (f)
{
case 1: Sys_stop(); break;
case 0: Sys_start();break;
}
}
/***********************************************
模数检测,电压检测,低压报警
***********************************************/
void ADC_tst(void) //低压报警查询延时
{
uint16_t i;
for (i=0; i<1; i++)
{
if (ADC_rel < 512) //电压低于设定正常电压报警灯亮
{
cbi(Dis_port, Alert_io);
}
if (ADC_rel >= 512) //电压正常
{
sbi(Dis_port, Alert_io);
}
if (ADC_rel <= 300) //电压过低,停止工作
{
Sys_stop();
}
}
}
/**********************************************
SPWM脉宽调制
**********************************************/
void spwm(void)
{
uint16_t i, j, k;
cbi(Dis_port, Work_io); //工作模式初始化,报警灯灭,工作灯亮
for (;;)
{ //SPWM波循环输出,由查表实现
KEY(flag);
for (j=0; j<360; j++)
{
cbi(Pwm_port, Posi_io);
for (i=0; i<sintab[j]; i++)
{
ADC_tst();
}
sbi(Pwm_port, Posi_io);
for (k=0; k<(256-sintab[j]); k++)
{
ADC_tst();
}
}
for (j=0; j<360; j++)
{
cbi(Pwm_port, Nega_io);
for (i=0; i<sintab[j]; i++)
{
ADC_tst();
}
sbi(Pwm_port, Nega_io);
for (k=0; k<(256-sintab[j]); k++)
{
ADC_tst();
}
}
}
}
/**************************************************
外部中断, 系统初始化
**************************************************/
void init_sys(void)
{
Pwm_port = 0xFF; //波形输出口初始化
DDRA = 0x7f;
Dis_port = 0xFF; //二极管显示口初始
DDRB = 0x0F;
PORTD = 0xFF; //按键口初始
DDRD = 0x00;
MCUCR = 0x02; //初始外部中断
SREG = 0x80;
GICR = 0x40;
}
/**************************************************
低压检测 模数转换
**************************************************/
void ADC_Init(void) //AD初始化
{
ADMUX = 0xc7;
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
SIGNAL(SIG_ADC) //AD中断服务程序
{
uint16_t h = 0, l = 0;
l = ADCL;
h = ADCH;
ADC_rel = (h<<8) + l;
}
/***********************************************
按键中断服务程序
***********************************************/
SIGNAL(SIG_INTERRUPT0)
{
Delay(5000);
if (flag == 0)
{
flag = 1;
}
else if (flag == 1)
{
flag = 0;
}
}
/********************************************
主函数
********************************************/
int main(void)
{
init_sys(); //系统初始化
ADC_Init(); //AD初始化
spwm(); //波形输出
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -