找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 947|回复: 3
收起左侧

51单片机+BH1750+LCD12864代码,不清楚错误在哪,望指点一二

[复制链接]
ID:1099094 发表于 2023-11-9 20:50 | 显示全部楼层 |阅读模式
原本用的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++;
        }
      }
    }
  }
}
回复

使用道具 举报

ID:584814 发表于 2023-11-15 08:42 | 显示全部楼层
错未必在主程序,别让人算命哈
回复

使用道具 举报

ID:1099094 发表于 2023-11-10 18:29 | 显示全部楼层
shenqiwei 发表于 2023-11-10 04:27
代码帮你看了一下,大置上没有问题,仔细查看,标点符号是否有错

又改了好多,运行还是有错误,搞不懂
回复

使用道具 举报

ID:278457 发表于 2023-11-10 04:27 | 显示全部楼层
代码帮你看了一下,大置上没有问题,仔细查看,标点符号是否有错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表