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次报警端口输出信号,如果密码正确就清零这个寄存器。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)