找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 1380|回复: 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 单片机教程网

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