找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3058|回復(fù): 24
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)教各位大師,為何以下簡(jiǎn)單的單片機(jī)程序執(zhí)行M2電機(jī)異常?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)用的是STC12C2052AD,時(shí)延子函數(shù)是STC-ISP(V6.88)自動(dòng)計(jì)算出來的,用12M的外部晶振。用STC12C2052AD+L298N去控制12V直流電機(jī)執(zhí)行動(dòng)作,使用的測(cè)試電源是正常的。

程序執(zhí)行后期望達(dá)到的目的:
1、當(dāng)SS1啟動(dòng)開關(guān)被觸發(fā)一下后,在SW4未被按下之前,M2電機(jī)保持運(yùn)行。
2、SW4被按下后,M2電機(jī)停止運(yùn)行4秒鐘。
3、M2電機(jī)恢復(fù)運(yùn)行,直至SW3被按壓下后停止運(yùn)行,回到初始狀態(tài)。

程序運(yùn)行后,測(cè)試了一百次,有六十多次都是可以正常運(yùn)行的,其他幾十次不正常。很多次都是在SW4還未被按壓,M2電機(jī)運(yùn)行一會(huì)兒后暫停,然后再運(yùn)行到SW4被壓下后不再執(zhí)行程序下半部分。當(dāng)出現(xiàn)M2電機(jī)異常暫停這種情況后,用萬用表測(cè)試單片機(jī)運(yùn)行時(shí)I/O腳的電壓,發(fā)現(xiàn)P1^5引腳的電壓還是保持在+5V,而P1^2輸出已經(jīng)是0V,請(qǐng)問這個(gè)是啥原因呢?


單片機(jī)程序如下
#include<STC12C2052AD.H> //頭文件
#define uchar unsigned char
#define uint unsigned intsbit M2F=P1^2;
sbit M2F=P1^2;
sbit M2B=P1^3;
sbit SS1=P1^7;            //定義啟動(dòng)開關(guān)
sbit SW3=P1^4;                  //定義剪切原位感應(yīng)開關(guān)
sbit SW4=P1^5;                  //定義剪切限位感應(yīng)開關(guān)

