仿真之后為什么我改變LDR的的值,顯示屏上一直都是255沒變化。第二塊單片機沒有起到作用。
仿真圖如下:
捕獲.PNG (76.96 KB, 下載次數(shù): 16)
下載附件
2020-4-13 15:12 上傳
捕獲2.PNG (146.06 KB, 下載次數(shù): 24)
下載附件
2020-4-13 15:14 上傳
捕獲1.PNG (164.73 KB, 下載次數(shù): 16)
下載附件
2020-4-13 15:14 上傳
光敏檢測電路放大:
捕獲3.PNG (94.55 KB, 下載次數(shù): 24)
下載附件
2020-4-13 15:17 上傳
程序如下:
#include<reg52.h>
#include <intrins.h>
#include <math.h>
#include <stdio.h>
#include <1602.h>
#include <sht11.h>
#include <24c02.h>
#define uchar unsigned char //宏定義,uchar代表 unsigned char(省字)
#define uint unsigned int // 同上
#define W_cmd 0xa0 //24c02寫指令
#define R_cmd 0xa1
uint temp,humi;
value humi_val,temp_val; //定義兩個共同體,一個用于濕度,一個用于溫度
uchar error; //用于檢驗是否出現(xiàn)錯誤
uchar checksum; //CRC
uchar TEMP_data[7]; //用于記錄實測的溫度
uchar HUMI_data[6]; //用于記錄實測的濕度
uchar LIGH_data[4]; //用于記錄實測光感度
uchar show_temp[5]; //顯示設(shè)定的溫度
uchar show_humi[4]; //顯示設(shè)定的濕度
uchar data temp_humi_cache[4]; //溫濕度設(shè)置緩存
uchar temp_set; //保存溫度變量
uchar humi_set; //保存濕度變量
uchar presskeynum; //按鍵次數(shù)變量
uchar nn; //用于蜂鳴器
uchar code word1[]={" a product of "};
uchar code word2[]={"UNITED ELECTRONS"}; //顯示屏顯示的字符
uchar code word3[]={" Welcome........"};
sbit k1=P2^0; //選擇按鍵
sbit k2=P2^1; //增加按鍵
sbit k3=P2^2; //減小按鍵
sbit k4=P2^3;// 確認按鍵
sbit led1=P1^4; //溫度過低指示燈
sbit led2=P1^5; //溫度過高
sbit led3=P1^6; //濕度低于下限值,報警,加濕。 未出現(xiàn)LED
sbit led4=P1^7; //濕度過高,報警,不調(diào)濕
sbit motor1=P3^4;
sbit motor2=P3^5;
sbit motor3=P3^6;
sbit motor4=P3^7;
sbit P2_6=P2^6; //暫時沒理解
//********延時函數(shù)*********
void delay(uint z) //z為毫秒數(shù)
{
int a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
void key()
{
uchar m;
if (k1==0) //調(diào)整按鍵檢測
{
delay(5);
if (k1==0)
{
presskeynum++;
if(presskeynum==3)
presskeynum=0;
while(k1==0); //若一直按下,循環(huán)
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
}
}
if(presskeynum==1)//溫度設(shè)置
{
if(k2==0) // 加
{
delay(300);
temp_set++;
if (temp_set>30)
temp_set=30;
while(k2==0); //加上此句必須松按鍵才處理
}
if(k3==0)//減
{
delay(300);
temp_set--;
if (temp_set<18)
temp_set=18;
while(k3==0); //加上此句必須松按鍵才處理
}
}
if(presskeynum==2)//濕度設(shè)置
{
if(k2==0)// 加
{
delay(300);
humi_set++;
if (humi_set>99)
humi_set=99;
while(k2==0);
}
if(k3==0)//減
{
delay(300);
humi_set--;
if (humi_set<1)
humi_set=1;
// while(k3==0); //這句是調(diào)試加入的
}
}
if(k4==0)// 退出鍵 //設(shè)置完初始值以后通過IIC寫入24c02并清屏
{
delay(10);
if(k4==0)
{
while(k4==0);
presskeynum=0;
temp_humi_cache[0]=temp_set/10;
temp_humi_cache[1]=temp_set%10;
temp_humi_cache[2]=humi_set/10;
temp_humi_cache[3]=humi_set%10;
for(m=0;m<4;m++)
{
WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]); //設(shè)定值寫入24c02
}
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
}
}
}
//主函數(shù)
void main()
{
uchar t;
uchar temp_adc;
k1=k2=k3=k4=1;
motor1=motor2=motor3=motor4=0;
P2_6=0;
for (t=0;t<4;t++)
temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd); //讀入24c02設(shè)定的值
temp_set=temp_humi_cache[0]*10+temp_humi_cache[1]; //設(shè)置溫度
humi_set=temp_humi_cache[2]*10+temp_humi_cache[3]; //設(shè)置濕度
LCD_Initial(); //液晶初始化
GotoXY(0,0); //光標移動(0,0)
Print_slow(word1);
GotoXY(0,1);
Print_slow(word2);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print_slow(word3);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 //完成系統(tǒng)初始化
while(1)
{
key();
P1 = 0xff; //P1口初始化
temp_adc = P1; //讀取光敏值,8位精度最大256
if(presskeynum==0) //測量溫濕度
{
s_connectionreset(); //啟動連接復(fù)位
error=0; //初始化error=0,即沒有錯誤
error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量值返回到temp.val.i
error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量值返回到humi_val.i
if(error!=0)
s_connectionreset(); //如果發(fā)生錯誤,系統(tǒng)復(fù)位
else
{
humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點數(shù)
temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點數(shù)
calc_sth10(&humi_val.f,&temp_val.f); //修正相對濕度及溫度,誤差彌補
temp=temp_val.f*10;
humi=humi_val.f*10;
GotoXY(0,0); //選擇溫度顯示位置
Print("Temp: C --- "); //5格空格
GotoXY(0,1); //選擇濕度顯示位置
Print("Humi: % "); //5格空格
GotoXY(5,0); //設(shè)置溫度顯示位置
TEMP_data[0]=temp/1000+'0'; //溫度百位
if (TEMP_data[0]==0x30) //ASCLL = 0
TEMP_data[0]=0x20; //對應(yīng)的ASCLL位空格
TEMP_data[1]=temp%1000/100+'0'; //溫度十位
if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30)
TEMP_data[1]=0x20;
TEMP_data[2]=temp%100/10+'0'; //溫度個位
TEMP_data[3]=0x2e; //小數(shù)點
TEMP_data[4]=temp%10+'0'; //溫度小數(shù)點后第一位
TEMP_data[5]=0xdf; //顯示溫度符號℃書上是第248
TEMP_data[6]='\0'; //實際上0xdf對應(yīng)的是小圓圈
Print(TEMP_data); //輸出溫度
GotoXY(5,1);
HUMI_data[0]=humi/1000+'0'; //濕度百位
if (HUMI_data[0]==0x30)
HUMI_data[0]=0x20;
HUMI_data[1]=humi%1000/100+'0'; //濕度十位
HUMI_data[2]=humi%100/10+'0'; //濕度個位
HUMI_data[3]='.' ; //小數(shù)點
HUMI_data[4]=humi%10+'0'; //濕度小數(shù)點后第一位
HUMI_data[5]='\0';
Print(HUMI_data); //輸出濕度
GotoXY(13,1);
LIGH_data[0] = temp_adc%1000/100+'0';
// if(LIGH_data[0] == 0x30)
// LIGH_data[0] = 0x20;
LIGH_data[1] = temp_adc%100/10+'0';
LIGH_data[2] = temp_adc%10+'0';
LIGH_data[3] = '\0';
Print(LIGH_data);
if ((temp/10)<temp_set)
{
motor1=1;
motor2=0;
}else if ((temp/10)>=temp_set)
{
motor2=1;
motor1=0;
}
if ((humi/10)<humi_set)
{
motor3=1;
motor4=0;
}
else if ((humi/10)>=humi_set)
{
motor4=1;
motor3=0;
}
} //else
} //if
if(presskeynum==1) //設(shè)定溫度時顯示的內(nèi)容
{
show_temp[0]=temp_set/10+0x30;
show_temp[1]=temp_set%10+0x30;
show_temp[2]=0xdf;
show_temp[3]='C';
show_temp[4]='\0';
GotoXY (0,0);
Print("SET TEMP:");
GotoXY (0,1);
Print(show_temp);
}
if(presskeynum==2) //設(shè)定濕度時顯示的內(nèi)容
{
show_humi[0]=humi_set/10+0x30;
show_humi[1]=humi_set%10+0x30;
show_humi[2]='%';
show_humi[3]='\0';
GotoXY (0,0);
Print("SET HUMI:");
GotoXY (0,1);
Print(show_humi);
}
}//while
} //mian
|