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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機小白求教問題—數碼管不顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:675269 發表于 2022-3-6 21:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
問題:數碼管不顯示問題
情況:加上Fuzzy模塊的函數后,數碼管不顯示

單片機源程序如下:
  1. void display_service();

  2. unsigned char ad_result = 0,ControlOut=0; // 0-255
  3. int ad_show = 0;

  4. void main()
  5. {

  6.         while(1)
  7.         {
  8.                 ad_result = ADC_Conv();
  9.                 ad_show = ad_result;  //5v - 500  255-份
  10.                 display_service();
  11.                 Display();
  12.                 ControlOut = Control_Fuzzy(ad_result);  //如果注釋掉這行代碼,不調用這個函數就會正常
  13.                 DAC0832_Conv(ControlOut);
  14.         }
  15. }

  16. void display_service()
  17. {
  18.         LEDBUF[0]=ad_show/1000%100;
  19.         LEDBUF[1]=ad_show/100%10;
  20.         LEDBUF[2]=ad_show/10%10;
  21.         LEDBUF[3]=ad_show%10;
  22. }
復制代碼

fuzzy模塊代碼
  1. const float code WaterLevel_FuzzyControl_table[7][7]=
  2.     // NL NM NS ZO PS PM PL
  3. {
  4.         3, 3, 3, 3, 2, 1, 0, //NL
  5.         3, 3, 3, 2, 1, 0, 0, //NM
  6.         3, 3, 2, 0, 0, 0, 0, //NS
  7.         0, 0, 0, 0, 0, 0, 0, //ZO
  8.         0, 0, 0, 0,-2,-3,-3, //PS
  9.         0, 0,-1,-2,-3,-3,-3, //PM
  10.         0,-1,-2,-3,-3,-3,-3        //PL
  11. };

  12. /*
  13. 函數名稱:隸屬度計算函數
  14. 參數:x為清晰值對應的模糊值,x0,x1,x2為端點中點值
  15.           a,b,c為過程隸屬度,u為最終隸屬度
  16. */
  17. float Membership( char x0, char x1, char x2, float x)
  18. {
  19.         float a,b,c,u;//r,

  20.         //r = x1-x0;                                        //相似三角形算法
  21.         //if(r == 0)
  22.         //        r = 0.001;                                //保證分母不為零
  23.         a = (x-x0)/(x1-x0);//r;
  24.         //r = x2-x1;
  25.         //if(r == 0)
  26.         //        r = 0.001;
  27.         b = (x2-x)/(x2-x1);//r;
  28. /*  tanx算法  tanx=1
  29.     a = x-x0;   
  30.         b = x2-x;
  31. */
  32.                
  33.         if(a <= b)                                        //比較取小
  34.                 c = a;
  35.         else
  36.                 c = b;
  37.         if(c < 0)                                        //若隸屬度小于零,則強制為零
  38.                 u = 0;                                        //隸屬度為什么等于零
  39.         else
  40.                 u = c;
  41.         return u;                                        //返回隸屬度
  42. }

  43. /*
  44. 函數名稱:控制函數
  45. 參數:入口參數WL;WLE水位偏差;WLEC偏差變化;
  46.           WLFlag水位控制標志;WL0上一次的水位值;
  47.           WLE0為上一次的水位偏差;WLOut為累計的水位控制輸出;
  48.           K為水位控制輸出比例因子。
  49. */

  50. unsigned int Control_Fuzzy(unsigned char WL)

  51. {
  52.         /*float ControlOut;
  53.         ControlOut = WL;*/
  54.         static unsigned char WL0 = 0, WLE0 = 0 ;//WLOut = 127 ,;
  55.         float ControlOut,WLE,WLEC;//,CG = 0
  56.         float code K = 2.67;
  57.         char i,j;//,k = 0
  58.         static char WLFlag = 0;
  59.         float MembershipE[7],MembershipEE[7];//        //定義隸屬度值緩沖區

  60.         if(WLFlag == 1) goto FC;                //滿足條件,進入模糊控子程序
  61. //*************水位異常報警**************
  62.         if(WL <= 106)                                //水位超低
  63.                 {
  64.                 if(WL0 == 0)                        //第一次進入程序不進行控制
  65.                         {
  66.                                 ControlOut = 0;
  67.                                 WL0 = WL;
  68.                         }
  69.                 else                                        //否則報警
  70.                         {
  71.                                 ControlOut = 0xff;
  72.                                 //Alarm();
  73.                         }
  74.                 }
  75.         else if (WL >= 150)                        //水位超高
  76.                 {
  77.                 if(WL0 == 0)                        //第一次進入程序不進行控制
  78.                         {
  79.                                 ControlOut = 0;
  80.                                 WL0 = WL;
  81.                         }
  82.                 else                                        //否則報警
  83.                         {
  84.                                 ControlOut = 0;
  85.                                 //Alarm();
  86.                         }
  87.                 }
  88. //爆管與虛假水位報警
  89.         WLE = WL - WL0;                                //計算水位偏差及其變化
  90.         WLEC = WLE - WLE0;
  91.         WL0 = WL;
  92.         if(WLEC*10 <= -1)                        //爆管
  93.                 {
  94.                         ControlOut = 0xff;
  95.                         //Alarm();
  96.                 }
  97.         else if(WLEC*10 >= 3)
  98.                 {
  99.                         ControlOut = 0;                //虛假水位
  100.                         //Alarm();
  101.                 }
  102.         else
  103.         FC:
  104.                 {
  105.                         if(WLFlag == 0)                                //第一次進入程序不進行控制
  106.                                 {
  107.                                         WLFlag = 1;
  108.                                         //K = 2.67;
  109.                                         WLE = (WL - 127)*0.035;                //論域轉換
  110.                                         WL0 = WL;
  111.                                         WLE = WLE0;
  112.                                         ControlOut = 0;
  113.                                 }
  114.                         else
  115.                                 {
  116.                                         WLFlag = 1;
  117.                                         WLE = (WL - 127)*0.035;                //論域轉換
  118.                                         WL0 = WL;
  119.                                         WLEC = (WLE0 - WLE)*0.024;
  120.                                         WLEC = WLE;
  121.                                 }        
  122.         //**************計算WLE的隸屬度************                                
  123.                 MembershipE[1] = Membership(-4,-3,-2,WLE);
  124.                 MembershipE[2] = Membership(-3,-2,-1,WLE);
  125.                 MembershipE[3] = Membership(-2,-1,-0,WLE);
  126.                 MembershipE[4] = Membership(-1,-0,1,WLE);
  127.                 MembershipE[5] = Membership(0,1,2,WLE);
  128.                 MembershipE[6] = Membership(1,2,3,WLE);
  129.                 MembershipE[7] = Membership(2,3,4,WLE);

  130.         //**************計算WLEC的隸屬度************
  131.                 MembershipEE[1] = Membership(-4,-3,-2,WLEC);
  132.                 MembershipEE[2] = Membership(-3,-2,-1,WLEC);
  133.                 MembershipEE[3] = Membership(-2,-1,-0,WLEC);
  134.                 MembershipEE[4] = Membership(-1,-0,1,WLEC);
  135.                 MembershipEE[5] = Membership(0,1,2,WLEC);
  136.                 MembershipEE[6] = Membership(1,2,3,WLEC);
  137.                 MembershipEE[7] = Membership(2,3,4,WLEC);
  138.                
  139.         //**************求輸出************
  140.                 for(i=1;i<8;i++)
  141.                 {
  142.                         if(MembershipE[i]>0)
  143.                                 {
  144.                                         i=i;
  145.                                 }
  146.                 }
  147.                 for(j=1;j<8;j++)
  148.                 {
  149.                         if(MembershipEE[i]>0)
  150.                                 {
  151.                                         j=j;
  152.                                 }
  153.                 }        
  154.                 ControlOut = WaterLevel_FuzzyControl_table[i][j]*K*16+127;        //計算結果并且轉化論域
  155.                 }
  156.                 return ControlOut;
  157. }