void Delay200ms()                //@12.000MHz
{
        unsigned char i, j, k;

        i = 10;
        j = 31;
        k = 147;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void Delay1000ms()                //@12.000MHz
{
        unsigned char i, j, k;

        i = 46;
        j = 153;
        k = 245;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void Delay4000ms()                //@12.000MHz
{
        unsigned char i, j, k;

        i = 183;
        j = 100;
        k = 225;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void main()        //主函數(shù)
{
        SS1=1;                                                                         //啟動(dòng)開關(guān)初值置1
        SW4=1;                                                                         //剪切限位感應(yīng)開關(guān)置1
        M2F=0;                                                                         //剪切電機(jī)正極置0
        M2B=0;                                                                         //剪切電機(jī)負(fù)極置0
        if(SS1==0)               //判斷啟動(dòng)開關(guān)被按下
        {                                         
        while(SW4)                //剪切限位感應(yīng)開關(guān)被按下之前執(zhí)行以下代碼
        {                  
        M2F=1;                   //啟動(dòng)M2電機(jī)
        }
        M2F=0;          //暫停M2電機(jī)
        Delay4000ms();
        while(SW3)                //剪切限位感應(yīng)開關(guān)被按下后執(zhí)行以下兩行代碼
        {   
        M2F=1;                                                                   //剪切原位感應(yīng)開關(guān)未按下之前執(zhí)行行代碼
        Delay200ms();
        }
        M2F=0;                                                                         //停止M2電機(jī)
  Delay1000ms();
        }
}
         

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2021-3-24 15:51 | 只看該作者
程序沒有限制在主循環(huán)while(1)內(nèi)運(yùn)行,會(huì)跑飛。
  1. #include<STC12C2052AD.H> //頭文件
  2. #define uchar unsigned char
  3. #define uint unsigned intsbit M2F=P1^2;
  4. sbit M2F=P1^2;
  5. sbit M2B=P1^3;
  6. sbit SS1=P1^7;            //定義啟動(dòng)開關(guān)
  7. sbit SW3=P1^4;                  //定義剪切原位感應(yīng)開關(guān)
  8. sbit SW4=P1^5;                  //定義剪切限位感應(yīng)開關(guān)

  9. void Delay200ms()                //@12.000MHz
  10. {
  11.         unsigned char i, j, k;

  12.         i = 10;
  13.         j = 31;
  14.         k = 147;
  15.         do
  16.         {
  17.                 do
  18.                 {
  19.                         while (--k);
  20.                 } while (--j);
  21.         } while (--i);
  22. }

  23. void Delay1000ms()                //@12.000MHz
  24. {
  25.         unsigned char i, j, k;

  26.         i = 46;
  27.         j = 153;
  28.         k = 245;
  29.         do
  30.         {
  31.                 do
  32.                 {
  33.                         while (--k);
  34.                 } while (--j);
  35.         } while (--i);
  36. }

  37. void Delay4000ms()                //@12.000MHz
  38. {
  39.         unsigned char i, j, k;

  40.         i = 183;
  41.         j = 100;
  42.         k = 225;
  43.         do
  44.         {
  45.                 do
  46.                 {
  47.                         while (--k);
  48.                 } while (--j);
  49.         } while (--i);
  50. }

  51. void main()        //主函數(shù)
  52. {
  53.         SS1=1;                 //啟動(dòng)開關(guān)初值置1
  54.         SW4=1;                 //剪切限位感應(yīng)開關(guān)置1
  55.         M2F=0;                 //剪切電機(jī)正極置0
  56.         M2B=0;                 //剪切電機(jī)負(fù)極置0
  57.         while(1)
  58.         {
  59.                 if(SS1==0)             //判斷啟動(dòng)開關(guān)被按下
  60.                 {                                         
  61.                         while(SW4)          //剪切限位感應(yīng)開關(guān)被按下之前執(zhí)行以下代碼
  62.                         {                  
  63.                                 M2F=1;           //啟動(dòng)M2電機(jī)
  64.                         }
  65.                         M2F=0;                          //暫停M2電機(jī)
  66.                         Delay4000ms();
  67.                         while(SW3)           //剪切限位感應(yīng)開關(guān)被按下后執(zhí)行以下兩行代碼
  68.                         {   
  69.                                 M2F=1;            //剪切原位感應(yīng)開關(guān)未按下之前執(zhí)行行代碼
  70.                                 Delay200ms();
  71.                         }
  72.                         M2F=0;               //停止M2電機(jī)
  73.                         Delay1000ms();
  74.                 }
  75.         }
  76. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

板凳
ID:889206 發(fā)表于 2021-3-24 15:59 | 只看該作者
wulin 發(fā)表于 2021-3-24 15:51
程序沒有限制在主循環(huán)while(1)內(nèi)運(yùn)行,會(huì)跑飛。

謝謝您的指導(dǎo),我改一下試試。
回復(fù)

使用道具 舉報(bào)

地板
ID:889206 發(fā)表于 2021-3-24 16:33 | 只看該作者
wulin 發(fā)表于 2021-3-24 15:51
程序沒有限制在主循環(huán)while(1)內(nèi)運(yùn)行,會(huì)跑飛。

測(cè)試了,收效不大。還是多次出現(xiàn)沒到SW4,M2已停止的問題。
回復(fù)

使用道具 舉報(bào)

5#
ID:889206 發(fā)表于 2021-3-24 16:38 | 只看該作者
wulin 發(fā)表于 2021-3-24 15:51
程序沒有限制在主循環(huán)while(1)內(nèi)運(yùn)行,會(huì)跑飛。

是否需要在下載程序時(shí),硬件選項(xiàng)上增加看門狗參數(shù)的設(shè)置?當(dāng)前狀態(tài)沒有對(duì)勾選這兩個(gè)選項(xiàng)。
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2021-3-24 17:30 | 只看該作者
kpljn 發(fā)表于 2021-3-24 16:38
是否需要在下載程序時(shí),硬件選項(xiàng)上增加看門狗參數(shù)的設(shè)置?當(dāng)前狀態(tài)沒有對(duì)勾選這兩個(gè)選項(xiàng)。

這樣的程序不能用看門狗,更亂套。
回復(fù)

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2021-3-24 21:49 | 只看該作者
kpljn 發(fā)表于 2021-3-24 16:33
測(cè)試了,收效不大。還是多次出現(xiàn)沒到SW4,M2已停止的問題。

這里還有問題#define uint unsigned intsbit M2F=P1^2;
應(yīng)該#define uint unsigned int
回復(fù)

使用道具 舉報(bào)

8#
ID:889206 發(fā)表于 2021-3-24 21:59 | 只看該作者
wulin 發(fā)表于 2021-3-24 21:49
這里還有問題#define uint unsigned intsbit M2F=P1^2;
應(yīng)該#define uint unsigned int

筆誤而已,實(shí)際程序是按照您這個(gè)標(biāo)準(zhǔn)寫的。
回復(fù)

使用道具 舉報(bào)

9#
ID:889206 發(fā)表于 2021-3-24 22:04 | 只看該作者
現(xiàn)在出現(xiàn)好多次要按著啟動(dòng)開關(guān)不放好幾秒鐘,程序才會(huì)執(zhí)行的問題。
回復(fù)

使用道具 舉報(bào)

10#
ID:889206 發(fā)表于 2021-3-24 22:15 | 只看該作者

主函數(shù)調(diào)整為以下的流程,電機(jī)的動(dòng)作更遲鈍,很多次都需要長(zhǎng)按啟動(dòng)開關(guān)不放手才開始動(dòng)作。。。。

void main()        //主函數(shù)
{
        SS1=0;                                                                        //啟動(dòng)開關(guān)初值置0------這里修改了
        SW4=0;                                                                         //剪切限位感應(yīng)開關(guān)置0------這里修改了
        M2F=0;                                                                         //剪切電機(jī)正極置0
        M2B=0;                                                                         //剪切電機(jī)負(fù)極置0
        while(1)
        {
        if(SS1==!0)                //判斷啟動(dòng)開關(guān)被按下------這里修改了
{     //------這里修改了
        while(!SW4)                //剪切限位感應(yīng)開關(guān)被按下之前執(zhí)行以下代碼------這里修改了
        {                  
        M2F=1;                   //啟動(dòng)M2電機(jī)
        }
                M2F=0;        //暫停M2電機(jī)
}     //------這里修改了
        Delay4000ms();
        while(SW3)                //剪切限位感應(yīng)開關(guān)被按下后執(zhí)行以下兩行代碼
        {   
        M2F=1;                                                                   //剪切原位感應(yīng)開關(guān)未按下之前執(zhí)行行代碼
        Delay200ms();
        }
        M2F=0;                                                                         //停止M2電機(jī)
  Delay1000ms();
       
}
}        
回復(fù)

使用道具 舉報(bào)

11#
ID:213173 發(fā)表于 2021-3-24 22:18 | 只看該作者
kpljn 發(fā)表于 2021-3-24 22:15
主函數(shù)調(diào)整為以下的流程,電機(jī)的動(dòng)作更遲鈍,很多次都需要長(zhǎng)按啟動(dòng)開關(guān)不放手才開始動(dòng)作。。。。

void ...

改這樣試試
  1. #include<STC12C2052AD.H> //頭文件

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit M2F=P1^2;
  5. sbit M2B=P1^3;
  6. sbit SS1=P1^7;            //定義啟動(dòng)開關(guān)
  7. sbit SW4=P1^5;            //定義剪切限位感應(yīng)開關(guān)
  8. sbit SW3=P1^4;            //定義剪切原位感應(yīng)開關(guān)

  9. uint time;
  10. uchar count,num;
  11. bit lock;

  12. void Timer0Init()        //10毫秒@12.000MHz
  13. {
  14.         TMOD= 0x01;                //設(shè)置定時(shí)器模式
  15.         TL0 = 0xF0;                //設(shè)置定時(shí)初值
  16.         TH0 = 0xD8;                //設(shè)置定時(shí)初值
  17.         TF0 = 0;                        //清除TF0標(biāo)志
  18.         TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
  19. }

  20. void main()        //主函數(shù)
  21. {
  22.         SS1=1;                 //啟動(dòng)開關(guān)初值置1
  23.         SW4=1;                 //剪切限位感應(yīng)開關(guān)置1
  24.         M2F=0;                 //剪切電機(jī)正極置0
  25.         M2B=0;                 //剪切電機(jī)負(fù)極置0
  26.         Timer0Init();       
  27.         while(1)
  28.         {
  29.                 if(TF0==1)
  30.                 {
  31.                         TF0=0;
  32.                         TL0 = 0xF0;                //設(shè)置定時(shí)初值
  33.                         TH0 = 0xD8;                //設(shè)置定時(shí)初值

  34.                         if(!SS1||!SW4||!SW3)
  35.                         {
  36.                                 if(++count>=2 && lock==0)//20ms防抖
  37.                                 {
  38.                                         lock=1;
  39.                                         if(!SS1) num=1;

  40.                                         if(!SW4)
  41.                                         {
  42.                                                 num=2;
  43.                                                 time=0;
  44.                                         }

  45.                                         if(!SW3) num=3;
  46.                                 }
  47.                         }
  48.                         else
  49.                         {
  50.                                 count=0;
  51.                                 lock=0;
  52.                         }

  53.                         if(num==1)
  54.                         {
  55.                                 M2F=1;           //啟動(dòng)M2電機(jī)
  56.                                 num=0;
  57.                         }
  58.                         if(num==2)
  59.                         {
  60.                                 time++;
  61.                                 if(time<400)
  62.                                 {       
  63.                                         M2F=0;           //暫停M2電機(jī)
  64.                                 }
  65.                                 else
  66.                                 {
  67.                                         M2F=1;                        //暫停4秒后繼續(xù)運(yùn)轉(zhuǎn)
  68.                                         num=0;
  69.                                 }
  70.                         }
  71.                         if(num==3)
  72.                         {
  73.                                 M2F=0;         //停止M2電機(jī)
  74.                                 num=0;
  75.                         }
  76.                 }
  77.         }
  78. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

12#
ID:889206 發(fā)表于 2021-3-24 22:33 | 只看該作者

謝謝您的指導(dǎo),我試一下。
回復(fù)

使用道具 舉報(bào)

13#
ID:383215 發(fā)表于 2021-3-24 22:42 | 只看該作者
按鍵去抖動(dòng)都沒有,可能是程序不穩(wěn)定的原因之一,M2是什么電機(jī)?是否會(huì)干擾單片機(jī)?我最近也想試試STC單片機(jī),主要就是測(cè)試抗干擾能力,我用AVR單片機(jī)控制385水泵,也就是385電機(jī),有6個(gè)按鍵開關(guān),從來沒有發(fā)生過程序不穩(wěn)定的情況,如果STC單片機(jī)可以做到,我就用STC單片機(jī),做不到繼續(xù)使用AVR單片機(jī)。
回復(fù)

使用道具 舉報(bào)

14#
ID:889206 發(fā)表于 2021-3-24 23:11 | 只看該作者
kmsj 發(fā)表于 2021-3-24 22:42
按鍵去抖動(dòng)都沒有,可能是程序不穩(wěn)定的原因之一,M2是什么電機(jī)?是否會(huì)干擾單片機(jī)?我最近也想試試STC單片 ...

應(yīng)該和去抖沒啥關(guān)系吧,因?yàn)榘戳鞒虂碚f,只要啟動(dòng)開關(guān)SS1狀態(tài)被觸發(fā)之后,程序就應(yīng)該執(zhí)行SS1=1這個(gè)條件內(nèi)的While(SW4)內(nèi)嵌語句了,在SW4未變?yōu)?時(shí),M2電機(jī)應(yīng)該一直是保持運(yùn)行才對(duì),F(xiàn)在測(cè)試的M2是普通12V直流電機(jī),安裝位置與單片機(jī)有一定的距離,電路板也測(cè)試過了,電機(jī)運(yùn)行時(shí)或狀態(tài)變化時(shí),單片機(jī)VCC電壓一直是4.998V至5V左右。
回復(fù)

使用道具 舉報(bào)

15#
ID:889206 發(fā)表于 2021-3-24 23:45 | 只看該作者

老師您好,測(cè)試了,電機(jī)無法啟動(dòng)。
回復(fù)

使用道具 舉報(bào)

16#
ID:213173 發(fā)表于 2021-3-25 06:37 | 只看該作者
kpljn 發(fā)表于 2021-3-24 23:45
老師您好,測(cè)試了,電機(jī)無法啟動(dòng)。

把硬件圖發(fā)上來看看。從你表述情況很像環(huán)境干擾導(dǎo)致異常,可以把電機(jī)換成LED或燈泡試試。
回復(fù)

使用道具 舉報(bào)

17#
ID:889206 發(fā)表于 2021-3-25 08:02 | 只看該作者
wulin 發(fā)表于 2021-3-25 06:37
把硬件圖發(fā)上來看看。從你表述情況很像環(huán)境干擾導(dǎo)致異常,可以把電機(jī)換成LED或燈泡試試。

是呀,我也懷疑是電路的問題,現(xiàn)在訂了兩片最小系統(tǒng),到貨后重新再測(cè)試。
回復(fù)

使用道具 舉報(bào)

18#
ID:383215 發(fā)表于 2021-3-25 10:41 | 只看該作者
kpljn 發(fā)表于 2021-3-24 23:11
應(yīng)該和去抖沒啥關(guān)系吧,因?yàn)榘戳鞒虂碚f,只要啟動(dòng)開關(guān)SS1狀態(tài)被觸發(fā)之后,程序就應(yīng)該執(zhí)行SS1=1這個(gè)條件內(nèi) ...

只要是按鍵,就必須去抖動(dòng),這是最最基本的常識(shí),連按鍵去抖動(dòng)都懶得編,編程還有什么意義?按鍵去抖動(dòng)能有多難編?M2是普通12V直流電機(jī),我用的385水泵電機(jī)也是12V直流電機(jī),我的電路分別控制一個(gè)385水泵電機(jī)、可控硅觸發(fā)、可控硅擊穿檢測(cè)、繼電器切斷可控硅、HX711重量傳感器,兩個(gè)18B20、6個(gè)RH6030感應(yīng)式按鍵、12個(gè)數(shù)碼管,比你的電路復(fù)雜好幾倍,運(yùn)行了三年多,從來沒有發(fā)現(xiàn)程序不穩(wěn)定的現(xiàn)象,6個(gè)RH6030感應(yīng)式按鍵照樣用了編程去抖動(dòng),一巴掌按上去都不會(huì)產(chǎn)生干擾,你這個(gè)電路最大問題就是電機(jī)是否會(huì)干擾STC單片機(jī),確實(shí)本論壇有人反映電機(jī)會(huì)干擾STC單片機(jī),那只有換單片機(jī)了,我知道AVR單片機(jī)的抗干擾能力很強(qiáng),最強(qiáng)的是PIC單片機(jī)我沒有用過,STC單片機(jī)的抗干擾能力我還沒有測(cè)試,一看你的程序結(jié)構(gòu)就不對(duì),我的程序也比你這個(gè)復(fù)雜好幾倍,一共編了2000多行,5K多的程序,編下來也很輕松啊,你要細(xì)化到步,用步驟式編程,是化繁為簡(jiǎn)的最佳方法,你這個(gè)程序,我?guī)追昼娭畠?nèi)就可以搞定,我把我的程序復(fù)制修改一下就完事了。本論壇不能直接給程序,我也只能提醒到這里,你自己慢慢搞定。
回復(fù)

