用AT89C51单片机设计声音报警器

用AT89C51单片机产生嘀、嘀的报警声从P1.0端口输出,产生的信号频率为500Hz,如下图可知:500HZ方波从P1.0输出0.2秒,接着0.2秒从P1.0输出电平信号,如此循环下去,就形成我们所需的报警声了。单片机的晶振频率为12MHz。
要求用89C51的指令编写如:ORG 0000H
LJMP MAIN
ORG 000BH
LJMP DVT0
ORG 0100H
MAIN: MOV TMOD,#001H
MOV TH0,#0F8H
MOV TL0,#30H
SETB ET0 ;T0
SETB EA
SETB TR0
SJMP $
DVT0:CPL P1.0
MOV TH0,#0F8H
MOV TL0,#30H
RETI
END

500HZ的方波,周期就是2MS。利用定时/计数器断功能每1MS中断一次,中断程序中让P1.0取反即可。然后关中断0.2秒后再继续,反复循环。
帮你吧。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint count;
void delay(uint i) //n毫秒延迟程序
{
uint k;
while(i--)
{
for(k=0;k<120;k++){;}
}
}
void main()
{
TMOD=0x01; // 定时计数器T0工作方式1
TH0=(65525-1000)/256;
TL0=(65525-1000)%256; //设定1MS初值
EA=1;ET0=1;TR0=1; //开总中断,定时器T0中断,启动定时器T0
count=0;
while(1)
{
if(count>=200) //输出超过0.2秒
{
ET0=0; //关中断
P1^0=0; //图中是低电平
delay(200); //发送0.2秒电平信号
ET0=1; //开中断 重新计数
count=0;
}
}
}

void TIME0(void) interrupt 1
{
TH0=(65525-1000)/256;
TL0=(65525-1000)%256;
P1^0=~P1^0; //每1MS 取反一次 产生频率500KZ的方波
count++; //每1MS count+1
}

OK了 程序思路很简单 自己要多多动手,简单的程序再就要自己写了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-01-13
试试:
用89C51片定时器
fosc=12MHz,
从P1.0口输出500Hz
org
000h
sjmp
do
;跳初始化程序
org
000bh
ajmp
t1ms
;1毫秒定时中断
do:
mov
tmod,#00010001b
;双定时T0,T1
setb
et0
;开中断
setb
ea
;开中断
MOV
TH0,#252
;设定T0:
1ms中断一次12MHz
MOV
TL0,#24
setb
tr0
;开始定时
sjmp
$
;=====================定时器中断==============
t1ms:
MOV
TH0,#252
;设定T0:
1ms中断一次12MHz
MOV
TL0,#24
;
;----------------------0.2s定时--
djnz
r0,next;0.2s
cpl
00h
mov
r0,#200
;--------------------------------
next:
jb
00h,toret
cpl
p1.0
;从P1.0输出周期2ms方波,每1ms翻转
reti
;-----------------------------
toret:
clr
p1.0
;电平输出
reti
;中断返回
end
第2个回答  2009-06-01
定时中断里面写程序,将端口取反就可以了。