| 
 19. “叮咚”门铃 1. 实验任务  当按下开关SP1,AT89S51单片机产生“叮咚”声从P1.0端口输出到LM386,经过放大之后送入喇叭。  2. 电路原理图  file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC647.tmp.png 图4.19.1  3. 系统板上硬件连线  (1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;  (2. 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧或者是16欧的喇叭;  (3. 把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上;  4. 程序设计方法  (1. 我们用单片机实定时/计数器T0来产生700HZ和500HZ的频率,根据定时/计数器T0,我们取定时250us,因此,700HZ的频率要经过3次250us的定时,而500HZ的频率要经过4次250us的定时。  (2. 在设计过程,只有当按下SP1之后,才启动T0开始工作,当T0工作完毕,回到最初状态。  (3. “叮”和“咚”声音各占用0.5秒,因此定时/计数器T0要完成0.5秒的定时,对于以250us为基准定时2000次才可以。  5. 程序框图  主程序框图 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC648.tmp.jpg T0中断服务程序框图  file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC659.tmp.jpgfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC65A.tmp.jpg 图4.19.2  6. 汇编源程序 
T5HZ EQU 30H 
T7HZ EQU 31H 
T05SA EQU 32H 
T05SB EQU 33H 
FLAG BIT 00H 
STOP BIT 01H 
SP1 BIT P3.7 
ORG 00H 
LJMP START 
ORG 0BH 
LJMP INT_T0 
START: MOV TMOD,#02H 
MOV TH0,#06H 
MOV TL0,#06H 
SETB ET0 
SETB EA 
NSP: JB SP1,NSP 
LCALL DELY10MS 
JB SP1,NSP 
SETB TR0 
MOV T5HZ,#00H 
MOV T7HZ,#00H 
MOV T05SA,#00H 
MOV T05SB,#00H 
CLR FLAG 
CLR STOP 
JNB STOP,$ 
LJMP NSP 
DELY10MS: MOV R6,#20 
D1: MOV R7,#248 
DJNZ R7,$ 
DJNZ R6,D1 
RET 
INT_T0: INC T05SA 
MOV A,T05SA 
CJNE A,#100,NEXT 
MOV T05SA,#00H 
INC T05SB 
MOV A,T05SB 
CJNE A,#20,NEXT 
MOV T05SB,#00H 
JB FLAG,STP 
CPL FLAG 
LJMP NEXT 
STP: SETB STOP 
CLR TR0 
LJMP DONE 
NEXT: JB FLAG,S5HZ 
INC T7HZ 
MOV A,T7HZ 
CJNE A,#03H,DONE 
MOV T7HZ,#00H 
CPL P1.0 
LJMP DONE 
S5HZ: INC T5HZ 
MOV A,T5HZ 
CJNE A,#04H,DONE 
MOV T5HZ,#00H 
CPL P1.0 
LJMP DONE 
DONE: RETI 
END 
 
7. C语言源程序 
#include <AT89X51.H> 
unsigned char t5hz; 
unsigned char t7hz; 
unsigned int tcnt; 
 
bit stop; 
bit flag; 
 
void main(void) 
{ 
unsigned char i,j; 
 
TMOD=0x02; 
TH0=0x06; 
TL0=0x06; 
ET0=1; 
EA=1; 
 
while(1) 
{ 
if(P3_7==0) 
{ 
for(i=10;i>0;i--) 
for(j=248;j>0;j--); 
if(P3_7==0) 
{ 
t5hz=0; 
t7hz=0; 
tcnt=0; 
flag=0; 
stop=0; 
TR0=1; 
while(stop==0); 
} 
} 
} 
} 
 
void t0(void) interrupt 1 using 0 
{ 
tcnt++; 
if(tcnt==2000) 
{ 
tcnt=0; 
if(flag==0) 
{ 
flag=~flag; 
} 
else 
{ 
stop=1; 
TR0=0; 
} 
} 
if(flag==0) 
{ 
t7hz++; 
if(t7hz==3) 
{ 
t7hz=0; 
P1_0=~P1_0; 
} 
} 
else 
{ 
t5hz++; 
if(t5hz==4) 
{ 
t5hz=0; 
P1_0=~P1_0; 
} 
} 
}     
 |