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

QQ登錄

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

搜索
查看: 3117|回復(fù): 3
收起左側(cè)

簡(jiǎn)易風(fēng)洞單片機(jī)程序12864顯示

[復(fù)制鏈接]
ID:195259 發(fā)表于 2017-5-1 15:41 | 顯示全部樓層 |閱讀模式
0.png


  1. /********************************************************************
  2. * 文件名  : 簡(jiǎn)易風(fēng)洞程序
  3. * 描述    :  
  4. * 創(chuàng)建人  : 王東表哥 2014年8月14日
  5. * 版本號(hào)  : 2.0
  6. ***********************************************************************/
  7. #include<STC12C5A60S2.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10. #include <math.h>
  11. #include<absacc.h>
  12. #define uchar unsigned char
  13. #define uint  unsigned int
  14. #define KSP                0.18              //        比例        0.18
  15. #define KSI                0.0045                //  積分        0.0045
  16. #define KSD                0.0001                //        微分        0.0001
  17. #define KSP1        0.14                //        比例
  18. #define KSI1        0.0018                //         積分
  19. #define KSD1        0.0001                //        微分       
  20. uchar code IC_DAT[];
  21. uchar code pic1[];
  22. uchar code pic2[];
  23. uchar code pic3[];
  24. uint size=0;                                         //位置
  25. uint sizechange,changesize=150;        //高度變化停止用
  26. uint displaytime;                                  //定義屏幕刷新時(shí)間
  27. uint Timetime;                                  //計(jì)時(shí)
  28. uint RTimetime;                                  //響應(yīng)
  29. uint MTimetime;                                  //保持
  30. uint ZTimetime;                                  //總時(shí)間
  31. uint Beep1stime;                                  //蜂鳴器1s定時(shí)時(shí)間
  32. uchar flagchangeStar;                        //任務(wù)變化標(biāo)志位
  33. uchar shuzi;
  34. uchar code IC_DAT[]={
  35.                                                 "任務(wù)要求:      "  
  36.                                                 "響應(yīng)時(shí)間:     s"
  37.                                                 "小球位置:    mm"
  38.                                                 "保持時(shí)間:      s"
  39.                                         };

  40. sbit RS  = P1^4;
  41. sbit WRD = P1^5;
  42. sbit E   = P1^6;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  43. sbit RES = P1^7;
  44. sbit RX  = P3^7;
  45. sbit TX  = P3^6;
  46. sbit BEEP  = P3^5;

  47. uchar key,keysign,beeptime;

  48. bit  flag =0;
  49. uchar flagStart=0;                  //啟動(dòng)標(biāo)志位
  50. uchar flagStart7=0;                  //啟動(dòng)標(biāo)志位7
  51. uchar flagStart6=0;                  //啟動(dòng)標(biāo)志位7
  52. uchar flagSep=0;                  //任務(wù)要求標(biāo)志位
  53. uchar pidchang=0;                          //任務(wù)要求標(biāo)志位
  54. uchar flagStart60=0;                          //任務(wù)6要求標(biāo)志位
  55. uchar flagStart61=0;                        //任務(wù)6要求標(biāo)志位1
  56. uchar beepchange1;
  57. uint time=0;
  58. int pwm=255;
  59. uint S=0,S1;

  60. void TransferData(char data1,bit DI);
  61. void display(void);
  62. void display_grapic(void);
  63. void delayms(uint n);
  64. void DisplayLine(uchar line1,uchar line2);
  65. void DisplayGraphic(uchar code *adder);
  66. void delay(uint m);
  67. void lcd_mesg(uchar code *adder1);
  68. void delay25us(void);  

  69. /*====================================================================================================
  70.     PID Function

  71.     The PID (比例、積分、微分) function is used in mainly
  72.     control applications. PIDCalc performs one iteration of the PID
  73.     algorithm.

  74.     While the PID function works, main is just a dummy program showing
  75.     a typical usage.
  76.         以下為PID參數(shù)定義
  77. =====================================================================================================*/

  78. typedef struct PID {

  79.         float  SetPoint;           //  設(shè)定目標(biāo) Desired Value(期望值)
  80.         float  Proportion;         //  比例常數(shù) Proportional Const
  81.         float  Integral;           //  積分常數(shù) Integral Const
  82.         float  Derivative;         //  微分常數(shù) Derivative Const

  83.         float  LastError;          //  Error[-1]        最后一個(gè)誤差
  84.         float  PrevError;          //  Error[-2]       
  85.         float  SumError;           //  Sums of Errors  總誤差

  86. }PID ;

  87. /*====================================================================================================
  88.    PID計(jì)算部分
  89. =====================================================================================================*/

  90. float PIDCalc( PID *pp, float NextPoint )       
  91. {
  92.         float  dError,
  93.             Error,
  94.                 DUTY;       
  95.         Error = pp->SetPoint -  NextPoint;          // 偏差          設(shè)定 - 下一點(diǎn)
  96.         pp->SumError += Error;                      // 積分          誤差和
  97.         dError = pp->LastError - pp->PrevError;     // 當(dāng)前微分         上一個(gè) - 上上個(gè)       
  98.         pp->PrevError = pp->LastError;                                //移位 上一個(gè)》上上個(gè)
  99.         pp->LastError = Error;                                                //移位 上上個(gè)》誤差
  100.         DUTY=
  101.                 (                pp->Proportion * Error              // 比例項(xiàng)          比例*誤差
  102.                 +   pp->Integral * pp->SumError         // 積分項(xiàng)          積分*誤差和
  103.                 +   pp->Derivative * dError             // 微分項(xiàng)          微分*誤差變化
  104.                 );
  105.                 if(DUTY>255){DUTY=255;}
  106.                 if(DUTY<-255){DUTY=-255;}
  107.         return         DUTY;
  108. }

  109. /*====================================================================================================
  110.    Initialize PID Structure          
  111. =====================================================================================================*/

  112. void PIDInit (PID *pp)//將PID各個(gè)參數(shù)初始化為0
  113. {
  114.     memset ( pp,0,sizeof(PID));                         //MEM組
  115. }

  116. /*====================================================================================================
  117.     Main Program
  118. =====================================================================================================*/

  119. float sensor (void)                            //  Dummy Sensor Function  虛擬傳感器功能
  120. {
  121.    while(!S);
  122.    return (float)S;                                                //(S/255.0)*5.0;
  123. }

  124. void actuator(float rDelta)                    //  Dummy Actuator Function 虛擬致動(dòng)器的功能
  125. {
  126. pwm=rDelta;                                                        //(rDelta/5.0)*255;
  127. if(pwm<0){pwm=0;}                                                //高
  128. if(pwm>255) pwm=255;                                        //低

  129. pwm=255-pwm;
  130. }



  131. /********************************************************************
  132. * 名稱(chēng) : 計(jì)數(shù)器 設(shè)T0為方式1,GATE=1
  133. * 功能 :
  134. * 輸入 :
  135. * 輸出 :
  136. ***********************************************************************/
  137. void InitTimer0(void)
  138. {
  139.     TMOD = 0x11;
  140.     TH0 = 0x10;
  141.     TL0 = 0x00;
  142.     TR0 = 1;
  143. }
  144. /********************************************************************
  145. * 名稱(chēng) : T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
  146. * 功能 :
  147. * 輸入 :
  148. * 輸出 :
  149. ***********************************************************************/
  150. void Timer0Interrupt(void) interrupt 1                  //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
  151. {
  152.         flag=1;                                                         //中斷溢出標(biāo)志
  153. }

  154. void  StartModule()                          //啟動(dòng)發(fā)射
  155. {
  156.         TX=1;                                         
  157.         delay25us();
  158.         TX=0;
  159. }
  160. /********************************************************************
  161. * 名稱(chēng) : Convert(uchar In_Date)
  162. * 功能 : 因?yàn)殡娐吩O(shè)計(jì)時(shí),P0.0--P0.7接法剛好了資料中的相反,所以設(shè)計(jì)該函數(shù)。
  163. * 輸入 : 12864資料上的值
  164. * 輸出 : 送
  165. ***********************************************************************/
  166. unsigned char Convert(unsigned char In_Date)
  167. {
  168.     unsigned char i, Out_Date = 0, temp = 0;
  169.     for(i=0; i<8; i++)
  170.     {
  171.         temp = (In_Date >> i) & 0x01;
  172.         Out_Date |= (temp << (7 - i));
  173.     }
  174.     return Out_Date;
  175. }

  176. /********************************************************************
  177. * 名稱(chēng) : LCD字庫(kù)初始化程序
  178. * 功能 : 主函數(shù)
  179. * 輸入 : 無(wú)
  180. * 輸出 : 無(wú)
  181. ***********************************************************************/
  182. void initinal(void)           //LCD字庫(kù)初始化程序
  183. {
  184.         delay(40);             //大于40MS的延時(shí)程序
  185. //        PSB=1;                 //設(shè)置為8BIT并口工作模式
  186.         delay(1);              //延時(shí)
  187.         RES=0;                 //復(fù)位
  188.         delay(1);              //延時(shí)
  189.         RES=1;                 //復(fù)位置高
  190.         delay(10);
  191.         TransferData(0x30,0);  //Extended Function Set :8BIT設(shè)置,RE=0: basic instruction set, G=0 :graphic display OFF
  192.         delay(100);            //大于100uS的延時(shí)程序
  193.         TransferData(0x30,0);  //Function Set
  194.         delay(37);             ////大于37uS的延時(shí)程序
  195.         TransferData(0x08,0);  //Display on Control
  196.         delay(100);            //大于100uS的延時(shí)程序
  197.         TransferData(0x10,0);  //Cursor Display Control光標(biāo)設(shè)置
  198.         delay(100);            //大于100uS的延時(shí)程序
  199.         TransferData(0x0C,0);  //Display Control,D=1,顯示開(kāi)
  200.         delay(100);            //大于100uS的延時(shí)程序
  201.         TransferData(0x01,0);  //Display Clear
  202.         delay(10);             //大于10mS的延時(shí)程序
  203.         TransferData(0x06,0);  //Enry Mode Set,光標(biāo)從右向左加1位移動(dòng)
  204.         delay(100);            //大于100uS的延時(shí)程序
  205. }


  206. /********************************************************************
  207. * 名稱(chēng) : 顯示文字
  208. * 功能 : 主函數(shù)
  209. * 輸入 : 無(wú)
  210. * 輸出 : 無(wú)
  211. ***********************************************************************/
  212. void   lcd_mesg(unsigned char code *adder1)
  213. {
  214.         unsigned char i;
  215.         TransferData(0x80,0);  //設(shè)置圖形顯示內(nèi)存addressset圖形顯示內(nèi)存地址
  216.         delay(100);
  217.         for(i=0;i<32;i++)
  218.         {
  219.                   TransferData(*adder1,1);
  220.                    adder1++;
  221.         }

  222.         TransferData(0x90,0);  //設(shè)置圖形顯示內(nèi)存地址
  223.         delay(100);
  224.         for(i=32;i<64;i++)
  225.         {
  226.                 TransferData(*adder1,1);
  227.                 adder1++;
  228.         }
  229. }

  230. /********************************************************************
  231. * 名稱(chēng) : 傳送數(shù)據(jù)或者命令
  232. * 功能 :
  233. * 輸入 : 無(wú)
  234. * 輸出 : 無(wú)
  235. ***********************************************************************/
  236. void TransferData(char data1,bit DI)  //傳送數(shù)據(jù)或者命令,當(dāng)DI=0時(shí),傳送命令,當(dāng)DI=1時(shí),傳送數(shù)據(jù).
  237. {
  238.         WRD=0;
  239.         RS=DI;
  240.         delay(1);
  241.         P0=Convert(data1);
  242.         E=1;
  243.         delay(1);
  244.         E=0;
  245. }
  246. void Conut(void)
  247. {
  248.         time=TH0*256+TL0;
  249.         TH0=0;
  250.         TL0=0;
  251.         S=time*0.179;       //算出來(lái)是CM          11。0592M晶振
  252.         if(flag==1)                      //超出測(cè)量
  253.         {         
  254.                 flag=0;          
  255.         }
  256.         else
  257.         {       
  258.                 if(S>480) S1=0;
  259.                 else S1=480-S;
  260.        
  261.         }
  262. }
  263. void Distance(void)
  264. {
  265.          StartModule();                 //計(jì)算
  266.          while(!RX);                //當(dāng)RX為零時(shí)等待
  267.          TR0=1;                            //開(kāi)啟計(jì)數(shù)
  268.          while(RX);                        //當(dāng)RX為1計(jì)數(shù)并等待
  269.          TR0=0;                                //關(guān)閉計(jì)數(shù)
  270.          Conut();
  271. }
  272. /********************************************************************
  273. * 名稱(chēng) : 毫秒延時(shí)
  274. * 功能 :
  275. * 輸入 : 無(wú)
  276. * 輸出 : 無(wú)
  277. ***********************************************************************/
  278. void    delayms(unsigned int xms)            //延時(shí)xms毫秒
  279. {
  280.         unsigned int i,j;
  281.         for(i=xms;i>0;i--)
  282.         for(j=1320;j>0;j--);
  283. }

  284. /********************************************************************
  285. * 名稱(chēng) : 10us延時(shí)程序
  286. * 功能 :
  287. * 輸入 : 無(wú)
  288. * 輸出 : 無(wú)
  289. ***********************************************************************/
  290. void    delay(unsigned int m)            //延時(shí)程序
  291. {
  292.         unsigned int i,j;
  293.         for(i=0;i<m;i++)
  294.         for(j=0;j<13;j++);
  295. }

  296. /********************************************************************
  297. * 名稱(chēng) : 25us延時(shí)程序
  298. * 功能 :
  299. * 輸入 : 無(wú)
  300. * 輸出 : 無(wú)
  301. ***********************************************************************/
  302. void delay25us(void)                                           //延時(shí)25us誤差 0us
  303. {
  304.     unsigned char a,b;
  305.     for(b=33;b>0;b--)
  306.         for(a=3;a>0;a--);
  307. }

  308. void InitTimer1(void)        //定時(shí)器初始化
  309. {
  310.     TMOD = 0x11;
  311.     TH1 = 0x0EC;
  312.     TL1 = 0x78;
  313.     EA = 1;
  314.     ET1 = 1;
  315.     TR1 = 1;
  316. }

  317.    
  318. void Timer1Interrupt(void) interrupt 3
  319. {
  320.     TH1 = 0x0EC;
  321.     TL1 = 0x78;
  322.     displaytime++;
  323.         Timetime++;  //計(jì)時(shí)
  324. }


  325. /********************************************************************
  326. * 名稱(chēng) : 顯示圖形
  327. * 功能 : 主函數(shù)
  328. * 輸入 : 無(wú)
  329. * 輸出 : 無(wú)
  330. ***********************************************************************/
  331. void DisplayGraphic(unsigned char code *adder)
  332. {       
  333.         int i,j;
  334. //顯示上半屏內(nèi)容設(shè)置
  335.         for(i=0;i<32;i++)
  336.         {
  337.                 TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD
  338.                 TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD
  339.                 for(j=0;j<16;j++)
  340.                 {
  341.                         TransferData(*adder,1);
  342.                         adder++;
  343.                 }
  344.     }          
  345. //顯示下半屏內(nèi)容設(shè)置
  346.         for(i=0;i<32;i++)            
  347.     {
  348.                 TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD
  349.                 TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD
  350.                 for(j=0;j<16;j++)
  351.                 {
  352.                         TransferData(*adder,1);
  353.                         adder++;
  354.                 }
  355.     }
  356. }




  357. /*******************************************************************/
  358. /*                                                                 */
  359. /*  矩陣鍵盤(pán)掃描                                                          */
  360. /*                                                                 */
  361. /*******************************************************************/
  362. uchar keyscan(void)//鍵盤(pán)掃描函數(shù),使用行列反轉(zhuǎn)掃描法 比如:行為低電位,列為高四位
  363. {
  364.         uchar cord_h,cord_l;//行列值
  365.         P2=0x0f;//行線(xiàn)輸出全為0
  366.         cord_h=P2&0x0f;//讀入列線(xiàn)值
  367.         if(cord_h!=0x0f) //先檢測(cè)有無(wú)按鍵按下
  368.         {
  369.                 delay(1); //去抖
  370.                 if(cord_h!=0x0f)
  371.                 {
  372.                         cord_h=P2&0x0f; //讀入列線(xiàn)值
  373.                         P2=cord_h|0xf0; //輸出當(dāng)前列線(xiàn)值
  374.                         cord_l=P2&0xf0; //讀入行線(xiàn)值
  375.                         return(cord_h+cord_l);//鍵盤(pán)最后組合碼值
  376.                 }
  377.         }
  378.         else return(0xff);//返回該值       
  379. }
  380. /**********************************************************/
  381. void beep()
  382. {
  383.   uchar i;
  384.   for (i=0;i<100;i++)
  385.    {
  386.    delay(10);
  387.    BEEP=!BEEP;                 //BEEP取反
  388.    }
  389.   BEEP=1;                      //關(guān)閉蜂鳴器
  390. }

  391. void beepchange()                  //變音蜂鳴器
  392. {
  393.         uchar i;
  394.         for (i=0;i<(20-beeptime)*10;i++)
  395.                 {
  396.                 delay((beeptime+2)*3);
  397.                 BEEP=!BEEP;                 //BEEP取反
  398.                 }
  399.         BEEP=1;                      //關(guān)閉蜂鳴器
  400.        
  401. }
  402. /********************************************************************
  403. * 名稱(chēng) : Main()
  404. * 功能 : 主函數(shù)
  405. * 輸入 : 無(wú)
  406. * 輸出 : 無(wú)
  407. ***********************************************************************/
  408. void main(void)
  409. {
  410.         PID        sPID;                   //  PID Control Structure  PID控制結(jié)構(gòu)
  411.     float      rOut;                   //  PID Response (Output)  PID控制器的響應(yīng)(輸出)
  412.     float      rIn;                    //  PID Feedback (Input)          PID反饋(輸入)

  413.        
  414.     PIDInit ( &sPID );                  //  Initialize Structure
  415.         if(pidchang==0)                                                //   準(zhǔn)
  416.     {
  417.         sPID.Proportion = KSP;              //  Set PID Coefficients         比例
  418.     sPID.Integral   = KSI;                                //  積分
  419.     sPID.Derivative = KSD;                                // 微分
  420.         }
  421.         if(pidchang==1)                                                 //   穩(wěn)
  422.         {
  423.     sPID.Proportion = KSP1;              //  Set PID Coefficients         比例
  424.     sPID.Integral   = KSI1;                                //  積分
  425.     sPID.Derivative = KSD1;                                // 微分
  426.         }

  427.     sPID.SetPoint   = size;            //  Set PID Setpoint         設(shè)定值


  428.         P4SW = 0x70;       
  429.         initina2();                                    //調(diào)用LCD顯示圖片(擴(kuò)展)初始化程序               
  430.         beep();
  431.         beep();
  432.         delayms(200);
  433.         initinal();                                            //調(diào)用LCD字庫(kù)初始化程序
  434.     delay(100);                                    //大于100uS的延時(shí)程序
  435.     lcd_mesg(IC_DAT);                              //顯示中文漢字1               
  436.         InitTimer0();                                           //計(jì)時(shí)器
  437.         InitTimer1();                                          //中斷初始化

  438.         CCON = 0;                       //主控制寄存器的初始
  439.                                     //PCA timer 停止運(yùn)行
  440.                                     //清除CF標(biāo)志
  441.                                     //清除所有中斷標(biāo)志模塊
  442.     CL = 0;                         //復(fù)位 PCA base timer
  443.     CH = 0;
  444.     CMOD = 0x02;                    //設(shè)置 PCA timer 時(shí)鐘源在 Fosc/2
  445.                                     //禁用PCA timer溢出中斷
  446.     CCAP0H = CCAP0L = 0xff;         //pwm0端口輸出的50%占空比的矩形波
  447.     CCAPM0 = 0x42;                  //PCA模塊工作在8位PWM模式 禁止PCA中斷

  448.     CCAP1H = CCAP1L = 0xff;         //PWM1輸出端口0方波的占空比
  449.     CCAPM1 = 0x42;                  //PCA模塊工作在8位PWM模式 禁止PCA中斷
  450.            CR = 1;                         //PCA timer 啟動(dòng)運(yùn)行
  451.          beep();
  452.          beep();
  453.         while(1)
  454.         {               
  455.                
  456.                 sPID.SetPoint   = 480-size;            //  Set PID Setpoint         設(shè)定值
  457.                 Distance();
  458.                 delayms(10);
  459. //                CCAP1H = CCAP1L = pwm;         //pwm0端口輸出的50%占空比的矩形方波
  460.                 CCAP0H = CCAP0L = pwm;         //pwm0端口輸出的50%占空比的矩形方波
  461.                 key=keyscan();//調(diào)用鍵盤(pán)掃描,
  462.                         switch(key)
  463.                 {
  464.                          case 235:key=0;break;        //0 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值 原理就是高四位一列低四位一列的組
  465.                                                                         //合。0111 1110 7e 0表示按鍵后為0,1表示沒(méi)有按鍵按下的。
  466.                                                                         //其他類(lèi)推。
  467.                         case 119:key=1;break;         //1
  468.                         case 123:key=2;break;        //2
  469.                         case 125:key=3;break;        //3
  470.                         case 183:key=4;break;        //4
  471.                         case 187:key=5;break;        //5
  472.                         case 189:key=6;break;        //6
  473.                         case 215:key=7;break;        //7
  474.                         case 219:key=8;break;        //8
  475.                         case 221:key=9;break;        //9
  476.                         case 126:key=10;break;        //A
  477.                         case 190:key=11;break;        //B
  478.                         case 222:key=12;break;        //C                       
  479.                         case 238:key=13;break;        //D       
  480.                         case 231:key=14;break;        //*
  481.                         case 237:key=15;break;        //#
  482.                         case 255:key=16;break;        //空

  483.                 }
  484.                 if(key==16)
  485.                 {
  486.                 if(keysign!=16)       
  487.                 {
  488.                 beeptime=keysign;
  489.                 if(beeptime!=14)
  490.                 {
  491.                         if((flagStart==1)&&(beeptime<=9)) {flagStart=1; beepchange1=1;}
  492.                         else beepchange();  
  493.                 }
  494.                 if((flagStart==0)&&(keysign<=9)) {flagSep=keysign; shuzi=keysign;}        //任務(wù)顯示
  495.                 if((flagStart==1)&&(keysign<=9)) { size=200-keysign*10; pidchang=1;}        //任務(wù)3
  496.                 if((shuzi==2)&&(flagSep==1))         
  497.                 {
  498.                 }        //任務(wù)3
  499.                 if(keysign==15)  
  500.                 {
  501.                 ZTimetime=0;
  502.                 flagStart=1;                   //標(biāo)志位置1
  503.                 if(flagSep==1)
  504.                 {
  505.                 if(flagStart6==0)size=150;
  506.                 }//任務(wù)1   位置
  507.                 if(keysign==5) flagchangeStar=5 ;                 //任務(wù)5   位置
  508.                 }
  509.                 if(keysign==14)  {flagStart=3;beepchange1=0; } //標(biāo)志位置0                  BEEP可以等于0;
  510.                 }
  511.                                                                                                  
  512.                 }
  513.                         keysign=key;        //上次的按鍵                          

  514.                   //***任務(wù)要求函數(shù)等等***
  515.                         if((flagStart==1)&&(flagSep==1))
  516.                         {
  517.                                 rIn = sensor (); //把S轉(zhuǎn)成浮點(diǎn)型               //  Read Input      讀取輸入
  518.                                 rOut = PIDCalc ( &sPID,rIn ); //PID  //  Perform PID Interation
  519.                                 actuator ( rOut+pwm );    //占空比          //  Effect Needed Changes
  520.                         }
  521.                 //***取消小球下降函數(shù)***
  522.                         if(flagStart==3)  
  523.                         {
  524.                         rIn = sensor (); //把S轉(zhuǎn)成浮點(diǎn)型               //  Read Input      讀取輸入
  525.                         rOut = PIDCalc ( &sPID,rIn ); //PID  //  Perform PID Interation
  526.                         actuator ( rOut+pwm );    //占空比          //  Effect Needed Changes
  527.                          size=sizechange+changesize;
  528.                          if(S1>=450)
  529.                          {
  530.                          sizechange=0;   //最低點(diǎn)清 0
  531.                          flagStart=0;
  532.                          BEEP=1;
  533.                          pwm=255;
  534.                          flagSep=0;
  535.                          flagchangeStar=0;
  536.                          
  537.                          }
  538.                         }
  539.                         if((flagSep==5)&&(flagStart==1))
  540.                         {                       

  541.                         pidchang=1;
  542.                         if(S1>100)        pwm=95;
  543.                         if(S1<150)        {flagSep=1;size=1;}
  544.                                  
  545.                                                 
  546.                         }

  547. /********************************************************************
  548. * 名稱(chēng) : 屏幕數(shù)據(jù)刷新
  549. * 功能 :                                                                       
  550. * 輸入 : 無(wú)
  551. * 輸出 : 無(wú)
  552. ***********************************************************************/          
  553.                         if(displaytime>=100 )
  554.                         {
  555.                                 if(flagStart==3) sizechange=sizechange+40;          //下降專(zhuān)用 距離下降  左后停止

  556.                                 TransferData(0x95,0);                               
  557.                                 TransferData(0x17,1);                                                   //高度顯示
  558.                                 TransferData(S1%1000/100+0x30,1);
  559.                                 TransferData(S1%100/10+0x30,1);
  560.                                 TransferData(S1%10+0x30,1);

  561.                                 TransferData(0x8D,0);                                                   //響應(yīng)時(shí)間顯示
  562.                                 TransferData(RTimetime/100%10+0x30,1);
  563.                                 TransferData(RTimetime%100/10+0x30,1);
  564.                                 TransferData(0x2E,1);
  565.                                 TransferData(RTimetime%10+0x30,1);

  566.                                 TransferData(0x9d,0);                                                        //保持時(shí)間顯示
  567.                                 TransferData(MTimetime/100%10+0x30,1);
  568.                                 TransferData(MTimetime%100/10+0x30,1);
  569.                                 TransferData(0x2E,1);  
  570.                                 TransferData(MTimetime%10+0x30,1);        
  571.                                 displaytime=0;

  572.                                 TransferData(0x85,0);                                                         //任務(wù)要求顯示

  573.                                 TransferData(0x20,1);

  574.                                 if(flagStart==1) TransferData(0x11,1);
  575.                                 else TransferData(0x3C,1);

  576.                                 TransferData(shuzi+0x30,1);
  577.                                 if(flagStart==1) TransferData(0x10,1);

  578.                                 else TransferData(0x3E,1);
  579.                         }

  580.                                                                                                                                                
  581.                         if((Timetime>=22)&&(flagStart==1))                //0.1s的保持與采樣時(shí)間計(jì)算
  582.                         {                               
  583.                                 ZTimetime++;                                                          //總時(shí)間

  584.                                 if((flagSep==5)&&(S1>=100))
  585.                                 {
  586.                                 RTimetime=ZTimetime;                                          //響應(yīng)時(shí)間S                               
  587.                                 }
  588.                                 if((size==301)&&(S1<200))
  589.                                 {
  590.                                 size=50;
  591.                                        
  592.                                 }
  593.                                

  594.                                 if((flagSep==1)&&((110>=S1)|(S1>=190))&&(size==150))
  595.                                 {
  596.                                 RTimetime=ZTimetime;                                          //響應(yīng)時(shí)間S       
  597.                                 pidchang=1;                               
  598.                                 }
  599.                                 if((flagSep==1)&&((10>=S1)|(S1>=90))&&(size==50))
  600.                                 {
  601.                                 RTimetime=ZTimetime;                                          //響應(yīng)時(shí)間S       
  602.                                 pidchang=1;                               
  603.                                 }
  604.                                 if((flagSep==1)&&((210>=S1)|(S1>=290))&&(size==250))
  605.                                 {
  606.                                 RTimetime=ZTimetime;                                          //響應(yīng)時(shí)間S       
  607.                                 pidchang=1;                               
  608.                                 }
  609.                                 else  
  610.                                 {
  611.                                 Beep1stime++;
  612.                                 if(Beep1stime>=1) BEEP=1;
  613.                                 if((Beep1stime>=10)&&(beepchange1!=1)) {BEEP=0;Beep1stime=0; }
  614.                                 }
  615.                                 MTimetime=ZTimetime-RTimetime;                         //保持時(shí)間
  616.                                 Timetime=0;
  617.                                 if(size==301) MTimetime=0;



  618.                         }
  619.                                 if(flagSep==6)
  620.                                  {
  621.                                  flagStart6=1;
  622.                                   flagSep=1;
  623.                                    size=301;
  624.                                 pidchang=0;
  625.                           }
  626.                           
  627.                           if ((MTimetime>=30)&&(flagStart6==1))         
  628.                           {
  629.                           flagStart61++;
  630.                           if (flagStart60==0)
  631.                            {
  632.                           size=250;          
  633.                           flagStart60=1;
  634.                           pidchang=0;       
  635.                           }
  636.                           else
  637.                           {
  638.                           size=50;          
  639.                           flagStart60=0;
  640.                           pidchang=0;
  641.                           }
  642.                           MTimetime=0;
  643.                           ZTimetime=0;
  644.                           RTimetime=0;                    
  645.                           }       
  646.                           if (flagStart61>=4){pwm=0; flagSep=0;}

  647.                           

  648.                           
  649.                            if(flagSep==7) //要求7功能
  650.                            {
  651.                        
  652.                           if((S1>=2)&&(flagStart7==0)){pwm=0;flagStart7=1;}          //啟動(dòng)標(biāo)志位
  653.                           else
  654.                           if(flagStart7==1)
  655.                           {
  656.                           if (S1>=140) {flagSep=1; size=150;}
  657.                            }
  658.                           }

  659.                           
  660. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

下載:
簡(jiǎn)易風(fēng)洞程序(2).zip (72.04 KB, 下載次數(shù): 54)

評(píng)分

參與人數(shù) 1黑幣 +2 收起 理由
976 + 2 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:210655 發(fā)表于 2017-6-13 01:18 | 顯示全部樓層
值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:252120 發(fā)表于 2017-11-21 23:37 | 顯示全部樓層
好東西
回復(fù)

使用道具 舉報(bào)

ID:110278 發(fā)表于 2018-5-31 19:12 | 顯示全部樓層
盼了很久,終于等來(lái)了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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