找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2821|回复: 7
收起左侧

51单片机无限时间循环设计思路?

  [复制链接]
ID:388065 发表于 2019-2-9 15:01 | 显示全部楼层 |阅读模式
谁能帮我用51单片机设计,类似冰箱时控器的功能,无限循环时间启动。就是开一段时间,关一段时间,无限循环。
开和关的时间可以调整,硬件部分包含3个数码管,显示时间以分钟为单位。3个按键,按键1按一次调整开的时间,再按一次调整关的时间,再按一次显示当前计时。按键2和3分别是加减。
一个输出控制继电器。
回复

使用道具 举报

ID:475444 发表于 2019-2-10 11:00 | 显示全部楼层
自己上网上下代码咯

评分

参与人数 3黑币 +78 收起 理由
春风十里吹 + 8
shuisheng60 + 35
shuisheng + 35

查看全部评分

回复

使用道具 举报

ID:284454 发表于 2019-2-10 12:27 | 显示全部楼层
设置两个定时器,一个定时器开,一个关.用两个IO口调用按键的参数,然后赋值给定时器的初始值.
两个定时器之间要在对面的定时器开头设置关闭另一个定时器,定时器结尾又设置打开另一个定时器.两个定时器互锁不同时运行.保证只能有一个定时器运行,另一个停止.就这样无限循环下去.
回复

使用道具 举报

ID:475529 发表于 2019-2-10 14:21 | 显示全部楼层
放到while(1)里面
回复

使用道具 举报

ID:303383 发表于 2019-2-10 15:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:213173 发表于 2019-2-10 17:19 | 显示全部楼层
本帖最后由 wulin 于 2019-2-11 07:33 编辑

无标题.jpg

//给你写一个1~999分钟开关机无限循环程序,利用小数点区分显示状态
//在实际电路中数码管要加限流电阻
//IO口可以按实际需要自行定义
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define key_S 20                                        //宏定义短按(20ms)
#define key_L 666                                        //宏定义长按(2/3s)
#define key_M 333                                        //宏定义长按步进(1/3s)

sbit K1 = P3^4;                                                //调整选择/退出
sbit K2 = P3^5;                                                //短按+,长按连+
sbit K3 = P3^6;                                                //短按-,长按连-
sbit OUT= P2^2;                                                //输出
sbit LED1= P2^3;                                                //输出显示
sbit LED2= P2^4;                                                //停止显示
sbit wela1=P2^5;                                                //位选1
sbit wela2=P2^6;                                                //位选2
sbit wela3=P2^7;                                                //位选3

