#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit high_key=P1^0;
sbit low_key=P1^1;
sbit led=P2^0;
sbit speak=P2^1;
uint count;
void delay(uint x)
{
uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
void main(void)
{
high_key=0;
low_key=1;
led=speak=0;
while(1)
{
if(high_key==1)
{
delay(10);
if(high_key==1)
led=1;
}
if(low_key==0)
{
delay(10);
if(low_key==0)
{
led=0;
count++;
if(count==8)
{
count=0;
speak=1;
delay(100);
speak=0;
delay(100);
speak=1;
delay(100);
speak=0;
delay(100);
}
}
}
}
}
要路图,,,可以用计数的方式(当连续出现8个低电平输入单片机时),当计数到8时,给接嗽的引脚发送一个高电平,延迟100MS再发送一个低电平
你要用两组IO 吗?
用一组也行 因为IO内部集成上拉(非p0)
你可以用硬件的现实的方式做第一个问题,因为你是说输入高会亮 那就就把二极管的正端接到你的输入量的引脚上 和IO 并有一起 然后把IO 一直拉低 就等着你的输入量拉高的时候 等就会亮 就想检测按键一样 。
对于第二个问题 你可以写程序 (但我还是不懂你说的连续什么意思)单片机处理时间很小小 这里不能没没有时间差 )因为人的输入肯定会有时间差 你在相应延时一下再检测的输入量是否是符合你的连续 就编个有源驱动程序驱动喇叭就行了!
LED BIT P1.0
KEY BIT P1.4
SPEAKER BIT P1.7
LOWCNT EQU 30H
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV LOWCNT,#0
LOOP:
JB KEY,LOOP1
SETB LED
JNB KEY,$
INC LOWCNT
MOV A,LOWCNT
CJNE A,#8,LOOP1
MOV LOWCNT,#0
LCALL FMQ
SJMP LOOP
LOOP1:
CLR LED
SJMP LOOP
FMQ:
CLR SPEAKER
MOV R2,#200
DLY:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DLY
RET
END
现场写给你吧:
org 0000h
ajmp main
ORG 0030H
MAIN:
MOV SP,#40H
MOV A,P1
JNB P1.0,J1
JB
AJMP MAIN
J1:
SETB P2.0
INT R0
CJNZ R0,#08H,J3
MOV R0,#00H
RET
J2:
CLR P2.0
RET
J3:
MOV R5,#64H
LOOP:
CPL P2.1
ACALL DELAY
DJNZ R5,LOOP
MOV R5,#64H
RET
DELAY:
MOV R7,#0FFH
MOV R6,#64H
DE1:NOP
DE2:NOP
DJNZ R6,DE2
DJNZ R7,DE1
RET
END
- 相关评论
- 我要评论
-