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

標題: 基于51單片機的智能花卉培養 [打印本頁]

作者: 54231    時間: 2018-6-11 11:35
標題: 基于51單片機的智能花卉培養
#include <reg52.h>          //調用單片機頭文件
#define uchar unsigned char  //無符號字符型 宏定義 變量范圍0~255
#define uint  unsigned int  //無符號整型 宏定義 變量范圍0~65535
#include <intrins.h>
            //數碼管段選定義 0     1    2    3    4    5 6  7   8    9
uchar code smg_du[]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05,
//        A B  C   D    E   F 不顯示
         0x06,0xa4,0x9c,0x64,0x8c,0x8e,0xff};  //斷碼
//數碼管位選定義
sbit smg_we1 = P2^0;     //數碼管位選定義
sbit smg_we2 = P2^2;
sbit smg_we3 = P2^4;
sbit smg_we4 = P2^6;
uchar dis_smg[8] = {0x14,0x77,0x4c,0x45,0x27,0x85,0x84};
sbit SCL=P1^2;  //SCL定義為P1口的第3位腳,連接ADC0832SCL腳
sbit DO=P1^3;  //DO定義為P1口的第4位腳,連接ADC0832DO腳
sbit CS=P1^0;  //CS定義為P1口的第4位腳,連接ADC0832CS腳
uchar shidu;     //濕度等級
uchar s_high = 70,s_low = 25; //濕度報警參數
sbit dianji = P3^5;     //電機IO定義
/***********************1ms延時函數*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
  for(j=0;j<120;j++);
}

/***********************數碼位選函數*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
  case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
}
}
uchar flag_200ms ;
uchar key_can;   //按鍵值的變量
uchar menu_1;        //菜單設計的變量
/***********************數碼顯示函數*****************************/
void display()
{
static uchar i;   
i++;
if(i >= 4)
  i = 0;
P0 = 0xff;    //消隱
smg_we_switch(i);   //位選
P0 = dis_smg[i];   //段選         
// delay_1ms(1);
}
/***********讀數模轉換數據********************************************************/
//請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
      //  1  1  0 通道
      //  1  1  1 通道
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;  
  SCL=0;
  DO=1;
  CS=0;  //開始
  SCL=1;  //第一個上升沿
  SCL=0;
  DO=SGL;
  SCL=1;   //第二個上升沿
  SCL=0;
  DO=ODD;
  SCL=1;    //第三個上升沿
  SCL=0;    //第三個下降沿
  DO=1;
  for(i=0;i<8;i++)
  {
   SCL=1;
   SCL=0; //開始從第四個下降沿接收數據
   value=value<<1;
   if(DO)
    value++;      
  }
  for(i=0;i<8;i++)
  {   //接收校驗數據
   value1>>=1;
   if(DO)
    value1+=0x80;
   SCL=1;
   SCL=0;
  }
  SCL=1;
  DO=1;
  CS=1;
  if(value==value1)    //與校驗數據比較,正確就返回數據,否則返回0
   return value;
return 0;
}

/********************獨立按鍵程序*****************/
uchar key_can;  //按鍵值
void key()  //獨立按鍵程序
{
static uchar key_new;
key_can = 20;                   //按鍵值還原
P1 |= 0xf0;
if((P1 & 0xf0) != 0xf0)  //按鍵按下
{
  delay_1ms(1);       //按鍵消抖動
  if(((P1 & 0xf0) != 0xf0) && (key_new == 1))
  {      //確認是按鍵按下
   key_new = 0;
   switch(P1 & 0xf0)
   {
    case 0x70: key_can = 1; break;    //得到k2鍵值
    case 0xb0: key_can = 2; break;    //得到k3鍵值
    case 0xd0: key_can = 3; break;    //得到k4鍵值
   }   
  }   
}
else
  key_new = 1;
}
/****************按鍵處理顯示函數***************/
void key_with()
{
if(menu_1 == 0)
{
  if(key_can == 3)   //手動打開電機
   dianji = 0;     //打開電機
  if(key_can == 2)
   dianji = 1;     //關閉電機
  }
if(key_can == 1)  //設置鍵
{
  menu_1 ++;
  if(menu_1 >= 3)
  {
   menu_1 = 0;
  }
}
if(menu_1 == 1)   //設置濕度上限
{
  if(key_can == 2)
  {
   s_high ++ ;  //濕度上限值加1
   if(s_high > 99)
    s_high = 99;
  }
  if(key_can == 3)
  {
   s_high -- ;  //濕度上限值減1
   if(s_high <= s_low)
    s_high = s_low + 1 ;
  }
  dis_smg[0] = smg_du[s_high % 10];            //取個位顯示
  dis_smg[1] = smg_du[s_high / 10 % 10];  //取十位顯示
  dis_smg[2] = 0xef;   
  dis_smg[3] = 0x26;  //H  0010 0110
}
if(menu_1 == 2)   //設置濕度下限
{
  if(key_can == 2)
  {
   s_low ++ ;   //濕度下限值加1
   if(s_low >= s_high)
    s_low = s_high - 1;
  }
  if(key_can == 3)
  {
   s_low --;   //濕度下限值減1
   if(s_low <= 1)
    s_low = 1;
  }
  dis_smg[0] = smg_du[s_low % 10];            //取個位顯示
  dis_smg[1] = smg_du[s_low / 10 % 10];  //取十位顯示
  dis_smg[2] = 0xef;   
  dis_smg[3] = 0xBC;  //L
}
}  
/****************電機控制函數***************/
void dianji_kongzi()
{
static uchar value,value1;
if(shidu <= s_low)
{
  value ++;
  if(value >= 2)
  {
   value = 10;
   dianji = 0;       //關機電機
  }
}
else
   value = 0;
if(shidu >= s_high)
{
  value1 ++;
  if(value1 >= 2)
  {
   value1 = 10;
   dianji = 1;       //打開電機
  }
}else
  value1 = 0;
}
/***************主函數*****************/
void main()
{
delay_1ms(100);
P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
while(1)
{
  key();     //獨立按鍵程序
  if(key_can < 10)
  {
   key_with();   //按鍵按下要執行的程序
  }
  flag_200ms ++;
  if(flag_200ms >= 200)
  {  
   flag_200ms = 0;   
   P0 = 0xff;    //消隱
   if(menu_1 == 0)
   {        
    shidu = ad0832read(1,0); //讀出濕度
    shidu =100-shidu * 99 / 255;
    dis_smg[0] = 0xff;  //
    dis_smg[1] = smg_du[shidu % 10]; //取濕度的個位顯示
    dis_smg[2] = smg_du[shidu / 10 % 10] ;    //取濕度的十位顯示
    dis_smg[3] = 0XFF; //
    dianji_kongzi();  //電機控制函數
   }
   
  }
  display();   //數碼管顯示函數
  delay_1ms(1);
}







歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1