1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

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

QQ登錄

只需一步,快速開(kāi)始

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

大佬,萌新求指導(dǎo),暑假剛學(xué)單片機(jī),編程總是達(dá)不到想要的效果

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
288黑幣
我和學(xué)長(zhǎng)自己做的一個(gè)小玩意,風(fēng)控自動(dòng)窗簾,使用微壓傳感器,但是我們的程序怎么調(diào)就是不能自動(dòng)控制,我們是這樣設(shè)置的,信號(hào)輸入范圍3-5v電機(jī)run,1-2v電機(jī)frun,但是電機(jī)卻一直在轉(zhuǎn),如果要實(shí)現(xiàn)這樣的效果,應(yīng)該使用什么樣的語(yǔ)言結(jié)構(gòu),救救孩子吧,萌新太難了!


單片機(jī)源程序如下:
  1. #include "reg52.h"             //此文件中定義了單片機(jī)的一些特殊功能寄存器
  2. #include"XPT2046.h"   

  3. typedef unsigned int u16;      //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  4. typedef unsigned char u8;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. sbit IN1=P2^0;
  9. sbit IN2=P2^1;



  10. u8 disp[4];
  11. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  12. u8 text=0,flag=0;
  13. u8 text1=0,flag1=0;

  14. /*******************************************************************************
  15. * 函 數(shù) 名         : delay
  16. * 函數(shù)功能           : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  17. *******************************************************************************/

  18. void delay(u16 i)
  19. {
  20.     while(i--);   
  21. }
  22. void run()
  23. {
  24.     u8 i;
  25.     IN1=IN2=0;
  26.     for(i=0;i<100;i++)      //循環(huán)100次,也就是大約5S
  27.     {
  28.         IN1=1;
  29.         IN2=0;             //開(kāi)啟電機(jī)
  30.         delay(5000);    //大約延時(shí)50ms
  31.     }
  32.     IN1=IN2=0;


  33. }
  34. void frun()
  35. {
  36.     u8 i;
  37.     IN1=IN2=0;
  38.     for(i=0;i<100;i++)      //循環(huán)100次,也就是大約5S
  39.     {
  40.         IN1=0;
  41.         IN2=1;             //開(kāi)啟電機(jī)
  42.         delay(5000);    //大約延時(shí)50ms
  43.     }
  44.     IN1=IN2=0;

  45.    
  46. }
  47. /*******************************************************************************
  48. * 函數(shù)名         :datapros()
  49. * 函數(shù)功能         :數(shù)據(jù)處理函數(shù)
  50. * 輸入           : 無(wú)
  51. * 輸出              : 無(wú)
  52. *******************************************************************************/
  53. void datapros()
  54. {
  55.     u16 temp;
  56.     static u8 i;
  57.     i++;
  58.     if(i==50)
  59.     {
  60.         i=0;
  61.         temp = Read_AD_Data(0xE4);        //   AIN3 外部輸入
  62.     }
  63.    
  64. //    disp[0]=smgduan[temp/1000];//千位
  65.     disp[0]=1;//千位
  66.     disp[1]=smgduan[temp%1000/100];//百位
  67.     disp[2]=smgduan[temp%1000%100/10];//個(gè)位
  68.     disp[3]=smgduan[temp%1000%100%10];        
  69. }


  70. /*******************************************************************************
  71. * 函數(shù)名         :DigDisplay()
  72. * 函數(shù)功能         :數(shù)碼管顯示函數(shù)
  73. * 輸入           : 無(wú)
  74. * 輸出              : 無(wú)
  75. *******************************************************************************/
  76. void DigDisplay()
  77. {
  78.     u8 i;
  79.     for(i=0;i<4;i++)
  80.     {
  81.         switch(i)     //位選,選擇點(diǎn)亮的數(shù)碼管,
  82.         {
  83.             case(0):
  84.                 LSA=1;LSB=1;LSC=1; break;//顯示第0位
  85.             case(1):
  86.                 LSA=0;LSB=1;LSC=1; break;//顯示第1位
  87.             case(2):
  88.                 LSA=1;LSB=0;LSC=1; break;//顯示第2位
  89.             case(3):
  90.                 LSA=0;LSB=0;LSC=1; break;//顯示第3位   
  91.         }
  92.         P0=disp[i];//發(fā)送數(shù)據(jù)
  93.         delay(100); //間隔一段時(shí)間掃描   
  94.         P0=0x00;//消隱
  95.     }        
  96. }
  97. void Text_Init()
  98. {
  99.     if (disp[0]>=3 && disp[0] != text)
  100.     {
  101.           text = disp[0];
  102.           flag = 1;
  103.     }
  104. }
  105. void Text_Init1()
  106. {
  107.     if (disp[0]<3 && disp[0] != text)
  108.     {
  109.           text = disp[0];
  110.           flag1 = 1;
  111.     }
  112. }
  113. /*******************************************************************************
  114. * 函 數(shù) 名       : main
  115. * 函數(shù)功能         : 主函數(shù)
  116. * 輸    入       : 無(wú)
  117. * 輸    出         : 無(wú)
  118. *******************************************************************************/
  119. void main()
  120. {   
  121.     while(1)
  122.     {
  123.         
  124.         datapros();     //數(shù)據(jù)處理函數(shù)
  125.         DigDisplay();
  126.         Text_Init();
  127.         Text_Init1();
  128.         if(disp[0]>=3)
  129.         {
  130.             if(disp[0]>=3)
  131.             {
  132.                        if(flag=1)
  133.                 {
  134.                     run();
  135.                     flag = 0;
  136.                 }
  137.              }
  138.          }
  139.          if(disp[0]<3)
  140.         {
  141.             if(disp[0]<3)
  142.             {
  143.                        if(flag1=1)
  144.                 {
  145.                     run();
  146.                     flag1= 0;
  147.                 }
  148.              }
  149.          }   
  150.         
  151.     }        
  152. }
