找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc15w4k56s4+yl_69土壤湿度传感器+lcd12864串行+AD转换

[复制链接]
跳转到指定楼层
楼主
ID:295898 发表于 2018-4-4 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用YL-69传感器做的土壤湿度检测,能显示数值

单片机源程序如下:
  1. #include <stc15.h>
  2. #include "intrins.h"


  3. #define uchar unsigned char
  4. #define uint  unsigned int


  5. /************* 12864LCD引脚定义 *************/
  6. sbit LCD_CS   = P1^3;      //LCD液晶片选
  7. sbit LCD_SID  = P1^1;      //LCD液晶读/写控制
  8. sbit LCD_SCLK = P1^2;      //LCD液晶使能控制
  9. sbit a0                =        P1^0;           //模拟量输入位
  10. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};


  11. /*unsigned char ADC_RES;  */

  12. uchar Vo; //A/D转换后换算的电压值


  13. /*sfr  P1ASF=    0x90;
  14. sfr ADC_CONTR= 0xc5;
  15. sfr ADC_DATA = 0xc6;
  16. sfr ADC_LOW2 = 0xbe; */



  17. /*Define ADC operation const for ADC_CONTR*/
  18. #define ADC_POWER   0x80            //ADC power control bit
  19. #define ADC_FLAG    0x10            //ADC complete flag 模数转换结束标志位
  20. #define ADC_START   0x08            //ADC start control bit  模数转换启动控制位          


  21. //转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度
  22. #define ADC_SPEEDLL 0x00            //540 clocks  
  23. #define ADC_SPEEDL  0x20            //360 clocks
  24. #define ADC_SPEEDH  0x40            //180 clocks
  25. #define ADC_SPEEDHH 0x60            //90 clocks
  26. /*********************************************************/
  27. uchar DIS1[] = {"湿度:           "};
  28. /*******************************************************************/
  29. /*                                                                 */
  30. /*  延时函数                                                       */
  31. /*                                                                 */
  32. /*******************************************************************/
  33. void delay(int ms)
  34. {
  35.     while(ms--)
  36.         {
  37.       uchar i;
  38.           for(i=0;i<150;i++)  
  39.            {
  40.             _nop_();                          
  41.                 _nop_();
  42.                 _nop_();
  43.                 _nop_();
  44.            }
  45.         }
  46. }
  47.        
  48. /*******************************************************************/
  49. /*                                                                 */
  50. /*  延时函数                                                       */
  51. /*                                                                 */
  52. /*******************************************************************/
  53. void delay1(int ms)
  54. {
  55.     while(ms--)
  56.         {
  57.       uchar y;
  58.           for(y=0;y<100;y++) ;
  59.         }
  60. }       

  61. void send(unsigned char dat)
  62. {
  63.         unsigned char i;
  64.         unsigned long x;        //为延时用
  65.         for(i=0;i<8;i++)
  66.         {
  67.                 if(        (dat & 0x80)!=0)
  68.                 {
  69.                         LCD_SID=1;
  70.                 }
  71.                 else
  72.                 {
  73.                         LCD_SID=0;
  74.                 }
  75.                 LCD_SCLK=1;
  76.                 x++;
  77.                 LCD_SCLK=0;
  78.         x++;
  79.                 dat=dat<<1;
  80.         }
  81. }
  82. /*******************************************************************/
  83. /*                                                                 */
  84. /*写指令数据到LCD                                                  */
  85. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  86. /*                                                                 */
  87. /*******************************************************************/
  88. void lcd_wcmd(uchar cmd)
  89. {                          
  90.     unsigned char byte1=0xf8,byte2,byte3;
  91.     byte2=cmd & 0xf0;
  92.         byte3=cmd<<4;
  93.     LCD_CS=1;
  94.         send(byte1);
  95.         send(byte2);
  96.         send(byte3);
  97.     LCD_CS=0;
  98.         delay(5);
  99. }
  100. /*******************************************************************/
  101. /*                                                                 */
  102. /*写显示数据到LCD                                                  */
  103. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  104. /*                                                                 */
  105. /*******************************************************************/
  106. void lcd_wdat(uchar dat)
  107. {                          
  108.     unsigned char byte1=0xfa,byte2,byte3;
  109.     byte2=dat & 0xf0;
  110.         byte3=dat<<4;
  111.     LCD_CS=1;
  112.         send(byte1);
  113.         send(byte2);
  114.         send(byte3);
  115.     LCD_CS=0;
  116.         delay(5);
  117. }
  118. /*******************************************************************/
  119. /*                                                                 */
  120. /*  LCD初始化设定                                                  */
  121. /*                                                                 */
  122. /*******************************************************************/
  123. void lcd_init()
  124. {
  125.     lcd_wcmd(0x34);      //扩充指令操作
  126.     delay(5);
  127.     lcd_wcmd(0x30);      //基本指令操作
  128.     delay(5);
  129.     lcd_wcmd(0x0c);      //显示开,关光标
  130.     delay(5);
  131.     lcd_wcmd(0x01);      //清除LCD的显示内容
  132.     delay(5);
  133. }
  134. /*********************************************************/
  135. /*                                                       */
  136. /* 设定显示位置                                          */
  137. /*                                                       */
  138. /*********************************************************/
  139. void lcd_pos(uchar X,uchar Y)
  140. {                          
  141.    uchar  pos;
  142.    if (X==1)
  143.      {X=0x80;}
  144.    else if (X==2)
  145.      {X=0x90;}
  146.    else if (X==3)
  147.      {X=0x88;}
  148.    else if (X==4)
  149.      {X=0x98;}
  150.    pos = X+Y ;

  151.    lcd_wcmd(pos);     //显示地址
  152. }

  153. /*********************************************************
  154. *                                                        *
  155. * 清屏函数                                               *
  156. *                                                        *
  157. *********************************************************/
  158. void  clr_screen()
  159. {
  160.    lcd_wcmd(0x34);      //扩充指令操作
  161.    delay(5);   
  162.    lcd_wcmd(0x30);      //基本指令操作
  163.    delay(5);
  164.    lcd_wcmd(0x01);      //清屏
  165.    delay(5);     
  166. }
  167. void disp_hz()
  168. {
  169.     unsigned char i;
  170.     lcd_pos(1,0);             //设置显示位置为第一行
  171.     for(i=0;i<16;i++)
  172.     {
  173.                lcd_wdat(DIS1[i]);
  174.        //        delay(30);
  175.     }
  176. }
  177.                        
  178. //----------------------------
  179. //Get ADC result
  180. //---------------------------
  181. uchar GetADCResult(uchar ch)                               //这里如有不懂 请仔细看资料
  182. {   
  183.     P1ASF = 0x01;                                         //选择P1口的哪一口 这里的口和ch要对应才能达到选择该口
  184.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
  185.                                                          // 这么用语句的主要原因就是不能位寻址
  186.                                                          //   通道选择在后3位所以直接用一个整数表示ch
  187.                                                          //例如ch=6 那么对应的后三位就是110           
  188.     _nop_();         //Must wait before inquiry ,
  189.     _nop_(); //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
  190.     _nop_();
  191.     _nop_();
  192.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  193.    ADC_CONTR &= ~ADC_FLAG;         //Close ADC 将标志位清零等待下次硬件置1
  194.    //也可以写成 ADC_CONTR= ADC_CONTR & ( ~ADC_FLAG)
  195.                                                                           
  196.     Vo=ADC_RES*5*10/256;                 //Return ADC result(为显示整数,这里将电压值扩大了十倍)
  197.                                          //5/256  因为是8位 把5V分成256份  ADC_RES为采集的份数
  198.                                          //ADC_RES*(5/256) 为采集的电压值  然后扩大10倍便于计算
  199.     return Vo;
  200. }
  201. void main()
  202. ……………………

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

所有资料51hei提供下载:
test_yl_69.zip (24.31 KB, 下载次数: 180)


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

使用道具 举报

沙发
ID:354412 发表于 2018-7-10 19:05 | 只看该作者
这个是串行显示吗?
回复

使用道具 举报

板凳
ID:295898 发表于 2018-12-28 08:50 | 只看该作者
沐浴阳光949 发表于 2018-7-10 19:05
这个是串行显示吗?

是的,当时是为了少接几根线
回复

使用道具 举报

地板
ID:670574 发表于 2019-12-22 17:35 | 只看该作者
你好,获取到电压值v0之后,要怎么转换成土壤湿度值呢?公式
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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