久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機小白求教問題—數碼管不顯示
[打印本頁]
作者:
rsdwm
時間:
2022-3-6 21:15
標題:
單片機小白求教問題—數碼管不顯示
問題:數碼管不顯示問題
情況:加上Fuzzy模塊的函數后,數碼管不顯示
單片機源程序如下:
void display_service();
unsigned char ad_result = 0,ControlOut=0; // 0-255
int ad_show = 0;
void main()
{
while(1)
{
ad_result = ADC_Conv();
ad_show = ad_result; //5v - 500 255-份
display_service();
Display();
ControlOut = Control_Fuzzy(ad_result); //如果注釋掉這行代碼,不調用這個函數就會正常
DAC0832_Conv(ControlOut);
}
}
void display_service()
{
LEDBUF[0]=ad_show/1000%100;
LEDBUF[1]=ad_show/100%10;
LEDBUF[2]=ad_show/10%10;
LEDBUF[3]=ad_show%10;
}
復制代碼
fuzzy模塊代碼
const float code WaterLevel_FuzzyControl_table[7][7]=
// NL NM NS ZO PS PM PL
{
3, 3, 3, 3, 2, 1, 0, //NL
3, 3, 3, 2, 1, 0, 0, //NM
3, 3, 2, 0, 0, 0, 0, //NS
0, 0, 0, 0, 0, 0, 0, //ZO
0, 0, 0, 0,-2,-3,-3, //PS
0, 0,-1,-2,-3,-3,-3, //PM
0,-1,-2,-3,-3,-3,-3 //PL
};
/*
函數名稱:隸屬度計算函數
參數:x為清晰值對應的模糊值,x0,x1,x2為端點中點值
a,b,c為過程隸屬度,u為最終隸屬度
*/
float Membership( char x0, char x1, char x2, float x)
{
float a,b,c,u;//r,
//r = x1-x0; //相似三角形算法
//if(r == 0)
// r = 0.001; //保證分母不為零
a = (x-x0)/(x1-x0);//r;
//r = x2-x1;
//if(r == 0)
// r = 0.001;
b = (x2-x)/(x2-x1);//r;
/* tanx算法 tanx=1
a = x-x0;
b = x2-x;
*/
if(a <= b) //比較取小
c = a;
else
c = b;
if(c < 0) //若隸屬度小于零,則強制為零
u = 0; //隸屬度為什么等于零
else
u = c;
return u; //返回隸屬度
}
/*
函數名稱:控制函數
參數:入口參數WL;WLE水位偏差;WLEC偏差變化;
WLFlag水位控制標志;WL0上一次的水位值;
WLE0為上一次的水位偏差;WLOut為累計的水位控制輸出;
K為水位控制輸出比例因子。
*/
unsigned int Control_Fuzzy(unsigned char WL)
{
/*float ControlOut;
ControlOut = WL;*/
static unsigned char WL0 = 0, WLE0 = 0 ;//WLOut = 127 ,;
float ControlOut,WLE,WLEC;//,CG = 0
float code K = 2.67;
char i,j;//,k = 0
static char WLFlag = 0;
float MembershipE[7],MembershipEE[7];// //定義隸屬度值緩沖區
if(WLFlag == 1) goto FC; //滿足條件,進入模糊控子程序
//*************水位異常報警**************
if(WL <= 106) //水位超低
{
if(WL0 == 0) //第一次進入程序不進行控制
{
ControlOut = 0;
WL0 = WL;
}
else //否則報警
{
ControlOut = 0xff;
//Alarm();
}
}
else if (WL >= 150) //水位超高
{
if(WL0 == 0) //第一次進入程序不進行控制
{
ControlOut = 0;
WL0 = WL;
}
else //否則報警
{
ControlOut = 0;
//Alarm();
}
}
//爆管與虛假水位報警
WLE = WL - WL0; //計算水位偏差及其變化
WLEC = WLE - WLE0;
WL0 = WL;
if(WLEC*10 <= -1) //爆管
{
ControlOut = 0xff;
//Alarm();
}
else if(WLEC*10 >= 3)
{
ControlOut = 0; //虛假水位
//Alarm();
}
else
FC:
{
if(WLFlag == 0) //第一次進入程序不進行控制
{
WLFlag = 1;
//K = 2.67;
WLE = (WL - 127)*0.035; //論域轉換
WL0 = WL;
WLE = WLE0;
ControlOut = 0;
}
else
{
WLFlag = 1;
WLE = (WL - 127)*0.035; //論域轉換
WL0 = WL;
WLEC = (WLE0 - WLE)*0.024;
WLEC = WLE;
}
//**************計算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);
//**************求輸出************
for(i=1;i<8;i++)
{
if(MembershipE[i]>0)
{
i=i;
}
}
for(j=1;j<8;j++)
{
if(MembershipEE[i]>0)
{
j=j;
}
}
ControlOut = WaterLevel_FuzzyControl_table[i][j]*K*16+127; //計算結果并且轉化論域
}
return ControlOut;
}
復制代碼
代碼仿真.zip
2022-3-6 21:14 上傳
點擊文件名下載附件
149 KB, 下載次數: 5
作者:
wojiaoguogai
時間:
2022-3-7 08:52
要么死循環,要么崩了
作者:
rsdwm
時間:
2022-3-7 15:31
wojiaoguogai 發表于 2022-3-7 08:52
要么死循環,要么崩了
謝謝解答,我模擬跑了一遍,發現每次經過fuzzy模塊出來后,再display后有又從第一個switch語句開始。死循環了,不知道是什么原因,現在我用定時中斷刷新display后可以顯示了。
作者:
lkc8210
時間:
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應定義為靜態變數
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
午夜影院操
|
日韩在线观看中文字幕
|
国产精品高清在线
|
激情六月丁香婷婷
|
三级高清
|
国产精品69毛片高清亚洲
|
西西裸体做爰视频
|
亚洲一区二区三区在线视频
|
久热免费
|
欧美久久精品一级c片
|
欧美亚洲视频
|
精品一区二区三区中文字幕
|
欧美精品福利视频
|
日韩国产免费
|
欧洲色
|
午夜欧美一区二区三区在线播放
|
日韩一区二区三区在线播放
|
久久久久久国产精品久久
|
天天澡天天狠天天天做
|
成人免费观看男女羞羞视频
|
久草免费在线
|
久久九九色
|
欧美日韩国产传媒
|
成年人视频在线免费观看
|
欧美激情va永久在线播放
|
精品国产乱码久久久久久丨区2区
|
国产乱码精品1区2区3区
|
国产精品99久久久久久久久
|
在线免费观看日本
|
久久久久亚洲视频
|
日韩色在线
|
亚洲美女视频
|
91av免费版
|
亚洲国产一区二区三区
|
四虎影视
|
成人做爰www免费看视频网站
|
免费久久久
|
国产一区
|
黄a网
|
cao在线
|
国产精品五月天
|