久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3367|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

做個18650鋰電池供電倒計數(shù)計時器(電路圖、程序)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:67356 發(fā)表于 2019-4-22 22:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
/*STC15W204;18650電池供電;頻率:12M
T0-1ms作為計數(shù)基準(zhǔn) ;T2-20ms作為按鍵檢測
P5.5 蜂鳴器
按下P3.0,設(shè)定增加;按下P3.1,設(shè)定減小 ;按下P3.2,儲存設(shè)定數(shù)值;P3.3,開始/停止計數(shù)
四位數(shù)碼管,使用中間兩個(手頭現(xiàn)有)
*/
/*
要求:
開機(jī),讀取預(yù)存倒計時數(shù)值,按壓“開始”按鈕,每秒數(shù)值減1,直到0終止,鳴笛2聲提醒,恢復(fù)到開機(jī)等待狀態(tài);
再次按壓“開始”,再次反復(fù),,,;
任何時候,可以通過“+”“-”按鈕調(diào)整初始值,按壓“存儲鍵”,數(shù)值被儲存。
使用18650電池供電,帶充電接口;
為節(jié)省電能,當(dāng)?shù)却龝r間大于5分鐘后,自動關(guān)閉顯示,進(jìn)入掉電模式;可通過按壓“開始”按鍵,恢復(fù)到開機(jī)等待狀態(tài)
*/



#include<STC15.H>
#include<intrins.h>
#define STC_Y1  97560U  // 89C/LEXX、90C/LEXX
#define STC_Y3  14050U  // 10F/Lxx、11F/Lxx 、12C/LExx、15F104E/L104E(A版)、15F204E/L204EA(A版)
#define STC_Y5  13043U  // 15F/L/Wxx(Y3內(nèi)核個別型號除外)、15F104W
#define uchar unsigned char //宏定義字符型變量
#define uint  unsigned int        //宏定義整型變量
#define Fosc 12000000UL
#define Core STC_Y5
/********************************************************************
                            命令定義
*********************************************************************/
#define CMD_IDLE     0         //EEPROM無操作
#define CMD_READ     1         //讀取字節(jié)
#define CMD_PROGRAM  2         //寫入字節(jié)
#define CMD_ERASE    3         //擦除字節(jié)
/********************************************************************
                       編程周期由晶振決定
*********************************************************************/
//#define ENABLE_IAP 0X80         //編程周期由晶振決定(如果<30MHZ選用此項)
//#define ENABLE_IAP 0X81         //編程周期由晶振決定(如果<24MHZ選用此項)
//#define ENABLE_IAP 0X82         //編程周期由晶振決定(如果<20MHZ選用此項)
  #define ENABLE_IAP 0X83         //編程周期由晶振決定(如果<12MHZ選用此項)
//#define ENABLE_IAP 0X84         //編程周期由晶振決定(如果<6MHZ選用此項)
//#define ENABLE_IAP 0X85         //編程周期由晶振決定(如果<3MHZ選用此項)
//#define ENABLE_IAP 0X86         //編程周期由晶振決定(如果<2MHZ選用此項)
//#define ENABLE_IAP 0X87         //編程周期由晶振決定(如果<1MHZ選用此項)

#define IAP_ADDRESS 0X0000         //內(nèi)部EEPROM地址

unsigned char code duanma[12]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x8c};//

sbit    led_2=P3^6;
sbit    led_3=P3^7;



sbit a6=P5^4;//g
sbit a5=P1^0;//f
sbit a4=P1^3;//e
sbit a3=P1^4;//d
sbit a2=P1^5;//c
sbit a1=P1^2;//b
sbit a0=P1^1;//a


sbit    buzzer=P5^5;
unsigned char pwm,pwmcun;
unsigned long counter;
unsigned char Trg;                          //點按
unsigned char Cont;                         //長按
unsigned char cnt_plus;                     //長按延時
unsigned char cnt_plus_time;                //長按速度
unsigned char start=0;                      //開始按鍵
/**
*  功能:延時t毫秒
*  入?yún)ⅲ?~65535
*/
void delay_ms(unsigned int t)
{
    unsigned int i;
    do{
        i = Fosc / Core;
        while(--i);
    }while(--t);
}
/********************************************************************
                           掉電模式(無操作5分鐘后關(guān)機(jī)省電)
*********************************************************************/
void kongxian()
{
PCON = 0x02; //MCU進(jìn)入掉電模式
_nop_();
_nop_();
}
/********************************************************************
                            操作函數(shù)
*********************************************************************/
void IapIdle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}

