|
妻深諳“要管住丈夫的心,先要管住丈夫的胃”的道理,做的一手好菜,可謂廚藝高手。一日,妻看著夫品著自己做的美味時,嘆曰:“烹飪的最高境界是掌握火候”。夫思忖:“掌握火候不就是控制烹調時間么。這個容易只要把此前拋出的‘兩塊磚’信手拈來即可。”于是夫找來了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 );
{
;
}
}
}
|
評分
-
查看全部評分
|