一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3680|回复: 1

[其他综合] 瓦斯报警器省电应用_时钟

[复制链接]
发表于 2012-8-7 16:08 | 显示全部楼层 |阅读模式
原理图在这里:https://www.yleee.com.cn/thread-16289-1-1.html
用的32768,太慢了没敢求模求余,还是有点闪。
程序比较乱,凑合看下吧,哈哈

//32768时钟
//
#define uchar unsigned char
#define uint  unsigned int
/*
led
  a_
f|  |b
|g_|
e|  |c
|__|
  d .h
*/
const uchar table[]={ 0x3f,0x0a,0x57,0x4f,0x6a,0x6d,0x7d,0x0b,0x7f,0x6f,0X00};
const uchar table2[]={ 0xBf,0x8a,0xD7,0xCf,0xEa,0xEd,0xFd,0x8b,0xFf,0xEf,0X00};
//带点
uchar delay1,time_miao,miaobz;
uchar ID;
uint gjbz;
bit shibz,dpbz,xsbz;
bit rb4bz,rb5bz,rb6bz,rb3bz; //off-on,set,up,down.
void disp(uchar num1,uchar num2,uchar num3,uchar num4);
void delay(uint x)
{
uchar a;
for(a=x;a>0;a--);
}
void init()
{
    //配置模拟/数字IO口(手册P178)
    ANSEL=0B00001010;  //AN1   AN3,4
    TRISA=0B00001010;  //AN1    端口A 配置0为输出,1为3态
    TRISD=0B00000000;   //设置端口D   为输出
    PORTD=0B00000000;   //端口D  输出0
    TRISB=0B01111000;  //B3-B6 键盘 设置为输入
    PORTB=0B01111001;   //B3-B6键盘设置高电平,位码b0设置为高电平
    TRISC=0B00000000;   //C6-C7 位码1,2
    PORTC=0B11000000;   //位码1,2设置为高电平

    TRISE=0B00000000;
    PORTE=0B00000000;   //位码1,2设置为高电平
//ADCON0=0B10100101;        //
//ADCON0=0B10100101;        //
//VCFG1_bit=1;
//delay(10);               //稳定ADC电源
//ADCON1=0B00010000;
//RA3_bit=1;               //使能基准电压
}
//===================================
void timr0int()
{
     GIE_bit=1;                  //开启全局中断
    // OSCCON=0X03;              //开启内部上拉,预分频比1/16
     OPTION_REG=0B00000011;     //开启内部上拉,预分频比1/16
     T0IF_bit=0;                //清中断标志
     T0IE_bit=1;                //允许TMR0中断
}
//=======================================
//KEY
//=======================================
void key()
{
///////off_on
if(rb4bz==0)
{
if(RB4_bit==0) //off_on
  {
  RC5_bit=1;//ON_BUZZ
  rb4bz=1;
  xsbz=~xsbz;
  RC5_bit=0;//OFF_BUZZ
  }
}
else if(RB4_bit==1)  rb4bz=0;
/////////set////////
if(rb5bz==0)
{
  if(RB5_bit==0)
  { rb5bz=1;
     RC5_bit=1;//ON_BUZZ
     T0IE_bit=0;                //禁止TMR0中断
     ID++;
     RA4_bit=0;   //LED_ON
     time_miao=0;
     RC5_bit=0;//OFF_BUZZ
     if(ID==3)  
     {ID=0;
     RA4_bit=1;  //LED_OFF
     T0IE_bit=1;                //允许TMR0中断
     }
  }
}
else if(RB5_bit==1)   rb5bz=0;
}//end_key
//=======================================
void disp(uchar num1,uchar num2,uchar num3,uchar num4)
{
PORTD=table[num1];//显示第一个数码管
RC6_bit=0;delay(0);
RC6_bit=1;PORTD=0x00;//0B00000000;
if(dpbz==0) PORTD=table[num2];//显示第二个数码管PORTD=table[num2]|0X80
else if  (dpbz==1) PORTD=table2[num2];//显示第二个数码管
RE2_bit=0;delay(0);RE2_bit=1;PORTD=0x00;//0B00000000;
//RC0_bit=0;delay(0);RC0_bit=1;PORTD=0x00;//0B00000000;
PORTD=table[num3];//显示第三个数码管
RB0_bit=0;delay(0);
RB0_bit=1;PORTD=0x00;//0B00000000;
PORTD=table[num4];//显示第四个数码管
RC7_bit=0;delay(0);
RC7_bit=1;PORTD=0x00;//0B00000000;
}
void main()
{
signed char ge,shi,bai,qian;
init();
timr0int();
RC5_bit=1;//ON_BUZZ
RC4_bit=1;//关TL431
RA4_bit=1;  //LED_OFF
        qian=1;
        bai=2;
        shi=0;
        ge=0;
        shibz=0;
        dpbz=0;
        xsbz=0;
        rb4bz=0;
        rb5bz=0;
        rb6bz=0;
        rb3bz=0;
        ID=0;
        gjbz=0;
        RB2_bit=0;          //off_ldo
        miaobz=0;
    RC5_bit=0;//OFF_BUZZ
while(1)
{
key();
if(time_miao==60)//1分到  60一分
{time_miao=0;
ge++;                //加分个位
if(ge==10)        //进位
{
ge=0;                //清个位
shi++;                //加十位
if(shi==6)         //一小时到
{shi=0;shibz=1;}        //shibz标志,再去算小时,
}
}
if(shibz==1)        //一小时到
{bai++;                //加小时个位
shibz=0;        //清小时标志
if(bai==10)//十小时到
             {qian++;        //加小时十位
             bai=0;                //清小时个位
             }
if((bai==4)&(qian==2)) {qian=0;bai=0;};        //清小时十位
}
if(xsbz==0)  
{disp(qian,bai,shi,ge);
gjbz++;
if(gjbz==5000)      //大约30秒自动关机
{xsbz=1; gjbz=0;}
}
else if(xsbz==1)  PORTD=0xff;   //关显示
//===================================
if(ID==1)
{////////////up/////////// RB6
if(rb6bz==0)
{if(RB6_bit==0)
  {rb6bz=1;
  bai++;//jia xiao shi
  if(bai==10)//十小时到
             {qian++;        //加小时十位
             bai=0;                //清小时个位
             }
if((bai==4)&(qian==2))      //==24=0
   {qian=0;      //清小时十位
   bai=0;
   }
  }
}
else if(RB6_bit==1)  rb6bz=0;
if(rb3bz==0)    //  DOWN_RB3
{if(RB3_bit==0)
  {rb3bz=1;
  bai--;//jian xiao shi
    if((bai<0)&(qian>0))//
    {qian--;        //
    bai=9;          //
     }
     if((qian==0)&(bai<0))
     {qian=2;        //
     bai=3;          //
    }
  }
}
else if(RB3_bit==1)  rb3bz=0;
}
if(ID==2)
{if(rb6bz==0)  //up
   {  if(RB6_bit==0)
     {
     rb6bz=1;
     ge++;    //jia _ge
     if(ge==10)        //进位
      {
      ge=0;                //清个位
      shi++;                //加十位
      if(shi==6)   shi=0;
      }
     }
  }
  if(RB6_bit==1)  rb6bz=0;
if(rb3bz==0)      //down
   {  if(RB3_bit==0)
     {
     uchar gebz;
     rb3bz=1;
     ge--;      //jian_ge
     gebz=ge+1;
     if(gebz==0)        //进位
      {
      ge=9;                //清个位
      shi--;                //加十位
      if(shi<0)   shi=5;
      }
     }
   }
else if(RB3_bit==1)  rb3bz=0;
}
}//while
}//main end
void interrupt()
{
if(T0IE_bit && T0IF_bit)
{
T0IF_bit=0;      //清除中断标志位
//CLRWDT();      //
if(miaobz==0) dpbz=0;
miaobz++;
//RC4_bit=~RC4_bit;
if(miaobz==2)
{time_miao++;
dpbz=1;
miaobz=0;}
}
}

评分

参与人数 1一乐金币 +20 收起 理由
fat + 20 感谢分享

查看全部评分

 楼主| 发表于 2012-8-7 16:09 | 显示全部楼层
本帖最后由 gw168sh 于 2012-8-7 16:13 编辑

顺便说下 mikroC PRO for PIC 和谐版的还是很好用的。

上面的程序就是用mikroC PRO for PIC编译的,只验证了功能。(还没有测电流多大)
按照规格书上面写的,跑32768的话,两个电池用一年也没问题(关显示,只计时)。
这样就可以DIY你想要的控制器了,比如说电池供电的鱼缸增氧器,自动浇花器,,,你懂的
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-3 17:24 , Processed in 0.036050 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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