- /***
- **项目名称:制作定时插座
- **编写时间:2017.11.26
- **使用芯片:stc12c5608ad
- **时钟频率:使用外部时钟频率11.0592MHz
- **简要说明:可以定时关闭插座电源
- ***/
- #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-关、1-开
- uint8_t TimingON = 0; //定时:0-关、1-开
- uint8_t Show_Update_Flag = 0; //更新数码管显示:0-不更新、1-需更新
- uint8_t KeyScan_Update_Flag = 0; //更新按键值:0-没更新、1-有更新
- uint16_t Timing = 0; //定时时间
- uint8_t KeyValue = 0; //按键值
- uint8_t ShowWei = 0; //数码管显示位
- 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;
- }
- }
-
- //数码管显示
- 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配置:为数码管显示和键盘扫描提供时间间隔5ms***/
- void Timer0_Config()
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0xEE; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- /***TIM1配置:提供定时基准,每次50ms***/
- void Timer1_Config()
- {
- AUXR &= 0xBF; //定时器时钟12T模式
- TMOD &= 0x0F; //设置定时器模式
- TMOD |= 0x10; //设置定时器模式
- TL1 = 0x00; //设置定时初值
- TH1 = 0x4C; //设置定时初值
- TF1 = 0; //清除TF1标志
- TR1 = 0; //定时器1开始计时
- }
- /***按键和数码管的扫描***/
- 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;
- }
- }
- //数码管扫描
- ShowWei = ++ShowWei > 2 ? 0 : ShowWei;
- Show_Update_Flag = 1;
- }
- /***定时基准***/
- 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;
- }
- //定时时间到 关电关显示关定时
- if(Timing == 0)
- {
- TurnOffPower();
- BUZZER(1);
- }
- }
- /***开电源***/
- void TurnOnPower()
- {
- P23 = 0;
- PowerON = 1;
- }
- /***关电源***/
- void TurnOffPower()
- {
- P23 = 1;
- TurnOffTiming();
- PowerON = 0;
- }
- /***开定时***/
- void TurnOnTiming()
- {
- TR1 = 1;
- Timing = DefaultTiming;
- TimingON = 1;
- }
- /***关定时***/
- 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;
- }
- }
复制代码
|