欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6146|回復: 3
打印 上一主題 下一主題
收起左側

stc15w4k56s4+yl_69土壤濕度傳感器+lcd12864串行+AD轉換

[復制鏈接]
跳轉到指定樓層
樓主
ID:295898 發(fā)表于 2018-4-4 15:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
利用YL-69傳感器做的土壤濕度檢測,能顯示數(shù)值

單片機源程序如下:
  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 模數(shù)轉換結束標志位
  20. #define ADC_START   0x08            //ADC start control bit  模數(shù)轉換啟動控制位          


  21. //轉換速度控制位SPEED0和SPEED1,共四種狀態(tài),對應四種轉換速度
  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. /*  延時函數(shù)                                                       */
  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. /*  延時函數(shù)                                                       */
  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. /*寫指令數(shù)據(jù)到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. /*寫顯示數(shù)據(jù)到LCD                                                  */
  103. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  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的顯示內(nèi)容
  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. * 清屏函數(shù)                                               *
  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位所以直接用一個整數(shù)表示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(為顯示整數(shù),這里將電壓值擴大了十倍)
  197.                                          //5/256  因為是8位 把5V分成256份  ADC_RES為采集的份數(shù)
  198.                                          //ADC_RES*(5/256) 為采集的電壓值  然后擴大10倍便于計算
  199.     return Vo;
  200. }
  201. void main()
  202. ……………………

  203. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
test_yl_69.zip (24.31 KB, 下載次數(shù): 181)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:354412 發(fā)表于 2018-7-10 19:05 | 只看該作者
這個是串行顯示嗎?
回復

使用道具 舉報

板凳
ID:295898 發(fā)表于 2018-12-28 08:50 | 只看該作者

是的,當時是為了少接幾根線
回復

使用道具 舉報

地板
ID:670574 發(fā)表于 2019-12-22 17:35 | 只看該作者
你好,獲取到電壓值v0之后,要怎么轉換成土壤濕度值呢?公式
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表