復制代碼


代碼仿真.zip

149 KB, 下載次數: 5

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

使用道具 舉報

沙發
ID:415064 發表于 2022-3-7 08:52 | 只看該作者
要么死循環,要么崩了
回復

使用道具 舉報

板凳
ID:675269 發表于 2022-3-7 15:31 | 只看該作者
wojiaoguogai 發表于 2022-3-7 08:52
要么死循環,要么崩了

謝謝解答,我模擬跑了一遍,發現每次經過fuzzy模塊出來后,再display后有又從第一個switch語句開始。死循環了,不知道是什么原因,現在我用定時中斷刷新display后可以顯示了。
回復

使用道具 舉報

地板
ID:161164 發表于 2022-3-7 17:37 | 只看該作者
fuzzy.c :
行64:float MembershipE[7],MembershipEE[7];//        //定義隸屬度值緩沖區

行128~144:
        //**************計算WLE的隸屬度************                               
                MembershipE[1] = Membership(-4,-3,-2,WLE);
                MembershipE[2] = Membership(-3,-2,-1,WLE);
                MembershipE[3] = Membership(-2,-1,-0,WLE);
                MembershipE[4] = Membership(-1,-0,1,WLE);
                MembershipE[5] = Membership(0,1,2,WLE);
                MembershipE[6] = Membership(1,2,3,WLE);
                MembershipE[7] = Membership(2,3,4,WLE);

        //**************計算WLEC的隸屬度************
                MembershipEE[1] = Membership(-4,-3,-2,WLEC);
                MembershipEE[2] = Membership(-3,-2,-1,WLEC);
                MembershipEE[3] = Membership(-2,-1,-0,WLEC);
                MembershipEE[4] = Membership(-1,-0,1,WLEC);
                MembershipEE[5] = Membership(0,1,2,WLEC);
                MembershipEE[6] = Membership(1,2,3,WLEC);
                MembershipEE[7] = Membership(2,3,4,WLEC);

