include<reg52.h>//包含头文件#define uint unsigned int#define uchar unsigned char//宏定义sbit speaker=P1^4;//喇叭引脚定义uchar a,b;//声明两个无符号字符型变量,用于定时器初值的赋值void check_key()//按键扫描函数{P3=0xff;//先赋给P3组口高电平switch(P3)//当有按键按下,P3口变为低电平{case 0xfe:P2=0xF9;a=0xfb;b=0xe9;EA=1;break; //当第一个按键按下,P2口数码管显示数字1,并给定时器赋初值,打开中断系统总开关case 0xfd:P2=0xA4;a=0xfc;b=0x5c;EA=1;break;case 0xfb:P2=0xB0;a=0xfc;b=0xc1;EA=1;break; //同上case 0xf7:P2=0x99;a=0xfc;b=0xef;EA=1;break;case 0xef:P2=0x92;a=0xfd;b=0x45;EA=1;break; //P2组为发光二极管组case 0xdf:P2=0x82;a=0xfd;b=0x92;EA=1;break; //注意:EA不能改为TR0case 0xbf:P2=0xf8;a=0xfd;b=0xd0;EA=1;break;case 0x7f:P2=0xF9;a=0xfd;b=0xee;EA=1;break;default:EA=0;speaker=0;P2=0xff; //当P3口为其他状态时(包括无按键按下和多按键按下)关闭声音输出和LED}}void main()//主函数{TMOD=0x01;//定时器工作方式1TH0=a;//定时器0初值的高八位TL0=b;//定时器0初值的低八位ET0=1;//允许中断TR0=1;//打开定时器while(1)//进入循环{check_key();//扫描按键}}void time0() interrupt 1//定时器工作函数{TH0=a;//定时器高八位赋初值TL0=b;//定时器低八位赋初值speaker=~speaker;//喇叭引脚取反}