久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1262|回復: 16
打印 上一主題 下一主題
收起左側

關于51單片機程序切換

[復制鏈接]
跳轉到指定樓層
樓主
這是51單片機控制的兩個模塊,一個用于測光強,另一個當萬年歷用。求一個按鍵程序,按一下切換一個模塊,不是按住和松開來切換,
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

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


if(kaiguan==1)
{
打開測強光程序
}

if(kaiguan==2)
{
打開萬年歷程序
}
回復

使用道具 舉報

地板
ID:161164 發表于 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) // 主循環
  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.                         //測光強
  34.                 }else{
  35.                         //萬年歷
  36.                 }
  37.     }
  38. }
復制代碼
回復

使用道具 舉報

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

但是要通過lcd顯示光強和萬年歷,這個程序能實現嗎
回復

使用道具 舉報

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

我試了但是萬年歷能顯示就是不動,是個固定值
回復

使用道具 舉報

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

萬年歷顯示的時候,LCD上顯示不清楚
回復

使用道具 舉報

8#
ID:1138353 發表于 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;

/********************* 函數聲明 *******************/
//顯示界面  每個菜單的結構
void Dis_menu();
//顯示 數據
void Dis_Dat();
//獲取數據
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) // 主循環
    {
                if(K1==0)
                {
                        DelayMs(20);
                        if(K1==0)
                        {
                                mode = ~mode;
                                while(K1==0);
                        }
                }
                if(mode==0)
                {            
                                        LCD_Init1();
                                        DS1302_Init();
                                        LCD_ShowString(1,1,"  -  -  ");//靜態字符初始化顯示
                                        LCD_ShowString(2,1,"  :  :  ");
                                       
                                        DS1302_SetTime();//設置時間
                                       
                                       
                                                {
                                                        DS1302_ReadTime();//讀取時間
                                                        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);//顯示時
                                                        LCD_ShowNum(2,4,DS1302_Time[4],2);//顯示分
                                                        LCD_ShowNum(2,7,DS1302_Time[5],2);//顯示秒
                                                }
                        }
                     
               else
                                {
                    DelayMs(100);//等待系統穩定
                        LCD_Init();
                    Dis_menu();
                        Init_Bh1750();
                       
                        {
                                Get_Dat();
                        }            //萬年歷
                }
    }
}

//獲取數據
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();
        }
}

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

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

回復

使用道具 舉報

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

使用道具 舉報

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

大神,用這個代碼之后萬年歷不動了
回復

使用道具 舉報

11#
ID:161164 發表于 2024-12-17 14:18 | 只看該作者
1900352116 發表于 2024-12-17 00:01
大神,用這個代碼之后萬年歷不動了


你不斷初始化LCD,顯示當然不清
你不斷寫入1302,時間當然不走
回復

使用道具 舉報

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

但是測光強有數值,切換萬年歷就顯示不清,秒不動,要怎么改嗎
回復

使用道具 舉報

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

我在萬年歷里加了一個循環,但是它跳不出去了,不加循環萬年歷又用不了
#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;

/********************* 函數聲明 *******************/
//顯示界面  每個菜單的結構
void Dis_menu();
//顯示 數據
void Dis_Dat();
//獲取數據
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) // 主循環
    {
                if(K1==0)
                {
                        DelayMs(20);
                        if(K1==0)
                        {
                                mode = ~mode;
                                while(K1==0);
                        }
                }
                if(mode==0)
                {            
                                        LCD_Init1();
                                        DS1302_Init();
                                        LCD_ShowString(1,1,"  -  -  ");//靜態字符初始化顯示
                                        LCD_ShowString(2,1,"  :  :  ");
                                       
                                        DS1302_SetTime();//設置時間
                                       
                                       
                                                {
                                                        DS1302_ReadTime();//讀取時間
                                                        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);//顯示時
                                                        LCD_ShowNum(2,4,DS1302_Time[4],2);//顯示分
                                                        LCD_ShowNum(2,7,DS1302_Time[5],2);//顯示秒
                                                }
                        }
                     
               else
                                {
                    DelayMs(100);//等待系統穩定
                        LCD_Init();
                    Dis_menu();
                        Init_Bh1750();
                       
                        {
                                Get_Dat();
                        }            //萬年歷
                }
    }
}

//獲取數據
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();
        }
}

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

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

使用道具 舉報

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

萬年歷要用while循環,但是循環之后就不能切換程序,;兩個矛盾
回復

使用道具 舉報

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

你不斷初始化LCD,顯示當然不清
你不斷寫入1302,時間當然不走
回復

使用道具 舉報

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

現在的問題不是顯示不清,萬年歷程序里有while循環,但是用了循環就不能切換程序,兩個矛盾了
回復

使用道具 舉報

17#
ID:255377 發表于 2024-12-21 17:08 | 只看該作者
這是51單片機控制的兩個模塊,一個用于測光強,另一個當萬年歷用。求一個按鍵程序,按一下切換一個模塊,不是按住和松開來切換,

第一  全局變量 char flag

第二 定時器中斷函數
  設定變量 MS;
  按鍵檢測函數;

第三  按鍵檢測函數
        只要有KEY按下 flag++;

main函數
if((MS == 500 ) &(flag ==0) ) //MS == 500ms刷新
{
         刷新萬年厲;
         MS = 0;
}
else if(flag==1)
{
測強光
}
else
{
flag = 0;
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美不卡一区二区三区 | 国产欧美精品区一区二区三区 | 久草视频在线播放 | 国产精品久久久久久久久图文区 | 国产免费高清 | 91视视频在线观看入口直接观看 | 精品久久久久久18免费网站 | 欧美日韩免费 | 99re视频精品| 国产日产精品一区二区三区四区 | 日韩在线不卡 | 免费99视频 | 国产精品久久久久久一区二区三区 | 日日做夜夜爽毛片麻豆 | 日本电影韩国电影免费观看 | 亚洲视频精品 | 国产精品99久久久久久动医院 | 97精品超碰一区二区三区 | 伊人久久大香线 | 91精品国产美女在线观看 | 精精精精xxxx免费视频 | 国产999精品久久久久久 | 四虎影院在线观看av | 成人精品鲁一区一区二区 | 毛片在线免费播放 | 国产欧美一区二区三区日本久久久 | 国产2区| 日本在线视频一区二区 | 欧美中文字幕一区二区三区亚洲 | 黑人巨大精品欧美一区二区免费 | 黄色大片免费播放 | 欧美日韩视频在线播放 | 日韩波多野结衣 | 精品三区| 久草中文网 | 精品三级在线观看 | 欧美日韩亚 | 日韩在线h | 国产精品视频在线免费观看 | 国产一区二区三区四区在线观看 | 欧美一区二区三区在线播放 |