找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机30秒,300秒,600秒三档倒计时,key1按键切换时间,key2键LED点亮,松手后启动

  [复制链接]
跳转到指定楼层
楼主
/30秒,300秒,600秒三档倒计时,key1按键切换时间,key2键LED点亮,松手后启动倒计时,数码管显示数值每秒减1,
//倒计时结束,LED熄灭,数码管显示设定值;如果倒计时没结束时,再按下key2键,倒计时时间置设定值重新计时
//仿真通过
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit led = P1^7;
sbit key1 = P1^0; //时间切换键
sbit key2 = P1^1; //启动按键
sbit we1 = P2^0;  //数码管位端口
sbit we2 = P2^1;
sbit we3 = P2^2;
uchar knum;                  //key1按键按下次数计数变量
uchar cont;                  //中断次数变量
uint cont1=30,cont2=300,cont3=600;        //定义时间变量并赋值30秒,300秒,600秒
uchar code LedTab[]=  //定义共阴极数码管段码
   {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
void delay(uint z)
{
        uint x,y;
        for(x=z; x>0; x--)
                for(y=114; y>0; y--);
}
void display1(uint shu)
{
        we1 = 0;
        P0 = LedTab[shu/100];
        delay(5);
        we1 = 1;
        we2 = 0;
        P0 = LedTab[shu%100/10];
        delay(5);
        we2 = 1;
        we3 = 0;
        P0 = LedTab[shu%10];
        delay(5);
        we3 = 1;
}
void keyscan()
{
        if(key1==0)
        {
                delay(5);
                if(key1==0)
                {
                        while(!key1);
                        knum++;
                        if(knum==3)
                                knum=0;
                }
        }
        if(key2 == 0)
        {
                delay(5);
                if(key2 == 0)         //key2按下
                {
                        led = 0;         //点亮LED,松手后启动倒计时
                        while(!key2)        //这句后面不加分号,下一句调用显示函数,按键时数码管才不会灭
                        {
//                                if(knum==0)
//                                display1(cont1);
//                                if(knum==1)
//                                display1(cont2);
//                                if(knum==2)
//                                display1(cont3);
                                switch(knum)
                                {
                                         case 0: display1(cont1);  break;
                                         case 1: display1(cont2);  break;
                                         case 2: display1(cont3);  break;
                                }
                                TR0 = 1;         //启动定时器
        //                        led = 0;         //点亮LED
                                cont1=30;
                                cont2=300;
                                cont3=600;
                        }
                }
        }
}
void main()
{
        TMOD = 0X01;                          //T0定时器,模式1, 16位计数
        TH0 = (65536-46082)/256;  //50ms初值
        TL0 = (65536-46082)%256;
        EA = 1;                         //开总中断
        ET0 = 1;                 //开定时器中断
        while(1)
        {
                keyscan();
                switch(knum)
                {
                         case 0: display1(cont1); cont2=300; cont3=600; break;
                         case 1: display1(cont2); cont1=30; cont3=600; break;
                         case 2: display1(cont3); cont1=30; cont2=300; break;
                }
        }
}
void timer0() interrupt 1
{
        TH0 = (65536-46082)/256; //重装初值
        TL0 = (65536-46082)%256;
        cont++;
        if(cont == 20)
        {
                cont = 0;
                switch(knum)
                {
                        case 0: cont1--;
                                        if(cont1==0)
                                        {
                                                cont1=30;  //倒计时时间到
                                                led=1;           //熄灭LED
                                                TR0=0;           //关闭定时器
                                        } break;
                        case 1: cont2--;
                                        if(cont2==0)
                                        {
                                                cont2=300;
                                                led=1;
                                                TR0=0;
                                        } break;
                        case 2: cont3--;
                                        if(cont3==0)
                                        {
                                                cont3=600;
                                                led=1;
                                                TR0=0;
                                        } break;
                }
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2020-3-14 12:50 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:478073 发表于 2020-3-14 13:18 | 只看该作者
admin 发表于 2020-3-14 12:50
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

真不明白为什这么简单的东东还要别人给电路,电路完全能从下面这些代码中画出来
sbit led = P1^7;
sbit key1 = P1^0; //时间切换键
sbit key2 = P1^1; //启动按键
sbit we1 = P2^0;  //数码管位端口
sbit we2 = P2^1;
sbit we3 = P2^2;
P0 = LedTab
回复

使用道具 举报

地板
ID:214276 发表于 2020-3-24 15:44 | 只看该作者
这个程序和在开发板上调试了一下可行,想请教楼主一个问题,你这个程序就是按键按下去了松开才开始倒计时,按键不松手就不会开始,如何能实现只要即使不松手按下就开始计时
回复

使用道具 举报

5#
ID:1045601 发表于 2023-5-30 11:19 来自手机 | 只看该作者
Mian里case 0: display1(cont1); cont2=300; cont3=600; break
回复

使用道具 举报

6#
ID:1045601 发表于 2023-5-30 11:20 来自手机 | 只看该作者
Mian里case 0: display1(cont1); cont2=300; cont3=600; break为什么要cont2=300; cont3=600
回复

使用道具 举报

7#
ID:863362 发表于 2023-5-30 12:48 | 只看该作者
抛砖引玉

keymiao.JPG (261.73 KB, 下载次数: 52)

仿真图

仿真图

按键倒计时秒表.zip

73.73 KB, 下载次数: 12, 下载积分: 黑币 -5

仿真文件和源程序

回复

使用道具 举报

8#
ID:169549 发表于 2023-5-30 16:19 | 只看该作者
春风十里吹死你 发表于 2020-3-14 13:18
真不明白为什这么简单的东东还要别人给电路,电路完全能从下面这些代码中画出来
sbit led = P1^7;
sbit ...

哥们,楼主也是为着群里的刚入门的同学着想的。必竟对于高手来说,很简单,但是对于入门的朋友可能有些难度了。
回复

使用道具 举报

9#
ID:140489 发表于 2023-5-31 08:09 | 只看该作者
http://www.51hei.com/bbs/dpj-105379-1.html大家看看,这是我多年前写着玩的一个程序,被楼主复制过来了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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