找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3800|回复: 5
打印 上一主题 下一主题
收起左侧

求助 单片机计时和定时再增加按键和跳转 功能,各位,急急急!

[复制链接]
跳转到指定楼层
楼主
求助大神,现在这个单片机代码只实现了计时和定时功能,就key 0,1, 2三个有用,我现在想实现key3(功能待定键)按下,就跳转到自己设定规定时间,再按下key3又回到初始计时显示,当计时到规定时间,蜂鸣器一直响。只有按下key4整个程序重新开始。以下就是代码,求大家帮忙加点程序实现我这个功能,愿意送出我全部黑币,万分感谢!
#include<reg51.h>
#include"DS18B20.h"
#define uchar unsigned char
#define uint unsigned int   

void delayms(uint xms); // Ñóê±oˉêy
void beep();            // ·äÃùÆ÷Ïì
void display();        // êyÂë1üÏÔê¾¼Æêy
void key_scan();       // ¼üÅìé¨Ãè
void timer_init();   // ÖD¶Ï3õê¼»ˉ   

sbit key0 = P1^0;   // μ÷êÔ¿ØÖư′¼ü
sbit key1 = P1^1;   // Ôö¼ó°′¼ü
sbit key2 = P1^2;   // ¼õD¡
sbit key3 = P1^3;   // 1|Äü′y¶¨
sbit buzzer = P1^4; // ·äÃùÆ÷¶Ë¿ú

uchar  tab[];   
uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20};    // êyÂë1üλѡ
// êyÂë1ü¶ÎÑ¡ 12òõ
/*
uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   */
// 12ÑôêyÂë1ü¶ÎÂë±í
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                        0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e};   

uchar count, set_place;  // count óÃóú¶¨ê±Æ÷1sÖD¶Ï  set_placeóÃóú¼ÆËã°′¼üμÄ′Îêy ±ãóúÑ¡Ôñμ÷½úÄÇ2¿·Öê±¼ä
uchar second = 0, minute = 0, hour = 0;   //3õê¼»ˉ ê±¼ä

void main()
{
    timer_init();
    for(; ;)
    {

       key_scan();
        display();
    }

}

void beep()
{
    buzzer = 1;
    delayms(2);
    buzzer = 0;
    delayms(2);
}
// ¼üÅìé¨Ãèoˉêy
void key_scan()
{
    if(key0 == 0)
    {
        delayms(5);
        if(key0 == 0)
        {
            set_place++;
            while(!key0);
            beep();
            if(set_place == 1)  //°′ÏÂò»′Î Ôò¶¨ê±Æ÷ÖD¶Ï
            {
                TR0 = 0;
            }

            if(set_place == 4)  // °′ÏÂá½′Î ¶¨ê±Æ÷′óéÏ′Î×′쬻ָ′1¤×÷
            {
               set_place = 0;
                TR0 = 1;
            }
        }
    }

    if(set_place != 0)
    {
        if(key1 == 0)
        {
            delayms(5);
            if(key1 == 0)
            {
                while(!key1);   // °′¼üêí·Å
                beep();
                if(set_place == 1)
                {
                    second++;
                    if(second == 60)
                    {
                        second = 0;
                    }
                }
                if(set_place == 2)
                {
                    minute++;
                    if(minute == 60)
                    {
                        minute = 0;
                    }
                }
                if(set_place == 3)
                {
                    hour++;
                    if(hour == 24)
                    {
                        hour = 0;
                    }
                }
            }
        }


    }
    if(set_place != 0)
    {
     if(key2 == 0)
        {
            delayms(5);
            if(key2 == 0)
            {
                while(!key2);   // °′¼üêí·Å
                 beep();
                if(set_place == 1)
                {
                    second--;
                    if(second == -1)
                    {
                        second = 59;
                    }
                }
                if(set_place == 2)
                {
                    minute--;
                    if(minute == -1)
                    {
                        minute = 59;
                    }
                }
                if(set_place == 3)
                {
                    hour--;
                    if(hour == -1)
                    {
                        hour = 23;
                    }
                }
            }
        }
    }
}


