標(biāo)題:
制作定時(shí)插座單片機(jī)源程序
[打印本頁(yè)]
作者:
tyftyh
時(shí)間:
2017-12-28 17:55
標(biāo)題:
制作定時(shí)插座單片機(jī)源程序
/***
**項(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ù)碼管顯示和鍵盤(pán)掃描提供時(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ù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1