使用道具 舉報(bào)

19#
ID:143767 發(fā)表于 2021-3-25 13:45 | 只看該作者
跟馬達(dá)干擾系統(tǒng)有很大關(guān)系,試試如下圖防干擾:


回復(fù)

使用道具 舉報(bào)

20#
ID:889206 發(fā)表于 2021-3-25 14:01 | 只看該作者
kmsj 發(fā)表于 2021-3-25 10:41
只要是按鍵,就必須去抖動(dòng),這是最最基本的常識(shí),連按鍵去抖動(dòng)都懶得編,編程還有什么意義?按鍵去抖動(dòng)能 ...

謝謝您的指點(diǎn),不去抖動(dòng)的主要原因是剛學(xué)單片機(jī)和C語言,很多知識(shí)點(diǎn)還沒弄明白,就如時(shí)延和時(shí)鐘這兩個(gè)知識(shí)點(diǎn),我也是在這個(gè)程序的測(cè)試中明白了大概的區(qū)別。另外,我也很想您再指導(dǎo)一下,我寫的這個(gè)程序的結(jié)構(gòu)錯(cuò)誤位置在哪里?因?yàn)樾率值闹R(shí)有限,就算是寫錯(cuò)了,也不知道錯(cuò)誤在哪里。再次感謝您的指導(dǎo)。
回復(fù)

