本文内容列表:
结构图:
它是如何工作的
答录机由74LS148、74LS279、74LS48组成,LED显示启动。当支架按钮尚未按下时,CLR为0,因此输出Q1~Q4为0;
所有发光二极管均熄灭。当主机按钮按下时,CLR为1。可以输入。谁先回答,相应的灯就会亮。 74LS279和74LS148的输出cp等于0,其他被锁存。 ,无法启用其他输出。
扩展信息:
使用51单片机搭建四路答录机
MCU当然不仅仅是51。51 MCU是一款稍微通用的MCU,可以通过I/O口的定义实现多种控制功能。
答录机原理:如果有四个通道,当其中任何一个通道被控制时,其他通道都无效。结果是第一次按下,可以用数码管或LED灯显示。当然,这只是讲原理和编程。具体可以根据答录机的通道数和显示模式来更改程序。
源程序如下:
div class="blockcode"blockquote/*使用的是AT89S52开发板。独立按钮界面如下,使用这四个通道。显示最先按下的LED灯,对应第一至第四个LED灯。按下其他按钮将无效。如果想再次实现,可以手动复位单片机*/
#include reg52.h
sbit key1=P3^0; //根据需要定义按键并连接线路,如独立按键(4路)
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
/*void delay(unsigned int cnt) //如果有抖动或者干扰,可以用小的delay来去抖
{
同时(--cnt);
}*/
void main()
{
位标志;
同时(!标志)
{
if(!key1)
{
P1=0xFE;
标志=1;
}
/*LED 灯显示按下的按键。这里的第一个灯是一个8位的LED灯,即:0111 1111。逆读为:1111 1110。即:0xFE *。 P1口对应LED灯。给P1赋值*/
else if(!key2)
{
P1=0xFD;
标志=1;
}
//第二个灯亮
else if(!key3)
{P1=0xFB;标志=1;}
//第三个灯亮
else if(!key4)
{
P1=0xF7;
标志=1;
}
//第四个灯亮,表示先按第四路
}
同时(标志); //可以再添加一个I/O来控制Flag,这样初始化,继续接听,还可以设计按下时的声音
}
我发个八路版本给你参考
ORG 0000H
JMP 开始
ORG 0030H
表:;共阴数码管显示代码表
?DB 6DH,7DH,07H,7FH;6789
延迟:MOV R5,#20
LOOP4:MOV R6,#50H;延迟20X20ms
LOOP5:MOV R7,#100
DJNZ R7,$
DJNZ R6,LOOP5
DJNZ R5,LOOP4
RET
;--------------------------------------------------------
BEGIN: MOV P2,#0FFH ;P2口设置为高电平,准备接收信号
MOV R4,#0
?再次:MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
LOOP1:MOV A,P3;接收来自p3端口的响应信号
CPL A
JZ LOOP1
LOOP2:RRC A;如果有人应答信号,请一一移动以确定哪一个应答
INC R4
JNC LOOP2
;************************
MOV A,R4
MOVC A,@A+DPTR ;找到对应位显示代码
MOV P1,A
LEDDIS:
MOV A,#0FFH
CLR C
LEDDIS1:
RLC A
DJNZ R4,LEDDIS1
MOV P0,A
LOOP3:JNB P2.2,开始;如果主机按下复位信号键,则转至主程序
?LCALL DELAY ;调用延迟子程序
SJMP LOOP3; p2.2端口以0.4s的间隔重复变化,驱动蜂鸣器
结束
#includereg51.h
#defineuint 无符号整数
#defineuchar 无符号字符
sbitspeaker = P2^7;
sbit key0 =P1^0;
sbit key1 =P1^1;
sbit key2 =P1^2;
sbit key3 =P1^3;
sbit key4 =P1^4;
sbit key5 =P1^5;
sbit key6 =P1^6;
sbit key7 =P1^7;
ucharled[8]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};
voiddelay_1ms(uint t)
{
uchar m,n;
对于(m=t;m0;m--)
对于(n=330;n0;n--);
}
bitiskeyinput() //判断某个按键是否关闭
{
if((P1 0xff) ==0xff ) //屏蔽高4位(列线),只检测低4位(行线)
返回0; //没有按键关闭,返回0
其他
返回1; //如果钥匙关闭,返回1
}
ucharkey_identify() //识别按键编号
{
uchar键;
if( key0==0 )key=0;
if(key1==0)key=1;
if( key2==0 )key=2;
if( key3==0 )key=3;
if( key4==0 )key=4;
if( key5==0 )key=5;
if( key6==0 )key=6;
if( key7==0 )key=7;
返回键; //输出按键号
}
voidkeyprocess(uchar keynum)
{
uint i;
P0 = led[keynum];
i=500;
同时(i--)
{
扬声器 = 0;
delay_1ms(10);
扬声器 = 1;
}
}
void main()
{
uchar keynum;
P0 = 0xFF;
同时(1)
{
while (!iskeyinput() ); //如果没有钥匙,则等待
delay_1ms(10); //去除按键抖动
if(iskeyinput() ) //当前有按键按下,需要识别按键并等待键盘松开
{
keynum= key_identify(); //识别钥匙号码
keyprocess(keynum);
同时(1); //等待重置
}
}
}