找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1529|回復: 3
收起左側

51單片機+BH1750+LCD12864代碼,不清楚錯誤在哪,望指點一二

[復制鏈接]
ID:1099094 發(fā)表于 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);//等待系統(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++;
        }
      }
    }
  }
}
回復

使用道具 舉報

ID:278457 發(fā)表于 2023-11-10 04:27 | 顯示全部樓層
代碼幫你看了一下,大置上沒有問題,仔細查看,標點符號是否有錯
回復

使用道具 舉報

ID:1099094 發(fā)表于 2023-11-10 18:29 | 顯示全部樓層
shenqiwei 發(fā)表于 2023-11-10 04:27
代碼幫你看了一下,大置上沒有問題,仔細查看,標點符號是否有錯

又改了好多,運行還是有錯誤,搞不懂
回復

使用道具 舉報

ID:584814 發(fā)表于 2023-11-15 08:42 | 顯示全部樓層
錯未必在主程序,別讓人算命哈
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表