// êyÂë1üÏÔê¾ê±¼ä
void display()  
{
    uchar j;

    P2 = 0x01;
    P0 = table[hour / 10];
    j = 60;
    while(j--);

    P2 = 0x02;
    P0 = table[hour % 10];
    j = 60;
    while(j--);

    P2 = 0x04;
    P0 = table[minute / 10];
    j = 60;
    while(j--);

    P2 = 0x08;
    P0 = table[minute % 10];
    j = 60;
    while(j--);

    P2 = 0x10;
    P0 = table[second / 10];
    j = 60;
    while(j--);

    P2 = 0x20;
    P0 = table[second % 10];
    j = 60;
    while(j--);

}

// ¶¨ê±Æ÷3õê¼»ˉ
void timer_init()
{
    TMOD = 0x01;    //¶¨ê±Æ÷T0 1¤×÷·½ê½1
    TH0 = (65536 - 45872) / 256;    // ×°3õÖμ 50ms
    TL0 = (65536 - 45872) % 256;
    EA = 1; //¿a·Å×üÖD¶Ï
    ET0 = 1;    //¿aÆô¶¨ê±Æ÷0ÖD¶Ï
    TR0 = 1;    //¿aÆô¶¨ê±Æ÷0
}

// 50msÖD¶Ï
void t0_timer() interrupt 1
{
    TH0 = (65536 - 45872) / 256;    // ×°3õÖμ ′Ëê±¾§ÕñÎa 11.0592MHz
    TL0 = (65536 - 45872) % 256;
    count++;
    if(count == 20) //1s ê±¼äμ½
    {
        count = 0;
        second++;
        if(second == 60)    // ÃëÎa60 Çåáã ·Ö½øò»
        {
            second = 0;
            minute++;
            if(minute == 60)    // ·ÖÎa60 Çåáã ê±½øò»
            {
                minute = 0;
                hour++;
                if(hour == 24)  // ê±Îa 24 Çåáã
                {
                    hour =0;
                }
            }
        }
    }
}

void delayms(uint xms)  // Ñóê±xms
{
    uchar i, j;
    for(i = xms; i > 0; i--)    // ¸Ä±äxmsμÄÖμ ¿éòÔμ÷½úÑóê±ê±¼ä
    for(j = 110; j > 0; j--);
}

L_@Z5BIMK0HVQ012B$YI_UE.png (37.35 KB, 下载次数: 90)

L_@Z5BIMK0HVQ012B$YI_UE.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:149988 发表于 2017-5-26 16:54 | 只看该作者

RE: 求助 单片机计时和定时再增加按键和跳转 功能,各位,急急急!

你的软件设定还有问题,注解部分还是乱码,解决方法:点击Edit、点击Colors&Fonts、点击8051:Editor C Files、右侧列表中点击Text、将右侧选项Use Color in Comments前勾选去掉,再试试,正确了在进行编程,否则别人看不懂你做了些什么,就不会帮你修改程序。
回复

使用道具 举报

板凳
ID:82765 发表于 2017-5-26 23:16 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

地板
ID:198696 发表于 2017-5-27 08:57 | 只看该作者
不倒翁.WZT 发表于 2017-5-26 16:54
你的软件设定还有问题,注解部分还是乱码,解决方法:点击Edit、点击Colors&Fonts、点击8051:Editor C Fil ...

不好意思是这样!
#include<reg51.h>
#include"DS18B20.h"
#define uchar unsigned char
#define uint unsigned int   

void delayms(uint xms); // 延时函数
void beep();            // 蜂鸣器响
void display();        //数码管显示计数
void key_scan();       // 键盘扫描
void timer_init();   // 中断初始化ˉ   

sbit key0 = P1^0;   // 调试控制按键
sbit key1 = P1^1;   // 增加控制
sbit key2 = P1^2;   // 减小控制
sbit key3 = P1^3;   // 功能待定
sbit buzzer = P1^4; // 蜂鸣器端口

uchar  tab[];   
uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20};    //数码管位选
// 数码管段选 共阴
/*
uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   */
//共阳数码管段码表
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                        0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e};   

uchar count, set_place;  // count 用于定时器1s中断 set_place 用于计算按键的次数 便于选择调节那部分时间
uchar second = 0, minute = 0, hour = 0;   //初始化时间

void main()
{
    timer_init();
    for(; ;)
    {
        
       key_scan();
        display();
    }
   
}

