找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2649|回复: 3
收起左侧

15单片机17年电赛P题水情监测系统(附程序)

[复制链接]
ID:366868 发表于 2018-7-15 19:58 | 显示全部楼层 |阅读模式
IMG_20180715_194503.jpg IMG_20180715_194511.jpg IMG_20180715_194532.jpg.JPG IMG_20180715_194520.jpg IMG_20180715_194507.jpg IMG_20180715_194515.jpg.JPG IMG_20180715_194529.jpg

单片机源程序如下:
  1. #include "15_INIT.h"
  2. #include "LCD12864.h"
  3. #include "UART_INIT.h"

  4. void main(void)
  5. {
  6.         unsigned int PreLength=0;
  7.         Delay_ms(10);                                 //等待上电稳定
  8.         ADC_Init();                                         //ADC初始化
  9.         UART_Init();                                //串口初始化
  10.         LCD12864_Init();                //LCD1602初始化
  11.         k = PreLength = 0;
  12.         while(1)
  13.         {
  14.                 ADC_Process();          //ADC数据采集并且处理
  15.                 //Delay_ms(1);
  16.                 if(b_flag==1)
  17.                  {
  18.                           b_flag = 0;
  19.                    UART_Send(0X55);                                           
  20.                          PreLength = GLengthLoh[0] * 256 + GLengthLoh[1]-5;
  21.              conversion(PreLength);
  22.                          
  23.                          if(PreLength <= 4500 )
  24.                          {
  25.                            LCD12864_WriteCMD(0x90 + 5);
  26.                                         LCD12864_WriteDAT(bai + 0x30);
  27.                                  LCD12864_WriteDAT(shi + 0x30);
  28.                                  LCD12864_WriteDAT(ge + 0x30);
  29.                                  //LCD12864_WriteDAT('.');
  30.                                  LCD12864_WriteDAT(part + 0x30);
  31.                          }
  32.                          else
  33.                          {
  34.                            LCD12864_WriteCMD(0x90 + 5);
  35.                                  //LCD12864_WriteDAT('-');
  36.                                  LCD12864_WriteDAT('-');
  37.                                  LCD12864_WriteDAT('-');
  38.                                  LCD12864_WriteDAT('-');
  39.                                  LCD12864_WriteDAT('-');
  40.                          }
  41.                          }
  42.         }
  43. }
  44. /***********************************************
  45. 函数名称:LCD12864_Init
  46. 功    能:LCD12864初始化函数
  47. 入口参数:无
  48. 返 回 值:无       
  49. 备    注:并行模式
  50. ************************************************/
  51. void LCD12864_Init(void)  
  52. {
  53.           Delay_ms(100);              //上电延时100ms
  54.         LCD12864_WriteCMD(0x01);//清屏   
  55.         LCD12864_Display(LINE1+0," <水情检测系统>" );                        //第一行显示字符
  56.         LCD12864_Display(LINE2+0,"水位高度:    mm" );        //第二行显示字符
  57.         LCD12864_Display(LINE3+0,"当前PH值:");                                        //第三行显示字符
  58.         LCD12864_Display(LINE4+0,"电源电压:     V");                        //第三行显示字符       
  59. }
  60. /***********************************************
  61. 函数名称:ADC_Process
  62. 功    能:ADC数据处理
  63. 入口参数:无
  64. 返 回 值:无       
  65. 备    注:采集32个数据进行求平均
  66. ************************************************/
  67. void ADC_Process(void)
  68. {
  69.         //从AD通道采集数据,并且进行累加
  70.         ADCSum1+=ADC_GetResult(ADC_CHANNEL2);
  71.         ADCSum2+=ADC_GetResult(ADC_CHANNEL3);
  72.         //计数器加1
  73.         ADCCnt++;
  74.         //如果累加到32个数据,则开始处理
  75.         if(ADCCnt==32)
  76.         {                       
  77.                 ADCCnt=0;
  78.                 //(ADCSum>>5)等价于(ADCSum/32)       
  79.                 //对32个数据取平均                       
  80.                 ADCSum1=ADCSum1>>5;       
  81.                 ADCSum2=ADCSum2>>5;       
  82.                 //ADC=(Vin/Vref)*1024       
  83.                 //根据ADC计算公式进行转换
  84.                 ADCSum1=ADCSum1*VCC/1024;
  85.                 ADCSum2=ADCSum2*VCC/1024;
  86.                 //保存转换结果并进行类型转换,方便显示
  87.                 ADCResult1=(uint)ADCSum1;
  88.                 ADCResult2=(uint)ADCSum2;
  89.                 //清除AD暂存变量
  90.                 ADCSum1=ADCSum2=0;
  91.                 //显示测量结果
  92.                 //将要显示的数值转换成字符型
  93.                 //因为12864显示的是字符,所以数值必须转换,否则显示乱码
  94.                 App_FormatDec(DispBuf1,ADCResult1);
  95.                 App_FormatDec(DispBuf2,ADCResult2);
  96.                 //显示该项菜单设置内容
  97.                 PH_Transfer[0] = DispBuf1[0];
  98.                 PH_Transfer[1] = DispBuf1[2];
  99.                 PH_Transfer[2] = DispBuf1[3];
  100.                 PH_Transfer[3] = DispBuf1[4];
  101.                
  102.                 PH = (PH_Transfer[0]-0x30)*1000 + (PH_Transfer[1]-0x30)*100 + (PH_Transfer[2]-0x30)*10 + (PH_Transfer[3]-0x30);
  103.                 PH1 = (42413-PH*10000) / 1773 + 1870;
  104.                
  105.                 PH_Transfer[0] = PH1 / 10000 % 10 + '0';
  106.                 PH_Transfer[1] = PH1 / 1000 % 10 + '0';
  107.                 PH_Transfer[2] = '.';
  108.                 PH_Transfer[3] = PH1 / 100 % 10 + '0';
  109.                 PH_Transfer[4] = PH1 / 10 % 10 + '0';
  110.                 PH_Transfer[5] = PH1 % 10 + '0';
  111.                
  112.                
  113.                 LCD12864_Display(LINE3+5,PH_Transfer);
  114.                 LCD12864_Display(LINE4+5,DispBuf2);
  115.         }       
  116. }
  117. /***********************************************
  118. 函数名称:ADC_Init
  119. 功    能:ADC初始化函数
  120. 入口参数:无
  121. 返 回 值:无       
  122. 备    注:无
  123. ************************************************/
  124. void ADC_Init(void)
  125. {
  126.         P1ASF |=0x0C;              //P1.7口做为AD转换通道
  127.         ADC_RES=0;                                  //ADC数据寄存器清零               
  128.         ADC_CONTR=ADC_POWER | ADC_SPEEDLL;                          
  129.                                                                                         //打开AD转换器电源,设置转换速率       
  130.         Delay_ms(2);                    //延时2ms,等待ADC上电稳定
  131. }
  132. /***********************************************
  133. 函数名称:ADC_GetResult
  134. 功    能:获取ADC转换的结果
  135. 入口参数:ch:转换的通道
  136. 返 回 值:unsigned int:转换得到的数据       
  137. 备    注:使用查询方式
  138. ************************************************/
  139. uint ADC_GetResult(uchar ch)
  140. {
  141.         uint ADC_Value;
  142.         ADC_CONTR =ADC_POWER | ADC_SPEEDLL| ch | ADC_START;        //启动ADC
  143.     _nop_();                        //延时
  144.     _nop_();
  145.     _nop_();
  146.     _nop_();
  147.     while (!(ADC_CONTR & ADC_FLAG));//等待AD转换完成
  148.     ADC_CONTR &= ~ADC_FLAG;         //清除转换完成标记
  149.         ADC_Value=ADC_RES;                                                                //读取ADC高八位
  150.         ADC_Value=(ADC_Value<<2)|ADC_RESL;//读取ADC低两位,并且数据合并
  151.     return ADC_Value;                         
  152. }
  153. /***********************************************
  154. 函数名称:App_FormatDec
  155. 功    能:整型数据转字符串函数
  156. 入口参数:value:整型数据
  157. 返 回 值:pstr:指向字符串的指针。       
  158. 备    注:无
  159. ************************************************/
  160. void  App_FormatDec (uchar *pstr, uint value)
  161. {
  162.     uchar                i;
  163.     uint                mult;
  164.     uint                nbr;

  165.     mult  = 1;
  166.         //因为这里要处理的value输入格式为四位数,例如1234
  167.         //故初始让mult=1000
  168.     for (i = 0; i < 3; i++)
  169.         {
  170.         mult *= 10;
  171.     }

  172.         i=0;
  173.     while (mult > 0)
  174.         {
  175.                 i++;
  176.                 //第一次整除,获取最高位数据,例如1234/1000=1
  177.                 //其他位类推
  178.         nbr = value / mult;
  179.                 //如果得到的数据不是0
  180.         if (nbr != 0)
  181.             {
  182.                         //整型数据+'0',将自动转换成字符数据,例如1+'0'将变成字符'1'
  183.                 *pstr = nbr + '0';
  184.         }
  185.             else
  186.                 {   
  187.                         //如果数据是0,则直接转换成字符'0'           
  188.             *pstr = '0';
  189.                
  190.         }
  191.                 //移动指针,进行其他位数据处理
  192.         pstr++;
  193.                 if(i==1)
  194.                 {
  195.                         *pstr = '.';   //显示小数点
  196.                         pstr++;               
  197.                 }
  198.                 value %= mult;
  199.                 mult  /= 10;
  200.     }
  201. }

  202. ……………………

  203. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
水情检测.zip (59.76 KB, 下载次数: 45)

评分

参与人数 2黑币 +80 收起 理由
天才小能猫 + 30
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:364328 发表于 2018-7-16 15:37 | 显示全部楼层
这是啥功能啊         楼主没有说清楚啊   
回复

使用道具 举报

ID:404673 发表于 2019-4-16 01:35 | 显示全部楼层
有其他资料吗?原理图什么的
回复

使用道具 举报

ID:472844 发表于 2019-7-20 09:14 | 显示全部楼层
有原理图就好了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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