ÃÀÀöµÄ´óº££¬¹ÊÏçµÄÇ黳

?

#include "mq2.h" /** * @brief MQ2&sup3;õÊ&frac14;»¯&sup3;ÌÐò * @param ÎÞ * @retval ÎÞ */ void MQ2_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //¿ªÆôGPIOAµÄʱÖÓ //PA4 ×÷ΪģÄâͨµÀÊäÈëÒý&frac12;Å GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Pin = MQ2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(MQ2_PROT, &GPIO_InitStructure); } /** * @brief MQ2 ADCÊý&frac34;ݶÁÈ¡ * @param ÎÞ * @retval ·µ»Ø×ª»»ºóµÄMQ2Ä£ÄâÐźÅÊýÖµ */ uint32_t MQ2_ADC_Read(void) { //ÉèÖÃÖ¸¶¨ADCµÄ&sup1;æÔò×éͨµÀ£¬²ÉÑùʱ&frac14;ä return ADC_GetValue(ADC_Channel_4, ADC_SampleTime_55Cycles5); } /** * @brief »ñÈ¡MQ2Ä£ÄâÐÅºÅÆ&frac12;&frac34;ùÖµ * @param ÎÞ * @retval ·µ»ØËã&sup3;öµÄMQ2Ä£ÄâÐÅºÅÆ&frac12;&frac34;ùÖµ */ u16 MQ2_Average_Data(void) { u16 temp_val=0; u8 t; for(t=0;t<SMOG_READ_TIMES;t++) //#define SMOG_READ_TIMES 10 ¶¨ÒåÑÌÎí´«¸ÐÆ÷¶ÁÈ¡´ÎÊý,¶ÁÕâô¶à´Î,È»ºóÈ¡Æ&frac12;&frac34;ùÖµ { temp_val+=MQ2_ADC_Read(); //¶ÁÈ¡ADCÖµ Delay_ms(5); } temp_val/=SMOG_READ_TIMES;//µÃµ&frac12;Æ&frac12;&frac34;ùÖµ return (u16)temp_val;//·µ»ØËã&sup3;öµÄADCÆ&frac12;&frac34;ùÖµ } /** * @brief »ñÈ¡MQ2µÄµçÑ&sup1;ÊýÖµ * @param ÎÞ * @retval ·µ»ØËã&sup3;öµÄMQ2µçÑ&sup1;ÊýÖµ */ float MQ2_Voltage_Data(void) { u16 adc_value = 0;//ÕâÊÇ´ÓMQ-2´«¸ÐÆ÷Ä£¿éµçÑ&sup1;Êä&sup3;öµÄADCת»»ÖлñµÃµÄÔ­Ê&frac14;Êý×ÖÖµ£¬¸ÃÖµµÄ·¶Î§Îª0µ&frac12;4095£¬&frac12;«Ä£ÄâµçÑ&sup1;±íÊ&frac34;ΪÊý×ÖÖµ float voltage = 0;//MQ-2´«¸ÐÆ÷Ä£¿éµÄµçÑ&sup1;Êä&sup3;ö adc_value = MQ2_Average_Data(); Delay_ms(5); voltage = (3.3f/4096.f)*(adc_value); return voltage; } /********************* // ´«¸ÐÆ÷У×&frac14;º¯Êý£¬¸ù&frac34;ݵ±Ç°»·&frac34;&sup3;PPMÖµÓë²âµÃµÄRSµçÑ&sup1;Öµ£¬·´ÍÆ&sup3;öR0Öµ¡£ // ÔÚ¿ÕÆøÖÐÔËÐÐ&sup1;ýºó²â&sup3;öR0Ϊ35 float MQ2_PPM_Calibration() { float RS = 0; float R0 = 0; RS = (3.3f - Smog_Get_Vol()) / Smog_Get_Vol() * RL;//RL 10 // RL×èÖµ R0 = RS / pow(CAL_PPM / 98.322, 1 / -1.458f);//CAL_PPM 10 // У×&frac14;»·&frac34;&sup3;ÖÐPPMÖµ return R0; } **********************/ /** * @brief »ñÈ¡MQ2µÄPPMÊýÖµ * @param ÎÞ * @retval ·µ»ØËã&sup3;öµÄMQ2 PPMÊýÖµ */ float Smog_GetPPM(void) //¸ÃËã·¨µÃ&sup3;öµÄppmÊýÖµ»á´ïµ&frac12;ÉÏÍò£¬ÓÉÓÚÏÔÊ&frac34;²»·&frac12;±ã&sup1;ÊÔݲ»Ê&sup1;Óᣠ{ // float RS = (3.3f - MQ2_Voltage_Data()) / MQ2_Voltage_Data() * RL; // float ppm = 98.322f * pow(RS/R0, -1.458f); float ppm = MQ2_Voltage_Data() * 100; return ppm; } 以上是我的main.c文件
04-01
#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "led.h" /************************************************ ALIENTEK &frac34;«Ó¢°æSTM32¿ª·¢°åUCOSʵÑé Àý6-1 UCOSIII ÈÎÎñ´´&frac12;¨ÓÚÉ&frac34;&sup3;ý &frac14;&frac14;ÊõÖ§&sup3;Ö£ºwww.openedv.com ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com &sup1;Ø×¢Î¢ÐÅ&sup1;«ÖÚÆ&frac12;̨΢Ðźţº"ÕýµãÔ­×Ó"£¬Ãâ·Ñ»ñÈ¡STM32×ÊÁÏ¡£ &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; ×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK ************************************************/ //UCOSIIIÖÐÒÔÏÂÓÅÏÈ&frac14;¶Óû§&sup3;ÌÐò²»ÄÜÊ&sup1;Óã¬ALIENTEK //&frac12;«ÕâЩÓÅÏÈ&frac14;¶·ÖÅ䏸ÁËUCOSIIIµÄ5¸öϵÍ&sup3;ÄÚ²¿ÈÎÎñ //ÓÅÏÈ&frac14;¶0£ºÖжϷþÎñ·þÎñ&sup1;ÜÀíÈÎÎñ OS_IntQTask() //ÓÅÏÈ&frac14;¶1£ºÊ±ÖÓ&frac12;ÚÅÄÈÎÎñ OS_TickTask() //ÓÅÏÈ&frac14;¶2£º¶¨Ê±ÈÎÎñ OS_TmrTask() //ÓÅÏÈ&frac14;¶OS_CFG_PRIO_MAX-2£ºÍ&sup3;&frac14;ÆÈÎÎñ OS_StatTask() //ÓÅÏÈ&frac14;¶OS_CFG_PRIO_MAX-1£º¿ÕÏÐÈÎÎñ OS_IdleTask() /* ΪÁËʵÏÖÁÙ&frac12;çÇøµÄ±£»¤£¬UCOSIIIÌá&sup1;©ÁËÁ&frac12;¸öºê£ºOS_CRITICAL_ENTER() ºÍOS_CRITICAL_EXIT()¡£ µ±Ò»¸öÈÎÎñ»òÖжÏ&frac12;øÈëÁÙ&frac12;çÇøÊ±£¬Ëü±ØÐëµ÷ÓÃOS_CRITICAL_ENTER()ºêÒÔ»ñµÃÁÙ&frac12;çÇøµÄ±£»¤¡£ Õâ¸öºê&frac12;«&frac12;ûÓÃÖжϣ¬ÒÔÈ·±£Ö´ÐÐÁÙ&frac12;çÇøµÄ´úÂë²»»á±»ÖжϻòÇÀÕ&frac14;£¬´Ó¶ø±£Ö¤ÁËÁÙ&frac12;çÇøµÄÔ­×ÓÐÔ¡£ µ±´úÂëÖ´ÐÐÍê±Ïʱ£¬ÈÎÎñ»òÖжϱØÐëµ÷ÓÃOS_CRITICAL_EXIT()ºêÀ´»Ö¸´Öжϣ¬ÒÔ±ãÆäËûÈÎÎñºÍÖжϿÉÒÔ·ÃÎÊ&sup1;²Ïí×ÊÔ´²¢Ö´ÐÐËüÃǵĴúÂë¡£ Ê&sup1;ÓÃOS_CRITICAL_ENTER()ºÍOS_CRITICAL_EXIT()ºêÀ´±£»¤ÁÙ&frac12;çÇø£¬ ÄÇôÔÚÈÎÎñT1Ö´ÐеÄÕû¸öʱ&frac14;äÄÚ£¬ÖжÏ&frac12;«±»&frac12;ûÓ㬠ÆäËûÈÎÎñ&frac12;«²»ÄÜ·ÃÎÊ&sup1;²Ïí×ÊÔ´²¢ÇÒÁÙ&frac12;çÇøµÄ´úÂë&frac12;«ÒÔÔ­×Ó·&frac12;Ê&frac12;Ö´ÐÐÍê±Ï¡£ ÕâÑù¿ÉÒÔÈ·±£ÁÙ&frac12;çÇø´úÂëµÄÕýÈ·ÐÔ£¬±ÜÃâ&frac34;ºÕùÌõ&frac14;þºÍÆäËûͬ²&frac12;ÎÊÌâ¡£ */ /* ÔÚUCOS IIIÖУ¬ÈÎÎñµÄÖ´ÐÐË&sup3;ÐòÊÇ»ùÓÚÓÅÏÈ&frac14;¶µ÷¶ÈËã·¨¡£ ÿ¸öÈÎÎñ¶&frac14;ÓÐÒ»¸öÓÅÏÈ&frac14;¶£¨0µ&frac12;255£©£¬&frac34;ßÓиü¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ±ÈµÍÓÅÏÈ&frac14;¶µÄÈÎÎñ¸ü¿ÉÄܵõ&frac12;µ÷¶È¡£ UCOS IIIÊ&sup1;ÓÃÇÀÕ&frac14;Ê&frac12;µ÷¶È£¬ÕâÒâζ×ŵ±ÓÐÒ»¸ö¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ&frac34;ÍÐ÷ʱ£¬µ±Ç°ÕýÔÚÖ´ÐеÄÈÎÎñ&frac12;«±»Öжϲ¢ÇÒ¸ßÓÅÏÈ&frac14;¶ÈÎÎñ&frac12;«±»Ö´ÐС£ ÕâÈ·±£ÁË&frac34;ßÓиü¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ¿ÉÒÔ&frac14;°Ê±»ñµÃÖ´ÐУ¬±ÜÃâ&sup3;¤Ê±&frac14;ä±»µÍÓÅÏÈ&frac14;¶ÈÎÎñÕ&frac14;Óô¦ÀíÆ÷µÄÇé¿ö·¢Éú¡£ UCOS IIIÈÎÎñµÄÖ´ÐÐÊÇͨ&sup1;ýÉÏÏÂÎÄÇл»ÊµÏֵġ£ ÉÏÏÂÎÄÇл»ÊÇÖ¸&frac12;«´¦ÀíÆ÷µÄ״̬´ÓÒ»¸öÈÎÎñ±£´æµ&frac12;Äڴ棬Ȼºó&frac12;«ÁíÒ»¸öÈÎÎñµÄ×´Ì¬×°ÔØµ&frac12;´¦ÀíÆ÷ÖУ¬ÒÔÔÚ²»&frac14;ä¶ÏµÄÇé¿öÏÂת»»ÈÎÎñÖ´ÐС£ µ±Ò»¸öÈÎÎñÐèÒª±»ÖÐÖ&sup1;ʱ£¬&frac14;´Ö´ÐÐOS_TaskSuspend()º¯Êýʱ£¬UCOS III´¦ÀíÆ÷»áÖ´ÐÐÒ»¸öÈÎÎñÇл»Öжϲ¢&frac12;«¿ØÖÆÈ¨×ªÒƵ&frac12;ÁíÒ»¸öÈÎÎñ¡£ ÈÎÎñÇл»Í¨&sup3;£·¢ÉúÔÚÒÔÏÂÇé¿öÏ£º µ±ÈÎÎñÖ÷¶¯µ÷ÓÃÁËÈÎÎñ¿ØÖƺ¯Êý£¨ÀýÈ磬OS_Delay()¡¢OS_EventWait()¡¢OS_TaskSuspend()µÈ£©²¢ÍËÈÃCPUʱ£» µ±Ä&sup3;¸öÖжϷþÎñ&sup3;ÌÐò(ISR)ÔÚ&sup1;Ø&frac14;üÈÎÎñÖ´ÐÐÆÚ&frac14;äÖ´ÐУ¨&frac14;´ÖжÏÓÅÏÈ&frac14;¶¸ßÓÚ&sup1;Ø&frac14;üÈÎÎñµÄÓÅÏÈ&frac14;¶£©¡£ */ //¿ªÊ&frac14;ÈÎÎñ£¬´´&frac12;¨ÍêÈÎÎñ¶þºÍÈÎÎñÈý&frac34;ÍÉ&frac34;&sup3;ý×Ô&frac14;º //ÈÎÎñÓÅÏÈ&frac14;¶ #define START_TASK_PRIO 3 //ÈÎÎñ¶ÑÕ»´óС #define START_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB StartTaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK START_TASK_STK[START_STK_SIZE]; //ÈÎÎñº¯Êý void start_task(void *p_arg); ///ÈÎÎñ¶þÁÁµÆ£¬²¢´òÓ¡&sup3;öÐÅÏ¢ //ÈÎÎñÓÅÏÈ&frac14;¶ #define TASK1_TASK_PRIO 4 //ÈÎÎñ¶ÑÕ»´óС #define TASK1_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task1_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); ///ÈÎÎñÈý£¬´òÓ¡ÈÎÎñÈýÖ´ÐÐÐÅÏ¢ //ÈÎÎñÓÅÏÈ&frac14;¶ #define TASK2_TASK_PRIO 5 //ÈÎÎñ¶ÑÕ»´óС #define TASK2_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task2_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; //ÈÎÎñº¯Êý void task2_task(void *p_arg); volatile u8 key_pressed = 0; volatile u8 current_task = 1; void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // ???? GPIO_Init(GPIOA, &GPIO_InitStructure); } void Key_Scan(void) { static u8 key_up = 1; if (key_up && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { delay_ms(20); // ?? if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 0; key_pressed = 1; // ?????? } } else if (!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 1; } } //Ö÷º¯Êý int main(void) { OS_ERR err; CPU_SR_ALLOC(); SystemInit();//ÓÉÓÚ±&frac34;&sup1;¤&sup3;ÌÊÇÓÉstm32f103zet6ÒÆÖ²ËùÀ´£¬Òò´ËÕâÀïÒò&frac14;ÓÈë±&frac34;º¯ÊýÈ·±£delayº¯ÊýÕý&sup3;£Ê&sup1;Óà delay_init(); //ʱÖÓ&sup3;õÊ&frac14;»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÖжϷÖ×éÅäÖà uart_init(115200); //´®¿Ú&sup3;õÊ&frac14;»¯ LED_Init(); KEY_Init(); // ??????? OSInit(&err); //&sup3;õÊ&frac14;»¯UCOSIII OS_CRITICAL_ENTER(); //&frac12;øÈëÁÙ&frac12;çÇø //´´&frac12;¨¿ªÊ&frac14;ÈÎÎñ OSTaskCreate((OS_TCB * )&StartTaskTCB, //ÈÎÎñ¿ØÖÆ¿é (CPU_CHAR * )"start task", //ÈÎÎñÃû×Ö (OS_TASK_PTR )start_task, //ÈÎÎñº¯Êý (void * )0, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý (OS_PRIO )START_TASK_PRIO, //ÈÎÎñÓÅÏÈ&frac14;¶ (CPU_STK * )&START_TASK_STK[0], //ÈÎÎñ¶ÑÕ»»ùµØÖ· (CPU_STK_SIZE)START_STK_SIZE/10, //ÈÎÎñ¶ÑÕ»Éî¶ÈÏÞλ (CPU_STK_SIZE)START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (OS_MSG_QTY )0, //ÈÎÎñÄÚ²¿ÏûÏ¢¶ÓÁÐÄÜ&sup1;»&frac12;ÓÊÕµÄ×î´óÏûÏ¢ÊýÄ¿,Ϊ0ʱ&frac12;ûÖ&sup1;&frac12;ÓÊÕÏûÏ¢ (OS_TICK )0, //µ±Ê&sup1;ÄÜʱ&frac14;䯬ÂÖתʱµÄʱ&frac14;䯬&sup3;¤¶È£¬Îª0ʱΪĬÈÏ&sup3;¤¶È£¬ (void * )0, //Óû§²&sup1;&sup3;äµÄ´æ´¢Çø (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ÈÎÎñÑ¡Ïî (OS_ERR * )&err); //´æ·Å¸Ãº¯Êý´íÎóʱµÄ·µ»ØÖµ OS_CRITICAL_EXIT(); //ÍË&sup3;öÁÙ&frac12;çÇø OSStart(&err); //¿ªÆôUCOSIII } //¿ªÊ&frac14;ÈÎÎñÈÎÎñº¯Êý void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //Í&sup3;&frac14;ÆÈÎÎñ #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //Èç&sup1;ûÊ&sup1;ÄÜÁ˲âÁ¿ÖжÏ&sup1;رÕʱ&frac14;ä CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //µ±Ê&sup1;ÓÃʱ&frac14;䯬ÂÖתµÄʱºò //Ê&sup1;ÄÜʱ&frac14;䯬ÂÖתµ÷¶È&sup1;¦ÄÜ,ʱ&frac14;䯬&sup3;¤¶ÈΪ1¸öϵÍ&sup3;ʱÖÓ&frac12;ÚÅÄ£¬&frac14;È1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //&frac12;øÈëÁÙ&frac12;çÇø //´´&frac12;¨TASK1ÈÎÎñ OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //´´&frac12;¨TASK2ÈÎÎñ OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); //ÍË&sup3;öÁÙ&frac12;çÇø OSTaskDel((OS_TCB*)0,&err); //É&frac34;&sup3;ýstart_taskÈÎÎñ×ÔÉí } // ??1:??PB0(LED0) void task1_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 2; // ?????2 key_pressed = 0; printf("Switch to Task2\n"); } else { // LED0?? GPIO_SetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } } void task2_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 1; // ?????1 key_pressed = 0; printf("Switch back to Task1\n"); } else { // ????2??? // ??:LED1?? GPIO_SetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } }我现在需要刚开始时B0(任务一)LED闪烁,当按下按键后(A0)给予信息量,使得代码进入(任务二),再次摁下按键,两个任务均不执行
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值