[]內只能是0~6,MembershipEE[7] 指向了不知明地址
當中可能包含了display內的i
而當你把display放進定時中斷內
display內的i的地址改變了
于是顯示就正常了
但依然存某地址不斷被MembershipEE[7] = Membership(2,3,4,WLEC);覆寫的危險

而且display內的i應定義為靜態變數
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美久久免费观看 | 在线视频亚洲 | 国产精品高清在线 | 成人黄页在线观看 | 国内精品久久久久 | 欧美自拍一区 | 亚洲精品4 | av影音| 亚洲精品视频免费观看 | 麻豆精品国产91久久久久久 | 日日碰狠狠躁久久躁96avv | 国产欧美日韩视频 | 日批日韩在线观看 | 91在线观看免费视频 | 日韩视频在线一区二区 | 日日摸夜夜添夜夜添精品视频 | 国产精品久久国产精品久久 | 欧美精品在欧美一区二区 | 91麻豆精品国产91久久久久久 | 中文字幕视频在线看 | 国产精品成人一区二区三区 | 亚洲精品久久久久久国产精华液 | 欧美一区二区二区 | 亚洲视频欧美视频 | 成年人视频免费在线观看 | 视频一区二区中文字幕日韩 | 国产精品美女久久久久久免费 | 人人干人人干人人 | 欧美jizzhd精品欧美巨大免费 | 国产高清在线精品一区二区三区 | 先锋影音资源网站 | 免费啪啪 | 国产精品爱久久久久久久 | 91就要激情 | 成人精品福利 | aaaa一级毛片 | 午夜影院视频在线观看 | 欧美一级三级 | 四虎在线观看 | 91免费入口 | 欧美日在线 |