void beep()
{
    buzzer = 1;
    delayms(2);
    buzzer = 0;
    delayms(2);
}
// 键盘扫描函数
void key_scan()
{
    if(key0 == 0)
    {
        delayms(5);
        if(key0 == 0)
        {
            set_place++;
            while(!key0);
            beep();
            if(set_place == 1)  //按下一次 则定时器中断
            {
                TR0 = 0;
            }
           
            if(set_place == 4)  // 按下两次 定时器从上次状态恢复工作
            {
               set_place = 0;
                TR0 = 1;
            }
        }
    }
   
    if(set_place != 0)
    {
        if(key1 == 0)
        {
            delayms(5);
            if(key1 == 0)
            {
                while(!key1);   // 按键释放
                beep();
                if(set_place == 1)
                {
                    second++;
                    if(second == 60)
                    {
                        second = 0;
                    }
                }
                if(set_place == 2)
                {
                    minute++;
                    if(minute == 60)
                    {
                        minute = 0;
                    }
                }
                if(set_place == 3)
                {
                    hour++;
                    if(hour == 24)
                    {
                        hour = 0;
                    }
                }
            }
        }
        
      
    }
    if(set_place != 0)
    {
     if(key2 == 0)
        {
            delayms(5);
            if(key2 == 0)
            {
                while(!key2);   // 按键释放
                 beep();
                if(set_place == 1)
                {
                    second--;
                    if(second == -1)
                    {
                        second = 59;
                    }
                }
                if(set_place == 2)
                {
                    minute--;
                    if(minute == -1)
                    {
                        minute = 59;
                    }
                }
                if(set_place == 3)
                {
                    hour--;
                    if(hour == -1)
                    {
                        hour = 23;
                    }
                }
            }
        }
    }
}


// 数码管显示时间
void display()  
{
    uchar j;
   
    P2 = 0x01;
    P0 = table[hour / 10];
    j = 60;
    while(j--);
   
    P2 = 0x02;
    P0 = table[hour % 10];
    j = 60;
    while(j--);
   
    P2 = 0x04;
    P0 = table[minute / 10];
    j = 60;
    while(j--);
   
    P2 = 0x08;
    P0 = table[minute % 10];
    j = 60;
    while(j--);
   
    P2 = 0x10;
    P0 = table[second / 10];
    j = 60;
    while(j--);
   
    P2 = 0x20;
    P0 = table[second % 10];
    j = 60;
    while(j--);
   
}

// 定时器初始化
void timer_init()
{
    TMOD = 0x01;    //定时器T0 工作方式1
    TH0 = (65536 - 45872) / 256;    // 装初值 50ms
    TL0 = (65536 - 45872) % 256;
    EA = 1; //开放总中断
    ET0 = 1;    //开启定时器中段
    TR0 = 1;    //开启定时器0
}

// 50ms中断
void t0_timer() interrupt 1
{
    TH0 = (65536 - 45872) / 256;    //装初值 此时晶振为11.0592MHz
    TL0 = (65536 - 45872) % 256;
    count++;
    if(count == 20) //1s 时间到
    {
        count = 0;
        second++;
        if(second == 60)    // 秒为60 清零 分进一
        {
            second = 0;
            minute++;
            if(minute == 60)    // 分为60 清零 时进一
            {
                minute = 0;
                hour++;
                if(hour == 24)  // 时为24清零
                {
                    hour =0;
                }
            }
        }
    }
}

void delayms(uint xms)  //延时xms
{
    uchar i, j;
    for(i = xms; i > 0; i--)    // 改变xms的值 可以调节延时时间
    for(j = 110; j > 0; j--);
}
回复

使用道具 举报

5#
ID:198696 发表于 2017-5-27 08:58 | 只看该作者
cjjcjj1 发表于 2017-5-26 23:16
你这仅有的点注释,还是乱码

不好意思是这样!
#include<reg51.h>
#include"DS18B20.h"
#define uchar unsigned char
#define uint unsigned int   

void delayms(uint xms); // 延时函数
void beep();            // 蜂鸣器响
void display();        //数码管显示计数
void key_scan();       // 键盘扫描
void timer_init();   // 中断初始化ˉ   

sbit key0 = P1^0;   // 调试控制按键
sbit key1 = P1^1;   // 增加控制
sbit key2 = P1^2;   // 减小控制
sbit key3 = P1^3;   // 功能待定
sbit buzzer = P1^4; // 蜂鸣器端口

uchar  tab[];   
uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20};    //数码管位选
// 数码管段选 共阴
/*
uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   */
//共阳数码管段码表
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                        0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e};   

