久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2704|回復: 10
打印 上一主題 下一主題
收起左側

萌新求教和師兄想做風壓自動窗簾系統,單片機接了傳感器后,電機一直轉,停不下來

[復制鏈接]
跳轉到指定樓層
樓主
大一,和師兄做了一個風壓自動控制系統,當風壓達到一定程度,電機自轉,帶動窗簾的關閉,但是程序不管怎么改,電機一直轉,根本停不下來,沒風的時候本來該停下來,但是還是在轉,大佬們,救救孩子們吧!

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

  3. typedef unsigned int u16;      //對數據類型進行聲明定義
  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. * 函 數 名         : delay
  16. * 函數功能           : 延時函數,i=1時,大約延時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++)      //循環100次,也就是大約5S
  27.     {
  28.         IN1=1;
  29.         IN2=0;             //開啟電機
  30.         delay(5000);    //大約延時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++)      //循環100次,也就是大約5S
  39.     {
  40.         IN1=0;
  41.         IN2=1;             //開啟電機
  42.         delay(5000);    //大約延時50ms
  43.     }
  44.     IN1=IN2=0;

  45.    
  46. }
  47. /*******************************************************************************
  48. * 函數名         :datapros()
  49. * 函數功能         :數據處理函數
  50. * 輸入           : 無
  51. * 輸出              : 無
  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];//個位
  68.     disp[3]=smgduan[temp%1000%100%10];        
  69. }


  70. /*******************************************************************************
  71. * 函數名         :DigDisplay()
  72. * 函數功能         :數碼管顯示函數
  73. * 輸入           : 無
  74. * 輸出              : 無
  75. *******************************************************************************/
  76. void DigDisplay()
  77. {
  78.     u8 i;
  79.     for(i=0;i<4;i++)
  80.     {
  81.         switch(i)     //位選,選擇點亮的數碼管,
  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];//發送數據
  93.         delay(100); //間隔一段時間掃描   
  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. * 函 數 名       : main
  115. * 函數功能         : 主函數
  116. * 輸    入       : 無
  117. * 輸    出         : 無
  118. *******************************************************************************/
  119. void main()
  120. {   
  121.     while(1)
  122.     {
  123.         run();
  124.         datapros();     //數據處理函數
  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. }
復制代碼

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

使用道具 舉報

沙發
ID:805016 發表于 2020-8-25 11:01 | 只看該作者
這是我那塊板子的原理圖


A2開發板原理圖.pdf

227.86 KB, 下載次數: 13

回復

使用道具 舉報

板凳
ID:805016 發表于 2020-8-25 11:02 | 只看該作者
這是我們用到的傳感器

1598324106874.jpg (2.79 MB, 下載次數: 87)

1598324106874.jpg
回復

使用道具 舉報

地板
ID:332444 發表于 2020-8-25 12:48 | 只看該作者
主函數內不受限制地運行run();當然電機一直轉動
回復

使用道具 舉報

5#
ID:805016 發表于 2020-8-26 10:59 | 只看該作者
xianfajushi 發表于 2020-8-25 12:48
主函數內不受限制地運行run();當然電機一直轉動

如果我去掉的話,也是這樣,我設置if語句沒什么用

回復

使用道具 舉報

6#
ID:517429 發表于 2020-8-26 13:26 | 只看該作者
本帖最后由 666的付同學 于 2020-8-26 16:01 編輯

你這程序我瞄了一下,寫的很不規范啊,瘋狂調用死循環延時,數碼管顯示處理的也很不好,白白占用了許多ROM,更關鍵的是if語句都有問題,這里需要的是邏輯等==,而不是=,所以你主函數里的if語句出了問題。
回復

使用道具 舉報

7#
ID:805016 發表于 2020-8-26 15:35 | 只看該作者
666的付同學 發表于 2020-8-26 13:26
你這程序我瞄了一下,寫的很不規范啊,瘋狂調用死循環延時,數碼管顯示處理的也很不好,白白占用了許多ROM ...

新手,剛開始學習
回復

使用道具 舉報

8#
ID:805016 發表于 2020-8-26 15:39 | 只看該作者
666的付同學 發表于 2020-8-26 13:26
你這程序我瞄了一下,寫的很不規范啊,瘋狂調用死循環延時,數碼管顯示處理的也很不好,白白占用了許多ROM ...

大佬,我請教一下,我不知道用什么樣的C語言結構,比如當輸入信號為3-4v時,我們想讓電機run,信號1-2frun時,但只轉一次,除非信號范圍變換,電機不轉,什么樣的結構可以達成這個效果
回復

使用道具 舉報

9#
ID:517429 發表于 2020-8-26 16:57 | 只看該作者
932585241 發表于 2020-8-26 15:39
大佬,我請教一下,我不知道用什么樣的C語言結構,比如當輸入信號為3-4v時,我們想讓電機run,信號1-2fru ...

這跟結構沒什么關系,我只是說你寫的程序有些地方不是很合理,至于輸入信號為3到4V時電機轉動,這就用到AD轉換了,因為單片機只能識別數字量,還有給你一個忠告,盡量別用delay,多用定時器。
回復

使用道具 舉報

10#
ID:230118 發表于 2020-8-26 18:26 | 只看該作者
編碼的風格還可以,邏輯有些混亂,問題較明顯,是不是沒仔細檢查自己代碼
1  //    disp[0]=smgduan[temp/1000];//千位
    disp[0]=1;//千位
    disp[1]=smgduan[temp%1000/100];//百位
    disp[2]=smgduan[temp%1000%100/10];//個位
    disp[3]=smgduan[temp%1000%100%10];  
這個下標需要這樣計算嗎
temp%1000%100  和 temp%100 的結果相等
2 main函數中開始的run()是多余的
3 datapros()函數中disp[0]=1;//千位 每次都把disp[0]賦值為1了,后面的if(disp[0]>=3)有可能為真嗎,編譯時候難道沒有警告說有不可能進入的分支?
4 text、text1做什么用的你知道嗎,應該是用來保存上一次切換的時候的AD值,只有在狀態有變化時候才操作風扇開關,而你根本沒用到
5 電機開關是一個開關量,不理解為什么要循環操作100次,只要你的電路設計沒問題,不要懷疑IO操作會失效。

綜上,推測你這是參考別人程序改的,但沒真正看懂別人程序,所以改的亂七八糟
回復

使用道具 舉報

11#
ID:582903 發表于 2020-9-16 15:28 | 只看該作者
風壓的量應該成為電機是否運轉的條件
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美中文在线 | 中文字幕一区二区三区日韩精品 | 国产成人免费视频网站高清观看视频 | 91黄色片免费看 | 密室大逃脱第六季大神版在线观看 | 五月天激情综合网 | 伊人二区| 国内自拍偷拍 | 欧美精品一区二区免费 | 国产精品一区二区三区99 | 久久久久久蜜桃一区二区 | 日韩高清av | 成人av资源在线 | 亚洲精品二区 | 成人激情视频网 | www亚洲精品| 自拍视频一区二区三区 | 毛色毛片免费看 | 欧美偷偷操| 中文视频在线 | 日本三级全黄三级a | 一区二区三区四区av | 国产乱码久久久久久一区二区 | 天天干狠狠操 | 天天艹逼网| 免费一区二区三区 | 国产精品久久一区二区三区 | 国产一区二区三区四区 | 亚洲永久精品国产 | 国产羞羞视频在线观看 | 免费av一区二区三区 | 久久伊人在| 久草精品视频 | 小早川怜子xxxxaⅴ在线 | 久久亚洲春色中文字幕久久久 | 久久网一区二区三区 | 久久亚洲美女 | 免费黄色在线观看 | 久久国内精品 | 欧美一区二区三区视频 | 日韩一区二区在线视频 |