/********************************************************************
                            讀取一個字節(jié)函數(shù)
*********************************************************************/
uchar IapReadByte(uint addr)
{
uchar dat;  
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
dat=IAP_DATA;
IapIdle();
return dat;
}

/********************************************************************
                            寫入一個字節(jié)函數(shù)
*********************************************************************/
void IapProgramByte(uint addr,uchar dat)
{

IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
IapIdle();
}
/********************************************************************
                            擦除一個字節(jié)函數(shù)
*********************************************************************/
void IapEraseSector(uint addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
IapIdle();
}


/**************************************
****************定時器初始化函數(shù)****************
**************************************/
void InitTimer(void)
{
        AUXR &= 0x7F;                //定時器時鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時器模式
        TL0 = 0x18;                //設(shè)置定時初值
        TH0 = 0xFC;                //設(shè)置定時初值1ms
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時器0開始計時
  ET0 = 1;  //T0中斷使能

        AUXR &= 0xFB;                //定時器2時鐘12T模式
        T2L = 0xE0;                //設(shè)置定時初值
        T2H = 0xB1;                //設(shè)置定時初值
        AUXR |= 0x10;                //定時器2開始計時
  IE2 |= 0x04; //T2使能
  EA = 1; //開總中斷
       
  IT1 = 0; //0,上升沿和下降沿都能中斷。
  EX1 =1; //使能INT1中斷

}

/********************************數(shù)碼管延時關(guān)斷函數(shù)******************************************/
void guanduan (void)//用于關(guān)斷數(shù)碼管的位選
{
delay_ms(1);//延時
led_2=1;//關(guān)斷百位
led_3=1;//關(guān)斷十位
delay_ms(2);//延時
}
/********************************10us延時函數(shù)************************************************/
void delay_10us (unsigned int a)//24MHz時鐘時的10微秒延時函數(shù)
{
unsigned int b;
while(a--)
{
  for(b=0;b<12;b++);
}
}
/********************************sound數(shù)************************************************/
void sound(unsigned int jj,ii ) //jj,時長;ii,頻率
{
        unsigned int i;
        for(i=0;i<=jj*5;i++)
        {buzzer=~buzzer;
        if(buzzer)
{delay_10us(ii);}
else {delay_10us(ii-12);}
        }
       
        buzzer=0;
}
/********************************字段函數(shù)(顯示)********************************************/
void ziduan(unsigned char a)
{
a6=a&0x40;//g
a5=a&0x20;//f
a4=a&0x10;//e
a3=a&0x08;//d
a2=a&0x04;//c
a1=a&0x02;//b
a0=a&0x01;//a
}
/********************************顯示函數(shù)****************************************************/
void display(signed int a)//顯示函數(shù)(顯示實際數(shù)據(jù)除以10,支持顯示負(fù)數(shù),負(fù)數(shù)顯示方式為百位顯示負(fù)號"-"十位和個位顯示數(shù)據(jù))
{
  unsigned char shiwei,gewei,d;//定義十位,個位,每次顯示幀數(shù)


        shiwei=a/10;//計算十位
  gewei=a%10;//計算個位
  for(d=0;d<20;d++)//顯示部分,每次顯示20個循環(huán)(20幀)
  {  
   ziduan(duanma[shiwei]);//顯示十位
   led_2=0;//打開十位
   guanduan();//延時關(guān)斷十位
   ziduan(duanma[gewei]);//顯示個位
         led_3=0;//打開個位
   guanduan();//延時關(guān)斷個位
         }
}

