久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1239|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美888| 久久精品免费 | 亚洲国产成人av好男人在线观看 | 亚洲一区二区三区四区五区中文 | 亚洲三区视频 | www.国产91 | 亚洲精品视频网站在线观看 | 日日干天天操 | 国产一级一片免费播放 | 亚洲综合一区二区三区 | 人人人人干 | 可以在线观看av的网站 | 国产区在线 | 五月激情六月婷婷 | 欧美精品一区二区蜜桃 | 国产精品午夜电影 | 黄色男女网站 | 国产精品久久久久久久白浊 | 欧美美乳| 久久久久久国产精品三区 | 国产精品theporn | 欧美午夜久久 | h在线播放 | 中文字幕在线一 | 亚洲精品久久久蜜桃 | 一区二区三区电影在线观看 | 欧美精品video | 欧美精品一区在线 | 久久99精品国产麻豆婷婷 | 亚洲 欧美 综合 | 久久久久久久电影 | 国产精品久久久久久妇女6080 | 97精品一区二区 | 日韩av黄色 | 91xxx在线观看 | 亚洲国产福利视频 | 91婷婷韩国欧美一区二区 | 久久一区二区三区四区 | 久久91精品| 国产综合精品一区二区三区 | 免费的色网站 |