原本用的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);//等待系统稳定
LcdInit();//初始化液晶显示
LcdClearTXT();//清屏
init_ds1302();//初始化1302
timer0_init();//定时器0初始化
Read_e2();//读取掉电保存的内容 Init_BH1750(); //初始化BH1750
while (1)
{
Get_Dat();//获取数据 并显示
ProcDevice();
Key_Scan();//按键扫描
}
}
//处理外部设备工作状态
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++;
}
}
}
}
}
|