标题:
制作定时插座单片机源程序
[打印本页]
作者:
tyftyh
时间:
2017-12-28 17:55
标题:
制作定时插座单片机源程序
/***
**项目名称:制作定时插座
**编写时间: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;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1