标题:
stc15w4k56s4+yl_69土壤湿度传感器+lcd12864串行+AD转换
[打印本页]
作者:
asimaka
时间:
2018-4-4 15:47
标题:
stc15w4k56s4+yl_69土壤湿度传感器+lcd12864串行+AD转换
利用YL-69传感器做的土壤湿度检测,能显示数值
单片机源程序如下:
#include <stc15.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
/************* 12864LCD引脚定义 *************/
sbit LCD_CS = P1^3; //LCD液晶片选
sbit LCD_SID = P1^1; //LCD液晶读/写控制
sbit LCD_SCLK = P1^2; //LCD液晶使能控制
sbit a0 = P1^0; //模拟量输入位
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*unsigned char ADC_RES; */
uchar Vo; //A/D转换后换算的电压值
/*sfr P1ASF= 0x90;
sfr ADC_CONTR= 0xc5;
sfr ADC_DATA = 0xc6;
sfr ADC_LOW2 = 0xbe; */
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag 模数转换结束标志位
#define ADC_START 0x08 //ADC start control bit 模数转换启动控制位
//转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
/*********************************************************/
uchar DIS1[] = {"湿度: "};
/*******************************************************************/
/* */
/* 延时函数 */
/* */
/*******************************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* */
/* 延时函数 */
/* */
/*******************************************************************/
void delay1(int ms)
{
while(ms--)
{
uchar y;
for(y=0;y<100;y++) ;
}
}
void send(unsigned char dat)
{
unsigned char i;
unsigned long x; //为延时用
for(i=0;i<8;i++)
{
if( (dat & 0x80)!=0)
{
LCD_SID=1;
}
else
{
LCD_SID=0;
}
LCD_SCLK=1;
x++;
LCD_SCLK=0;
x++;
dat=dat<<1;
}
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
unsigned char byte1=0xf8,byte2,byte3;
byte2=cmd & 0xf0;
byte3=cmd<<4;
LCD_CS=1;
send(byte1);
send(byte2);
send(byte3);
LCD_CS=0;
delay(5);
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
unsigned char byte1=0xfa,byte2,byte3;
byte2=dat & 0xf0;
byte3=dat<<4;
LCD_CS=1;
send(byte1);
send(byte2);
send(byte3);
LCD_CS=0;
delay(5);
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/*********************************************************
* *
* 清屏函数 *
* *
*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
void disp_hz()
{
unsigned char i;
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++)
{
lcd_wdat(DIS1[i]);
// delay(30);
}
}
//----------------------------
//Get ADC result
//---------------------------
uchar GetADCResult(uchar ch) //这里如有不懂 请仔细看资料
{
P1ASF = 0x01; //选择P1口的哪一口 这里的口和ch要对应才能达到选择该口
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
// 这么用语句的主要原因就是不能位寻址
// 通道选择在后3位所以直接用一个整数表示ch
//例如ch=6 那么对应的后三位就是110
_nop_(); //Must wait before inquiry ,
_nop_(); //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
ADC_CONTR &= ~ADC_FLAG; //Close ADC 将标志位清零等待下次硬件置1
//也可以写成 ADC_CONTR= ADC_CONTR & ( ~ADC_FLAG)
Vo=ADC_RES*5*10/256; //Return ADC result(为显示整数,这里将电压值扩大了十倍)
//5/256 因为是8位 把5V分成256份 ADC_RES为采集的份数
//ADC_RES*(5/256) 为采集的电压值 然后扩大10倍便于计算
return Vo;
}
void main()
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
test_yl_69.zip
(24.31 KB, 下载次数: 181)
2018-4-4 15:46 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
沐浴阳光949
时间:
2018-7-10 19:05
这个是串行显示吗?
作者:
asimaka
时间:
2018-12-28 08:50
沐浴阳光949 发表于 2018-7-10 19:05
这个是串行显示吗?
是的,当时是为了少接几根线
作者:
1305174379
时间:
2019-12-22 17:35
你好,获取到电压值v0之后,要怎么转换成土壤湿度值呢?公式
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1