原本用的ADC0832,現換成BH1750,更改的代碼還是有很多問題,望大佬能指點一二。
以下代碼為main.c
#include <reg52.h>
#include<intrins.h> // _nop_();
#include <math.h>
#include "delay.h"
#include "Independent_Keys.h"
#include "Tx_timerx.h"
#include "eeprom_isp.h"
#include "BH1750.h"
#include "ds1302.h"
#include "lcd12864.h"
#include "stdio.h"
/********************* 宏定義 *******************/
#define RUN_CNT_MAX 2
#define MENU_NUM_LIMIT 5
#define LIGHT_MAX 150
#define UART0_RXD_SIZE 10
/********************* 引腳定義 *******************/
sbit Relay_Led1 = P2 ^ 4;
/********************* 變量定義 *******************/
uchar menu = 0;//菜單頁面設置計數
uchar Light1; //光照強度
uchar Dis_Str[16];//用于保存臨時顯示的內容
bit Flag_Mode; //0---手動 1---自動
//1的光照世界計數
uchar Dev1_shi, Dev1_fen, Dev1_miao;
//1的光照設置上限
uchar SetDev1_shi = 7, SetDev1_fen = 30;
bit Flag_Led1; // 0--關燈 1---開燈
bit Flag1_Clean;//清零指示
//定時器計數
uint Time0_Cnt;
bit Flag_OK = 0;//指令解析成功標志位
uchar Uart_Key_Value;//鍵值解析存儲變量
/********************* 函數聲明 *******************/
//顯示 數據
void Dis_Dat();
//獲取數據
void Get_Dat();
//按鍵掃描
void Key_Scan();
//讀取掉電保存的內容
void Read_e2();
//將數據保存在芯片中
void ProcDevice();
void main()
{
DelayMs(100);//等待系統(tǒng)穩(wěn)定
LcdInit();//初始化液晶顯示
LcdClearTXT();//清屏
init_ds1302();//初始化1302
timer0_init();//定時器0初始化
Read_e2();//讀取掉電保存的內容 Init_BH1750(); //初始化BH1750
while (1)
{
Get_Dat();//獲取數據 并顯示
ProcDevice();
Key_Scan();//按鍵掃描
}
}
//處理外部設備工作狀態(tài)
void ProcDevice()
{
uint Time1_Cur, Time1_Set;
if (Flag_Led1)
Relay_Led1 = 0;
else
Relay_Led1 = 1;
Time1_Cur = (Dev1_shi * 60) + Dev1_fen;//1光照總分鐘數
Time1_Set = (SetDev1_shi * 60) + SetDev1_fen;//1設置光照上限總分鐘數
if (Flag1_Clean == 1 && Time1_Cur >= Time1_Set)
{
Flag1_Clean = 0;
Dev1_miao = 0;
Dev1_fen = 0;
Dev1_shi = 0;
Flag_Led1 = 0;
}
if (Flag_Mode == 0)
return;
//當前時間小于8點
if (shi < 8 && Flag1_Clean == 0)
{
Flag_Led1 = 0;
}
else if (shi >= 8)//到達8點補光的就進行補光
{
//燈光1
//符合光照時間
if (Time1_Cur > Time1_Set)
{
//關閉燈光
Flag_Led1 = 0;
}
else//未達到光照要求時間
{
//進行補光 打開燈光
Flag_Led1 = 1;
}
}
}
//讀取掉電保存的內容
void Read_e2()
{
uchar Check = 0;
Check = EEPROM_Read(0x2000); // 從EEPROM中讀取CHECK值
if (Check == CHECK_NUM)//檢測上次是否有寫入數據,如果沒有則使用默認數據
{
//讀取指定位置數據
SetDev1_shi = EEPROM_Read(0x2001);
SetDev1_fen = EEPROM_Read(0x2002);
}
}
//將數據保存在芯片中
void Write_e2()
{
Sector_Erase(0x2000);// 擦除單片機內部EEPROM的數據
//將數據寫入指定位置
EEPROM_Write(0x2000, CHECK_NUM);
EEPROM_Write(0x2001, SetDev1_shi);
EEPROM_Write(0x2002, SetDev1_fen);
}
//按鍵掃描
void Key_Scan()
{
uchar Key_Vlaue;
Key_Vlaue = KEY_Scan(0);
if (Key_Vlaue != 0xff && Uart_Key_Value != 0)
{
Key_Vlaue = Uart_Key_Value;
Uart_Key_Value = 0;
}
switch (Key_Vlaue)
{
case 1://設置按鍵
{
menu++;//標記設置哪個數值
if (menu > MENU_NUM_LIMIT)
{
menu = 0;//返回主頁面
write_time();//將設置的時間保存在1302里
Write_e2();//將數據保存在芯片中
}
Dis_Dat();//刷新顯示
break;
}
case 2://設置加
{
//根據在不同menu下設置不同的數值
switch (menu)
{
case 0:
break;
case 1:
{
shi++;
if (shi > 23)
shi = 0;
break;
}
case 2:
{
fen++;
if (fen > 59)
fen = 0;
break;
}
case 3:
{
miao++;
if (miao > 59)
miao = 0;
break;
}
case 4:
{
SetDev1_shi++;
if (SetDev1_shi > 23)
SetDev1_shi = 0;
break;
}
case 5:
{
SetDev1_fen++;
if (SetDev1_fen > 59)
SetDev1_fen = 0;
break;
}
default:
break;
}
Dis_Dat();
break;
}
case 3://設置減
{
//根據在不同menu下設置不同的數值
switch (menu)
{
case 0:
break;
case 1:
{
if (shi > 0)
shi--;
else
shi = 23;
break;
}
case 2:
{
if (fen > 0)
fen--;
else
fen = 59;
break;
}
case 3:
{
if (miao > 0)
miao--;
else
miao = 59;
break;
}
case4:
{
if (SetDev1_shi > 0)
SetDev1_shi--;
else
SetDev1_shi = 23;
break;
}
case 5:
{
if (SetDev1_fen > 0)
SetDev1_fen--;
else
SetDev1_fen = 59;
break;
}
default:
break;
}
Dis_Dat();
break;
}
case 4:
{
//手動模式,并且在主頁面才允許開關燈
if (menu == 0 && Flag_Mode == 0)
{
Flag_Led1 = ~Flag_Led1;
}
break;
}
case 5:
{
//模式切換
if (menu == 0)
{
Flag_Mode = ~Flag_Mode;
Dis_Dat();
}
break;
}
default:
break;
}
}
//獲取數據
void Get_Dat()
{
static uint Run_Get_Cnt = RUN_CNT_MAX;
uint Time1_Cur, Time1_Set;
if (menu == 0 && Run_Get_Cnt++ > RUN_CNT_MAX)
{
Run_Get_Cnt = 0;
read_time();//讀取時間
if (shi == 0 && fen == 0 && miao == 0)
{
Time1_Cur = (Dev1_shi * 60) + Dev1_fen;//1光照總分鐘數
Time1_Set = (SetDev1_shi * 60) + SetDev1_fen;//1設置光照上限總分鐘數
if (Time1_Cur < Time1_Set && Flag_Mode == 1) //未達到補光時長 并且是自動模式下
{
Flag1_Clean = 1;//因為過了凌晨0點還未補光充分,所以需要置1 在補光完成后進行清零
}
else
{
Dev1_miao = 0;
Dev1_fen = 0;
Dev1_shi = 0;
}
}
//獲取光強
Light1 = 65535 - BH1750(0);
Dis_Dat();//顯示數據
}
}
//顯示 數據
void Dis_Dat()
{
if (menu == 0)//顯示主頁面數據
{
sprintf(Dis_Str, "%02d:%02d:%02d %s ", (uint)shi, (uint)fen, (uint)miao, Flag_Mode == 0 ? "手動" : "自動");
PutStr(0, 0, Dis_Str);
sprintf(Dis_Str, "%s:%02d:%02d", "SET-T",(uint)Dev1_shi, (uint)Dev1_fen);
PutStr(1, 0, Dis_Str);
sprintf(Dis_Str, "%s:%3dlux", "光照度",(uint)Light1);
PutStr(2, 0, Dis_Str);
}
else if (menu == 1)
{
sprintf(Dis_Str, " 實時時間設置 ", (uint)shi, (uint)fen, (uint)miao, Flag_Mode == 0 ? "手動" : "自動");
PutStr(0, 0, Dis_Str);
sprintf(Dis_Str, " ");
PutStr(1, 0, Dis_Str);
sprintf(Dis_Str, " %02d:%02d:%02d ", (uint)shi, (uint)fen, (uint)miao, Flag_Mode == 0 ? "手動" : "自動");
PutStr(2, 0, Dis_Str);
sprintf(Dis_Str, " ^^ ");
PutStr(3, 0, Dis_Str);
}
else if (menu == 2)
{
sprintf(Dis_Str, " %02d:%02d:%02d ", (uint)shi, (uint)fen, (uint)miao, Flag_Mode == 0 ? "手動" : "自動");
PutStr(2, 0, Dis_Str);
sprintf(Dis_Str, " ^^ ");
PutStr(3, 0, Dis_Str);
}
else if (menu == 3)
{
sprintf(Dis_Str, " %02d:%02d:%02d ", (uint)shi, (uint)fen, (uint)miao, Flag_Mode == 0 ? "手動" : "自動");
PutStr(2, 0, Dis_Str);
sprintf(Dis_Str, " ^^ ");
PutStr(3, 0, Dis_Str);
}
else if (menu == 4)
{
sprintf(Dis_Str, "SET-T光照時間");
PutStr(0, 0, Dis_Str);
sprintf(Dis_Str, " %02d:%02d ", (uint)SetDev1_shi, (uint)SetDev1_fen);
PutStr(2, 0, Dis_Str);
sprintf(Dis_Str, " ^^ ");
PutStr(3, 0, Dis_Str);
}
else if (menu == 5)
{
sprintf(Dis_Str, " SET-T");
PutStr(0, 0, Dis_Str);
sprintf(Dis_Str, " %02d:%02d ", (uint)SetDev1_shi, (uint)SetDev1_fen);
PutStr(2, 0, Dis_Str);
sprintf(Dis_Str, " ^^ ");
PutStr(3, 0, Dis_Str);
}
}
//定時器0中斷處理函數
void T0_time() interrupt 1
{
TH0 = (65536 - T0_SET_NUM) / 256; //定時器T0的高8位設置初值
TL0 = (65536 - T0_SET_NUM) % 256; //定時器T0的低8位設置初值
Time0_Cnt++;
if (Time0_Cnt >= T0_1S_NUM)
{
Time0_Cnt = 0;
//符合光照標準 可以進行計時
if (Light1 > LIGHT_MAX)
{
Dev1_miao++;
if (Dev1_miao >= 1)
{
Dev1_miao = 0;
Dev1_fen++;
if (Dev1_fen > 60)
{
Dev1_fen = 0;
if (Dev1_shi < 99)
Dev1_shi++;
}
}
}
}
}
|