uchar count, set_place;  // count 用于定时器1s中断 set_place 用于计算按键的次数 便于选择调节那部分时间
uchar second = 0, minute = 0, hour = 0;   //初始化时间

void main()
{
    timer_init();
    for(; ;)
    {
        
       key_scan();
        display();
    }
   
}

void beep()
{
    buzzer = 1;
    delayms(2);
    buzzer = 0;
    delayms(2);
}
// 键盘扫描函数
void key_scan()
{
    if(key0 == 0)
    {
        delayms(5);
        if(key0 == 0)
        {
            set_place++;
            while(!key0);
            beep();
            if(set_place == 1)  //按下一次 则定时器中断
            {
                TR0 = 0;
            }
           
            if(set_place == 4)  // 按下两次 定时器从上次状态恢复工作
            {
               set_place = 0;
                TR0 = 1;
            }
        }
    }
   
    if(set_place != 0)
    {
        if(key1 == 0)
        {
            delayms(5);
            if(key1 == 0)
            {
                while(!key1);   // 按键释放
                beep();
                if(set_place == 1)
                {
                    second++;
                    if(second == 60)
                    {
                        second = 0;
                    }
                }
                if(set_place == 2)
                {
                    minute++;
                    if(minute == 60)
                    {
                        minute = 0;
                    }
                }
                if(set_place == 3)
                {
                    hour++;
                    if(hour == 24)
                    {
                        hour = 0;
                    }
                }
            }
        }
        
      
    }
    if(set_place != 0)
    {
     if(key2 == 0)
        {
            delayms(5);
            if(key2 == 0)
            {
                while(!key2);   // 按键释放
                 beep();
                if(set_place == 1)
                {
                    second--;
                    if(second == -1)
                    {
                        second = 59;
                    }
                }
                if(set_place == 2)
                {
                    minute--;
                    if(minute == -1)
                    {
                        minute = 59;
                    }
                }
                if(set_place == 3)
                {
                    hour--;
                    if(hour == -1)
                    {
                        hour = 23;
                    }
                }
            }
        }
    }
}


// 数码管显示时间
void display()  
{
    uchar j;
   
    P2 = 0x01;
    P0 = table[hour / 10];
    j = 60;
    while(j--);
   
    P2 = 0x02;
    P0 = table[hour % 10];
    j = 60;
    while(j--);
   
    P2 = 0x04;
    P0 = table[minute / 10];
    j = 60;
    while(j--);
   
    P2 = 0x08;
    P0 = table[minute % 10];
    j = 60;
    while(j--);
   
    P2 = 0x10;
    P0 = table[second / 10];
    j = 60;
    while(j--);
   
    P2 = 0x20;
    P0 = table[second % 10];
    j = 60;
    while(j--);
   
}

// 定时器初始化
void timer_init()
{
    TMOD = 0x01;    //定时器T0 工作方式1
    TH0 = (65536 - 45872) / 256;    // 装初值 50ms
    TL0 = (65536 - 45872) % 256;
    EA = 1; //开放总中断
    ET0 = 1;    //开启定时器中段
    TR0 = 1;    //开启定时器0
}

// 50ms中断
void t0_timer() interrupt 1
{
    TH0 = (65536 - 45872) / 256;    //装初值 此时晶振为11.0592MHz
    TL0 = (65536 - 45872) % 256;
    count++;
    if(count == 20) //1s 时间到
    {
        count = 0;
        second++;
        if(second == 60)    // 秒为60 清零 分进一
        {
            second = 0;
            minute++;
            if(minute == 60)    // 分为60 清零 时进一
            {
                minute = 0;
                hour++;
                if(hour == 24)  // 时为24清零
                {
                    hour =0;
                }
            }
        }
    }
}

void delayms(uint xms)  //延时xms
{
    uchar i, j;
    for(i = xms; i > 0; i--)    // 改变xms的值 可以调节延时时间
    for(j = 110; j > 0; j--);
}
回复

使用道具 举报

6#
ID:198696 发表于 2017-5-27 08:58 | 只看该作者
不好意思各位,源代码是这样!
#include<reg51.h>
#include"DS18B20.h"
#define uchar unsigned char
#define uint unsigned int   

void delayms(uint xms); // 延时函数
void beep();            // 蜂鸣器响
void display();        //数码管显示计数
void key_scan();       // 键盘扫描
void timer_init();   // 中断初始化ˉ   