/**************************************
****************按鍵檢測****************
**************************************/
void Key(void)
{
    unsigned char ReadData=P3^0xff;//若為0,表示沒有按鍵
    Trg=ReadData&(ReadData^Cont);
    Cont=ReadData;
    if (Cont==0)
    {
        cnt_plus=0;     //長按標(biāo)志清0
    }
                if (Trg&0x04)       //按下P3.2,00000100;儲存當(dāng)前數(shù)值
                 {
                         sound(50,17);
                         IapEraseSector(0X0000);                    delay_ms(5);
             IapProgramByte(0X0000,pwm);           delay_ms(5);
                         pwmcun=pwm;
                 }

               
                if (Trg&0x01)       //按下P3.0,00000001,設(shè)定增加
    {  
                          start=0;
        pwm++;
        if(pwm==99)
        {
            pwm=0;
        }
    }
    if (Trg&0x02)       //按下P3.1,00000010,設(shè)定減小
    {  
                                start=0;
        pwm--;
        if(pwm==0)
        {
            pwm=99;
        }
    }
       
                if(Trg&0x08)       //按下P3.3,00001000,計數(shù)/停止
                {
                        start=~start;
                        counter=0;
                        sound(50,17);
            pwm=pwmcun;
                }
               
    if (cnt_plus<50)
    {
        cnt_plus++;        //開始長按延時
    }
    if (cnt_plus>=50)     //長按1秒后開始動作
    {
        cnt_plus_time++;        //長按時速度變化
        if (cnt_plus_time>30)
        {
            cnt_plus_time=0;
            if (Cont&0X01)  //長按P1.3,連加5
            {
                if(pwm<=(pwmcun-10))
                {
                    pwm=pwm+5;
                }
                else
                {
                    pwm++;
                }

            }
            if (Cont&0X02)      //長按P1.4,連減5
            {
                if(pwm>=10)
                {
                    pwm=pwm-5;
                }
                else
                {
                    pwm--;
                }

            }
        }
    }
        }       



/**************************************
****************主函數(shù)***************
**************************************/
void main ()
{ start=0;
        sound(100,17);
        P5M0=0xff;//P5都是推挽模式
  P5M1=0x00;
        P1M0=0xff;//P1都是推挽模式
  P1M1=0x00;
  InitTimer();
       
        pwmcun=IapReadByte(0X0000);//讀取設(shè)定起始數(shù)值
  delay_ms(5);
  pwm = pwmcun;
         buzzer=0;
         counter = 0 ;
   while(1)
    {

      display(pwm);
         }
}
/**************************************
****************T0中斷,1ms用于倒計數(shù)****************
**************************************/
void Timer0Interrupt(void) interrupt 1
{
if(start)  //計數(shù)狀態(tài),T0用于倒計數(shù)
{
        counter++;
    if(counter==1000) //每秒(1000ms)倒計時1
    {
        counter = 0 ;
        pwm--;
                             if(pwm==0) //計數(shù)完成,滴滴2聲,停止
       {
                                start=0;
                                led_2=led_3=1;
                                pwm=pwmcun;
                         sound(80,17);
                         delay_ms(100);
                         sound(80,17);
                                 delay_ms(400);
                                 sound(80,17);
                           delay_ms(100);
                           sound(80,17);
                         }   
    }
}
if(start==0) //倒計數(shù)結(jié)束后,T0用于延時關(guān)機(jī)
  {
                counter++;
        if(counter==300000)  //5分鐘
        {               
                led_2=led_3=1;
                sound(300,17);
                start=~start;
          kongxian();
        }
}

}
/**************************************
****************T2中斷,20ms用于檢測按鍵****************
**************************************/
void t2int() interrupt 12
{
    IE2 &= ~0x04;               //關(guān)閉定時器T2
    Key();              //執(zhí)行鍵盤掃描
    IE2 |= 0x04;                //啟動定時器T2
}
void exint1() interrupt 2 //INT1中斷入口
{
        counter=0;
}



評分

參與人數(shù) 2黑幣 +62 收起 理由
YJGG + 12 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区 | 国产剧情一区 | 久久综合久色欧美综合狠狠 | 日韩av一区二区在线观看 | 91中文字幕在线观看 | 国产精品久久久久久久久婷婷 | 欧美亚洲国产日韩 | 久久久91 | 亚洲区一区二区 | 欧洲精品一区 | 久久国产精品视频 | 亚洲天堂999 | 国产高清视频一区二区 | 精品久久久久香蕉网 | 91av大全| 久久最新| 91一区二区在线观看 | 免费成人av网站 | 欧美一区二区在线播放 | 青青草一区二区三区 | 91久久久www播放日本观看 | 午夜男人天堂 | 一区二区免费 | av网站在线免费观看 | 国产福利视频网站 | 免费高清成人 | 国产激情视频网 | 精品一区二区电影 | 亚洲国产偷 | 国产最新视频在线 | av日韩精品 | 羞羞的视频免费在线观看 | 一区二区三区日本 | 91亚洲精品在线观看 | 日本三级视频 | 久久综合久 | 国产精品久久国产精品久久 | 一本大道久久a久久精二百 国产成人免费在线 | 欧美精品在线播放 | 激情国产 | 欧美一区视频在线 |