使用道具 舉報(bào)

21#
ID:889206 發(fā)表于 2021-3-25 21:43 | 只看該作者
dj3365191 發(fā)表于 2021-3-25 13:45
跟馬達(dá)干擾系統(tǒng)有很大關(guān)系,試試如下圖防干擾:

謝謝您的指導(dǎo),我增加這三個(gè)電容試試。
回復(fù)

使用道具 舉報(bào)

22#
ID:889206 發(fā)表于 2021-3-25 21:55 | 只看該作者
dj3365191 發(fā)表于 2021-3-25 13:45
跟馬達(dá)干擾系統(tǒng)有很大關(guān)系,試試如下圖防干擾:

回想了一下電機(jī)的特性,電機(jī)動(dòng)作有問題。很有可能是電機(jī)造成。因?yàn)樽鳛楦行栽,?dāng)輸入端電流突變時(shí),會(huì)產(chǎn)生反電動(dòng)勢(shì),干擾單片機(jī)電源。
回復(fù)

使用道具 舉報(bào)

23#
ID:889206 發(fā)表于 2021-3-26 00:42 | 只看該作者

老師您好,我是剛學(xué)單片機(jī)和C語言的,知識(shí)有限。今天分析了您寫的程序的思路,以下是我的理解,不知道是否理解正確。理解有誤和不明白的地方請(qǐng)?jiān)俣喽嘀笇?dǎo):
1、單片機(jī)啟動(dòng)內(nèi)部時(shí)鐘,8位置0,開始死循環(huán),時(shí)鐘溢出一次后,溢出標(biāo)志位置0,內(nèi)8位置0,重新執(zhí)行。
2、單片機(jī)在主線程繼續(xù)同步執(zhí)行由40行開始的代碼,掃描在SS1或SW4或SW3任一條件為0的基礎(chǔ)上,設(shè)置三個(gè)狀態(tài)條件,分別滿足時(shí)各個(gè)條件下需執(zhí)行的各組動(dòng)作,要是不滿足三個(gè)條件,count和lock置0。
這一段里面,還沒辦法理解的有多處:第42行代碼是如何實(shí)現(xiàn)20ms時(shí)延(++count在何處執(zhí)行了?是否在IF語句里面可以合并后簡(jiǎn)寫?)、第44行的代碼的目的是啥?、第50行的代碼是否對(duì)內(nèi)時(shí)鐘8位全置0?)、58和59行的count和lock置0有啥用?
3、主程序執(zhí)行滿足掃描外部開關(guān)狀態(tài)條件下面的三組動(dòng)作。
這一段里面,還沒辦法理解也有多處:第65行77行83行的作用是啥?
回復(fù)

