首页资源分类嵌入式处理器STM8 > 空气净化器源程序

空气净化器源程序

已有 445025个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:空气净化器源程序STM8

    分    享:

    文档简介

    空气净化器源程序  STM8

    文档预览

    /*********************************************************************************/ //标 题: 空气净化器源程序 //文件名: main.c //版 本: V2.0 //日 期: 2013-04-08 by ** //更 改: 增加空气质量传感器模块和负离子发生器模块 //硬 件:芯片STM8S103K3,内部16M的RC振荡器经2分频后的8M时钟频率作为系统时钟 //软 件:Cosmic 和STVD /***********************************************************************************/ #include "stm8s.h" #include "stm8s_gpio.h" #include "stm8s_clk.h" #include "stm8s_it.h" #include "my_type.h" #define uint unsigned int #define uchar unsigned char #define u8 unsigned char #define u16 unsigned short #define u32 unsigned long #define key_value_power 0x1e #define key_value_time 0x1d #define key_value_speed 0x1b #define key_value_anion 0x1c #define key_null 0x1f #define key_long_period 500 #define key_continue_period 25 #define key_down 0x800 #define key_long 0x400 #define key_continue 0x200 #define key_up 0x100 #define key_state_init 0 #define key_state_wobble 1 #define key_state_press 2 #define key_state_long 3 #define key_state_continue 4 #define key_state_release 5 #define time_wobble 30 #define time_key_long 500 //按键宏定义 #define key_power GPIO_ReadInputPin(GPIOC,GPIO_PIN_2)//电源键 #define key_time GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)//定时键 #define key_speed GPIO_ReadInputPin(GPIOF,GPIO_PIN_4)//调速键 #define key_anion GPIO_ReadInputPin(GPIOC,GPIO_PIN_3)//负离子键 //指示灯宏定义 #define LED_A_on GPIO_WriteHigh(GPIOD,GPIO_PIN_4) #define LED_A_off GPIO_WriteLow(GPIOD,GPIO_PIN_4) #define LED_B_on GPIO_WriteHigh(GPIOD,GPIO_PIN_6) #define LED_B_off GPIO_WriteLow(GPIOD,GPIO_PIN_6) #define LED_C_on GPIO_WriteHigh(GPIOC,GPIO_PIN_5) #define LED_C_off GPIO_WriteLow(GPIOC,GPIO_PIN_5) #define LED_D_on GPIO_WriteHigh(GPIOD,GPIO_PIN_2) #define LED_D_off GPIO_WriteLow(GPIOD,GPIO_PIN_2) #define LED_E_on GPIO_WriteHigh(GPIOD,GPIO_PIN_0) #define LED_E_off GPIO_WriteLow(GPIOD,GPIO_PIN_0) #define LED_F_on GPIO_WriteHigh(GPIOC,GPIO_PIN_7) #define LED_F_off GPIO_WriteLow(GPIOC,GPIO_PIN_7) #define LED_G_on GPIO_WriteHigh(GPIOC,GPIO_PIN_4) #define LED_G_off GPIO_WriteLow(GPIOC,GPIO_PIN_4) #define LED_H_on GPIO_WriteHigh(GPIOB,GPIO_PIN_6) #define LED_H_off GPIO_WriteLow(GPIOB,GPIO_PIN_6) #define LED_I_on GPIO_WriteHigh(GPIOB,GPIO_PIN_7) #define LED_I_off GPIO_WriteLow(GPIOB,GPIO_PIN_7) #define LED_J_on GPIO_WriteHigh(GPIOA,GPIO_PIN_2) #define LED_J_off GPIO_WriteLow(GPIOA,GPIO_PIN_2) #define LED_K_on GPIO_WriteHigh(GPIOA,GPIO_PIN_1) #define LED_K_off GPIO_WriteLow(GPIOA,GPIO_PIN_1) #define LED_L_on GPIO_WriteHigh(GPIOA,GPIO_PIN_3) #define LED_L_off GPIO_WriteLow(GPIOA,GPIO_PIN_3) #define LED_M_on GPIO_WriteHigh(GPIOB,GPIO_PIN_1) #define LED_M_off GPIO_WriteLow(GPIOB,GPIO_PIN_1) //指示灯公共端宏定义 #define LED_on GPIO_WriteHigh(GPIOD,GPIO_PIN_3) #define LED_off GPIO_WriteLow(GPIOD,GPIO_PIN_3) //蜂鸣器控宏定义 #define beep_on GPIO_WriteHigh(GPIOC,GPIO_PIN_1) #define beep_off GPIO_WriteLow(GPIOC,GPIO_PIN_1) //风机控制宏定义 #define fan_on GPIO_WriteLow(GPIOB,GPIO_PIN_3) #define fan_off GPIO_WriteHigh(GPIOB,GPIO_PIN_3) //负离子发生器宏定义 #define anion_on GPIO_WriteHigh(GPIOB,GPIO_PIN_2) #define anion_off GPIO_WriteLow(GPIOB,GPIO_PIN_2) //压差报警宏定义 #define warning GPIO_ReadInputPin(GPIOB,GPIO_PIN_5) //空气净化传感器宏定义(TTL电平) #define sensors GPIO_ReadInputPin(GPIOE,GPIO_PIN_5) //置0,置1宏定义 #define SET_FLAG(N,F) ( (N) |= (1 << (F) ) )//置1 #define CLR_FLAG(N,F) ( (N) &=~(1 << (F) ) )//置0 //断码宏定义 #define A 0; #define B 1; #define C 2; #define D 3; #define E 4; #define F 5; #define G 6; #define H 7; #define I 8; #define J 9; #define K 10; #define L 11; #define M 12; bool task1=0;//1ms bool task2=0;//1s bool task3=0;//30min bool task4=0;//1H bool task5=0;//2H bool task6=0;//4H bool flag_key_down=0; bool exti_flag=0; bool exti_time_flag=0; bool warning_flag=0; bool sensors_flag1=0; bool sensors_flag2=0; u8 led_data[1];//只有一个位选 u8 led_datatable[13]={0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08, 0x09,0x0a,0x0b,0x0c,0x0d};//A/B/C/D/E/F/G/H/I/J/K/L/M u8 key_power_count=0;//电源按键计数器 u8 key_time_count=0;//定时按键计数器 u8 key_speed_count=0;//档位按键计数器 u8 key_anion_count=0;//负离子按键计数器 u8 warning_count=0;//压差报警检测次数计数器 u8 warning_beep_count=0; u8 sensors_count1=0;//空气质量传感器检测信号次数 u8 sensors_count2=0; u16 beep_short_time=0; u16 beep_long_time=0; uchar s_u8keystate=key_state_init; uint s_u8keytimecount=0; uint s_u8lastkey=key_null; uchar time_key_acc=0; //****************时钟初始化函数****************// void CLK_init(void) { CLK_DeInit();//恢复时钟寄存器到默认值 CLK_HSICmd(ENABLE);//启动内部高速振荡器 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);//配置内部高速振荡器为2分频 //CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);//CPU时钟2分频 CLK_ClockSecuritySystemEnable(); //启动时钟安全系统,一旦启用就不能关闭,直到下一次复位 } //***************GPIO初始化函数**************// void GPIO_init(void) { GPIOA->DDR=0xff;//0为输入,1为输出 GPIOA->CR1=0xff;//0为浮空输入,1为带上拉输入;0为开漏输出,1为推挽输出 GPIOA->CR2=0x00;//0为禁止外部中断使能,1为启动外部中断使能,0为低速,1为高速 GPIOB->DDR=0xce;//ce GPIOB->CR1=0xff;//PB0作为AD输入口要配置为浮空输入 GPIOB->CR2=0x00;//PB0口作为AD输入口,使能PB4外部中断0想0x10 GPIOC->DDR=0xb3; GPIOC->CR1=0xff; GPIOC->CR2=0x00; GPIOD->DDR=0xdd; GPIOD->CR1=0xff; GPIOD->CR2=0x20; GPIOE->DDR=0xdf; GPIOE->CR1=0xff; GPIOE->CR2=0x00; GPIOF->DDR=0xef; GPIOF->CR1=0xff; GPIOF->CR2=0x00; } //**************定时器初始化函数**********************// void TIME2_init(void) { //第一种方式设定TIM2,用的库,比较清楚 //TIM2_DeInit(); //TIM2_TimeBaseInit(TIM2_PRESCALER_16,999);//定时1ms //TIM2_SetCounter(999);//给计数器赋值,当启动计数器时令其立即产生更新事件,这样分频才有效 //TIM2_ITConfig(TIM2_IT_UPDATE,ENABLE); //TIM2_Cmd(ENABLE); //下面是第二种方式设定TIM2,也同样是0.1ms中断,可以用 TIM2->PSCR=0X00;//配置TIM2预分频=0 TIM2->ARRH=0X03;//8MHz 每次计数时间是0.000125ms 0.1ms 计数器累加800=0x3200 TIM2->ARRL=0X20; TIM2->CNTRH=0X03;//赋值,启动时立即产生更新时间,这样分频才有效 TIM2->CNTRL=0X20;//分频为2分频 TIM2->CR1 |=0X81;//开始计数 TIM2->IER|=0X01;//更新中断使能 } /*void TIME4_init(void) { TIM4->PSCR=0X04;//16分频 TIM4->CNTR=(0XFF-0X4B);//0.1MS中断 TIM4->ARR=(0XFF-0X4B); TIM4->CR1|=0X81; //开始计数 TIM4->IER|=0X01; //更新中断使能 }*/ //**********外部中断初始化函数*************// void EXTI_init(void) { EXTI_DeInit();//恢复外部中断寄存器到默认值 //EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_RISE_ONLY);//上升沿触发 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_RISE_FALL);//上升沿或者下降沿触发 //EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_LOW);//下降沿和低电平触发 } /**********AD初始化函数*******/ /*void AD_init(void) { ADC1->CR1=0x00;//预分屏,单次转换模式 ADC1->CR2=0x00;//数据左对齐 ADC1->CSR=0x00;//选择通道0 //ADC1->CR1|=0x01;//第一次开AD,把AD从低功耗模式下唤醒 //Delayms(1); //ADC1->CR1|=0x01;//第二次开AD,启动AD转换 }*/ //****************蜂鸣器开关函数********************// void beep(u16 beep_state) { if(beep_state==1)//蜂鸣器短叫一声 { beep_short_time=100; beep_long_time=0; beep_on; } if(beep_state==2)//蜂鸣器长鸣三声 { beep_short_time=0; beep_long_time=2500; beep_on; } } //*******************按键扫描函数**********************// uchar keyscan(void) { if(key_power==0) return key_value_power;//电源键 if(key_time==0) return key_value_time;//定时键 if(key_speed==0) return key_value_speed;//档位键 if(key_anion==0) return key_value_anion;//负离子键 return key_null; } //*********************按键状态读取函数****************************// void getkey(uint *pkey_value) { uint keytemp = key_null;//先将空键值赋给keytemp keytemp=keyscan(); // 获取键值 switch(s_u8keystate) { case key_state_init://初始化状态下 { if(key_null!=(keytemp))//说明有按键按下 { s_u8keystate = key_state_wobble; time_key_acc=time_wobble;//按键释放 消抖动 } } break; case key_state_wobble://抖动状态下 { s_u8keystate=key_state_press; } break; case key_state_press://按键按下状态 { if(key_null!=(keytemp))//按键还没有释放 { s_u8lastkey=keytemp;//保存键值,以便在释放按键状态返回键值 keytemp |=key_down;//key_down的值赋给key_temp s_u8keystate=key_state_long; } else { s_u8keystate=key_state_init;//否则是按键抖动,回到初始化状态 } } break; case key_state_long://在按键长按状态 { if(key_null!=(keytemp))//按键还没有释放 { if(++s_u8keytimecount > key_long_period)//如果大于按键周期,则判断为按键长按 { //s_u8KeyTimeCount=0; s_u8keytimecount=key_long_period; keytemp|=key_long;//长按键事件发生 //s_u8KeyState=KEY_STATE_CONTINUE;//continue 没有用到 } } else { s_u8keystate=key_state_release;//否则按键释放 s_u8keytimecount=0;//清零 } } break; /* //没有用到,注释 case KEY_STATE_CONTINUE: { if(KEY_NULL!=(KeyTemp)) { if(++s_u8KeyTimeCount > KEY_CONTINUE_PERIOD) { s_u8KeyTimeCount=0; KeyTemp|=KEY_CONTINUE; } } else { s_u8KeyState=KEY_STATE_RELEASE; s_u8KeyTimeCount=0; } } break; */ case key_state_release://在按键释放状态下 { s_u8lastkey|=key_up;//按键抬起 keytemp=s_u8lastkey;//将键值赋给keytemp s_u8keystate=key_state_init;//按键进入初始化状态,以便再次扫描 time_key_acc=time_wobble;//按键释放 消抖动 } break; default:;break; } *pkey_value=keytemp;//返回键值 } //**************按键处理函数***************// void key_handle(void) { uint key_value=key_null; getkey(&key_value); if(key_value==(key_value_power|key_down)&&flag_key_down==1)//==优先级大于&& { beep(1);//蜂鸣器响一声 flag_key_down=0;//按键释放消抖结束后按键才有效,才能第二次按下 key_power_count++; if(key_power_count>=3) { key_power_count=1; } } if(key_value==(key_value_time|key_down)&&flag_key_down==1&&key_power_count==1)//电源键关掉,其他按键失灵 { beep(1); flag_key_down=0; if(key_power_count==1)//当电源键按下后才可以进行操作 { key_time_count++; if(key_time_count>=6) { key_time_count=1; } } } if(key_value==(key_value_speed|key_down)&&flag_key_down==1&&key_power_count==1)//电源键关掉,其他按键失灵 { beep(1); flag_key_down=0; if(key_power_count==1)//电源键按下后才可以进行操作 { key_speed_count++; if(key_speed_count>=6) { key_speed_count=1; } } } if(key_value==(key_value_anion|key_down)&&flag_key_down==1&&key_power_count==1)//电源键关掉,其他按键失灵 { beep(1); flag_key_down=0; if(key_power_count==1)//电源键按下后才可以进行操作 { key_anion_count++; if(key_anion_count>=3) { key_anion_count=1; } } } } //**********微秒延时函数********// void delay_us(u16 time)//time是多少就延时多少us { do { time--; } while(time>1); } //**********脉冲波形************// void impulse (void)//脉冲宽度为200us的方波 { fan_on; delay_us(200); fan_off; delay_us(200); } //****************显示函数***********************// /*void display(void) { LED_on; if(key_power_count==1) LED_A_on; else {LED_off;LED_A_off;LED_B_off;LED_C_off;LED_D_off;LED_E_off; LED_F_off;LED_G_off;LED_H_off;LED_I_off;LED_J_off;LED_K_off; LED_L_off;LED_M_off;fan_off;anion_off; } if(key_) }*/ /*void display(const u8 *datatable ,const u8 *data) { u8 temp; LED_on;//打开公共端 temp=datatable[data[1]];//解码LED段选 if(temp & 0x01) LED_A_on; else LED_A_off; if(temp & 0x02) LED_B_on; else LED_B_off; if(temp & 0x03) LED_C_on; else LED_C_off; if(temp & 0x04) LED_D_on; else LED_D_off; if(temp & 0x05) LED_E_on; else LED_E_off; if(temp & 0x06) LED_F_on; else LED_F_off; if(temp & 0x07) LED_G_on; else LED_G_off; if(temp & 0x08) LED_H_on; else LED_H_off; if(temp & 0x109) LED_I_on; else LED_I_off; if(temp & 0x0a) LED_J_on; else LED_J_off; if(temp & 0x0b) LED_K_on; else LED_K_off; if(temp & 0x0c) LED_L_on; else LED_L_off; if(temp & 0x0d) LED_M_on; else LED_M_off; }*/ //***************运行函数*********************// void run(void) { unsigned char a; if(task3==0&&task4==0&&task5==0&&task6==0)//定时时间是否到 { LED_on; if(key_power_count==1) { LED_A_on; //SET_FLAG(led_data[1],A);//打开电源指示灯 if(!warning)//是否检测到报警信号 { if(++warning_count>=10)//连续检测十次 { warning_count=0; warning_flag=1;//让蜂鸣器不会响第二次 //led_data[1]=M;//报警灯亮起 //beep(2); } } else//十次中有一次未检测到就要重新开始计数 { warning_count=0;//重新开始计数 warning_beep_count=0; LED_M_off; //CLR_FLAG(led_data[1],M); } if(warning_flag==1&&key_power_count==1)//一开机就检测是否过载 { warning_flag=0; //SET_FLAG(led_data[1],M); LED_M_on;//led_data[1]=M;//报警指示灯亮 if(++warning_beep_count==1) { beep(2); } warning_beep_count=1; } } else { LED_A_off;LED_B_off;LED_C_off;LED_D_off;LED_E_off;LED_F_off; LED_G_off;LED_H_off;LED_I_off;LED_J_off;LED_K_off;LED_L_off;LED_M_off; fan_off;LED_off; key_time_count=0;//时间按键次数计时器清零 key_speed_count=0;//速度按次数计时器清零 key_anion_count=0; warning_count=0;//报警计数器清零 warning_beep_count=0; } if(key_time_count==1) LED_C_on;//led_data[1]=C;//常开指示灯 else LED_C_off; if(key_time_count==2) LED_D_on;//led_data[1]=D;//半小时指示灯 else LED_D_off; if(key_time_count==3) LED_E_on;//led_data[1]=E;//一小时指示灯 else LED_E_off; if(key_time_count==4) LED_F_on;//led_data[1]=F;//两小时指示灯 else LED_F_off; if(key_time_count==5) LED_G_on;//led_data[1]=G;//四小时指示灯 else LED_G_off; if(key_speed_count==1) { LED_H_on;//led_data[1]=H;//5档指示灯 if(!sensors)//检测空气质量信号 { sensors_count2=0;//检测到一半后检测不到要清零 if(++sensors_count1>=10)//连续检测空气质量信号十次 { sensors_count1=0; sensors_flag1=1; if(exti_flag==1&&exti_time_flag==1) { fan_on; exti_flag=0;exti_time_flag=0; } } } else { sensors_count1=0;//检测到一半后检测不到要清零 sensors_flag2=1; if(exti_flag==1&&exti_time_flag==1) { for(a=3;a>0;a--) { impulse(); } exti_flag=0;exti_time_flag=0; } //} } //led_data[3]=0;//数组一定要清零,否则循环时LED11关不掉 /*if(exti_flag==1&&exti_time_flag==1)//检测到零点并且计时时间到 { fan_on; exti_flag=0;exti_time_flag=0; }*/ } else LED_H_off; if(key_speed_count==2) { LED_I_on;//led_data[1]=I;//4档指示灯 if(exti_flag==1&&exti_time_flag==1)//检测到零点并且计时时间到 { for(a=3;a>0;a--) { impulse();//fan_on; } exti_flag=0;exti_time_flag=0; } } else LED_I_off; if(key_speed_count==3) { LED_J_on;//led_data[1]=J;//3档指示灯 if(exti_flag==1&&exti_time_flag==1)//检测到零点并且计时时间到 { for(a=3;a>0;a--) { impulse();//fan_on; } exti_flag=0;exti_time_flag=0; } } else LED_J_off; if(key_speed_count==4) { LED_K_on;//led_data[1]=K;//二档指示灯 if(exti_flag==1&&exti_time_flag==1)//检测到零点并且计时时间到 { for(a=3;a>0;a--) { impulse();//fan_on; } exti_flag=0;exti_time_flag=0; } } else LED_K_off; if(key_speed_count==5) { LED_L_on;//led_data[1]=L;//一档指示灯 if(exti_flag==1&&exti_time_flag==1)//检测到零点并且计时时间到 { for(a=3;a>0;a--) { impulse();//fan_on; } exti_flag=0;exti_time_flag=0; } } else LED_L_off; if(key_anion_count==1) { LED_B_on;//led_data[1]=B//负离子发生器指示灯亮 anion_on;//打开负离子发生器 } else { LED_B_off; anion_off; } /*if(!sensors&&key_time_count==1&&key_speed_count==1)//检测到空气质量不好 { if(!sensors) { sensors_count++; if(sensors_count==10) { key_speed_count=1; sensors_count=0; } } else sensors_count=0; }*/ } else { task3=0;task4=0;task5=0;task6=0;key_power_count=0;key_anion_count=0;//清零计数器 LED_A_off;LED_B_off;LED_C_off;LED_D_off;LED_E_off;LED_F_off; LED_G_off;LED_H_off;LED_I_off;LED_J_off;LED_K_off;LED_L_off;LED_M_off; LED_off; fan_off; anion_off; beep(2); } } //**********************主函数****************************// void main() { CLK_init(); GPIO_init(); TIME2_init(); EXTI_init(); enableInterrupts();//开总中断 beep_off;//因为上电初始化时蜂鸣器会响,所以关掉它 fan_off; anion_off; LED_off; LED_A_off;LED_B_off;LED_C_off;LED_D_off;LED_E_off;LED_F_off; LED_G_off;LED_H_off;LED_I_off;LED_J_off;LED_K_off;LED_L_off;LED_M_off; while (1) { if(task1==1)//1ms到 { task1=0;//1ms标志位清零 if(!time_key_acc)//消抖时间结束后进行按键的扫描 { key_handle(); } run(); /*if(key_power_count==1)//开机显示 { //display(); display(led_datatable,led_data); }*/ if(beep_short_time>0&&beep_long_time==0) { beep_short_time--; if((beep_short_time>0&&beep_short_time<250)||(beep_short_time>500&&beep_short_time<750)) { beep_on;//0~50ms和100~150ms之间响两次,周期为50ms } else { beep_off; } } if(beep_long_time>0&&beep_short_time==0) { beep_long_time--; if((beep_long_time>0&&beep_long_time<500)||(beep_long_time>1000&&beep_long_time<1500)||(beep_long_time>2000&&beep_long_time<2500)) { beep_on;//0~500ms和1000~1500ms之间响两次,周期为500ms } else { beep_off; } } } } }

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高员外,我们会尽快处理。