Áõ¹ðÓÂ:ÖÐСÆóÒµÐÅÏ¢»¯ËùÃæÁÙµÄÎÊÌâ--°¬ÈðÍø×÷Õß..

许多中小企业正在经历企业信息化的转型过程,部分企业在实施企业信息化后确实获得了一定的效益;然而大部分中小企业由于重视不足等原因,在这条道路上面临诸多挑战。
ÖÐСÆóÒµÐÅÏ¢»¯ËùÃæÁÙµÄÎÊÌⲿ·ÖÖÐСÆóÒµ×ßÐÅÏ¢»¯µÀ·£¬¾ÍºÃ±ÈÄÇʳ֮ÎÞÈ⣬ÆúÖ®ÓÐζµÄ¼¦ÀߣºÆóÒµÐÅÏ¢»¯ÏÖÒѳÉΪһÖÖÇ÷ÊÆ£¬ÓÐÒ»²¿·ÖÆóÒµÔÚ½øÐÐÆóÒµÐÅÏ¢»¯ÒÔºóȷʵÊÕµ½ÁËÒ»¶¨µÄÐ§Òæ£»¶ø´ó²¿·ÖÖÐСÆóÒµÓÉÓÚÖØ ...
#################################################################### ## ## ## ## ## CODE SKELETON v1.0.0 ## ## ## ## TP-LINK ## ## 2013.7.9 ## #################################################################### 1. žÅÊö CODE SKELETONÊÇÌáÈ¡CODEʵÏÖµÄÖ÷Ìå¿òŒÜ¡£ËüžúʵŒÊʵÏÖ»&sup1;Óзdz£ŽóµÄ²î Ÿà¡£·œ±ãŽóŒÒÊìÏ€CODEµÄ&sup1;ŠÄÜ»®·ÖÒÔŒ°ŽóžÅÁËœâÓïÒô&sup1;ŠÄÜÉæŒ°µÄһЩ±à³ÌŒŒÊõ¡£ ËüÖ÷Òª°üº¬menuconfigµÄ»ùŽ¡Ê&sup1;Óá¢MakefileŽîœš&sup1;€³Ì¡¢¶¯Ì¬¿âµÄÊ&sup1;Óᢟ²Ì¬¿â µÄÊ&sup1;Óᢌòµ¥ÖÕ¶ËI/O¡¢»Øµ÷º¯Êý¡¢¶àÏ̱߳à³Ì¡¢socket±à³Ì¡¢Œòµ¥Çý¶¯±à³ÌµÈ ÄÚÈÝ¡£&sup1;ŠÄÜʵÏֱȜώֲڣ¬»¶Ó­¶ÁÕß·áž»CODE SKELETONµÄÄÚÈÝ¡£CODE SKELETON Ö»º­žÇÁËCODEʵÏÖµÄÒ»²¿·ÖÄÚÈÝ£¬Èç&sup1;û¶ÁÕß¶ÔÓïÒôÄÚÈÝÓÐÐËÈ€¿ÉÒÔœøÒ»²œÑ§Ï° ºÍÉºóÎIJοŒ×ÊÁϵÄÄÚÈÝ¡£ 2. ¿òŒÜ CODE SKELETON°üÀšÈýžöÄ£¿é£ºÄÚºËÄ£¿é£š×Ö·ûÇý¶¯simple£©£¬·þÎñŽŠÀíÖÐ ÐÄ£šcs_server)ºÍ·þÎñÇëÇó¿Í»§¶Ë£šcs_client£©¡£cs_clientÒÔÃüÁîÐеķœÊœ œÓÊÜÓû§µÄÇëÇ󣬞ùŸÝÃüÁîÔÙÍš&sup1;ýsocket°ÑÃüÁË͵œcs_server, cs_server ŽŠÀíºó·µ»ØÖŽÐМá&sup1;ûžøcs_client¡£Œòµ¥œá&sup1;&sup1;ÍŒÈçÏÂËùÊŸ¡£ *--------* *-----------* *---------* | | | | | | | simple |<----------->| server |<---------->| client | | | | | | | *--------* *-----------* *---------* server ºÍ client Ä£¿éŸùÊ&sup1;ÓÃÁœžöÄ£¿é£¬mini_shellºÍsocketÄ£¿é¡£Ç°Õß ·â×°ÖÕ¶ËI/OºÍ»Øµ÷º¯Êý±í¡£ºóÕß·â×°unixÓòÌלÓ×ÖÓÃÓÚœø³ÌŒäÍšÐÅ¡£ 3. ĿŒœá&sup1;&sup1; TOP [code skeleton¶¥²ãĿŒ] | *---> readme [±ŸÎĵµ *-*] | *---> build [&sup1;€³Ì±àÒë»·Ÿ³] | *---> config [ÅäÖÃĿŒ£¬µ±Ç°Ö»ÓÐmenuconfig] | *---> install [&sup1;€³Ì±àÒëºóÉú³ÉµÄÊ&sup1;ÓÃÎÄŒþ] | *---> code [ÔŽŽúÂë] | *---> modules [ÄÚºËÄ£¿é] | | | *---> simple [Œòµ¥×Ö·ûÇý¶¯ÊµÏÖ] | *---> apps [Óû§²ãŽúÂë] | *---> inc [&sup1;«ÓÃÍ·ÎÄŒþ] | *---> cs_libs [¿âÎÄŒþ] | | | *---> mini_shell | | | *---> socket | *---> cs_server | *---> cs_client 4. Ê&sup1;ÓòœÖè 4.1 ÅäÖÃ&sup1;€³Ì œøÈëTOP/buildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£#ÊÇlinux shellÌáÊŸ·û£¬²»ÊôÓÚÃüÁ·Ö£¬ ºóÐøŸùÏàͬº¬Òå¡£Èç&sup1;û²»ÊäÈëMODEL=xxx, ĬÈÏÊ&sup1;ÓÃMODEL=TEST¡£ÅäÖÃÍê³Éºó±£ŽæÅä ÖÃÐÅÏ¢¡£ # make MODEL=xxx menuconfig 4.2 ±àÒë&sup1;€³Ì ŒÌÐøÍ£ÁôÔÚbuildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£ # make MODEL=xxx /* MODEL=xxx¿ÉÒÔ²»ÊäÈ룬ĬÈÏÊ&sup1;ÓÃMODEL=TEST */ ÁíÍ⣬±àÒëʱ¿ÉÒÔÊäÈë²ÎÊýÀŽŸö¶šÊÇ·ñÆô¶¯µ÷ÊÔ¿ª&sup1;ØŒ°µ÷ÊԵȶ±ð£¬ÈçÏÂÃüÁî # make MODEL=xxx VSDEBUG=yyy /* ÆäÖÐyyy¿ÉÒÔȡֵ error, sys, info, debugl, debugm, debugh£¬Ä¬ÈÏΪerror */ 4.3 ÔËÐгÌÐò ÏÂÃæµÄ²Ù×÷ŸùÔÚ TOP/installĿŒÏ¡£ 4.3.1 ŒÓÔØÇý¶¯ ŒÓÔØŒòµ¥×Ö·ûÇý¶¯simple£¬ÊäÈëÏÂÃæÃüÁî¡£ # insmod csmsimple.ko # cd /dev # mknod -m 666 csmsimple c 220 0 # cd - 4.3.2 Æô¶¯cs_server Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪŸ²Ì¬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_server & 4.3.3 Æô¶¯cs_client Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪŸ²Ì¬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_client È»ºó¿ÉÒÔœøÈëÃüÁîÐÐģʜ£º[ code skeleton client ] # ¡£Æô¶¯Íê³É¡£ 5. ÍØÕ&sup1; µ±Ç°°æ±ŸÏµÍ³±ÈœÏŽÖ²Ú£¬»¶Ó­¶ÁÕßÍêÉÆ±ŸÏµÍ³¡£ŽóÖÂÂÞÁÐÐèÒªÍêÉÆµÄµØ·œ¡£ 1£©ÖÕ¶ËI/O£» 2£©ÃüÁîÐÐģʜµÄÀúÊ·ŒÇÂŒ¡¢×Ô¶¯Æ¥Å䣻 3£©Çý¶¯µÄÄں˶šÊ±Æ÷»òÕßÄÚºËÏ̲߳úÉúÊÂŒþʵÏÖclientµÄ׎̬Çл»£¬Íê³ÉÒ»žö СÐ͵Ä׎̬»ú£» 4£©Ïß³Ìͬ²œÊµÏÖ£» 5£©ÓŠÓòãŽúÂëºÍÄںˎúÂëµ÷ÊÔŒŒÊõ£» 6£©clientÌíŒÓžüÓÐÈ€µÄÃüÁî¡£ 6. ²Î¿Œ×ÊÁÏ [1] rfc3261, J. RosenbergµÈ, 2002 [2] Understanding the Session Initiation Protocol (Third Edition), Alan B.Johnston, 2009 [3] LinuxÉ豞Çý¶¯³ÌÐò [4] LinuxÍøÂ簲ȫŒŒÊõÓëʵÏÖ(µÚ¶þ°æ), ³ÂÓÂÑ«, Ç廪Žóѧ³ö°æÉç [5] Unix»·Ÿ³žßŒ¶±à³Ì [6] pjsip&sup1;ÙÍø [7] netfilter&sup1;ÙÍø 7. ·ŽÀ¡ÐÅÏ¢ »¶Ó­ŽóŒÒ·ŽÀ¡ÐÅÏ¢µœ zhonglianbo@tp-link.net¡£ 为什么我的readme是这杨的
08-14
根据增量式PID算法原理,完成main.c文件IncPIDInit()函数pid的初始化和 int32_t BLDC_SpdPIDCalc(int32_t NextPoint)函数的编写。条件:当误差小于等于正负3时,视为无误差。 #include "main.h" #include "math.h" #include "stm32f4xx_hal.h" #include "bldc/bsp_bldc.h" #include "key/bsp_key.h" #include "beep/bsp_beep.h" #include "HMI/bsp_usartx_HMI.h" /* Ë&frac12;ÓÐÀàÐͶ¨Òå --------------------------------------------------------------*/ typedef struct { __IO int32_t SetPoint; //É趨Ŀ±ê Desired Value __IO long SumError; //Îó²îÀÛ&frac14;Æ __IO float Proportion; //±ÈÀý³£Êý Proportional Const __IO float Integral; //»ý·Ö³£Êý Integral Const __IO float Derivative; //΢·Ö³£Êý Derivative Const __IO int LastError; //Error[-1] }PID_Typedef; /* Ë&frac12;Óк궨Òå ----------------------------------------------------------------*/ //&frac12;«¸¡µãÊýxËÄÉáÎåÈëΪint32_t #define ROUND_TO_INT32(x) ((int32_t)(x)+0.5f)>=(x)? ((int32_t)(x)):((int32_t)(x)+1) #define WIN 8 #define P_DATA 0.035f // P²ÎÊý #define I_DATA 0.10f // I²ÎÊý #define D_DATA 0.0f // D²ÎÊý #define TARGET_SPEED 500 /* Ë&frac12;ÓбäÁ¿ ------------------------------------------------------------------*/ __IO int32_t flag = 0; // µÃµ&frac12;WIN´ÎËÙ¶ÈÖµµÄ±êÖ¾ __IO int32_t start_flag = 0; // Æô¶¯±êÖ¾ __IO int32_t Avg_cnt = 0; // Æ&frac12;¾ùÖµ&frac14;ÆÊý __IO float Avg_Speed[WIN]= {0};// ǰWIN´ÎµÄËÙ¶ÈÖµ static __IO int32_t BLDC_CaptureNumber = 0; // ÊäÈë²¶»ñÊý __IO PID_Typedef PID_BLDC; // BLDC PID¿ØÖÆ&frac12;á&sup1;&sup1;Ìå int32_t BLDC_SPEED_MAX = (3000); // µç»ú×î´óËÙ¶È//ĬÈÏ3000 int32_t BLDC_SPEED_MIN = (-3000); // µç»ú×î´óËÙ¶È//ĬÈÏ3000 uint32_t Time_CNT = 0; /* À©Õ&sup1;±äÁ¿ ------------------------------------------------------------------*/ /* Ë&frac12;Óк¯ÊýÔ­ÐÎ --------------------------------------------------------------*/ static void IncPIDInit(void) ; static float Avg_speed(float Speed); int32_t BLDC_SpdPIDCalc(int32_t NextPoint); void UpdateHMI_SM_PID_feedback(int32_t CaptureNumber,int32_t RPM); static void UpdateHMI_SM_PID_Param(PID_Typedef Param_Pos); void BLDC_SetTargetSpd(int32_t Spd); /* º¯ÊýÌå --------------------------------------------------------------------*/ /** * º¯Êý&sup1;¦ÄÜ: ϵͳʱÖÓÅäÖà * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÎÞ */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); // Ê&sup1;ÄÜPWRʱÖÓ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);// ÉèÖõ÷Ñ&sup1;Æ÷Êä³öµçÑ&sup1;&frac14;¶±ð1 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;// Íⲿ¾§Õñ£¬8MHz RCC_OscInitStruct.HSEState = RCC_HSE_ON; // ´ò¿ªHSE RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // ´ò¿ªPLL RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;// PLLʱÖÓÔ´Ñ¡ÔñHSE RCC_OscInitStruct.PLL.PLLM = 8; // 8·ÖƵMHz RCC_OscInitStruct.PLL.PLLN = 336; // 336±¶Æµ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 2·ÖƵ£¬µÃµ&frac12;168MHzÖ÷ʱÖÓ RCC_OscInitStruct.PLL.PLLQ = 7; // USB/SDIO/Ëæ»úÊý²úÉúÆ÷µÈµÄÖ÷PLL·ÖƵϵÊý HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // ϵͳʱÖÓ£º168MHz RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHBʱÖÓ£º 168MHz RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1ʱÖÓ£º42MHz RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2ʱÖÓ£º84MHz HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); HAL_RCC_EnableCSS(); // Ê&sup1;ÄÜCSS&sup1;¦ÄÜ£¬ÓÅÏÈÊ&sup1;ÓÃÍⲿ¾§Õñ£¬ÄÚ²¿Ê±ÖÓԴΪ±¸Óà // HAL_RCC_GetHCLKFreq()/1000 1msÖжÏÒ»´Î // HAL_RCC_GetHCLKFreq()/100000 10usÖжÏÒ»´Î // HAL_RCC_GetHCLKFreq()/1000000 1usÖжÏÒ»´Î HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // ÅäÖò¢Æô¶¯ÏµÍ³µÎ´ð¶¨Ê±Æ÷ /* ϵͳµÎ´ð¶¨Ê±Æ÷ʱÖÓÔ´ */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* ϵͳµÎ´ð¶¨Ê±Æ÷ÖжÏÓÅÏÈ&frac14;¶ÅäÖà */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /** * º¯Êý&sup1;¦ÄÜ: Ö÷º¯Êý. * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÎÞ */ int main(void) { /* ¸´Î»ËùÓÐÍâÉ裬³õÊ&frac14;»¯Flash&frac12;Ó¿ÚºÍϵͳµÎ´ð¶¨Ê±Æ÷ */ HAL_Init(); /* ÅäÖÃϵͳʱÖÓ */ SystemClock_Config(); /* ³õÊ&frac14;»¯°´&frac14;üÅäÖà */ KEY_GPIO_Init(); /* ³õÊ&frac14;»¯´®¿ÚÅäÖà */ HMI_USARTx_Init(); /* ³õÊ&frac14;»¯»ô¶û´«¸ÐÆ÷&frac12;Ó¿Ú */ HALL_TIMx_Init(); /* ³õÊ&frac14;»¯¶¨Ê±Æ÷¸÷ͨµÀÊä³ö */ BLDCMOTOR_TIMx_Init(); /* Æô¶¯¶¨Ê±Æ÷ */ HAL_TIM_Base_Start(&htimx_BLDC); /* ³õÊ&frac14;»¯PID²ÎÊý*/ IncPIDInit(); // UpdateHMI_SM_PID_Param(BLDC_sPID); /* ÔÚ·ÂÕæµÄʱºò&frac12;ûÖ&sup1;¶¨Ê±Æ÷Êä³ö */ __HAL_DBGMCU_FREEZE_TIM8(); while (1) { if(Frame.PageID == PAGE_EX_PID) { switch(Frame.ObjID ) { /* ÉèÖÃÄ¿±êÖµ */ case EX_PID_NUM_POSTAR: BLDC_SetTargetSpd( Frame.Param.Init/10 ); Frame.ObjID = NONEOBJ; break; /* ÉèÖÃPID²ÎÊýP */ case EX_PID_NUM_POSP: PID_BLDC.Proportion = Frame.Param.Init/ 1000.0f; Frame.ObjID = NONEOBJ; break; /* ÉèÖÃPID²ÎÊýI */ case EX_PID_NUM_POSI: PID_BLDC.Integral = Frame.Param.Init/ 1000.0f; Frame.ObjID = NONEOBJ; break; /* ÉèÖÃPID²ÎÊýD */ case EX_PID_NUM_POSD: PID_BLDC.Derivative = Frame.Param.Init/ 1000.0f; Frame.ObjID = NONEOBJ; break; /* È·¶¨°´Å¥£¬Æô¶¯µç»ú */ case EX_PID_BTN_CONFIG: Enable_BLDC(); start_flag = 1; Frame.ObjID = NONEOBJ; break; /* Í£Ö&sup1;°´Å¥£¬Í£Ö&sup1;µç»ú */ case EX_PID_BTN_PAUSE: Disable_BLDC(); start_flag = 0; PID_BLDC.LastError = 0;// Error[-1] PID_BLDC.SumError = 0; Frame.ObjID = NONEOBJ; break; case EX_PID_BTN_UDATE:// ¶¨Ê±ÈÎÎñ£¬ÓÉ´®¿ÚÆÁ¾ö¶¨Ê±&frac14;ä&frac14;ä¸ô UpdateHMI_SM_PID_feedback(0,BLDC_CaptureNumber); UpdateHMI_SM_PID_Param(PID_BLDC); Frame.ObjID = NONEOBJ; break; } } /* Ê&sup1;Äܵç»ú */ if(KEY1_StateRead() == KEY_DOWN) { Enable_BLDC(); start_flag = 1; } /* µç»úÍ£Ö&sup1; */ if(KEY2_StateRead() == KEY_DOWN) { Disable_BLDC(); start_flag = 0; } } } /** * º¯Êý&sup1;¦ÄÜ: PID²ÎÊý³õÊ&frac14;»¯ * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÎÞ */ void IncPIDInit(void) { PID_BLDC.LastError = 0; // Error[-1] PID_BLDC.Proportion = P_DATA; // ±ÈÀý³£Êý Proportional Const PID_BLDC.Integral = I_DATA; // »ý·Ö³£Êý Integral Const PID_BLDC.Derivative = D_DATA; // ΢·Ö³£Êý Derivative Const PID_BLDC.SetPoint = TARGET_SPEED;// É趨Ŀ±êDesired Value } /****************************** ÐÅÏ¢·´À¡º¯Êý **********************************/ ///** // * º¯Êý&sup1;¦ÄÜ£º¸üд®¿ÚÆÁ&frac12;çÃæµÄPID²ÎÊýºÍÄ¿±êÖµ // * ÊäÈë²ÎÊý£ºParam_Pos,ËÙ¶È»·µÄPID&frac12;á&sup1;&sup1;ÌåÖ¸Õë // * ·µ »Ø Öµ£ºÎÞ // * ˵ Ã÷£º¸üеÄÊÇĬÈϵÄPID²ÎÊýºÍÄ¿±êÖµ // */ static void UpdateHMI_SM_PID_Param(PID_Typedef Param_Pos) { float tmp = 0; // /* ¸üд®¿ÚÆÁµÄPID²ÎÊý,PID²ÎÊý¶&frac14;ÊÇ·Å´ó1000±¶ */ tmp = ( (float)Param_Pos.Proportion * 1000.0f ); HMI_value_setting("numPosP.val",tmp); tmp = ( (float)Param_Pos.Integral * 1000.0f ); HMI_value_setting("numPosI.val",tmp); tmp = ( (float)Param_Pos.Derivative * 1000.0f ); HMI_value_setting("numPosD.val",tmp); tmp = ( (float)Param_Pos.SetPoint ); HMI_string_setting("numPosTar.txt",tmp); } /** * º¯Êý&sup1;¦ÄÜ£º¸üд®¿ÚÆÁ&frac12;çÃæµÄÊý¾Ý * ÊäÈë²ÎÊý£ºÎÞ * ·µ »Ø Öµ£ºÎÞ * ˵ Ã÷£º¸üÐÂλÖÃÖµºÍËÙ¶ÈÖµ */ void UpdateHMI_SM_PID_feedback(int32_t CaptureNumber,int32_t RPM) { HMI_string_setting("txtPosition.txt",0); HMI_string_setting("txtSpeed.txt",RPM); /* ·¢ËÍ·´À¡Öµ */ HMI_value_setting("vatmpReal.val",RPM/10); HMI_value_setting("vatmpTarget.val",ROUND_TO_INT32(PID_BLDC.SetPoint/10)); } /******************** Ëٶȱջ· PID ¿ØÖÆÉè&frac14;Æ ***********************************/ /** * º¯Êý&sup1;¦ÄÜ: »¬¶¯Â˲¨º¯Êý * ÊäÈë²ÎÊý: ËÙ¶ÈÖµ(r/min) * ·µ »Ø Öµ: Â˲¨ºóµÄËÙ¶ÈÖµ(r/min) * ˵ Ã÷: ¶ÔËÙ¶ÈÖµ&frac12;øÐ묶¯Â˲¨´¦Àí,´ó¸ÅÁ÷³Ì: * ¶ÔǰWIN´Î²ÉÑùµÄËÙ¶ÈֵȡÆ&frac12;¾ùÖµ */ float Avg_speed(float Speed) { int32_t i = 0; float Sum = 0; Avg_Speed[Avg_cnt] =Speed; Avg_cnt++; if(Avg_cnt == WIN) { Avg_cnt = 0; flag = 1; } /* ÔÚ²ÉÑù´ÎÊýÉÙÓÚn´ÎµÄÇé¿öÏÂ&frac14;ÆËã¾ùÖµ */ if(flag == 0) { for(i = 0; i<Avg_cnt;i++) { Sum += Avg_Speed[i]; } Sum /= (i+1); } /* ÇóµÃǰn´ÎµÄÆ&frac12;¾ùÖµ */ else { for(i = 0; i<WIN;i++) { Sum += Avg_Speed[i]; } Sum /= WIN; } return Sum; } /** * º¯Êý&sup1;¦ÄÜ: ϵͳµÎ´ð¶¨Ê±Æ÷Öжϻص÷º¯Êý * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÿ·¢ÉúÒ»´ÎµÎ´ð¶¨Ê±Æ÷ÖжÏ&frac12;øÈë¸Ã»Øµ÷º¯ÊýÒ»´Î */ void HAL_SYSTICK_Callback() { float speed_rpm = 0; int32_t PID_Result = 0; Time_CNT++; /* 100ms ²ÉÑùÖÜÆÚ,¿ØÖÆÖÜÆÚ */ if(Time_CNT >= 100) { Time_CNT = 0; /* »ñÈ¡ËÙ¶ÈÖµ:Óɲ¶»ñµ&frac12;µÄÂö³åÊý³ýÒÔ×ܵÄʱ&frac14;ä Pul/t */ /* BLDCMotorÊÇ4¶Ô&frac14;«,ÐýתһȦÓÐ4¸öÂö³åÐźÅ,3ÏàUVWÐźÅÏß,&sup112¸öÂö³åÐźÅ, * ÿ¸öÂö³å±ßÑØ&frac14;ÆÊýÒ»´Î,ËùÒÔBLDCMÐýתһȦ,¿ÉÒÔ²¶»ñµ&frac12;µÄ»ô¶ûÐźÅÊÇ24, * &frac14;ÆÊýÖµ¿ÉÒÔ&frac14;ÆÊýµ&frac12;24.ÿ¸öÐźűßÑØ¶&frac14;»á²¶»ñµ&frac12;&frac12;Ó¿Ú¶¨Ê±Æ÷µÄCCR1, * ÿ100ms¶ÁÈ¡²¶»ñµ&frac12;µÄʱ&frac14;äºÍÂö³åÊý,¾Í¿ÉÒԵõ&frac12;µç»úµÄËÙ¶ÈÖµ. */ if(BLDCMotor.Hall_Period == 0)//±ÜÃâ³ýÊýΪ0 { speed_rpm = 0; } else /*Ëٶȵ¥Î»:RPM*/ speed_rpm = (((float)BLDCMotor.Hall_PulNum*60*HALL_TIM_FREQ) / ((float)BLDCMotor.Hall_Period*24)); //¶ÔËÙ¶ÈÖµ×ö»¬¶¯Â˲¨´¦Àí BLDC_CaptureNumber = (int32_t)Avg_speed(speed_rpm); BLDCMotor.Hall_Period = 0; BLDCMotor.Hall_PulNum = 0; if(start_flag == 1) { if(MotorDirction == MOTOR_DIR_CCW) BLDC_CaptureNumber = -BLDC_CaptureNumber; /* PID¿ØÖÆ&frac14;ÆËã */ PID_Result = BLDC_SpdPIDCalc(BLDC_CaptureNumber); /* ·&frac12;ÏòÅж¨ */ if(PID_Result<0) { BLDCMotor.Dir = MOTOR_DIR_CCW; BLDCMotor.PWM_Duty = -PID_Result; } else { BLDCMotor.Dir = MOTOR_DIR_CW; BLDCMotor.PWM_Duty = PID_Result; } /* Õ&frac14;¿Õ±ÈÏÞ¶¨ */ if(BLDCMotor.PWM_Duty >=(int32_t)(BLDCMOTOR_TIM_PERIOD - 100)) BLDCMotor.PWM_Duty = (int32_t)(BLDCMOTOR_TIM_PERIOD - 100); /* ¸ù¾Ýµ±Ç°Ô˶¯·&frac12;Ïò,Á¢&frac14;´ÐÞ¸ÄÕ&frac14;¿Õ±È */ BLDCMotor.uwStep = HallSensor_GetPinState(); if(MotorDirction == MOTOR_DIR_CW) { // ¸ù¾Ý˳Ðò±íµÄ&sup1;æÂÉ CW = 7 - CCW; BLDCMotor.uwStep = (uint32_t)7 - BLDCMotor.uwStep; } /* ¸ù¾Ý·&frac12;ÏòÉ趨¶ÔӦͨµÀµÄÕ&frac14;¿Õ±È */ switch(BLDCMotor.uwStep) { case 2: // AÏà case 6: __HAL_TIM_SET_COMPARE(&htimx_BLDC,TIM_CHANNEL_1,BLDCMotor.PWM_Duty); break; case 4: // BÏà case 5: __HAL_TIM_SET_COMPARE(&htimx_BLDC,TIM_CHANNEL_2,BLDCMotor.PWM_Duty); break; case 1: // CÏà case 3: __HAL_TIM_SET_COMPARE(&htimx_BLDC,TIM_CHANNEL_3,BLDCMotor.PWM_Duty); break; } /* µ±»»ÏòµÄʱºò£¬µç»ú¿ÉÄÜ»áÆô¶¯Ê§°Ü£¬ÕâÀïÖØÐÂÆô¶¯Ò»´Î */ if(MotorDirction != BLDCMotor.Dir) { Disable_BLDC(); Enable_BLDC(); } else if(speed_rpm == 0) { Disable_BLDC(); Enable_BLDC(); } } } } /** * º¯ÊýÃû³Æ£ºËٶȱջ·PID¿ØÖÆÉè&frac14;Æ * ÊäÈë²ÎÊý£ºµ±Ç°¿ØÖÆÁ¿ * ·µ »Ø Öµ£ºÄ¿±ê¿ØÖÆÁ¿ * ˵ Ã÷£ºÎÞ */ int32_t BLDC_SpdPIDCalc(int32_t NextPoint) { } /** * º¯Êý&sup1;¦ÄÜ: ÉèÖÃBLDCÄ¿±êËÙ¶È * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÏÞÖÆËÙ¶ÈÔÚãÐÖµ·¶Î§ÄÚ */ void BLDC_SetTargetSpd(int32_t Spd) { if(Spd >= BLDC_SPEED_MAX) Spd = BLDC_SPEED_MAX; if(Spd <= BLDC_SPEED_MIN) Spd = BLDC_SPEED_MIN; PID_BLDC.SetPoint = Spd; }
06-21
#include <reg52.h> //------------------------- Òý&frac12;Ŷ¨Òå --------------------------// sbit BEEP = P2^0; //·äÃùÆ÷¿ØÖÆÒý&frac12;Å£¬?µçÆ&frac12;ÓÐЧ sbit LED1 = P2^3; //LED1£¬¿ØÖÆÒý&frac12;Å£¬µÍµçÆ&frac12;ÓÐЧ sbit LED2 = P2^2; //LED2£¬¿ØÖÆÒý&frac12;Å£¬µÍµçÆ&frac12;ÓÐЧ sbit LED3 = P2^1; //LED3£¬¿ØÖÆÒý&frac12;Å£¬µÍµçÆ&frac12;ÓÐЧ //ÊýÂë&sup1;ÜÒý&frac12;Ŷ¨Òå #define duanPore P0 //ÊýÂë&sup1;ܶοØÖƶ˿ڣ¬¸ßµçÆ&frac12;ÓÐЧ sbit DIG1 = P2^4; //ÊýÂë&sup1;ܵÚ1λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG2 = P2^5; //ÊýÂë&sup1;ܵÚ2λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG3 = P2^6; //ÊýÂë&sup1;ܵÚ3λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG4 = P2^7; //ÊýÂë&sup1;ܵÚ4λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ //°´&frac14;üÒý&frac12;Ŷ¨Òå sbit KEY1 = P1^0; //1ºÅÑ¡ÊÖ sbit KEY2 = P1^1; //2ºÅÑ¡ÊÖ sbit KEY3 = P1^2; //3ºÅÑ¡ÊÖ sbit KEY4 = P1^3; //4ºÅÑ¡ÊÖ sbit KEY5 = P1^4; //5ºÅÑ¡ÊÖ sbit KEY6 = P1^5; //6ºÅÑ¡ÊÖ sbit KEY7 = P3^2; //Ö÷³ÖÈË&frac14;ü sbit KEY8 = P3^3; //ÉèÖÃ&frac14;ü //---------------------- È«¾Ö±äÁ¿¶¨Òå --------------------// //ÊýÂë&sup1;ܶÎÂë±í£¬ÊÊÓÃÓÚ&sup1;²ÒõÊýÂë&sup1;Ü unsigned char code tab_duan[19] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9 0x77,0x7c,0x39,0x5e,0x79,0x71, //A~F 0x40,0x00,0x48 //'-'£¬&sup1;رÕÏÔʾ£¬'=' }; unsigned char dat_buf[4] = {17, 17, 0, 5}; //ÏÔʾÊý¾Ý»º´æÇø£¬Ä¬ÈÏÉϵçÏÔʾ" 05" int time = 5, time1 = 5, time2 = 20; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;䣬time1£ºÇÀ´ðµ&sup1;&frac14;ÆÊ±Ê±&frac14;䣬time2£º»Ø´ðµ&sup1;&frac14;ÆÊ±Ê±&frac14;ä unsigned char i = 0; unsigned int count = 0; //&frac14;ÆÊý»º´æ±äÁ¿ bit flag_lock = 1; //&frac14;üÅÌËø¶¨±êÖ¾£¬1£º²»Ëø¶¨£¬0£ºËø¶¨ //------------------------------- º¯ÊýÉùÃ÷ ------------------------------------// void DelayMs(unsigned int ms); //ÑÓʱº¯Êý£¬µ¥Î»£ºms void dig_scan(unsigned char *dat); unsigned char KeyScan(void); //¶ÀÁ¢°´&frac14;üɨÃè void InitTimer0(void); //¶¨Ê±Æ÷0³õÊ&frac14;»¯ void alarm(void); //±¨¾¯º¯Êý void AnswerTask(void); //ÇÀ´ðÈÎÎñ void SetTime(void); //ÉèÖõ&sup1;&frac14;ÆÊ±Ê±&frac14;ä /* Ö÷º¯Êý */ void main(void) { BEEP = 0; //ÉϵçĬÈÏ&sup1;رշäÃùÆ÷ LED1 = 1; InitTimer0(); //¶¨Ê±Æ÷0³õÊ&frac14;»¯ time = time1; //ÉϵçĬÈÏÇÀ´ðµ&sup1;&frac14;ÆÊ± while(1) { if(KeyScan() == 7) //Èç&sup1;ûÖ÷³ÖÈË&frac14;ü°´Ï£¬Ôò&frac12;øÐÐÇÀ´ð { alarm(); //·äÃùÆ÷ÏìÒ»Éù AnswerTask(); //&frac12;øÐÐÇÀ´ðÈÎÎñ } if(KeyScan() == 8) //Èç&sup1;ûÉèÖÃ&frac14;ü°´Ï£¬&frac12;øÈëÉèÖõ&sup1;&frac14;ÆÊ±Ê±&frac14;ä { alarm(); //·äÃùÆ÷ÏìÒ»Éù SetTime(); //&frac12;øÈëÉè&frac14;Ƶ&sup1;&frac14;ÆÊ±Ê±&frac14;ä } dat_buf[0] = 17; dat_buf[1] = 17; dat_buf[2] = time / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //²âÊÔÊýÂë&sup1;ÜÏÔʾ } } /* ÑÓʱº¯Êý£¬µ¥Î»£ºms */ void DelayMs(unsigned int ms) { unsigned char a,b,c; while(--ms) { for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } } /* ÊýÂë&sup1;ÜÏÔʾɨÃè */ void dig_scan(unsigned char *dat) { /* ¶¯Ì¬É¨Ãè´¦Àí */ switch(i) { case 0: { duanPore = tab_duan[dat[0]]; //ÏÔʾµÚ1λÊýÂë&sup1;ÜÄÚÈÝ DIG1 = 0; break; } case 1: { duanPore = tab_duan[dat[1]]; //ÏÔʾµÚ2λÊýÂë&sup1;ÜÄÚÈÝ DIG2 = 0; //ѡͨµÚ2λÊýÂë&sup1;Ü break; } case 2: { duanPore = tab_duan[dat[2]]; //ÏÔʾµÚ3λÊýÂë&sup1;ÜÄÚÈÝ DIG3 = 0; //ѡͨµÚ3λÊýÂë&sup1;Ü break; } case 3: { duanPore = tab_duan[dat[3]]; //ÏÔʾµÚ4λÊýÂë&sup1;ÜÄÚÈÝ DIG4 = 0; //ѡͨµÚ4λÊýÂë&sup1;Ü break; } default: break; } DelayMs(5); //ɨÃèÑÓʱ10ms£¬¸ù¾Ýʵ&frac14;ÊÇé¿öÊʵ±Ð޸ĸÄÑÓʱʱ&frac14;ä DIG1 = 1; //ÏûÒþ DIG2 = 1; DIG3 = 1; DIG4 = 1; ++i; //ɨÃè±äÁ¿Ñ­»· if(i > 3) i = 0; } /* ¶ÀÁ¢°´&frac14;üɨÃè */ unsigned char KeyScan(void) { if(KEY1 == 0) //Èç&sup1;û°´&frac14;ü1°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY1 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 1; //Êä³ö°´&frac14;üÖµ1 } if(KEY2 == 0) //Èç&sup1;û°´&frac14;ü2°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY2 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 2; //Êä³ö°´&frac14;üÖµ2 } if(KEY3 == 0) //Èç&sup1;û°´&frac14;ü3°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY3 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 3; //Êä³ö°´&frac14;üÖµ3 } if(KEY4 == 0) //Èç&sup1;û°´&frac14;ü4°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY4 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 4; //Êä³ö°´&frac14;üÖµ4 } if(KEY5 == 0) //Èç&sup1;û°´&frac14;ü5°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY5 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 5; //Êä³ö°´&frac14;üÖµ5 } if(KEY6 == 0) //Èç&sup1;û°´&frac14;ü6°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY6 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 6; //Êä³ö°´&frac14;üÖµ6 } if(KEY7 == 0) //Èç&sup1;û°´&frac14;ü7°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY7 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 7; //Êä³ö°´&frac14;üÖµ7 } if(KEY8 == 0) //Èç&sup1;û°´&frac14;ü8°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY8 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 8; //Êä³ö°´&frac14;üÖµ8 } return 0; //ÎÞ°´&frac14;ü°´ÏÂÊä³ö0 } /* ¶¨Ê±Æ÷0³õÊ&frac14;»¯ */ void InitTimer0(void) { TMOD = 0x01; //ÅäÖö¨Ê±Æ÷0Ϊ&sup1;¤×÷Ä£Ê&frac12;1£¬16λ¶¨Ê±Æ÷ TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms TL0 = (65536 - 10000) % 256; EA = 1; //´ò¿ª×ÜÖÐ¶Ï ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0ÖÐ¶Ï TR0 = 0; //ÉϵçĬÈÏ&sup1;رն¨Ê±Æ÷0 } /* ¶¨Ê±Æ÷0ÖжϷþÎñº¯Êý£¬10ms&frac12;øÒ»´ÎÖÐ¶Ï */ void Timer0Interrupt(void) interrupt 1 { TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms£¬ÖØÐÂ×°ÔØ&frac14;ÆÊýÖµ TL0 = (65536 - 10000) % 256; ++count; if(count > 100) //1sʱ&frac14;ä&frac14;ÆË㣺10ms * 100 = 1s { count = 0; //&frac14;ÆÊýÖµÇåÁã --time; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;ä&frac14;õÒ»´Î if(time <= 0) //Èç&sup1;ûµ&sup1;&frac14;ÆÊ±&frac12;áÊø£¬Ôò&sup1;رն¨Ê±Æ÷0£¬Í£Ö&sup1;µ&sup1;&frac14;ÆÊ±£¬²¢Éù&sup1;ⱨ¾¯ºÍËø¶¨&frac14;üÅÌ { TR0 = 0; //&sup1;رն¨Ê±Æ÷0 BEEP = 1; //Éù&sup1;ⱨ¾¯ LED1 = 0; flag_lock = 0; //Ëø¶¨&frac14;üÅÌ } } } /* ±¨¾¯º¯Êý */ void alarm(void) { BEEP = 1; //·äÃùÆ÷ÏìһϠDelayMs(300); //ÑÓʱ300ms BEEP = 0; } /* ʵÏÖÇÀ´ðÈÎÎñ */ void AnswerTask(void) { unsigned char key_val; //°´&frac14;üÖµ»º´æ TR0 = 1; //Æô¶¯¶¨Ê±Æ÷0£¬¿ªÊ&frac14;µ&sup1;&frac14;ÆÊ± while(1) { if(flag_lock == 1) { key_val = KeyScan(); //»ñÈ¡°´&frac14;üÖµ switch(key_val) { case 1: { dat_buf[0] = key_val; //µÚ1λÊýÂë&sup1;ÜÏÔʾ1ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; //»Ø´ðµ&sup1;&frac14;ÆÊ±£¬Ñ¡Êֻشðʱ&frac14;ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; //Ëø¶¨&frac14;üÅÌ break; } case 2: { dat_buf[0] = key_val; //µÚ2λÊýÂë&sup1;ÜÏÔʾ2ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; //»Ø´ðµ&sup1;&frac14;ÆÊ±£¬Ñ¡Êֻشðʱ&frac14;ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 3: { dat_buf[0] = key_val; //µÚ3λÊýÂë&sup1;ÜÏÔʾ3ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 4: { dat_buf[0] = key_val; //µÚ4λÊýÂë&sup1;ÜÏÔʾ4ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 5: { dat_buf[0] = key_val; //µÚ5λÊýÂë&sup1;ÜÏÔʾ5ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 6: { dat_buf[0] = key_val; //µÚ6λÊýÂë&sup1;ÜÏÔʾ6ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } default: break; } } dat_buf[2] = time / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //ÊýÂë&sup1;ÜÏÔʾÄÚÈÝ } } /* ÉèÖõ&sup1;&frac14;ÆÊ±Ê±&frac14;ä */ void SetTime(void) { unsigned char mode = 0; //0£ºµ÷&frac12;ÚÇÀ´ðµ&sup1;&frac14;ÆÊ±£¬1£ºµ÷&frac12;ڻشðµ&sup1;&frac14;ÆÊ±£¬2£ºÍ˳ö while(1) { if(KeyScan() == 8) //Èç&sup1;ûÔٴΰ´ÏÂÉèÖÃ&frac14;ü£¬ÔòÍ˳öÉèÖÃ&sup1;¦ÄÜ { alarm(); //·äÃùÆ÷ÏìÒ»Éù ++mode; if(mode >= 2) break; //Ìø³öµ±Ç°ËÀÑ­»· } if(KeyScan() == 7) //Èç&sup1;û°´ÏÂ&frac14;Ó&frac14;ü£¬&frac12;øÐе÷ʱ { alarm(); //·äÃùÆ÷ÏìÒ»Éù if(mode == 0) //µ÷&frac12;ÚÇÀ´ðµ&sup1;&frac14;ÆÊ± { ++time1; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;ä&frac14;ÓÒ»´Î if(time1 > 30) //µ÷ʱ·¶Î§£º5s~30s time1 = 5; } if(mode == 1) //µ÷&frac12;ڻشðµ&sup1;&frac14;ÆÊ± { ++time2; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;ä&frac14;ÓÒ»´Î if(time2 > 30) //µ÷ʱ·¶Î§£º5s~30s time2 = 5; } } /* µ÷ʱÏÔʾ´¦Àí */ if(mode == 0) { dat_buf[0] = 16; //ÏÔʾ'-' dat_buf[1] = time1 / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[2] = time1 % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dat_buf[3] = 16; //ÏÔʾ'-' } if(mode == 1) { dat_buf[0] = 18; //ÏÔʾ'=' dat_buf[1] = time2 / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[2] = time2 % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dat_buf[3] = 18; //ÏÔʾ'=' } dig_scan(dat_buf); //ÊýÂë&sup1;ÜÏÔʾÄÚÈÝ } time = time1; //»Øµ&frac12;Ö÷&frac12;çÃæÏÔʾÇÀ´ðµ&sup1;&frac14;ÆÊ± }写出一个这样的代码,主持人是1.0,时间调节是1.1,选手1.2-1.7,蜂鸣器是3.3,LED是3.4,数码管1234是2.0-2.3
最新发布
09-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值