跪求! AT89S52单片机程序

(1)如果P1.5高电平, 则P1.1=0和P1.0=0
2秒后P1.0=1,P1.1=0
(2)如果P1.6高电平,则P1.1=0和P1.4=0
2秒后P1.0=1,P1.4=1
(3)如果P1.7高电平,则P1.0=0和P1.3=0
2秒后P1.0=1,P1.3=0
(4)如果P1.6高电平,则P1.4=0和P1.3=0
2秒后P1.4=1,P1.3=1
现在先考虑每次操作之间可以等到2秒结束后再进行上电操作的,这样子编程简单点 。

可以用单片机的汇编语言编程,也可以用C语言编程,我用的是AT89S52单片机。

麻烦您帮忙把程序写出来吧,谢谢啦、、 、

顺序执行下列程序:
(1)如果P1.5高电平, 则P1.1=0和P1.0=0
2秒后P1.0=1,P1.1=0
(2)如果P1.6高电平,则P1.1=0和P1.4=0
2秒后P1.0=1,P1.4=1,并且p1.2=0
(3)如果P1.7高电平,则P1.0=0和P1.3=0
2秒后P1.0=1,P1.3=0
(4)如果P1.6高电平,则P1.4=0和P1.3=0
2秒后P1.4=1,P1.3=1,并且p1.2=0

P1.5、P1.6、P1.7,三个输入端,它们的高电平,是单独输入的吗?
每个输入,都能等2秒以后吗?
假设各个按键,是顺序的按下,且间隔2S以上。
--------------
ORG 0000H
JMP START
ORG 0030H
START:
;-------------------------------------------------
;(1)如果P1.5高电平,则P1.1=0和P1.0=0 2秒后P1.0=1,P1.1=0
PRG5:
JNB P1.5, $ ;为0就是没有按下,重新读入.
CALL DELAY ;延时10ms
JNB P1.5, PRG5 ;为0就是没有按下,重新读入.
;-------------------------------
CLR P1.1
CLR P1.0
CALL DL1S
CALL DL1S
SETB P1.1
; SETB P1.0
;-------------------------------------------------
;(2)如果P1.6高电平,则P1.1=0和P1.4=0 2秒后P1.0=1,P1.4=1
PRG6:
JNB P1.6, $ ;为0就是没有按下,重新读入.
CALL DELAY ;延时10ms
JNB P1.6, PRG6 ;为0就是没有按下,重新读入.
;-------------------------------
CLR P1.1
CLR P1.4
CALL DL1S
CALL DL1S
SETB P1.1
SETB P1.4
;-------------------------------------------------
;(3)如果P1.7高电平,则P1.0=0和P1.3=0 2秒后P1.0=1,P1.3=0
PRG7:
JNB P1.7, $ ;为0就是没有按下,重新读入.
CALL DELAY ;延时10ms
JNB P1.7, PRG7 ;为0就是没有按下,重新读入.
;-------------------------------
CLR P1.0
CLR P1.3
CALL DL1S
CALL DL1S
SETB P1.0
; SETB P1.3
;-------------------------------------------------
;(4)如果P1.6高电平,则P1.4=0和P1.3=0 2秒后P1.4=1,P1.3=1
PRG6_2:
JNB P1.6, $ ;为0就是没有按下,重新读入.
CALL DELAY ;延时10ms
JNB P1.6, PRG6_2;为0就是没有按下,重新读入.
;-------------------------------
CLR P1.3
CLR P1.4
CALL DL1S
CALL DL1S
SETB P1.3
SETB P1.4
SJMP START
;-------------------------------------------------
DELAY: ;延时5ms
MOV R6, #10
MOV R7, #200
DJNZ R7, $
DJNZ R6, $ - 2
RET
DL1S:
MOV R5, #200
ACALL DELAY
DJNZ R5, $ - 2
RET
END
;==================================================
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-01
SETB P1.5
JB P1.5,L0

LO: CLR P1.1
CLR P1.0
CALL DALY(这是个 2秒的延迟)
SETB P1.0

其他的段落可以参考这个
第2个回答  2011-01-02
#include<reg52.h>
sbit a=P1^0;
sbit b=P1^1;
sbit c=P1^3;
sbit d=P1^4;
sbit m=P1^5;
sbit n=P1^6;
sbit k=P1^7;
void delay(unsigned int );
void main()
{
P1=0x00;
while(1)
{
if(m)
{
a=0;
b=0;
delay(2000);
a=1;
b=0;
}
if(n)
{
b=0;
d=0;
delay(2000);
a=1;
d=1;
}
if(k)
{
a=0;
c=0;
delay(2000);
a=1;
c=0;
}
}
}
void delay(unsigned int i)
{

unsigned char j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}

}

}
第3个回答  2011-01-01
zdpfat 的回答很不错,我的建议和补充如下:
直接给你程序,你不懂代码的话,不会修改功能和参数,要来何用?更别说移植了。如果是你的工作,刚接触单片机的话,就更得好好学习了。不会没什么大不了,刚出校门的时候,一开始大家都没做过。只要自己努力,多咨询和多泡坛子,不要动不动要程序,自己从简单代码写起。或者耐性看别人的成熟代码,吸取营养。这个程序算是很简单了,练练吧
1)蜂鸣器的话分有源和无源两种,有源的只要给电源就会发出滴滴声。无源的要给频率信号,可以用pwm驱动。
2)键盘按键看你的图只有四个,可以使用时普通IO一额可以的,注意去延时10ms抖动。当然中断也可以实现,用一个中断的话,用个或电路,再用io查询那个键按下,网上键盘电路方案很多。
3)双基色led是三引脚的双色灯吧,可以三种颜色显示。只有1个脚通电是红色或绿色,两个脚通电是橙色。
4)3节干电池才4.5v,充电电池才3.6v,建议换锂电一节3.6v,充足电4.2v,不过要充放电保护电路,我以前从事的行业,锂电容量高。现在基本都使用。
5)所以从电压看,你的52能正常工作么,建议更换芯片,从性价比(考虑成本)和你以后学习的方向,你以后设计产品的需求。推荐你学avr 8位的单片,有低电压也能工作,还有ad转换等等
6)低电压检测,可以用比较器做,如果电压在单片机的工作范围,比如2.9v单片机能正常工作的话,可以用单片机做。
其他问题可以邮件联系[email protected]
--------------------------------------
还太史公瑾,不知道给人以鱼,不如授人以渔到道理。
相似回答