使用道具 舉報(bào)

24#
ID:213173 發(fā)表于 2021-3-26 07:57 | 只看該作者
kpljn 發(fā)表于 2021-3-26 00:42
老師您好,我是剛學(xué)單片機(jī)和C語言的,知識(shí)有限。今天分析了您寫的程序的思路,以下是我的理解,不知道是 ...

由于你的目的是通過3個(gè)開關(guān)控制電機(jī)的開停且有隨時(shí)間變化的要求。你的原程序從邏輯上沒有問題,但實(shí)現(xiàn)的方法不妥。阻滯型延時(shí)方式是迫使MCU原地踏步等待,有其它事件發(fā)生MCU不會(huì)做出響應(yīng),這只適合作短暫計(jì)時(shí)。大于ms級(jí)計(jì)時(shí)就要使用定時(shí)器,不但準(zhǔn)確而且不會(huì)耽誤其它程序執(zhí)行。在此使用了定時(shí)器查詢方式if(TF0==1),MCU在主循環(huán)while(1)內(nèi)可以做很多很多事情。這里只占用幾u(yù)s到幾十us,只有當(dāng)TF0==1時(shí)(每隔10ms)才執(zhí)行其{ }內(nèi)任務(wù)。這里任務(wù)分兩塊,1.判斷3個(gè)開關(guān)狀態(tài),滿足條件繼續(xù)執(zhí)行,否則退出。當(dāng)++count>=2兩次滿足條件證明確實(shí)有按鍵操作不是干擾和抖動(dòng)再結(jié)合lock狀態(tài)判斷有效,繼續(xù)執(zhí)行。因?yàn)閘ock=1;就把此次掃描按鍵狀態(tài)鎖定,不會(huì)因不松手又按其它鍵導(dǎo)致錯(cuò)誤。松手后count和lock清0。2.按照鍵值num執(zhí)行相應(yīng)任務(wù)。任務(wù)完成num清0。time是計(jì)時(shí)變量,可以正計(jì)時(shí)也可以倒計(jì)時(shí),在這里使用前者。不論如何在使用前要賦初值。
回復(fù)

