找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3372|回复: 2
打印 上一主题 下一主题
收起左侧

2017年电赛简易水情代码,STC15W4K58S4单片机做的 求指导

[复制链接]
跳转到指定楼层
楼主
ID:507486 发表于 2019-8-3 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*********************************************************************************
  2. *实验名   :简易水情检测系统
  3. *实验效果        :精确的测量水位高度,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)          //延迟函数//一指令是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)                        //判断是否有按下信号
  37.          {
  38.                   delay(10);                  //延时10ms
  39.                   if(K1==0)                        //再次判断是否按下
  40.                   {
  41.                           while(K1==0);        //判断是否松开按键
  42.                           FM=1;                        //打开蜂鸣器
  43.                         }        
  44.    }
  45.                  if(K2==0)                        //判断是否有按下信号
  46.          {
  47.                   delay(10);                  //延时10ms
  48.                         if(K2==0)                        //再次判断是否按下
  49.                         {
  50.                            while(K2==0);        //判断是否松开按键
  51.                            FM=1;                        //打开蜂鸣器
  52.                         }
  53.     }
  54.          if(K3==0)                        //判断是否有按下信号
  55.          {
  56.                   delay(10);                  //延时10ms                                          
  57.                         if(K3==0)                        //再次判断是否按下
  58.                         {
  59.                            while(K3==0);        //判断是否松开按键
  60.                            FM=0;                        //关闭蜂鸣器
  61.                         }
  62.   }
  63.          if(K4==0)                        //判断是否有按下信号
  64.          {
  65.                   delay(10);                  //延时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);//测
  79.                 OLED_ShowCHinese(80,0,4);//系
  80.                 OLED_ShowCHinese(96,0,5);//统
  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);//测
  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. 入口参数:无
  110. 返回值:无
  111. ***************************************/
  112. void        ADC_config(void)
  113. {
  114.         ADC_InitTypeDef                ADC_InitStructure;                                         //结构定义
  115.         ADC_InitStructure.ADC_Px        = ADC_P10 ;                //设置要做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功率允许/关闭        ENABLE,DISABLE
  118.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H2L8;                  //ADC结果调整,        ADC_RES_H2L8,ADC_RES_H8L2
  119.         ADC_InitStructure.ADC_Polity    = PolityLow;                    //优先级设置        PolityHigh,PolityLow
  120.         ADC_InitStructure.ADC_Interrupt = DISABLE;                            //中断允许                ENABLE,DISABLE
  121.         ADC_Inilize(&ADC_InitStructure);                                                  //初始化//调用ADC初始化函数
  122.         ADC_PowerControl(ENABLE);                                                                      //单独的ADC电源操作函数, ENABLE或DISABLE// 开启ADC电源
  123.         

  124.         ADC_InitStructure.ADC_Px        = ADC_P11 ;                //设置要做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功率允许/关闭        ENABLE,DISABLE
  127.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H2L8;                  //ADC结果调整,        ADC_RES_H2L8,ADC_RES_H8L2
  128.         ADC_InitStructure.ADC_Polity    = PolityLow;                    //优先级设置        PolityHigh,PolityLow
  129.         ADC_InitStructure.ADC_Interrupt = DISABLE;                            //中断允许                ENABLE,DISABLE
  130.         ADC_Inilize(&ADC_InitStructure);                                                  //初始化//调用ADC初始化函数
  131.         ADC_PowerControl(ENABLE);
  132. }

  133. /**************************************
  134. 功能描述:GPIO口初始化
  135. 入口参数:无
  136. 返回值:无
  137. ***************************************/
  138. void        GPIO_config(void)
  139. {
  140.                 GPIO_InitTypeDef        GPIO_InitStructure;                                            //结构定义
  141.         
  142.                   //
  143.           GPIO_InitStructure.Pin=GPIO_Pin_0|GPIO_Pin_1;                                //P3.0,p3.1引脚               
  144.     GPIO_InitStructure.Mode=GPIO_OUT_PP;                               //指定IO口为强推挽
  145.     GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);                        //初始化P1口
  146.         
  147.                 //设置AD检测口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相关的IO口均为
  160. *      高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
  161. *相关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;        //设置P0.0~P0.7为准双向口
  165.         P1M1 = 0;        P1M0 = 0;        //设置P1.0~P1.7为准双向口
  166.         P2M1 = 0;        P2M0 = 0;        //设置P2.0~P2.7为准双向口
  167.         P3M1 = 0;        P3M0 = 0;        //设置P3.0~P3.7为准双向口
  168.         P4M1 = 0;        P4M0 = 0;        //设置P4.0~P4.7为准双向口
  169.         P5M1 = 0;        P5M0 = 0;        //设置P5.0~P5.7为准双向口
  170. // char t;
  171.         GPIO_config();
  172.         OLED_Init();                        //初始化OLED  
  173.         OLED_Clear();
  174.         delay_ms(10);                                 //初始化后延时
  175.   ADC_config();
  176.         display();
  177.         
  178.         while(1)
  179.   {
  180.         
  181.         key();
  182.   //Temp = Get_ADC10bitResult(0);              //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误
  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);//电压的小数位
  209.         OLED_ShowNum(102,6, (TempPhoto1%1000)%100,1,16);//

  210.         OLED_ShowNum(80,6,TempPhoto1/1000,1,16);//电压的个位
  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. }
复制代码

全部程序51hei下载地址:
2017年电赛简易水情代码.rar (105.27 KB, 下载次数: 40)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:927850 发表于 2021-6-26 21:30 | 只看该作者
大佬,这个PCON2为什么报错没有定义?

屏幕截图 2021-06-26 212808.png (99.9 KB, 下载次数: 52)

屏幕截图 2021-06-26 212808.png

屏幕截图 2021-06-26 212625.png (24.5 KB, 下载次数: 52)

屏幕截图 2021-06-26 212625.png
回复

使用道具 举报

板凳
ID:94031 发表于 2021-6-27 08:58 | 只看该作者
yanzewu 发表于 2021-6-26 21:30
大佬,这个PCON2为什么报错没有定义?

STC15.h 头文件里没有PCON2定义,这个程序不是STC15W4K58S4单片机的,找STC15W4K58S4 AD初始化例程用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表