📄 main.c
字号:
#ifndef COMMON_H
#define COMMON_H
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
//#include <twi.h>
//#include <avr/pgmspace.h>
//#include <string.h>
#include <stdio.h>
#include <deprecated.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
#define FREQ 4
//========================
#define Lcd_CS PD1
#define Lcd_CLK PD0
#define Lcd_DATA PD2
#define LCD_PORT PORTD //定义LCD口
#define SPECK_PORT PORTC //定义语音口
#define SBT PC4
#define MORT_PORT PORTD //定义真空口
#define JRQ_PORT PORTC //定义蒸气口
#define QD 0x10
#define CM 0x08
#define NoW 0x04
#define POWER 0x20
#define ZQ 0x80
#define SYN 0x08
#define MORT PD4
#define JR PC5
#define UP 0x01
#define ZK 0x02
#define ZQON 0x04
#define ZQOFF 0x08
#define DOWN 0x10
#define VOICE1 0x00 //声音地址
#define VOICE2 0x01
#define VOICE3 0x02
#define VOICE4 0x03
#define VOICE5 0x04
#define VOICE6 0x05
#define VOICE7 0x06
#define VOICE8 0x07
#define KEY_ADC4V 0xcc //A/D等于4V的值
#define KEY_ADC2V 0x64 //A/D等于2V的值 127 0x7f
#define KEY_ADC1V 0x1E //A/D等于1V的值 42 0x2a
#define LED_Power 0x7F //电源灯
#define LED_ZKHIG 0x1F //真空高
#define LED_ZKMID 0x37 //真空中
#define LED_ZKLOW 0x3B //真空低
#define LED_ZKOFF 0x6C //真空关
#define LED_ZQ 0x6F //蒸气灯
#define LED_ZQOFF 0x10 //蒸气关
#define LED_CM_OFF 0x01 //尘满关
#define LED_CM_ON 0x7E //尘满开
#define LED_NoW_OFF 0x02 //无水关
#define LED_NoW_ON 0x7D //无水开
#define OFF 0
#define ON 1
//========================
uint SUM_Buf[10];
uint Sumn;
static uchar Sumn_T; //时间平均值
static uchar Sumn_Key; //A/D键平均值
static uchar Motol_Star;
static uchar Motol_End;
static uchar Motol_Mid;
static uchar Power_Hi;
static uchar Power_Mi;
static uchar Power_Li;
static uchar Work_Power=0;
static uchar Work_ZK =0;
static uchar Work_ZQ =0;
static uchar Put_Key = 0;
//------------------------
static uchar State_LED; //LED指示灯
static uchar State_Speak; //声音指示
static uchar State_Motol=0; //Motol状态 1: 高速 2:中速 3:低速
//static uchar State_Motol_Js =0; //Motol状态 加速
static uchar State_Ykonq=0; //遥控器工作状态 0:无工作 1:以工作
static uchar Bj_QD = 0; //倾倒报警标记 0是无报警
static uchar T1_Count=0; //T1中断次数
static uchar T1_Gs =0; //T1中断时间数
static uchar Bj_Count=0; //报警1s记数器
static uchar Bj_Direct =0; //报警方向
static uchar Bj_NoW =0; //无水报警标记 0是无报警
static uchar Bj_CM=0; //尘满报警标记 0是无报警
//------------------------
//#define F_CPU 8000000 /* 单片机主频为8MHz,用于延时子程序 */
//***************************
extern void SUM_PINJS();
void DelayMs(uint t)
{
uint i;
for(i =0;i<t;i++)
_delay_loop_2( 250*FREQ );
}
void DelayUs(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{
for(j=0;j<10;j++)
{
asm("nop");
}
}
}
#endif
//===============================
void LED_Display(uchar x) //LED显示
{
uchar i=0;
cbi(LCD_PORT,Lcd_CS);
for(i=0;i<8;i++)
{
cbi(LCD_PORT,Lcd_CLK);
if((x&0x80)!=0)
{
sbi(LCD_PORT,Lcd_DATA);
asm("nop");
}
else
{
cbi(LCD_PORT,Lcd_DATA);
asm("nop");
}
x = x << 1;
sbi(LCD_PORT,Lcd_CLK);
asm("nop");
}
sbi(LCD_PORT,Lcd_CS);
}
void VO_Time() //测量平均时间T,定时器T0
{
uchar i;
for(i=0;i<10;i++)
{
while((PIND & SYN) == 0);
while((PIND & SYN) != 0);
TCNT0 = 0X0;
TCCR0B = _BV(CS02)|_BV(CS00);
while((PIND & SYN) ==0 );
while((PIND & SYN) != 0);
SUM_Buf[i] = (uint)TCNT0;
}
Sumn = 0;
SUM_PINJS(SUM_Buf);
Sumn_T = Sumn;
Power_Hi = 3;
Power_Mi = Sumn_T * 45 / 100 ;
Power_Li = Sumn_T * 60 /100;
Motol_Mid = Power_Mi;
Motol_Star = Power_Li;//Sumn_T - 15;
Motol_End = 3;
}
void INIT() //初试
{
DDRD = 0X17;
DDRB = 0x00;
DDRC = 0X3F;
PORTD = 0xFF;
PORTB = 0xFF;
PORTC = 0x00;
//--------------------
State_LED = 0xFF;
State_Speak = 0xFF;
Motol_Star = 0x0;
Motol_End = 0x0;
Work_Power = OFF;
Work_ZK = OFF;
Work_ZQ = OFF;
Bj_QD = OFF;
Bj_CM = OFF;
Bj_NoW = OFF;
//--------------------
}
void KEY_ADC(uchar p) //8位 A/D值
{
uchar i=0;
uint ret;
ADMUX = _BV(REFS0)|_BV(ADLAR)|p;
ADCSRA = _BV(ADEN)|_BV(ADPS2)|_BV(ADPS1);
for(i=0;i<10;i++)
{
ADCSRA |=_BV(ADSC);
while(ADCSRA & _BV(ADSC));
ret = (uint)ADCH;
SUM_Buf[i] = ret;
}
ADCSRA = 0;
SUM_PINJS(SUM_Buf);
Sumn_Key = Sumn;
}
void SPEAK()
{
while(State_Speak != 0xFF)
{
PORTC &= 0XF0;
PORTC |= State_Speak;
asm("nop");
asm("nop");
cbi(SPECK_PORT,SBT);
asm("nop");
asm("nop");
sbi(SPECK_PORT,SBT);
// DelayUs(300);
asm("nop");
asm("nop");
State_Speak = 0xFF;
}
}
void SUM_PINJS(uint *p)
{
uchar i;
uint ret;
uchar max_id,min_id,max_value,min_value;
ret = 0;
for(i=1;i<10;i++)
ret +=*(p+i);
ret /= 9;
max_id = min_id = 1;
max_value = min_value = 0;
for(i=1;i<10;i++)
{
if( *(p+i) >ret)
{
if(*(p+i)-ret > max_value)
{
max_value = *(p+i) - ret;
max_id = i;
}
}
else
{
if( ret-*(p+i)>min_value)
{
min_value = ret-*(p+i);
min_id = i;
}
}
}
ret = 0;
for(i=1;i<10;i++)
{
if((i !=min_id)&&(i != max_id))
ret += *(p+i);
}
if(min_id != max_id)
ret /=7;
else
ret /= 8;
Sumn = ret;
}
void Motol_Work() //匀速加速,定时器T0
{
uchar i=0,Fx;
uchar Gs;
Gs = 3;
Fx = (Motol_Star > Motol_End) ? 1 : 2;
if(Motol_Star ==Motol_End )
{
TCNT0 = 0;
OCR0A = Motol_Star; //高速触发
TCCR0B = _BV(CS02)|_BV(CS00);
TIMSK0 =_BV(OCIE0A);
}
else
{
if(Fx == 1)
{
TCNT0 = 0;
OCR0A = Motol_Star; //高速触发
TCCR0B = _BV(CS02)|_BV(CS00);
TIMSK0 =_BV(OCIE0A);
i++;
while (i<Gs)
{
while((PIND & SYN) == 0);
while((PIND & SYN) != 0);
TCNT0 = 0;
OCR0A = Motol_Star; //高速触发
TCCR0B = _BV(CS02)|_BV(CS00);
TIMSK0 =_BV(OCIE0A);
i++;
}
Motol_Star--;
}
else
{
TCNT0 = 0;
OCR0A = Motol_Star; //高速触发
TCCR0B = _BV(CS02)|_BV(CS00);
TIMSK0 =_BV(OCIE0A);
i++;
while (i<Gs)
{
while((PIND & SYN) == 0);
while((PIND & SYN) != 0);
TCNT0 = 0;
OCR0A = Motol_Star; //高速触发
TCCR0B = _BV(CS02)|_BV(CS00);
TIMSK0 =_BV(OCIE0A);
i++;
}
Motol_Star++;
}
}
}
SIGNAL(SIG_OUTPUT_COMPARE0A)//SIG_OVERFLOW0) //定时器0 ,中断触发
{
TCNT0 = 0X0;
TCCR0B = 0X00;
cbi(PORTD,MORT);
DelayUs(5);
sbi(PORTD,MORT);
DelayUs(13);
cbi(PORTD,MORT);
DelayUs(5);
sbi(PORTD,MORT);
}
SIGNAL(SIG_OVERFLOW2) //定时器2
{
if(++Bj_Count > 100)
{
if(Bj_Direct) //反向LED控制
{
if(Bj_CM == ON )
State_LED |= LED_CM_OFF;
if( Bj_NoW == ON )
State_LED |= LED_NoW_OFF;
LED_Display(State_LED);
Bj_Direct = 0;
}
else
{
if(Bj_CM == ON )
State_LED &= LED_CM_ON;
if(Bj_NoW == ON)
State_LED &= LED_NoW_ON;
LED_Display(State_LED);
Bj_Direct = 1;
}
Bj_Count = 0;
if(Bj_CM == ON )
{
if((PINB & CM) !=0)
{
State_LED |=0X01;
LED_Display(State_LED);
Bj_CM = OFF;
}
}
if(Bj_NoW == ON)
{
if((PINB & NoW) ==0)
{
State_LED |=0X02;
LED_Display(State_LED);
Bj_NoW = OFF;
}
}
if((Bj_CM ==OFF ) &&( Bj_NoW ==OFF))
{
TIMSK2 &=~ _BV(TOIE2);
TCCR2B = 0x00;
}
}
}
SIGNAL(SIG_OVERFLOW1) //定时器1
{
if(++T1_Count > T1_Gs)
{
T1_Count =0;
TCNT1 = 0X0;
TCCR1B = 0;
TIMSK1 &= ~_BV(TOIE1);
State_Speak = VOICE8;
SPEAK();
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void POWER_Key()
{
if( Work_Power == OFF)
{
Work_Power = ON;
State_LED = LED_Power;
LED_Display(State_LED);
State_Speak = VOICE1;
SPEAK();
}
else
{
Work_Power = OFF;
cbi(JRQ_PORT,JR);
cli();
TCCR0B = 0;
TIMSK0 = 0;
TCCR1B = 0;
TIMSK1 = 0 ;
TCCR2B = 0;
TIMSK2 = 0;
State_Motol = 0;
Work_ZQ = OFF;
Work_ZK = OFF;
State_LED = 0xFF;
Bj_CM = 0;
Bj_NoW = 0;
Bj_QD = 0;
LED_Display(State_LED);
State_Speak = VOICE7;
SPEAK();
INIT();
while( (PINB & POWER) == 0 );
DelayMs(1000);
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void NoW_Key() //无水
{
Bj_NoW =ON;
State_Speak = VOICE6;
SPEAK();
Work_ZQ = OFF;
cbi(JRQ_PORT,JR);
State_LED |= LED_ZQOFF;
LED_Display(State_LED);
TCNT2 = 0; //初始值
TCCR2B = _BV(CS22)|_BV(CS20); //1024分频
TIMSK2 = _BV(TOIE2); //T/C2中断允许
TCCR1B = 0;
TIMSK1 = 0;
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void CM_Key() //高速/尘满
{
Bj_CM = ON;
State_Speak = VOICE5;
SPEAK();
TCNT2 = 0; //初始值
TCCR2B = _BV(CS22)|_BV(CS20); //1024分频
TIMSK2 = _BV(TOIE2); //T/C2中断允许
Work_ZK = OFF;
State_Motol = 0;
State_LED |= LED_ZKOFF;
LED_Display(State_LED);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//void QD_Key() //倾到
//{
// Work_ZQ = OFF;
// cbi(JRQ_PORT,JR);
// State_LED |= LED_ZQOFF;
// LED_Display(State_LED);
// Bj_QD = ON;
//}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void ZK_Key()
{
if(Work_ZK == ON)
{
Work_ZK = OFF;
State_Motol = 0;
State_Speak = VOICE2;
SPEAK();
State_LED |= LED_ZKOFF;
LED_Display(State_LED);
}
else
{
if( Bj_CM == OFF )
{
Work_ZK = ON;
State_LED |= LED_ZKOFF;
State_LED &= LED_ZKHIG;
LED_Display(State_LED);
Motol_End = 3;
Motol_Star = Power_Li;
State_Motol =1;
}
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void UP_Key()
{
switch (State_Motol)
{
case 3: {
State_Motol = 2;
State_LED |= LED_ZKOFF;
State_LED &= LED_ZKMID;
LED_Display(State_LED);
Motol_End = Power_Mi;//((Sumn_T >> 1)-5); //Sumn_T/2;
break;
}
case 2: {
State_Motol = 1;
State_LED |= LED_ZKOFF;
State_LED &= LED_ZKHIG;
LED_Display(State_LED);
Motol_End = 3;
break;
}
default: break;
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void DOWN_Key()
{
switch (State_Motol)
{
case 1: {
State_Motol = 2;
State_LED |= LED_ZKOFF;
State_LED &= LED_ZKMID;
LED_Display(State_LED);
Motol_End = Power_Mi;//((Sumn_T >> 1)-5); //Sumn_T/2;
break;
}
case 2: {
State_Motol = 3;
State_LED |= LED_ZKOFF;
State_LED &= LED_ZKLOW;
LED_Display(State_LED);
Motol_End = Power_Li;//(Sumn_T-(Sumn_T>>2)-13); //(Sumn_T*0.7);
break;
}
default: break;
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void ZQ_Key()
{
if((Bj_NoW == OFF) && (Bj_QD == OFF))
{
if(Work_ZQ == ON)
{
Work_ZQ = OFF;
cbi(JRQ_PORT,JR);
State_LED |= LED_ZQOFF;
LED_Display(State_LED);
State_Speak = VOICE4;
SPEAK();
TCCR1B = 0X0;
TIMSK1 &= ~_BV(TOIE1);
}
else
{
Work_ZQ = ON;
sbi(JRQ_PORT,JR);
State_LED &= LED_ZQ;
LED_Display(State_LED);
State_Speak = VOICE3;
SPEAK();
T1_Count = 0;
T1_Gs = 7;//10;
TCNT1 = 0X0;
TCCR1B = _BV(CS12)|_BV(CS10);
TIMSK1 =_BV(TOIE1);
Bj_QD = 0;
}
}
}
//****************************************************************************************
int main()
{
uchar Key1_In,Key2_In,Ad_Buf1,min,max;
INIT();
State_LED =0xFF;
LED_Display(State_LED);
DelayMs(10);
VO_Time();
First: while( (PINB & POWER) != 0 ); //判断POWER键
POWER_Key();
while( (PINB & POWER) == 0 );
sei();
START: while( Work_Power == ON)
{
if( Work_ZK == ON)
{
while((PIND & SYN) == 0);
while((PIND & SYN) != 0);
Motol_Work();
}
Key1_In = PINB;
if((Key1_In & NoW )!= 0) //无水
{
if(Bj_NoW == OFF)
NoW_Key();
}
if( (Key1_In & CM) == 0) //尘满
{
if(State_Motol ==1)
{
if(Bj_CM == OFF )
CM_Key();
}
}
// if((Key1_In & QD ) != 0) //倾到
// {
// if(Bj_QD == OFF )
// QD_Key();
// }
// else
// Bj_QD = OFF;
//***************************************************************
KEY_ADC(6);
if(Sumn_Key > KEY_ADC4V)
{
KEY_ADC(7);
if(Sumn_Key > KEY_ADC4V)
Put_Key =0;
}
//***************************************************************
if(Put_Key == 0)
{
KEY_ADC(6);
Ad_Buf1 = Sumn_Key;
KEY_ADC(6);
min = (Ad_Buf1 >= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
max = (Ad_Buf1 <= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
if( (max -min ) < 50)
{
if( Sumn_Key < KEY_ADC4V )
{
if( Sumn_Key > KEY_ADC2V)
{
Put_Key = 1;
if((Work_ZK == ON) && (State_Motol >1))
UP_Key(); //真空键+
}
else
{
Put_Key = 1;
ZK_Key(); //真空键
}
}
}
KEY_ADC(7);
Ad_Buf1 = Sumn_Key;
KEY_ADC(7);
min = (Ad_Buf1 >= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
max = (Ad_Buf1 <= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
if( (max-min) <50 )
{
if( Sumn_Key < KEY_ADC4V )
{
if( Sumn_Key > KEY_ADC2V )
{
Put_Key = 1;
ZQ_Key(); //蒸汽键
}
else
{
Put_Key = 1;
if((Work_ZK == ON) && (State_Motol <3))
DOWN_Key(); //真空键-
}
}
}
}
if((PINB & POWER) == 0 )
POWER_Key();
}
goto First;
return 0;
}
// if((Key1_In & ZQ ) != 0)
// goto ZQ_Key;
// Key2_In = PINB;
// if((Key2_In & UP) != 0 )
// {
// State_Ykonq =1; //遥控器工作
// goto UP_Key;
// }
// if((Key2_In & ZK) != 0 )
// {
// State_Ykonq=1;
// goto ZK_Key;
// }
// if((Key2_In & ZQON) != 0 )
// {
// State_Ykonq=1;
// goto ZQON_Key;
// }
// if((Key2_In & ZQOFF) != 0 )
// {
// State_Ykonq=1;
// goto ZQOFF_Key;
// }
// if((Key2_In & DOWN) != 0 )
// {
// State_Ykonq=1;
// goto DOWN_Key;
// }
// else
// {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -