|
#include <reg52.h> //調(diào)用單片機頭文件
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
#include <intrins.h>
//數(shù)碼管段選定義 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}; //斷碼
//數(shù)碼管位選定義
sbit smg_we1 = P2^0; //數(shù)碼管位選定義
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; //濕度報警參數(shù)
sbit dianji = P3^5; //電機IO定義
/***********************1ms延時函數(shù)*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************數(shù)碼位選函數(shù)*****************************/
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; //菜單設(shè)計的變量
/***********************數(shù)碼顯示函數(shù)*****************************/
void display()
{
static uchar i;
i++;
if(i >= 4)
i = 0;
P0 = 0xff; //消隱
smg_we_switch(i); //位選
P0 = dis_smg[i]; //段選
// delay_1ms(1);
}
/***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)********************************************************/
//請先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來讀本函數(shù),主要是對應(yīng)時序圖來理解,本函數(shù)是模擬0832的串行協(xié)議進行的
// 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; //開始從第四個下降沿接收數(shù)據(jù)
value=value<<1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{ //接收校驗數(shù)據(jù)
value1>>=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
SCL=1;
DO=1;
CS=1;
if(value==value1) //與校驗數(shù)據(jù)比較,正確就返回數(shù)據(jù),否則返回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))
{ //確認(rèn)是按鍵按下
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;
}
/****************按鍵處理顯示函數(shù)***************/
void key_with()
{
if(menu_1 == 0)
{
if(key_can == 3) //手動打開電機
dianji = 0; //打開電機
if(key_can == 2)
dianji = 1; //關(guān)閉電機
}
if(key_can == 1) //設(shè)置鍵
{
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0;
}
}
if(menu_1 == 1) //設(shè)置濕度上限
{
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) //設(shè)置濕度下限
{
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
}
}
/****************電機控制函數(shù)***************/
void dianji_kongzi()
{
static uchar value,value1;
if(shidu <= s_low)
{
value ++;
if(value >= 2)
{
value = 10;
dianji = 0; //關(guān)機電機
}
}
else
value = 0;
if(shidu >= s_high)
{
value1 ++;
if(value1 >= 2)
{
value1 = 10;
dianji = 1; //打開電機
}
}else
value1 = 0;
}
/***************主函數(shù)*****************/
void main()
{
delay_1ms(100);
P0 = P1 = P2 = P3 = 0xff; //初始化IO口
while(1)
{
key(); //獨立按鍵程序
if(key_can < 10)
{
key_with(); //按鍵按下要執(zhí)行的程序
}
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(); //電機控制函數(shù)
}
}
display(); //數(shù)碼管顯示函數(shù)
delay_1ms(1);
}
|
|