找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5883|回复: 5
收起左侧

15单片机定时开关程序

  [复制链接]
ID:95809 发表于 2020-2-7 21:01 | 显示全部楼层 |阅读模式
以前发表过一个51单片机的,参考微波炉的方式,按一下加1分钟,运行的时候可以随时修改时间。现在把程序移植到15单片机上并优化。不再使用三极管扩流,用单片机推挽模式直接驱动,减少元件数量,能省就省。2,定时时间1-99分钟,使用4位数码管显示倒计时时间,倒计时结束蜂鸣器响,继电器断开。

制作出来的实物图如下:

运行

运行


电路原理图如下:

原理图

原理图

代码如下:
#include<STC15.h>
#define KeyPort P1

unsigned char KeyV,TempKeyV,num;

       ///////////////  定义数码管 ////////////////                                                      

sbit DS1=P3^7;        //数码管第1位
sbit DS2=P3^6;        //数码管第2位
sbit DS3=P3^5;        //数码管第3位
sbit DS4=P3^4;        //数码管第4位
          //////////////////定义按键         /////////////////
sbit Key_UP=P1^0;     ///启动
sbit Key_DOWN=P1^1;   ///停止
sbit PA=P1^2;         ///时间加
sbit PB=P1^3;         ///时间减
            //////////////////定义输出         /////////////////
sbit JDQ=P1^5;        //继电器
sbit FMQ=P1^6;        //蜂鸣器
sbit LED1=P1^4;       //LED启动
sbit LED2=P1^7;       //LED停止
unsigned int js;
unsigned int ds=100,x,y;//倒计时初始时间,加时,减时  30分钟
unsigned char jsflag;
static unsigned int i;
unsigned char code LEDDis[]={  
        0xBF,/*0*/
        0x86,/*1*/
        0xDB,/*2*/
        0xCF,/*3*/
        0xE6,/*4*/
        0xED,/*5*/
        0xFD,/*6*/
        0x87,/*7*/
        0xFF,/*8*/
        0xEF,/*9*/
};
  unsigned char KeyScan(void);//键盘扫描
  void tiaojie(void);
void Delay(unsigned int ii)        //1MS
{
unsigned int jj;
for(;ii>0;ii--)
for(jj=0;jj<125;jj++);
}
void main()
{
        EA = 1;             //允许CPU中断
        ET0 = 1;            //定时器0中断打开
        ET1=1;              //定时器1中断打开
        TMOD = 0x11;        //设定时器0 1为模式1,16位模式
        TH0=0xB8;
        TL0=0x00;           //设定时值为(20ms)
        TH1=0xdc;           //设定时值为(10ms)
        TL1=0x00;
        TR0 = 1;
        TR1=1;

        KeyV = 0;
        TempKeyV = 0;
        jsflag=0;
while(1);
}

//定时器0中断外理中键扫描和显示
void Key_Time0(void) interrupt 1 using 2
{
  TH0=0xB8;
        TL0=0x00;          //设定时值为20000us(20ms)
  if (!Key_UP)
    KeyV = 1;
  if (!Key_DOWN)
    KeyV = 2;

          if(PA==0)
          {
           Delay(20);
           if(PA==0)
            ds=ds+100;    //定时加1分钟
                while(!P12);
          }
          if(PB==0)
          {
           Delay(20);
           if(PB==0)
           ds=ds-100;     //定时减1分钟
           while(!P13);
          }
   if (KeyV!= 0)         //有键按下
    {
      Delay(10);         //延时防抖  按下10ms再测
      if (!Key_UP)
        TempKeyV = 1;
      if (!Key_DOWN)
        TempKeyV = 2;
                 if (KeyV == TempKeyV)   //两次值相等为确定接下了键
           {
                 if (KeyV == 1)
           {
                 jsflag=0;
                 if(ds==0)
           {     ds=100;
                      }
                 js=js+1;
            JDQ=0;   //继电器吸合
                        FMQ=1;   //蜂鸣器不响
                        LED1=0;   //LED不亮
            LED2=1;   //LED亮                                   
                 if(js==50)
           {
                 js=0;
                 ds=ds-1;
                      }
   }

                 if(KeyV==2)
           {
                 jsflag=1;
        }
          }
            }

   if(jsflag==1)
   {
                JDQ=1; //继电器断开
                FMQ=0;   //蜂鸣器响
                LED1=1;   //LED亮
                                LED2=0;   //LED不亮

   }
   if(ds==0)
   {                        JDQ=1;    //继电器断开
                FMQ=0;   //蜂鸣器响
                LED1=1;   //LED亮
                                LED2=0;   //LED不亮

   jsflag=1;
   KeyV=0;
   }

}
//////////////显示函数
void disp_Time1(void) interrupt 3 using 3
{            
                P2M1 = 0x00; P2M0 = 0xFF; //P0口强推挽模式

        TH1=0xdc;
        TL1=0x00;
        x=ds/10000;



        y=(ds%10000)/1000;     //分钟十位
        P2=LEDDis[y];
        DS1=0;
        Delay(2);
        DS1=1;                                //消隐

        P2=LEDDis[((ds%10000)%1000)/100];//分钟各位
        DS2=0;
        Delay(2);                                //消隐
        DS2=1;                              



        P2=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
        if(((ds%1000)%100)/10>=6)              //满60,百位减一
      {
        ds=ds-10;
        P2=LEDDis[6];
  }
        DS3=0;
        Delay(2);
        DS3=1;                                         //消隐

        P2=LEDDis[(((ds%10000)%1000)%100)%10]; //秒个位
        DS4=0;
        Delay(2);
        DS4=1;                                         //消隐
}

15F204共阴版本.rar

137.57 KB, 下载次数: 115, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:474921 发表于 2020-11-5 06:50 | 显示全部楼层
谢谢分享,不过我觉着要是把按键改成编码器EC11来设定就更好了。
回复

使用道具 举报

ID:704585 发表于 2020-11-6 17:54 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:897089 发表于 2021-3-27 22:03 | 显示全部楼层
感谢楼主分享正需要这个
回复

使用道具 举报

ID:492633 发表于 2023-1-20 18:12 | 显示全部楼层
changhai 发表于 2020-11-5 06:50
谢谢分享,不过我觉着要是把按键改成编码器EC11来设定就更好了。

把按键程序换成ec111就行
回复

使用道具 举报

ID:200118 发表于 2023-8-31 12:15 | 显示全部楼层
做一个试试。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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