復(fù)制代碼


1598324106874.jpg (2.79 MB, 下載次數(shù): 92)

1598324106874.jpg

最佳答案

查看完整內(nèi)容

粗略看了下, 整個(gè)程序只有第75行 disp[0]=1;//千位 對(duì) disp[0]進(jìn)行過(guò)操作,所以整個(gè)程序運(yùn)行過(guò)程中, disp[0]永遠(yuǎn)等于1。小于3,所以while中的if循環(huán)永遠(yuǎn)只能進(jìn)第二分支。 由于disp[0] =1 ,所以Text_Init()中的if語(yǔ)句里面的語(yǔ)句不會(huì)被執(zhí)行。執(zhí)行的是Text_Init1() void Text_Init1() { if (disp[0]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:511890 發(fā)表于 2020-8-26 15:47 | 只看該作者
粗略看了下, 整個(gè)程序只有第75行 disp[0]=1;//千位  對(duì) disp[0]進(jìn)行過(guò)操作,所以整個(gè)程序運(yùn)行過(guò)程中, disp[0]永遠(yuǎn)等于1。小于3,所以while中的if循環(huán)永遠(yuǎn)只能進(jìn)第二分支。
由于disp[0] =1 ,所以Text_Init()中的if語(yǔ)句里面的語(yǔ)句不會(huì)被執(zhí)行。執(zhí)行的是Text_Init1()
void Text_Init1()
{
    if (disp[0]<3 && disp[0] != text)//由于disp[0]=1,text =0,所以判斷通過(guò),執(zhí)行以下程序
    {
          text = disp[0];
          flag1 = 1;
    }
}
到這里得到flag=0,flag1=1,所以程序執(zhí)行
         if(disp[0]<3)
        {
            if(disp[0]<3)
            {
                       if(flag1=1)
                {
                    run();
                    flag1= 0;
                }
執(zhí)行一次后就不再執(zhí)行。
至于你說(shuō)的電機(jī)一直在轉(zhuǎn),這個(gè)有兩種可能,一種是硬件電路有問(wèn)題。另一種的當(dāng)IN1=IN2=0時(shí)電機(jī)運(yùn)行,等于1時(shí)電機(jī)不轉(zhuǎn)。要確定這種情況只要看下程序剛開(kāi)始運(yùn)行時(shí)有一個(gè)電機(jī)停止5秒就能確定。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2020-8-26 18:11 | 只看該作者
從樓主混亂不堪的代碼猜測(cè):temp = Read_AD_Data(0xE4);獲取傳感器16位數(shù)據(jù),解析temp后得到的信息來(lái)控制電機(jī)。可是“disp[1]=smgduan[temp%1000/100];//百位”這樣的代碼提取的信息只能供數(shù)碼管顯示用,其數(shù)據(jù)內(nèi)容已經(jīng)面目全非了,根本不可能用做后續(xù)判斷條件 if (disp[0]>=3 && disp[0] != text) 。如果要提取temp的百位數(shù)據(jù)用于判斷應(yīng)當(dāng)是 if((temp/100%10)>=3 && (temp/100%10) != text)。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:805016 發(fā)表于 2020-8-26 20:05 | 只看該作者
wulin 發(fā)表于 2020-8-26 18:11
從樓主混亂不堪的代碼猜測(cè):temp = Read_AD_Data(0xE4);獲取傳感器16位數(shù)據(jù),解析temp后得到的信息來(lái)控制電 ...

大佬,萌新第一次寫(xiě)代碼,很多地方都不太懂,我想請(qǐng)教一下您,


void Text_Init()
{
    if (disp[0]>=3 && disp[0] != text)
    {
          text = disp[0];
          flag = 1;


這個(gè)對(duì)比程序,跟下一次的程序?qū)Ρ龋绻c上次的程序相同,電機(jī)不轉(zhuǎn),反之亦然,我主要有一個(gè)疑惑,我的這個(gè)傳感器時(shí)有規(guī)律輸出信號(hào),在一定范圍內(nèi)波動(dòng),如果要實(shí)現(xiàn)理想情況,該采用什么樣的結(jié)構(gòu)
回復(fù)

使用道具 舉報(bào)

5#
ID:391114 發(fā)表于 2020-8-26 22:57 | 只看該作者
程序有點(diǎn)混亂,但是像這樣的為控制,大多是需要算法來(lái)進(jìn)行調(diào)整的,譬如PID算法
回復(fù)

使用道具 舉報(bào)

6#
ID:781556 發(fā)表于 2020-8-27 00:21 | 只看該作者
if語(yǔ)法應(yīng)該沒(méi)什麼可說(shuō)的,
關(guān)鍵是先確定傳感器的穩(wěn)定性,漂移誤差範(fàn)圍,
而後考慮是否可通過(guò)算法進(jìn)行補(bǔ)償修正。
建議逐步監(jiān)視跟蹤數(shù)據(jù),以便鎖定問(wèn)題所在,代碼 電路 器件都有可能。
A.驗(yàn)證代碼建議移除傳感器,以固定信號(hào)進(jìn)行觸發(fā)
B.驗(yàn)證傳感器建議參考供應(yīng)商範(fàn)例。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:808485 發(fā)表于 2020-8-31 15:48 | 只看該作者
本帖最后由 gbchang 于 2020-8-31 15:53 編輯

“信號(hào)輸入范圍3-5v電機(jī)run,1-2v電機(jī)frun,但是電機(jī)卻一直在轉(zhuǎn)”

我大膽猜測(cè)補(bǔ)充一下邏輯要求:
傳感器3~5V時(shí),電機(jī)正轉(zhuǎn),1~2V時(shí),電機(jī)反轉(zhuǎn),傳感器其它數(shù)值時(shí),電機(jī)停止
進(jìn)一步猜測(cè)應(yīng)用場(chǎng)景:
根據(jù)風(fēng)壓控制窗簾開(kāi)閉,起大風(fēng)時(shí),為了防止刮壞窗簾,打開(kāi)窗簾(只需要開(kāi)一次就好),風(fēng)小了太陽(yáng)出來(lái)了,關(guān)窗簾防曬,同樣也只需要關(guān)一次
所以,開(kāi)和閉應(yīng)該是有一個(gè)制約關(guān)系的。開(kāi)-關(guān)-開(kāi)-關(guān)...,交替進(jìn)行

在充分尊重原作者程序思想前提下,主程序邏輯增加制約條件,即交替因素:

void Text_Init()
{
        if (disp[0]>=3 && disp[0] != text)
        {//風(fēng)壓變化,且大于3V
                text = disp[0];
                flag = 1;        //請(qǐng)求開(kāi)窗簾
        }
}
void Text_Init1()
{
        if (disp[0]<=2 && disp[0] != text)
        {//風(fēng)壓變化,且小于2V
                text = disp[0];
                flag = 0;        //請(qǐng)求閉窗簾
        }
}

void main()
{   
    while(1)
    {
        
        datapros();     //數(shù)據(jù)處理函數(shù)
        DigDisplay();
        Text_Init();
        Text_Init1();
               
                if( flag1 == 0 && flag == 1 )
                {//窗簾處于閉合狀態(tài),有開(kāi)啟請(qǐng)求
                        run();
                        flag1 = 1;        //窗簾已經(jīng)打開(kāi),記錄狀態(tài)為1
                }
                else if( flag1 == 1 && flag == 0 )
                {//窗簾處于開(kāi)啟狀態(tài),有閉合請(qǐng)求
                        frun();
                        flag1 = 0;        //窗簾已經(jīng)閉合,記錄狀態(tài)為0
                }
    }        
}


評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

8#
ID:750684 發(fā)表于 2020-9-7 08:17 | 只看該作者
程序有點(diǎn)混亂,但是像這樣的為控制,大多是需要算法來(lái)進(jìn)行調(diào)整的,譬如PID算法

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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