矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3272|回复: 8

STC15单片机定时开关

[复制链接]
     
发表于 2018-5-13 11:39:31 | 显示全部楼层 |阅读模式
以前发过一个用51单片机做的定时开关,用的40脚的89C52芯片.一是体积太大,而是不需要那么多的IO。所以决定把程序移植到体积小一些的单片机,最后选择了28脚的STC15F204EA,一是利用单片机的推挽输出直接驱动共阴数码管显示,省去了驱动三极管。并且使用单片机内部自带的晶振,体积大大缩小,电路板面积只有25*100MM。



/////STC15F204EA 4位共阳数码管定时器




#include "STC15F2K.h"
#define KeyPort P1/////定义按键在P1
unsigned char KeyV,TempKeyV,num;
  
       //定义数码管                                               
sbit DS2=P3^7;        //数码管第2位          分十位
sbit DS3=P3^6;        //数码管第3位          分个位
sbit DS4=P3^5;        //数码管第3十位
sbit DS5=P3^4;        // 数码管第4        秒个位

          //定义按键       
sbit STAR=P1^1;     ///        启动
sbit STOP=P1^3;   ///        停止
sbit PA=P1^2;        ///   时间加
sbit PB=P1^0;        ///   时间减

            //定义输出       
sbit JDQ=P1^5;        //   继电器
sbit FMQ=P1^6;        //   蜂鸣器
sbit LED1=P1^7;        //   LED指示灯        开始
sbit LED2=P1^4;                        //   LED指示灯         停止

unsigned int js;
unsigned int ds=100,x,y;//倒计时初始时间,100=1分钟
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 (!STAR)
    KeyV = 1;
  if (!STOP)
    KeyV = 2;
        
          if(PA==0)
          {
           Delay(20);
           if(PA==0)
            ds=ds+100;//定时加1分钟 ,100=1分钟,(调节精度)
                while(!P12);
          }
          if(PB==0)
          {
           Delay(20);
           if(PB==0)
           ds=ds-100; //定时减1分钟, 100=1分钟,
           while(!P13);
          }
   if (KeyV!= 0)      //有键按下
    {
      Delay(10);   //延时防抖  按下10ms再测
      if (!STAR)
        TempKeyV = 1;
      if (!STOP)
        TempKeyV = 2;
                 if (KeyV == TempKeyV)   //两次值相等为确定接下了键
           {
                      if (KeyV == 1)
                   {
                                   jsflag=0;
                                                      if(ds==0)
                                                   {
                                                   ds=100;
                                                   }
                                                         js=js+1;
   JDQ=0;   //继电器吸合
   FMQ=1;   //蜂鸣器不响
   LED1=1;   //LED不亮
    LED2=0;   //LED亮                                            
                               if(js==50)
                                   {
                                 js=0;
                                 ds=ds-1;
         
                             }
           }
if(KeyV==2)
{
          jsflag=1;
        }
}
}
   if(jsflag==1)
   {
   JDQ=1; //继电器断开
   FMQ=0;   //蜂鸣器响
   LED1=0;   //LED亮
   LED2=1;   //LED不亮
   }
   if(ds==0)
   {                       
   JDQ=1;    //继电器断开
   FMQ=0;   //蜂鸣器响
   LED1=0;   //LED亮
   LED2=1;   //LED不亮


   jsflag=1;
   KeyV=0;
   }

}

void disp_Time1(void) interrupt 3 using 3
{                P2M1 = 0x00;
        P2M0 = 0xFF;  //// 设P2口为推挽模式
        TH1=0xdc;
        TL1=0x00;
        x=ds/10000;

      

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

         P2=LEDDis[((ds%10000)%1000)/100];
         //分钟个位
     DS3=0;
     Delay(2);
     DS3=1;                                



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

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

原理图

原理图

PCB

PCB

PCB2

PCB2

显影后的电路板

显影后的电路板

丝印

丝印

阻焊

阻焊

侧面

侧面

正面

正面

装在自己做的曝光台上

装在自己做的曝光台上

评分

1

查看全部评分

     
发表于 2018-5-13 13:12:12 | 显示全部楼层
会单片机就是好!
回复 支持 反对

使用道具 举报

     
发表于 2018-5-14 18:39:07 | 显示全部楼层
还带数码管的 好高级啊  
回复 支持 反对

使用道具 举报

     
发表于 2018-5-16 15:33:48 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2018-5-16 15:45:45 | 显示全部楼层
不错,漂亮,会单片机就是好
回复 支持 反对

使用道具 举报

     
发表于 2018-5-17 10:31:29 | 显示全部楼层
做的真漂亮,赞
回复 支持 反对

使用道具 举报

     
发表于 2018-5-17 11:14:04 | 显示全部楼层
我总是觉得花功夫做类似东西不值得,结果最后什么都没做
回复 支持 反对

使用道具 举报

     
发表于 2018-10-22 22:30:36 | 显示全部楼层
会了定时器 会了串通讯 51就到头了
回复 支持 反对

使用道具 举报

     
发表于 2018-10-23 22:01:36 | 显示全部楼层
hzviolin180416 发表于 2018-5-17 11:14
我总是觉得花功夫做类似东西不值得,结果最后什么都没做

哈哈哈,真有你的!有时候的确是不想做,我做显影开关就找了个声控灯,改了下阻容延时部分,结果就将就了。本想用单片机,结果都懒得做。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-27 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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