uchar code table[]={                                        //0~F数组
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uint Cnt1ms;                                                //定义1毫秒变量
uchar  Choice=0;                                        //设置状态变量
uchar  min_ON,min_OFF;                                //倒计时变量
uchar  min_ON_1=3,min_OFF_1=2;                //倒计时设置变量
bit sign=1,flag=0;                                                //输出状态标志,1ms中断标志

/**************************************
        定时器0/1初始化程序 @12.000MHz
**************************************/
void Timer0Init()        //1毫秒@12.000MHz
{
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TR0 = 1;                //定时器0开始计时
        EA=1;                        //开总中断
        ET0=1;                        //开定时器0中断
}
/*************************
          按键扫描程序
*************************/
void key_scan()
{
        static bit key1_sign;                        //按键自锁标志
        static uint count1,count2,count3=0;//消抖计数变量                        

        if(!K1)                                                        //检测按键1按下
        {
                count1++;                                        //消抖计数1自+1
                if((count1>=key_S)&&(key1_sign==0))//检测消抖计数与按键1自锁标志
                {                        
                        key1_sign=1;                        //按键1自锁标志置1
                        Choice++;                                //调整选择变量自+1
                        if(Choice>=3)                        //调整时间选择0正常倒计时,1调开机时长,2调关机时长
                        {
                                Choice=0;                        //调整时间选择清0
                                Cnt1ms=0;                        //时间变量Cnt200us自+1
                                min_ON=min_ON_1;        //传递设定开机时长
                                min_OFF=min_OFF_1;    //传递设定关机时长
                        }
                }
        }
        else
        {
                key1_sign=0;                                //按键1自锁标志清0
                count1=0;                                        //消抖计数count1清0
        }
                                
        if(!K2)   
        {  
                count2++;  
                if(count2>=key_L)                        //长按快调
                {
                        if(Choice==1)                        //选择变量1调min_ON_1+
                        {
                                if(min_ON_1<999)
                                        min_ON_1++;
                        }
                        if(Choice==2)                        //选择变量2调min_OFF_1+
                        {
                                if(min_OFF_1<999)
                                        min_OFF_1++;
                        }
                        count2=key_M;
                }
        }  
        else                                                        //按键抬起
        {  
                if(count2>key_S && count2<key_L)//短按
                {
                        if(Choice==1)                        //选择变量1调min_ON_1+
                        {
                                if(min_ON_1<999)
                                        min_ON_1++;
                        }
                        if(Choice==2)                        //选择变量2调min_OFF_1+
                        {
                                if(min_OFF_1<999)
                                        min_OFF_1++;
                        }
                }
                count2=0;                                        //count2清0
        }   
        if(!K3)   
        {  
                count3++;  
                if(count3>=key_L)                        //长按
                {
                        if(Choice==1)                        //选择变量1调min_ON_1+
                        {
                                if(min_ON_1>2)
                                        min_ON_1--;
                        }
                        if(Choice==2)                        //选择变量2调min_OFF_1+
                        {
                                if(min_OFF_1>2)
                                        min_OFF_1--;
                        }
                        count3=key_M;
                }
        }  
        else                                                        //按键抬起
        {  
                if(count3>key_S && count3<key_L)//短按
                {
                        if(Choice==1)                        //选择变量1调min_ON_1+
                        {
                                if(min_ON_1>2)
                                        min_ON_1--;
                        }
                        if(Choice==2)                        //选择变量2调min_OFF_1+
                        {
                                if(min_OFF_1>2)
                                        min_OFF_1--;
                        }
                        count3=key_M;
                }
                count3=0;                                        //count3清0
        }   
}
/********************************
                数码管显示程序
********************************/
void display()
{
        static uchar num=0;
        if((Choice==0)&&(sign==1))//显示开机倒计时
        {
                P0=0x00;        //消隐
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_ON / 100%10];num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_ON / 10%10];num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_ON % 10]|0x80;num=0;break;
                }
        }
        if((Choice==0)&&(sign==0))//显示关机倒计时
        {
                P0=0x00;        //消隐
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_OFF / 100%10];num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_OFF / 10%10];num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_OFF % 10]|0x80;num=0;break;
                }
        }
        if(Choice==1)//显示设置开机倒计时
        {
                P0=0x00;        //消隐
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_ON_1 / 100%10]|0x80;num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_ON_1 / 10%10];num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_ON_1 % 10];num=0;break;
                }
        }
        if(Choice==2)//显示设置关机倒计时
        {
                P0=0x00;        //消隐
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_OFF_1 / 100%10];num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_OFF_1 / 10%10]|0x80;num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_OFF_1 % 10];num=0;break;
                }
        }
}

/********************************
                主程序
********************************/
void main(void)
{
        Timer0Init();                                        //初始化定时器
        min_ON=min_ON_1;                                //开机倒计时赋初值
        min_OFF=min_OFF_1;                        //关机倒计时赋初值
        while(1)
        {
                if(min_ON>0)
                {
                        LED1=0;
                        LED2=1;
                        OUT=0;
                }
                else
                {
                        LED1=1;
                        LED2=0;
                        OUT=1;
                }
                if(flag==1)
                {
                        flag=0;
                        if(Choice==0)                //非设置状态允许计时
                        {
                                Cnt1ms++;                        //时间变量Cnt1ms自+1
                                if(Cnt1ms>=60000)        //分钟
                                {
                                        Cnt1ms=0;
                                        if(sign)
                                        {
                                                min_ON--;
                                                if(min_ON==0)
                                                {
                                                        sign=0;
                                                        min_OFF=min_OFF_1;
                                                }
                                        }
                                        else
                                        {
                                                min_OFF--;
                                                if(min_OFF==0)
                                                {
                                                        sign=1;
                                                        min_ON=min_ON_1;
                                                }
                                        }
                                }
                        }
                        key_scan();
                        display();
                }
        }
}
/*-----------------------------
  定时器0中断服务程序  1ms
------------------------------*/
void timer0() interrupt        1
{
        TL0 = 0x18;                        //设置定时初值
        TH0 = 0xFC;                        //设置定时初值
        flag=1;
}

回复

使用道具 举报

ID:321301 发表于 2019-2-11 11:43 | 显示全部楼层
加入代码while(1)
回复

使用道具 举报

ID:388065 发表于 2019-2-16 16:55 | 显示全部楼层
wulin 发表于 2019-2-10 17:19
//给你写一个1~999分钟开关机无限循环程序,利用小数点区分显示状态
//在实际电路中数码管要加限流电 ...

感谢,程序没有错误,非常好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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