|
- /***
- **項(xiàng)目名稱:制作定時(shí)插座
- **編寫(xiě)時(shí)間:2017.11.26
- **使用芯片:stc12c5608ad
- **時(shí)鐘頻率:使用外部時(shí)鐘頻率11.0592MHz
- **簡(jiǎn)要說(shuō)明:可以定時(shí)關(guān)閉插座電源
- ***/
- #include <stc12c5630ad.h>
- typedef unsigned char uint8_t;
- typedef unsigned int uint16_t;
- code uint8_t TABLE_NUM[11] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
- #define DefaultTiming 60
- uint8_t PowerON = 0; //電源:0-關(guān)、1-開(kāi)
- uint8_t TimingON = 0; //定時(shí):0-關(guān)、1-開(kāi)
- uint8_t Show_Update_Flag = 0; //更新數(shù)碼管顯示:0-不更新、1-需更新
- uint8_t KeyScan_Update_Flag = 0; //更新按鍵值:0-沒(méi)更新、1-有更新
- uint16_t Timing = 0; //定時(shí)時(shí)間
- uint8_t KeyValue = 0; //按鍵值
- uint8_t ShowWei = 0; //數(shù)碼管顯示位
- void Timer0_Config();
- void Timer1_Config();
- void TurnOnPower();
- void TurnOffPower();
- void TurnOnTiming();
- void TurnOffTiming();
- void BUZZER(uint8_t type);
- void Delay50ms();
- void Delay500ms();
- void main()
- {
- P1 = 0xff;
- P2 = 0xf0;
- P3 = 0;
- Timer0_Config();
- Timer1_Config();
- ET0 = 1;
- ET1 = 1;
- EA = 1;
- TurnOnPower();
- while(1)
- {
- //按鍵處理
- if(KeyScan_Update_Flag)
- {
- KeyScan_Update_Flag = 0;
-
- switch(KeyValue)
- {
- case 1:
- BUZZER(0);
- if(PowerON) TurnOffPower();
- else TurnOnPower();
- break;
- case 2:
- if(Timing > 10 && TimingON) Timing -= 10;
- break;
- case 3:
- if(TimingON) TurnOffTiming();
- else if(PowerON) TurnOnTiming();
- break;
- case 4:
- if(Timing <= 230 && TimingON) Timing += 10;
- break;
- }
- }
-
- //數(shù)碼管顯示
- if(Show_Update_Flag)
- {
- Show_Update_Flag = 0;
-
- P1 = 0xff; //斷碼
- P20 = P21 = P22 = 0; //位碼
-
- switch(ShowWei)
- {
- case 0:
- if(TimingON) P1 = TABLE_NUM[(Timing / 100) % 10];
- else P1 = TABLE_NUM[10];
- P20 = 1;
- break;
- case 1:
- if(TimingON) P1 = TABLE_NUM[(Timing / 10) % 10];
- else P1 = TABLE_NUM[10];
- P21 = 1;
- break;
- case 2:
- if(TimingON) P1 = TABLE_NUM[Timing % 10];
- else P1 = TABLE_NUM[10];
- P22 = 1;
- break;
- }
- }
- }
- }
- /***TIM0配置:為數(shù)碼管顯示和鍵盤掃描提供時(shí)間間隔5ms***/
- void Timer0_Config()
- {
- AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0xEE; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- }
- /***TIM1配置:提供定時(shí)基準(zhǔn),每次50ms***/
- void Timer1_Config()
- {
- AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TMOD |= 0x10; //設(shè)置定時(shí)器模式
- TL1 = 0x00; //設(shè)置定時(shí)初值
- TH1 = 0x4C; //設(shè)置定時(shí)初值
- TF1 = 0; //清除TF1標(biāo)志
- TR1 = 0; //定時(shí)器1開(kāi)始計(jì)時(shí)
- }
- /***按鍵和數(shù)碼管的掃描***/
- void TIMER0() interrupt 1 using 1
- {
- static uint8_t _key_down = 0, _key_tempvalue = 0, _times = 0;
- TL0 = 0x00;
- TH0 = 0xEE;
- //按鍵掃描 20ms一次
- _times++;
- if(_times == 4)
- {
- _times = 0;
- if(!P24 || !P25 || !P26 || !P27)
- {
- if(_key_down)
- {
- if(!P24) _key_tempvalue = 1;
- if(!P25) _key_tempvalue = 2;
- if(!P26) _key_tempvalue = 3;
- if(!P27) _key_tempvalue = 4;
- }
- else
- {
- _key_down = 1;
- }
- }
- else
- {
- if(_key_down && _key_tempvalue) KeyValue = _key_tempvalue;
- else KeyValue = 0;
-
- if(_key_down) KeyScan_Update_Flag = 1;
-
- _key_down = _key_tempvalue = 0;
- }
- }
- //數(shù)碼管掃描
- ShowWei = ++ShowWei > 2 ? 0 : ShowWei;
- Show_Update_Flag = 1;
- }
- /***定時(shí)基準(zhǔn)***/
- void TIMER1() interrupt 3 using 1
- {
- static uint8_t _num = 0, _second_num = 0;
- TL1 = 0x00;
- TH1 = 0x4C;
- //1秒鐘
- _num++;
- if(_num == 20)
- {
- _second_num++;
- _num = 0;
- }
- //1分鐘
- if(_second_num == 60)
- {
- Timing--;
- _second_num = 0;
- }
- //定時(shí)時(shí)間到 關(guān)電關(guān)顯示關(guān)定時(shí)
- if(Timing == 0)
- {
- TurnOffPower();
- BUZZER(1);
- }
- }
- /***開(kāi)電源***/
- void TurnOnPower()
- {
- P23 = 0;
- PowerON = 1;
- }
- /***關(guān)電源***/
- void TurnOffPower()
- {
- P23 = 1;
- TurnOffTiming();
- PowerON = 0;
- }
- /***開(kāi)定時(shí)***/
- void TurnOnTiming()
- {
- TR1 = 1;
- Timing = DefaultTiming;
- TimingON = 1;
- }
- /***關(guān)定時(shí)***/
- void TurnOffTiming()
- {
- TR1 = 0;
- TimingON = 0;
- }
- void Delay50ms() [url=]//@11.0592MHz[/url]
- {
- unsigned char i, j, k;
- i = 3;
- j = 26;
- k = 223;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay500ms() [url=]//@11.0592MHz[/url]
- {
- unsigned char i, j, k;
- i = 22;
- j = 3;
- k = 227;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /***蜂鳴器***/
- void BUZZER(uint8_t type)
- {
- switch(type)
- {
- case 0:
- P34 = 1;
- Delay50ms();
- P34 = 0;
- break;
- case 1:
- P1 = 0xff;
- P34 = 1;
- Delay500ms();
- P34 = 0;
- Delay500ms();
- P34 = 1;
- Delay500ms();
- P34 = 0;
- Delay500ms();
- P34 = 1;
- Delay500ms();
- P34 = 0;
- break;
- }
- }
復(fù)制代碼
|
|