妻深谙“要管住丈夫的心,先要管住丈夫的胃”的道理,做的一手好菜,可谓厨艺高手。一日,妻看着夫品着自己做的美味时,叹曰:“烹饪的最高境界是掌握火候”。夫思忖:“掌握火候不就是控制烹调时间么。这个容易只要把此前抛出的‘两块砖’信手拈来即可。”于是夫找来了C51单片机、数码管、蜂鸣器等元器件,搭建了一个电路简洁,计时精准,声音响亮、调时方便的100-0分钟递减的计时报警器。给妻烹饪时掌握火候。 妻爱不释手,喜曰:“烹小鲜,如治大国矣。”
夫心曰:“治小家,一定要学单片机。”
#include< reg52.h > //包含头文件
#define INT8 unsigned char //预定义关键词
#define INT16 unsigned int
sbit Key1 = P1 ^ 6; //十位按键加
sbit Key2 = P1 ^ 7; //个位按键加
sbit BUZZER = P1 ^ 0;
/*
INT8 code table[] = //共阴码表。
{
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
*/
INT8 code table[] = //共阳码表。
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
INT8 T_count = 0, Second = 0;
INT8 Minute_1 = 1, Minute_2 = 5; //初始设定为15分钟,可以选择最常用的时间为初始值。
void Delay( INT16 xms ) //延时函数,有参函数
{
INT16 x, y;
for( x = xms; x > 0; x -- )
for( y = 110; y > 0; y -- );
}
void Keyscan() //按键扫描函数
{
if( Key1 == 0 ) //十位加
{
Delay( 10 );
if( Key1 == 0 )
{
while( !Key1 )
P1 = 0xC0;
{
Minute_1 ++;
if( Minute_1 == 10 )
Minute_1 =0;
}
}
}
if( Key2 == 0 ) //个位加
{
Delay( 10 );
if( Key2 == 0 )
{
while( !Key2 )
P1 = 0xC0;
{
Minute_2 ++;
if( Minute_2 == 10 )
Minute_2 = 0;
}
}
}
}
void main()
{
TMOD |= 0x10;
TMOD &= 0xDF;
TR1 = 1;
ET1 = 1;
EA = 1;
while( 1 )
{
P2 = table[ Minute_1 ];
P3 = table[ Minute_2 ];
Keyscan();
}
}
void Buzzer( INT16 Number, INT8 Time ) //可以选择鸣响次数和时间
{
INT8 h,j;
INT16 i ;
for ( h = 0; h < Number; h ++ )
{
for ( i = 0; i < Time; i ++ )
{
BUZZER =~ BUZZER; //BEEP取反
for ( j = 0; j < 75; j ++ ); //需要产生方波,调节音频
}
Delay( 100 ); //间隔时间
}
BUZZER = 0; //PNP-0;NPN-1关闭蜂鸣器
}
void interrupt_timer1() interrupt 3
{
TH1 = ( 65536 - 50000 ) / 256;
TL1 = ( 65536 - 50000 ) % 256;
T_count ++; //定时器中断计数器加一
if( T_count == 20 ) //计数20次
{
T_count = 0; //清零定时器中断计数器
Second ++; //秒计数器加一
if( Second >= 60 ) //秒计数器等于100
{
Second = 0; //秒计数器清零
Minute_2 --;
if( Minute_2 == -1 && Minute_1 >> 0 )
{
Minute_2 = 9;
Minute_1 --;
}
}
}
if( Minute_1 == 0 && Minute_2 == -1 )
{
Minute_1 = 0;
Minute_2 = 0;
Buzzer( 200,100 );
while( 1 );
{
;
}
}
}
|