|
#include <reg52.h> /* special function register declarations */
#include <absacc.h> /* for the intended 8051 derivative */
#include <stdio.h> /* prototype declarations for I/O functions */
/***************************************************
* A型板,定义 model 为 1,B型板,定义 model 为 2。*
***************************************************/
#define model 2
#if model == 1
sbit SCC=P3^2;
#else
sbit SCC=P1^7;
#endif
sbit SCR=P3^3;
sbit SCI0=P3^5;
sbit SCI1=P3^4;
sbit BP=P1^3;
unsigned int i;
unsigned char timer1;
unsigned char keyin;
bit BPgate = 1;
unsigned char TL0INIT = 0x00;
unsigned char const xchgtab[]={ 0x01, 0x02, 0x04, 0x05, 0x07, 0x08, 0x00, 0x0f,
0x03, 0x0a, 0x06, 0x0b, 0x09, 0x0c, 0x0e, 0x0d };
/***************************************************
* 主程序入口。 *
***************************************************/
void main (void)
{
/***************************************************
* 设置 T0 定时器工作在模式3,将其分成 TL0、TH0 两 *
* 定时器。 *
***************************************************/
TMOD |= 0x03;
/***************************************************
* 起动 TL0 定时器。 *
***************************************************/
TR0 = 1;
/***************************************************
* 起动 TH0 定时器。 *
***************************************************/
TR1 = 1;
/***************************************************
* 设定 T0 定时器的中断优先级为高,避免被其它中断打*
* 断,造成计时不准。 *
***************************************************/
IP |= 0x02;
/***************************************************
* 允许 TL0、TH0 定时器中断,并将全局中断控制位置 *
* 为允许。 *
***************************************************/
IE |= 0x8a;
while(1){
/***************************************************
* 等待按键按下。在按键放开期间,延续发声一段时间。*
***************************************************/
i=0;
timer1=0;
while(keyin==0){
if(timer1>100){
timer1=0;
i++;
}
if(i>10) BPgate = 1;
}
/***************************************************
* 根据按键的值,设定发声频率,允许蜂鸣器发声。 *
***************************************************/
switch(xchgtab[keyin-1]){
case 1:{
TL0INIT = 0x24;
BPgate = 0;
break;
}
case 2:{
TL0INIT = 0x3c;
BPgate = 0;
break;
}
case 3:{
TL0INIT = 0x52;
BPgate = 0;
break;
}
case 4:{
TL0INIT = 0x5c;
BPgate = 0;
break;
}
case 5:{
TL0INIT = 0x6e;
BPgate = 0;
break;
}
case 6:{
TL0INIT = 0x7e;
BPgate = 0;
break;
}
case 7:{
TL0INIT = 0x8c;
BPgate = 0;
break;
}
default:{
break;
}
/***************************************************
* 等待按键放开。 *
***************************************************/
while(keyin!=0){}
/***************************************************
* 延时。 *
***************************************************/
i=0;
timer1=0;
while(i<10){
if(timer1>20){
timer1=0;
i++;
}
}
}
}
}
/***************************************************
* TL0 的中断处理程序,用来产生一定频率的方波。 *
***************************************************/
dirTL0() interrupt 1
{
static bit i=0;
TL0 = TL0INIT;
/***************************************************
* 每次中断,i都取反一次,用以产生方波。 *
***************************************************/
i=~i;
/***************************************************
* 用 BPgate 来控制,是否把方波送到蜂鸣器的控制脚 *
* 上。 *
***************************************************/
BP = i|BPgate;
}
/***************************************************
* TH0的中断处理程序,用来给时间变量加1及键盘扫描。*
***************************************************/
dirTH0() interrupt 3
{
static unsigned char i,k;
i++;
if(i>7){
i=0;
SCR=1;
SCR=0;
keyin=k;
k=0;
}else{
SCC=1;
SCC=0;
}
if(SCI0){
if(k==0){
k=i+1;
}
}
if(SCI1){
if(k==0){
k=i+9;
}
}
timer1++;
}
|