使用道具 舉報(bào)

25#
ID:889206 發(fā)表于 2021-3-26 09:13 | 只看該作者
wulin 發(fā)表于 2021-3-26 07:57
由于你的目的是通過3個(gè)開關(guān)控制電機(jī)的開停且有隨時(shí)間變化的要求。你的原程序從邏輯上沒有問題,但實(shí)現(xiàn)的 ...

非常感謝您的解答,拜讀了您的方案讓我理解好幾個(gè)模糊的概念。我本來的目的是控制兩個(gè)直流電機(jī)依次執(zhí)行動(dòng)作的,在一開始寫的函數(shù)也是用條件語句結(jié)合定時(shí)器去控制,但很多概念類的知識(shí)還沒弄清楚,所以初始版本的程序的執(zhí)行結(jié)果就是動(dòng)作不受控制(特別是在時(shí)延4秒這個(gè)節(jié)點(diǎn)上不好把握)。針對(duì)上述情況,我把難度降低了一點(diǎn),先從控制一個(gè)電機(jī)入手。然后就如您所說的那樣,選用空計(jì)算的方式迫使MCU達(dá)到延時(shí)效果,計(jì)算完畢后,再執(zhí)行下一步的有效動(dòng)作。從流程上來看,我也知道我寫的肯定是最笨的程序,因?yàn)楦揪蜎]有充分利用了MCU的能力,根本就沒有拓展性。但這種寫法難度很低,很適合我這種腦子里沒啥干貨的人,不需要涉及更多的知識(shí)點(diǎn),幾個(gè)動(dòng)作依次執(zhí)行,簡(jiǎn)單而粗暴。嘻嘻-------------------
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表