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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1184|回復: 16
收起左側

關于51單片機程序切換

[復制鏈接]
ID:1138353 發表于 2024-12-2 21:00 | 顯示全部樓層 |閱讀模式
這是51單片機控制的兩個模塊,一個用于測光強,另一個當萬年歷用。求一個按鍵程序,按一下切換一個模塊,不是按住和松開來切換,
回復

使用道具 舉報

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. }
復制代碼
回復

使用道具 舉報

ID:1138353 發表于 2024-12-14 23:28 | 顯示全部樓層

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

使用道具 舉報

ID:1138353 發表于 2024-12-14 23:41 | 顯示全部樓層

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

使用道具 舉報

ID:1138353 發表于 2024-12-14 23:42 | 顯示全部樓層

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

使用道具 舉報

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();
}

回復

使用道具 舉報

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) { 打開萬年歷程序 }
回復

使用道具 舉報

ID:1138353 發表于 2024-12-17 00:01 | 顯示全部樓層

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

使用道具 舉報

ID:161164 發表于 2024-12-17 14:18 | 顯示全部樓層
1900352116 發表于 2024-12-17 00:01
大神,用這個代碼之后萬年歷不動了

2024-12-17_141641.png
你不斷初始化LCD,顯示當然不清
你不斷寫入1302,時間當然不走
回復

使用道具 舉報

ID:1138353 發表于 2024-12-18 20:17 | 顯示全部樓層
lkc8210 發表于 2024-12-17 14:18
你不斷初始化LCD,顯示當然不清
你不斷寫入1302,時間當然不走

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

使用道具 舉報

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();
}
回復

使用道具 舉報

ID:1138353 發表于 2024-12-18 21:15 | 顯示全部樓層
lkc8210 發表于 2024-12-17 14:18
你不斷初始化LCD,顯示當然不清
你不斷寫入1302,時間當然不走

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

使用道具 舉報

ID:161164 發表于 2024-12-19 11:45 | 顯示全部樓層
1900352116 發表于 2024-12-18 21:15
萬年歷要用while循環,但是循環之后就不能切換程序,;兩個矛盾

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

使用道具 舉報

ID:1138353 發表于 2024-12-20 19:21 | 顯示全部樓層
lkc8210 發表于 2024-12-19 11:45
你不斷初始化LCD,顯示當然不清
你不斷寫入1302,時間當然不走

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

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线高清免费观看视频 | 日p视频免费看 | 国产精品亚洲精品日韩已方 | 久久久精品高清 | 久久高清免费视频 | 亚洲精品一区二区三区中文字幕 | 蜜臀久久 | 日本高清aⅴ毛片免费 | 国产精品福利视频 | 国产激情偷乱视频一区二区三区 | 亚洲超碰在线观看 | 免费在线观看成年人视频 | 久久福利电影 | h视频免费观看 | 久草中文网 | 成人在线小视频 | 超碰97人人人人人蜜桃 | 福利社午夜影院 | 最新国产福利在线 | 日韩一区二区三区四区五区六区 | www.国产| 国产91丝袜在线播放 | www.五月天婷婷.com | www.国产精品 | www在线视频 | 日日骚视频 | 成人精品一区二区三区中文字幕 | 中文字幕在线视频免费观看 | 一区二区三区小视频 | 国产精品国产三级国产a | 精品免费av| 国产成人免费 | 国产免费福利 | 久久久精品网 | 91色啪 | 一区二区三区在线 | 国产精品久久久乱弄 | 97日日碰人人模人人澡分享吧 | 中文字幕乱码一区二区三区 | www.4虎影院 国产999精品久久久影片官网 | 网站黄色av|