单片机c语言<>欢迎进入51单片机学习网论坛讨论
本站新域名www.8951.com开通WWW.51C51.COM
中国单片机编程技术普及推广第一站! 19. “叮咚”门铃 1.实验任务 当按下开关SP1,AT89S51单片机产生“叮咚”声从P1.0端口输出到LM386,经过放大之后送入喇叭。 2.电路原理图
图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次才可以。 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;
}
} }
|