sbit key0 = P1^0;   // 调试控制按键
sbit key1 = P1^1;   // 增加控制
sbit key2 = P1^2;   // 减小控制
sbit key3 = P1^3;   // 功能待定
sbit buzzer = P1^4; // 蜂鸣器端口

uchar  tab[];   
uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20};    //数码管位选
// 数码管段选 共阴
/*
uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   */
//共阳数码管段码表
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                        0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e};   

uchar count, set_place;  // count 用于定时器1s中断 set_place 用于计算按键的次数 便于选择调节那部分时间
uchar second = 0, minute = 0, hour = 0;   //初始化时间

void main()
{
    timer_init();
    for(; ;)
    {
        
       key_scan();
        display();
    }
   
}

void beep()
{
    buzzer = 1;
    delayms(2);
    buzzer = 0;
    delayms(2);
}
// 键盘扫描函数
void key_scan()
{
    if(key0 == 0)
    {
        delayms(5);
        if(key0 == 0)
        {
            set_place++;
            while(!key0);
            beep();
            if(set_place == 1)  //按下一次 则定时器中断
            {
                TR0 = 0;
            }
           
            if(set_place == 4)  // 按下两次 定时器从上次状态恢复工作
            {
               set_place = 0;
                TR0 = 1;
            }
        }
    }
   
    if(set_place != 0)
    {
        if(key1 == 0)
        {
            delayms(5);
            if(key1 == 0)
            {
                while(!key1);   // 按键释放
                beep();
                if(set_place == 1)
                {
                    second++;
                    if(second == 60)
                    {
                        second = 0;
                    }
                }
                if(set_place == 2)
                {
                    minute++;
                    if(minute == 60)
                    {
                        minute = 0;
                    }
                }
                if(set_place == 3)
                {
                    hour++;
                    if(hour == 24)
                    {
                        hour = 0;
                    }
                }
            }
        }
        
      
    }
    if(set_place != 0)
    {
     if(key2 == 0)
        {
            delayms(5);
            if(key2 == 0)
            {
                while(!key2);   // 按键释放
                 beep();
                if(set_place == 1)
                {
                    second--;
                    if(second == -1)
                    {
                        second = 59;
                    }
                }
                if(set_place == 2)
                {
                    minute--;
                    if(minute == -1)
                    {
                        minute = 59;
                    }
                }
                if(set_place == 3)
                {
                    hour--;
                    if(hour == -1)
                    {
                        hour = 23;
                    }
                }
            }
        }
    }
}


// 数码管显示时间
void display()  
{
    uchar j;
   
    P2 = 0x01;
    P0 = table[hour / 10];
    j = 60;
    while(j--);
   
    P2 = 0x02;
    P0 = table[hour % 10];
    j = 60;
    while(j--);
   
    P2 = 0x04;
    P0 = table[minute / 10];
    j = 60;
    while(j--);
   
    P2 = 0x08;
    P0 = table[minute % 10];
    j = 60;
    while(j--);
   
    P2 = 0x10;
    P0 = table[second / 10];
    j = 60;
    while(j--);
   
    P2 = 0x20;
    P0 = table[second % 10];
    j = 60;
    while(j--);
   
}

// 定时器初始化
void timer_init()
{
    TMOD = 0x01;    //定时器T0 工作方式1
    TH0 = (65536 - 45872) / 256;    // 装初值 50ms
    TL0 = (65536 - 45872) % 256;
    EA = 1; //开放总中断
    ET0 = 1;    //开启定时器中段
    TR0 = 1;    //开启定时器0
}

// 50ms中断
void t0_timer() interrupt 1
{
    TH0 = (65536 - 45872) / 256;    //装初值 此时晶振为11.0592MHz
    TL0 = (65536 - 45872) % 256;
    count++;
    if(count == 20) //1s 时间到
    {
        count = 0;
        second++;
        if(second == 60)    // 秒为60 清零 分进一
        {
            second = 0;
            minute++;
            if(minute == 60)    // 分为60 清零 时进一
            {
                minute = 0;
                hour++;
                if(hour == 24)  // 时为24清零
                {
                    hour =0;
                }
            }
        }
    }
}

void delayms(uint xms)  //延时xms
{
    uchar i, j;
    for(i = xms; i > 0; i--)    // 改变xms的值 可以调节延时时间
    for(j = 110; j > 0; j--);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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