找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1276|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

關(guān)于51單片機(jī)程序切換

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是51單片機(jī)控制的兩個(gè)模塊,一個(gè)用于測(cè)光強(qiáng),另一個(gè)當(dāng)萬(wàn)年歷用。求一個(gè)按鍵程序,按一下切換一個(gè)模塊,不是按住和松開來切換,
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:136366 發(fā)表于 2024-12-3 01:31 | 只看該作者
首先你定義一個(gè)數(shù)值變量
回復(fù)

使用道具 舉報(bào)

板凳
ID:136366 發(fā)表于 2024-12-3 01:36 | 只看該作者
首先你定義一個(gè)數(shù)值變量
sbit key=P1^0;
unsigned char kaiguan=0;

if(key==0)
{
kaiguan=kaiguan+1;
while(!key);
}


if(kaiguan==1)
{
打開測(cè)強(qiáng)光程序
}

if(kaiguan==2)
{
打開萬(wàn)年歷程序
}
回復(fù)

使用道具 舉報(bào)

地板
ID:161164 發(fā)表于 2024-12-3 09:28 | 只看該作者
  1. #include <REG52.h>

  2. // 定義類型別名
  3. typedef unsigned char u8;  // 0 到 255
  4. typedef unsigned int u16;   // 0 到 65535

  5. void Delay20ms(void)        //@11.0592MHz
  6. {
  7.         unsigned char data i, j;

  8.         i = 36;
  9.         j = 217;
  10.         do
  11.         {
  12.                 while (--j);
  13.         } while (--i);
  14. }


  15. // 定義按鍵和 LED 引腳
  16. sbit K1 = P3^2;    // 按鍵 1 連接到 P3.2
  17. bit mode = 0;
  18. void main()
  19. {
  20.     while(1) // 主循環(huán)
  21.     {
  22.                 if(K1==0)
  23.                 {
  24.                         Delay20ms();
  25.                         if(K1==0)
  26.                         {
  27.                                 mode = ~mode;
  28.                                 while(K1==0);
  29.                         }
  30.                 }
  31.                 if(mode==0)
  32.                 {
  33.                         //測(cè)光強(qiáng)
  34.                 }else{
  35.                         //萬(wàn)年歷
  36.                 }
  37.     }
  38. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:1138353 發(fā)表于 2024-12-14 23:28 | 只看該作者

但是要通過lcd顯示光強(qiáng)和萬(wàn)年歷,這個(gè)程序能實(shí)現(xiàn)嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:1138353 發(fā)表于 2024-12-14 23:41 | 只看該作者

我試了但是萬(wàn)年歷能顯示就是不動(dòng),是個(gè)固定值
回復(fù)

使用道具 舉報(bào)

7#
ID:1138353 發(fā)表于 2024-12-14 23:42 | 只看該作者

萬(wàn)年歷顯示的時(shí)候,LCD上顯示不清楚
回復(fù)

使用道具 舉報(bào)

8#
ID:1138353 發(fā)表于 2024-12-14 23:46 | 只看該作者

這是主程序代碼
#include "main.h"
#include "delay.h"
#include "BH1750.h"
#include "lcd1602.h"
#include <REG52.H>
#include "DS1302.h"
#include "LCDC1602.h"

/********************* 宏定義 *******************/
#define RUN_CNT_MAX                        2
#define MENU_NUM_LIMIT                        3

/********************* 引腳定義 *******************/


/********************* 變量定義 *******************/
uchar menu = 0;
uint Light = 0;

/********************* 函數(shù)聲明 *******************/
//顯示界面  每個(gè)菜單的結(jié)構(gòu)
void Dis_menu();
//顯示 數(shù)據(jù)
void Dis_Dat();
//獲取數(shù)據(jù)
void Get_Dat();

#include <REG52.h>

// 定義類型別名
typedef unsigned char u8;  // 0 到 255
typedef unsigned int u16;   // 0 到 65535

void Delay20ms(void)        //@11.0592MHz
{
        unsigned char data i, j;

        i = 36;
        j = 217;
        do
        {
                while (--j);
        } while (--i);
}


// 定義按鍵和 LED 引腳
sbit K1 = P3^0;    // 按鍵 1 連接到 P3.2
bit mode = 0;
void main()
{
    while(1) // 主循環(huán)
    {
                if(K1==0)
                {
                        DelayMs(20);
                        if(K1==0)
                        {
                                mode = ~mode;
                                while(K1==0);
                        }
                }
                if(mode==0)
                {            
                                        LCD_Init1();
                                        DS1302_Init();
                                        LCD_ShowString(1,1,"  -  -  ");//靜態(tài)字符初始化顯示
                                        LCD_ShowString(2,1,"  :  :  ");
                                       
                                        DS1302_SetTime();//設(shè)置時(shí)間
                                       
                                       
                                                {
                                                        DS1302_ReadTime();//讀取時(shí)間
                                                        LCD_ShowNum(1,1,DS1302_Time[0],2);//顯示年
                                                        LCD_ShowNum(1,4,DS1302_Time[1],2);//顯示月
                                                        LCD_ShowNum(1,7,DS1302_Time[2],2);//顯示日
                                                        LCD_ShowNum(2,1,DS1302_Time[3],2);//顯示時(shí)
                                                        LCD_ShowNum(2,4,DS1302_Time[4],2);//顯示分
                                                        LCD_ShowNum(2,7,DS1302_Time[5],2);//顯示秒
                                                }
                        }
                     
               else
                                {
                    DelayMs(100);//等待系統(tǒng)穩(wěn)定
                        LCD_Init();
                    Dis_menu();
                        Init_Bh1750();
                       
                        {
                                Get_Dat();
                        }            //萬(wàn)年歷
                }
    }
}

//獲取數(shù)據(jù)
void Get_Dat()
{
        static uint Run_Get_Cnt = RUN_CNT_MAX;
        if(Run_Get_Cnt++ > RUN_CNT_MAX)
        {
                Run_Get_Cnt = 0;
               
                Light = Get_Bh1750();
                Dis_Dat();
        }
}

//顯示 數(shù)據(jù)
void Dis_Dat()
{
        if(menu == 0)
        {
    LCD_Write_Number(6,0,Light,5);
        }
}

//顯示界面  每個(gè)菜單的結(jié)構(gòu)
void Dis_menu()
{
  LCD_Clear();
        if(menu == 0)
        {
                LCD_Write_String(0,0,"Light:     Lx");
        }
        else if(menu == 1)
        {
               
               
        }
        Dis_Dat();
}

回復(fù)

使用道具 舉報(bào)

9#
ID:1139785 發(fā)表于 2024-12-15 11:00 | 只看該作者
首先你定義一個(gè)數(shù)值變量 sbit key=P1^0; unsigned char kaiguan=0;  if(key==0) { kaiguan=kaiguan+1; while(!key); }   if(kaiguan==1) { 打開測(cè)強(qiáng)光程序 }  if(kaiguan==2) { 打開萬(wàn)年歷程序 }
回復(fù)

使用道具 舉報(bào)

10#
ID:1138353 發(fā)表于 2024-12-17 00:01 | 只看該作者

大神,用這個(gè)代碼之后萬(wàn)年歷不動(dòng)了
回復(fù)

使用道具 舉報(bào)

11#
ID:161164 發(fā)表于 2024-12-17 14:18 | 只看該作者
1900352116 發(fā)表于 2024-12-17 00:01
大神,用這個(gè)代碼之后萬(wàn)年歷不動(dòng)了


你不斷初始化LCD,顯示當(dāng)然不清
你不斷寫入1302,時(shí)間當(dāng)然不走
回復(fù)

使用道具 舉報(bào)

12#
ID:1138353 發(fā)表于 2024-12-18 20:17 | 只看該作者
lkc8210 發(fā)表于 2024-12-17 14:18
你不斷初始化LCD,顯示當(dāng)然不清
你不斷寫入1302,時(shí)間當(dāng)然不走

但是測(cè)光強(qiáng)有數(shù)值,切換萬(wàn)年歷就顯示不清,秒不動(dòng),要怎么改嗎
回復(fù)

使用道具 舉報(bào)

13#
ID:1138353 發(fā)表于 2024-12-18 20:51 | 只看該作者
lkc8210 發(fā)表于 2024-12-17 14:18
你不斷初始化LCD,顯示當(dāng)然不清
你不斷寫入1302,時(shí)間當(dāng)然不走

我在萬(wàn)年歷里加了一個(gè)循環(huán),但是它跳不出去了,不加循環(huán)萬(wàn)年歷又用不了
#include "main.h"
#include "delay.h"
#include "BH1750.h"
#include "lcd1602.h"
#include <REG52.H>
#include "DS1302.h"
#include "LCDC1602.h"

/********************* 宏定義 *******************/
#define RUN_CNT_MAX                        2
#define MENU_NUM_LIMIT                        3

/********************* 引腳定義 *******************/


/********************* 變量定義 *******************/
uchar menu = 0;
uint Light = 0;

/********************* 函數(shù)聲明 *******************/
//顯示界面  每個(gè)菜單的結(jié)構(gòu)
void Dis_menu();
//顯示 數(shù)據(jù)
void Dis_Dat();
//獲取數(shù)據(jù)
void Get_Dat();

#include <REG52.h>

// 定義類型別名
typedef unsigned char u8;  // 0 到 255
typedef unsigned int u16;   // 0 到 65535

void Delay20ms(void)        //@11.0592MHz
{
        unsigned char data i, j;

        i = 36;
        j = 217;
        do
        {
                while (--j);
        } while (--i);
}


// 定義按鍵和 LED 引腳
sbit K1 = P3^0;    // 按鍵 1 連接到 P3.2
bit mode = 0;
void main()
{
    while(1) // 主循環(huán)
    {
                if(K1==0)
                {
                        DelayMs(20);
                        if(K1==0)
                        {
                                mode = ~mode;
                                while(K1==0);
                        }
                }
                if(mode==0)
                {            
                                        LCD_Init1();
                                        DS1302_Init();
                                        LCD_ShowString(1,1,"  -  -  ");//靜態(tài)字符初始化顯示
                                        LCD_ShowString(2,1,"  :  :  ");
                                       
                                        DS1302_SetTime();//設(shè)置時(shí)間
                                       
                                       
                                                {
                                                        DS1302_ReadTime();//讀取時(shí)間
                                                        LCD_ShowNum(1,1,DS1302_Time[0],2);//顯示年
                                                        LCD_ShowNum(1,4,DS1302_Time[1],2);//顯示月
                                                        LCD_ShowNum(1,7,DS1302_Time[2],2);//顯示日
                                                        LCD_ShowNum(2,1,DS1302_Time[3],2);//顯示時(shí)
                                                        LCD_ShowNum(2,4,DS1302_Time[4],2);//顯示分
                                                        LCD_ShowNum(2,7,DS1302_Time[5],2);//顯示秒
                                                }
                        }
                     
               else
                                {
                    DelayMs(100);//等待系統(tǒng)穩(wěn)定
                        LCD_Init();
                    Dis_menu();
                        Init_Bh1750();
                       
                        {
                                Get_Dat();
                        }            //萬(wàn)年歷
                }
    }
}

//獲取數(shù)據(jù)
void Get_Dat()
{
        static uint Run_Get_Cnt = RUN_CNT_MAX;
        if(Run_Get_Cnt++ > RUN_CNT_MAX)
        {
                Run_Get_Cnt = 0;
               
                Light = Get_Bh1750();
                Dis_Dat();
        }
}

//顯示 數(shù)據(jù)
void Dis_Dat()
{
        if(menu == 0)
        {
    LCD_Write_Number(6,0,Light,5);
        }
}

//顯示界面  每個(gè)菜單的結(jié)構(gòu)
void Dis_menu()
{
  LCD_Clear();
        if(menu == 0)
        {
                LCD_Write_String(0,0,"Light:     Lx");
        }
        else if(menu == 1)
        {
               
               
        }
        Dis_Dat();
}
回復(fù)

使用道具 舉報(bào)

14#
ID:1138353 發(fā)表于 2024-12-18 21:15 | 只看該作者
lkc8210 發(fā)表于 2024-12-17 14:18
你不斷初始化LCD,顯示當(dāng)然不清
你不斷寫入1302,時(shí)間當(dāng)然不走

萬(wàn)年歷要用while循環(huán),但是循環(huán)之后就不能切換程序,;兩個(gè)矛盾
回復(fù)

使用道具 舉報(bào)

15#
ID:161164 發(fā)表于 2024-12-19 11:45 | 只看該作者
1900352116 發(fā)表于 2024-12-18 21:15
萬(wàn)年歷要用while循環(huán),但是循環(huán)之后就不能切換程序,;兩個(gè)矛盾

你不斷初始化LCD,顯示當(dāng)然不清
你不斷寫入1302,時(shí)間當(dāng)然不走
回復(fù)

使用道具 舉報(bào)

16#
ID:1138353 發(fā)表于 2024-12-20 19:21 | 只看該作者
lkc8210 發(fā)表于 2024-12-19 11:45
你不斷初始化LCD,顯示當(dāng)然不清
你不斷寫入1302,時(shí)間當(dāng)然不走

現(xiàn)在的問題不是顯示不清,萬(wàn)年歷程序里有while循環(huán),但是用了循環(huán)就不能切換程序,兩個(gè)矛盾了
回復(fù)

使用道具 舉報(bào)

17#
ID:255377 發(fā)表于 2024-12-21 17:08 | 只看該作者
這是51單片機(jī)控制的兩個(gè)模塊,一個(gè)用于測(cè)光強(qiáng),另一個(gè)當(dāng)萬(wàn)年歷用。求一個(gè)按鍵程序,按一下切換一個(gè)模塊,不是按住和松開來切換,

第一  全局變量 char flag

第二 定時(shí)器中斷函數(shù)
  設(shè)定變量 MS;
  按鍵檢測(cè)函數(shù);

第三  按鍵檢測(cè)函數(shù)
        只要有KEY按下 flag++;

main函數(shù)
if((MS == 500 ) &(flag ==0) ) //MS == 500ms刷新
{
         刷新萬(wàn)年厲;
         MS = 0;
}
else if(flag==1)
{
測(cè)強(qiáng)光
}
else
{
flag = 0;
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表