怎样自制电子门铃?

怎样自制电子门铃?,第1张

“叮咚声”的电子门铃

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次才可以饥陪袜。

5. 程序框乱慎图

主程序框图

T0中断服务程序框图

图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语言源程序

#i nclude <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=10i>0i--)

for(j=248j>0j--)

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

}

}

}

4*4矩阵键盘检测程序(新手用),本程序用于检测4*4矩阵按键,先检测是否有按

键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给

8位数码管,P2^0位选,P2^1段选,P1接4*4矩阵按键

#include <reg52.h>

#include<intrins.h> //头文件

#define uchar unsigned char //宏定义

#define uint unsigned int

sbit du=P2^1 //段选位

sbit we=P2^0 //位选位

uchar code duanma[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71}

void delay(xms)//延时函数

{

uchar i,j

for(xms=i,i>0i--)

for(j=11j>0j--)

}

void main() //主函数

{

we=1//位选开

P0=0//8位数码管全部显示

we=0//位选关判档谈

du=1//段选开

P1=0x00 //初始化蠢卜,8位数码管无显示

while(1)

{

uchar a,b

P1=0xf0

a=P1

if(a!=0xf0)

{

delay(5)//去抖动

b=P1

if(a==b)

{

a=0xfe

do

{

P1=a

if(a!=P1)

{

switch(P1)

{

case 0x7e:{P0=duanma[0]break} //编码检测,第一个键按下显示0,第16个按键按下显示F

case 0xbe:{P0=duanma[1]break}

case 0xde:{P0=duanma[2]break}

case 0xee:{P0=duanma[3]break}

case 0x7d:{P0=duanma[4]break}

case 0xbd:{P0=duanma[5]break}

case 0xdd:{P0=duanma[6]break}

case 0xed:{P0=duanma[7]break}

case 0x7b:{P0=duanma[8]break}

case 0xbb:{P0=duanma[9]break}

case 0xdb:{P0=duanma[10]break}

case 0xeb:{P0=duanma[11]break}

case 0x77:{P0=duanma[12]break}

case 0xb7:{P0=duanma[13]break}

case 0xd7:{P0=duanma[14]break}

case 0xe7:{P0=duanma[15]break}

}

}

a=_crol_(a,1)//循环移掘碰位去检测按键

}while(a!=0xef)

}

}

}

}

以前我在网上找高贺到过密码锁的源代码,你可以找找。给你一个思路吧,先用7个端口做成3*4矩阵键盘,0~9 * #共12个键,另外用4个端口做红灯输出、绿灯输出、报警输出、开锁输出。*键为取消键,#键为确认键,密码可存入单片机的ROM中(不能改密码)或存入24CXX串行E2PROM(可改密码)。键盘处理方法可以用两种,一种是在主程序里不停扫描端口检测按键消抖动后处理按键。另一种方法是键盘通过与门接到外戚渗派部中断,当有键按下时会引起中断,然后在中断程序中消抖动后处理按键。经过键盘处理程序后就可以知道按下什么键,是数字就存入你自己指定的密码缓存寄存器,是取消就清除密码缓存寄存器,是确认就读出密码与密码缓存寄存器的值比较。密码的存放(不加密8位数):设ABCD,4个字节存放密码,A中高4位与低4位各存入一位数,其喊闹它的跟A一样。再就是用一个字节的寄存器存放错误次数,错一次加1,达到3次报警端口输出信号,如果密码正确就清零这个寄存器。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12552395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存