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

QQ登錄

只需一步,快速開始

帖子
查看: 3399|回復(fù): 2
收起左側(cè)

2017年電賽簡(jiǎn)易水情代碼,STC15W4K58S4單片機(jī)做的 求指導(dǎo)

[復(fù)制鏈接]
ID:507486 發(fā)表于 2019-8-3 14:32 | 顯示全部樓層 |閱讀模式
  1. /*********************************************************************************
  2. *實(shí)驗(yàn)名   :簡(jiǎn)易水情檢測(cè)系統(tǒng)
  3. *實(shí)驗(yàn)效果        :精確的測(cè)量水位高度,PH值,輸出電壓
  4. *
  5. *********************************************************************************/
  6. #include <STC15.h>
  7. #include <string.h >
  8. #include <intrins.h>

  9. #include "oled.h"
  10. #include "adc.h"
  11. #include "GPIO.h"

  12. #define uchar unsigned char
  13. #define uint  unsigned int
  14. #define  uint32   unsigned long
  15. uchar j;

  16. sbit FM = P5^5;
  17. sbit K1 = P2^3;
  18. sbit K2 = P2^4;
  19. sbit K3 = P2^5;
  20. sbit K4 = P2^6;

  21. uint water = 0;

  22. void delay(unsigned int t)          //延遲函數(shù)//一指令是0.83us
  23. {
  24.    while(--t);         
  25. }

  26. void delay_ms(uint x)
  27. {  
  28.         uint j,i;   
  29.         for(j=0;j<x;j++)   
  30.         {   
  31.                 for(i=0;i<1100;i++);   
  32.         }  
  33. }

  34. void key()
  35. {
  36.    if(K1==0)                        //判斷是否有按下信號(hào)
  37.          {
  38.                   delay(10);                  //延時(shí)10ms
  39.                   if(K1==0)                        //再次判斷是否按下
  40.                   {
  41.                           while(K1==0);        //判斷是否松開按鍵
  42.                           FM=1;                        //打開蜂鳴器
  43.                         }        
  44.    }
  45.                  if(K2==0)                        //判斷是否有按下信號(hào)
  46.          {
  47.                   delay(10);                  //延時(shí)10ms
  48.                         if(K2==0)                        //再次判斷是否按下
  49.                         {
  50.                            while(K2==0);        //判斷是否松開按鍵
  51.                            FM=1;                        //打開蜂鳴器
  52.                         }
  53.     }
  54.          if(K3==0)                        //判斷是否有按下信號(hào)
  55.          {
  56.                   delay(10);                  //延時(shí)10ms                                          
  57.                         if(K3==0)                        //再次判斷是否按下
  58.                         {
  59.                            while(K3==0);        //判斷是否松開按鍵
  60.                            FM=0;                        //關(guān)閉蜂鳴器
  61.                         }
  62.   }
  63.          if(K4==0)                        //判斷是否有按下信號(hào)
  64.          {
  65.                   delay(10);                  //延時(shí)10ms
  66.                         if(K4==0)                        //再次判斷是否按下
  67.                         {
  68.                            while(K4==0);        //判斷是否松開按鍵
  69.                            FM=0;                        //打開蜂鳴器
  70.                         }
  71.          }

  72. }


  73. void display()
  74. {
  75.     OLED_ShowCHinese(16,0,0);//水
  76.                 OLED_ShowCHinese(32,0,1);//情
  77.                 OLED_ShowCHinese(48,0,2);//檢
  78.                 OLED_ShowCHinese(64,0,3);//測(cè)
  79.                 OLED_ShowCHinese(80,0,4);//系
  80.                 OLED_ShowCHinese(96,0,5);//統(tǒng)
  81.    
  82.                 OLED_ShowCHinese(0,2,0);//水
  83.                 OLED_ShowCHinese(16,2,6);//位
  84.                 OLED_ShowCHinese(32,2,7);//高
  85.                 OLED_ShowCHinese(48,2,8);//度
  86.                 OLED_ShowChar(64,2,':');

  87.                 OLED_ShowString(110,2,"mm");
  88.                
  89.                 OLED_ShowString(0,4,"PH");
  90.                 OLED_ShowCHinese(16,4,9);//測(cè)
  91.           OLED_ShowCHinese(32,4,10);//量
  92.                 OLED_ShowCHinese(48,4,11);//值
  93.                 OLED_ShowChar(64,4,':');
  94.                 OLED_ShowChar(88,4,'.');
  95.                 OLED_ShowNum(94,4,20,2,16);//
  96.                 OLED_ShowNum(72,4,10,2,16);//
  97.                
  98.                 OLED_ShowCHinese(0,6,12);//輸
  99.                 OLED_ShowCHinese(16,6,13);//出
  100.                 OLED_ShowCHinese(32,6,14);//電
  101.                 OLED_ShowCHinese(48,6,15);//壓
  102.                 OLED_ShowChar(64,6,':');
  103.                 OLED_ShowChar(112,6,'V');
  104.                 OLED_ShowChar(88,6,'.');
  105.         
  106. }

  107. /**************************************
  108. 功能描述:ADC口初始化
  109. 入口參數(shù):無(wú)
  110. 返回值:無(wú)
  111. ***************************************/
  112. void        ADC_config(void)
  113. {
  114.         ADC_InitTypeDef                ADC_InitStructure;                                         //結(jié)構(gòu)定義
  115.         ADC_InitStructure.ADC_Px        = ADC_P10 ;                //設(shè)置要做ADC的IO
  116.         ADC_InitStructure.ADC_Speed     = ADC_360T;                            //ADC速度                        ADC_90T,ADC_180T,ADC_360T,ADC_540T
  117.         ADC_InitStructure.ADC_Power     = DISABLE;                             //ADC功率允許/關(guān)閉        ENABLE,DISABLE
  118.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H2L8;                  //ADC結(jié)果調(diào)整,        ADC_RES_H2L8,ADC_RES_H8L2
  119.         ADC_InitStructure.ADC_Polity    = PolityLow;                    //優(yōu)先級(jí)設(shè)置        PolityHigh,PolityLow
  120.         ADC_InitStructure.ADC_Interrupt = DISABLE;                            //中斷允許                ENABLE,DISABLE
  121.         ADC_Inilize(&ADC_InitStructure);                                                  //初始化//調(diào)用ADC初始化函數(shù)
  122.         ADC_PowerControl(ENABLE);                                                                      //單獨(dú)的ADC電源操作函數(shù), ENABLE或DISABLE// 開啟ADC電源
  123.         

  124.         ADC_InitStructure.ADC_Px        = ADC_P11 ;                //設(shè)置要做ADC的IO
  125.         ADC_InitStructure.ADC_Speed     = ADC_360T;                            //ADC速度                        ADC_90T,ADC_180T,ADC_360T,ADC_540T
  126.         ADC_InitStructure.ADC_Power     = DISABLE;                             //ADC功率允許/關(guān)閉        ENABLE,DISABLE
  127.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H2L8;                  //ADC結(jié)果調(diào)整,        ADC_RES_H2L8,ADC_RES_H8L2
  128.         ADC_InitStructure.ADC_Polity    = PolityLow;                    //優(yōu)先級(jí)設(shè)置        PolityHigh,PolityLow
  129.         ADC_InitStructure.ADC_Interrupt = DISABLE;                            //中斷允許                ENABLE,DISABLE
  130.         ADC_Inilize(&ADC_InitStructure);                                                  //初始化//調(diào)用ADC初始化函數(shù)
  131.         ADC_PowerControl(ENABLE);
  132. }

  133. /**************************************
  134. 功能描述:GPIO口初始化
  135. 入口參數(shù):無(wú)
  136. 返回值:無(wú)
  137. ***************************************/
  138. void        GPIO_config(void)
  139. {
  140.                 GPIO_InitTypeDef        GPIO_InitStructure;                                            //結(jié)構(gòu)定義
  141.         
  142.                   //
  143.           GPIO_InitStructure.Pin=GPIO_Pin_0|GPIO_Pin_1;                                //P3.0,p3.1引腳               
  144.     GPIO_InitStructure.Mode=GPIO_OUT_PP;                               //指定IO口為強(qiáng)推挽
  145.     GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);                        //初始化P1口
  146.         
  147.                 //設(shè)置AD檢測(cè)口P17口為浮空輸入
  148.           GPIO_InitStructure.Pin=GPIO_Pin_0;                                //P1.0引腳               
  149.     GPIO_InitStructure.Mode=GPIO_HighZ;                               //指定IO口為浮空輸入
  150.     GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);                        //初始化P1口
  151. }


  152. void main()
  153. {
  154.         uint        Temp=0,adc_data1[20],TempPhoto1=0,adtmp1=0,adc_data2[20],TempPhoto2=0,adtmp2=0;
  155.         uchar j,i;
  156. //        uchar strPhoto[6];
  157.         
  158. /*********************************************************************************
  159. *注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關(guān)的IO口均為
  160. *      高阻態(tài),需將這些口設(shè)置為準(zhǔn)雙向口或強(qiáng)推挽模式方可正常使用
  161. *相關(guān)IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
  162. *        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
  163. *********************************************************************************/
  164.         P0M1 = 0;        P0M0 = 0;        //設(shè)置P0.0~P0.7為準(zhǔn)雙向口
  165.         P1M1 = 0;        P1M0 = 0;        //設(shè)置P1.0~P1.7為準(zhǔn)雙向口
  166.         P2M1 = 0;        P2M0 = 0;        //設(shè)置P2.0~P2.7為準(zhǔn)雙向口
  167.         P3M1 = 0;        P3M0 = 0;        //設(shè)置P3.0~P3.7為準(zhǔn)雙向口
  168.         P4M1 = 0;        P4M0 = 0;        //設(shè)置P4.0~P4.7為準(zhǔn)雙向口
  169.         P5M1 = 0;        P5M0 = 0;        //設(shè)置P5.0~P5.7為準(zhǔn)雙向口
  170. // char t;
  171.         GPIO_config();
  172.         OLED_Init();                        //初始化OLED  
  173.         OLED_Clear();
  174.         delay_ms(10);                                 //初始化后延時(shí)
  175.   ADC_config();
  176.         display();
  177.         
  178.         while(1)
  179.   {
  180.         
  181.         key();
  182.   //Temp = Get_ADC10bitResult(0);              //參數(shù)0~7,查詢方式做一次ADC, 返回值就是結(jié)果, == 1024 為錯(cuò)誤
  183.    
  184.        for(j=0;j<20;j++)
  185.                                 {
  186.                                 adc_data1[j] = Get_ADC10bitResult(0);        
  187.                                 delay_ms(1);        //
  188.                                 }
  189.                                 
  190.         for(j=0;j<20;j++)
  191.                                 for(i=1;i<20-j;i++)
  192.                                         {
  193.                                         if(adc_data1[j]<adc_data1[i])
  194.                                         {
  195.                                                         adtmp1=adc_data1[j];
  196.                                                 adc_data1[j]=adc_data1[i];
  197.                                                         adc_data1[i]=adtmp1;
  198.                                                 }
  199.                                         }
  200.                 TempPhoto1=0;
  201.                                 for(j=5;j<16;j++)
  202.                         {
  203.                 TempPhoto1=TempPhoto1+adc_data1[j];
  204.                         
  205.                }        
  206.             TempPhoto1=TempPhoto1/10;        
  207.   
  208.         OLED_ShowNum(94,6, (TempPhoto1%1000)/100,1,16);//電壓的小數(shù)位
  209.         OLED_ShowNum(102,6, (TempPhoto1%1000)%100,1,16);//

  210.         OLED_ShowNum(80,6,TempPhoto1/1000,1,16);//電壓的個(gè)位
  211.                                 
  212.                                 
  213.        for(j=0;j<20;j++)
  214.                                 {
  215.                                 adc_data2[j] = Get_ADC10bitResult(0);        
  216.                                 delay_ms(1);        //
  217.                                 }
  218.                                 
  219.         for(j=0;j<20;j++)
  220.                                 for(i=1;i<20-j;i++)
  221.                                         {
  222.                                         if(adc_data2[j]<adc_data2[i])
  223.                                         {
  224.                                                         adtmp2=adc_data2[j];
  225.                                                 adc_data2[j]=adc_data2[i];
  226.                                                         adc_data2[i]=adtmp2;
  227.                                                 }
  228.                                         }
  229.                 TempPhoto2=0;
  230.                                 for(j=5;j<16;j++)
  231.                         {
  232.                 TempPhoto2=TempPhoto2+adc_data2[j];
  233.                         
  234.                }        
  235.             TempPhoto2=TempPhoto2/10;        
  236.                                 OLED_ShowNum(80,2, TempPhoto2,4,16);//水位高度
  237.          delay_ms(200);         
  238.                
  239.                
  240.                
  241.                
  242.                
  243.   }
  244.         
  245.         
  246. }
復(fù)制代碼

全部程序51hei下載地址:
2017年電賽簡(jiǎn)易水情代碼.rar (105.27 KB, 下載次數(shù): 40)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:927850 發(fā)表于 2021-6-26 21:30 | 顯示全部樓層
大佬,這個(gè)PCON2為什么報(bào)錯(cuò)沒(méi)有定義?
屏幕截圖 2021-06-26 212808.png
屏幕截圖 2021-06-26 212625.png
回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2021-6-27 08:58 | 顯示全部樓層
yanzewu 發(fā)表于 2021-6-26 21:30
大佬,這個(gè)PCON2為什么報(bào)錯(cuò)沒(méi)有定義?

STC15.h 頭文件里沒(méi)有PCON2定義,這個(gè)程序不是STC15W4K58S4單片機(jī)的,找STC15W4K58S4 AD初始化例程用。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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