“叮咚”门铃源程序
2012-08-07
标签: 门铃

1.实验任务

当按下开关SP1,AT89S51单片机产生“叮咚”声从P1.0端口输出到LM386,经过放大之后送入喇叭。

2.电路原理图

3.系统板上硬件连线

(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上;

(2.在“音频放大模块”区域中的SPKOUT端口上接上一个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. 汇编源程序

            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

6. 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;
                }
        }
}

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号