找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机土壤湿度传感器设计 程序编译错误

[复制链接]
跳转到指定楼层
楼主

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "intrins.h"                                                                                          
#ifndef _XPT2046_H_
#define _XPT2046_H_
#define     u8                          unsigned char
#define     u16                   unsigned int
#define     uchar                          unsigned char
#define     uint                   unsigned int

uchar yushe_Moisture=30;                        //Moisture预设值
uchar Moisture;                                                                 //用于读取ADC数据

//运行模式  
uchar Mode=0;                                                                 //=1是设置湿度阀值        =0是正常监控模式
uchar Mode_1=0;                                                                 //0:自动 1;手动
//管脚声明
sbit Relay= P1^6;                 //湿度报警

void delay_ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<110;j++);
}

//LCD管脚声明
sbit LCDRS = P2^6;
sbit LCDRW = P2^5;
sbit LCDEN = P2^7;
//LCD延时
void LCDdelay(uint z)                  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--);

}
//写命令
void write_com(uchar com)
{
  LCDRS=0;
  LCDRW=0;                                 
  P0=com;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//写数据
void write_data(uchar date)
{
  LCDRS=1;
//        LCD_WriteData(date);
  LCDRW=0;
  P0=date;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}

void SelectPosition(unsigned char x,unsigned char y)
{     
        if (x == 0)
        {     
                write_com(0x80 + y);     //表示第一行
        }
        else
        {      
                write_com(0xC0 + y);      //表示第二行
        }        
}
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
        SelectPosition(x,y) ;
        while (*s)
        {     
                write_data( *s);     
                s ++;     
        }
}
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
{     
        SelectPosition(x,y) ;

        if(l>=5)
                write_data(0x30+s/10000%10);        //万位
        if(l>=4)
                write_data(0x30+s/1000%10);                //千位
        if(l>=3)
                write_data(0x30+s/100%10);                //百位
        if(l>=2)
                write_data(0x30+s/10%10);                        //十位
        if(l>=1)
                write_data(0x30+s%10);                //个位

}
/*1602指令简介
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x0d);//打开显示 阴影闪烁
  write_com(0x0d);//打开显示 阴影闪烁
*/
//1602初始化
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0C);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
        
}

void Display_1602(yushe_Moisture,temp)
{
        
        //显示预设湿度
        LCD_Write_Char(1,12,yushe_Moisture,3) ;
        //时时湿度
        LCD_Write_Char(0,10,temp,3) ;
}

sbit DOUT = P3^7;          //输出
sbit CLK  = P3^6;          //时钟
sbit DIN  = P3^4;          //输入
sbit CS   = P3^5;          //片选

uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);

void SPI_Start(void)
{
        CLK = 0;
        CS  = 1;
        DIN = 1;
        CLK = 1;
        CS  = 0;               
}
/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/

void SPI_Write(uchar dat)
{
        uchar i;
        CLK = 0;
        for(i=0; i<8; i++)
        {
                DIN = dat >> 7;          //放置最高位
                dat <<= 1;
                CLK = 0;                        //上升沿放置数据

                CLK = 1;

        }
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/

uint SPI_Read(void)
{
        uint i, dat=0;
        CLK = 0;
        for(i=0; i<12; i++)                //接收12位数据
        {
                dat <<= 1;

                CLK = 1;
                CLK = 0;

                dat |= DOUT;

        }
        return dat;        
}

/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
        uchar i;
        uint AD_Value;
        CLK = 0;
        CS  = 0;
        SPI_Write(cmd);
        for(i=6; i>0; i--);         //延时等待转换结果
        CLK = 1;          //发送一个时钟周期,清除BUSY
        _nop_();
        _nop_();
        CLK = 0;
        _nop_();
        _nop_();
        AD_Value=SPI_Read();
        CS = 1;
        return AD_Value;        
}


sbit Key1=P3^1;                                 //设置键
sbit Key2=P3^0;                                 //加按键
sbit Key3=P3^2;                                 //减按键

#define KEY_SET                 1                //设置
#define KEY_ADD                        2                //加
#define KEY_MINUS                3                //减


u8 Key_Scan()
{         
        static u8 key_up=1;//按键按松开标志
        if(key_up&&(Key1==0||Key2==0||Key3==0))
        {
                delay_ms(10);//去抖动
                key_up=0;
                if(Key1==0)                        return 1;
                else if(Key2==0)return 2;
                else if(Key3==0)return 3;
        }
        else if(Key1==1&&Key2==1&&Key3==1)
                key_up=1;            
         return 0;// 无按键按下
}


void main (void)
{
        u8 key;
        Moisture=XPT2046;                                //读取湿度值
        Moisture=100-(Moisture*100/256);                                //读取湿度值
        Init1602();                          //调用初始化显示函数
        LCD_Write_String(0,0," Moisture:000%");  //开机界面
        LCD_Write_String(1,0,"MODE:A  SET:000%");  //
        delay_ms(1000);
        Moisture=XPT2046(0);                                //读取湿度值
        Moisture=100-(Moisture*100/256);                                //读取湿度值
        while (1)                                                //主循环
        {
                key=Key_Scan();                                        //按键扫描
                Moisture=XPT2046(0);                                //读取湿度值
                Moisture=100-(Moisture*100/256);                                //读取湿度值
                if(key==KEY_SET)
                {
                        Mode++;
                }
                switch(Mode)                                                //判断模式的值
                {
                        case 0:                                                                //监控模式
                        {
                                if(key==KEY_ADD)
                                {
                                        Mode_1=!Mode_1;
                                        if(Mode_1)
                                                LCD_Write_String(1,5,"H");  //
                                        else
                                                LCD_Write_String(1,5,"A");  //
                                }
                                if(Mode_1)
                                {
                                        if(key==KEY_MINUS)
                                        {
                                                Relay=!Relay;
                                        }
                                }
                                Display_1602(yushe_Moisture,Moisture);  //显示预设湿度,湿度值
                                if(!Mode_1)
                                {
                                        if(Moisture>=yushe_Moisture)          //湿度值大于等于预设值时
                                        {
                                                Relay=1;                                          //关闭继电器
                                        }
                                        else                                                                                  //湿度值小于预设值时
                                        {
                                                Relay=0;                                          //打开继电器
                                        }
                                }
                                break;
                        }
                        case 1:                                //预设湿度模式
                        {
                                SelectPosition(1,11) ;                                //指定位置        
                           write_com(0x0d);                                                        //打开显示 无光标 光标闪烁
                                if(key==KEY_ADD)                                                        //加键按下
                                {
                                        if(yushe_Moisture>=99)        //当阀值加到大于等于99时
                                        yushe_Moisture=99;            //阀值固定为99
                                        yushe_Moisture++;                                            //预设湿度值(阀值)加1,最大为100
                                        LCD_Write_Char(1,12,yushe_Moisture,3) ;//显示预设湿度

                                }
                                if(key==KEY_MINUS)                                                //减键按下
                                {
                                        if(yushe_Moisture<=1)                                        //当湿度上限值减小到1时
                                                yushe_Moisture=1;                  //固定为1
                                        yushe_Moisture--;                                                        //预设温度值减一,最小为0         
                                        LCD_Write_Char(1,12,yushe_Moisture,3) ;//显示预设湿度
                                }
                                break;
                        }
                        default        :        
                        {
                                write_com(0x38);//屏幕初始化
                                write_com(0x0C);//打开显示 无光标 无光标闪烁
                                Mode=0;                        //恢复正常模式
                                break;
                        }
                }
        }
                  }

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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