51单片机怎么用一个按键控制P0,P2顺序输出高电平

供稿:hz-xin.com     日期:2025-01-14
自制51单片机最小系统 控制P2,P0分别输出高电平和低电平,可经测量它们间的电压为1.35V

1). P0口作为IO口使用时,需要加上拉电阻,否则给不出高电平;输出0时为低电平;输出1时为高阻状态,具体电平要看你的负载怎么接的了。
2). 要用示波器看输出波形,用电压表看电压只能看到高、低电平的平均值,切换速度快的话根本看不出来,你测量的1.35V也可能就是这个原因,除非保持高、低电平输出的时间较长(最好数秒以上),才能看到高低电平的跳动。

#inclde"reg51.h"
sbit P22=P2^3;
sbit P23=P2^3;
unsigned char flag;
void main()
{
EX01;
IT0=1;
EA=1;
while(1)
{
if(flag) {P22=1;P23=0}
else {P23=1;P22=0;}
}
}

voif INT_0() inteerrupt 0
{
while(INT0==0);
flag=~flag;
}

下面这个程序里面有你要的东西,自己找找。
#include"reg51.h"
void delay(int n);
sbit K1=P3^3; //LED左移按键
sbit K2=P3^5; //LED右移按键
sbit K3=P3^6; //开启手动按键
sbit K4=P3^7; //开启自动按键
bit mark1=0;
bit mark2=0;
unsigned char a,b,c,d;
int x;
void pulse(void);
void main()
{
a=0xfe;b=0xff;
c=0x7f;d=0xff;

while(K4)
{P2=a; P0=b;
if(!K1&!mark1) //如果K1按下且mark1=0
{delay(10); //延时
if(!K1) //检查K1还是按下
{
mark1=1; //mark1=1
if((a&0x80)&&(a!=0xff)) //如果a=1*******("*"号为0或者1(最高位为1))并且a不等于0xff
{ a=(a<<1)|0x01;pulse();} //让a向左移后边会拉出0,然后与00000001相与(最后一位补1)
else if(a==0x7f)
{a=0xff;b=0xfe;pulse();}
else if((b&0x80)&&(b!=0xff))
{b=(b<<1)|0x01;pulse();}
else if(b==0x7f)
{a=0xfe;b=0xff;pulse();}
// {a<<=1;} //a左移一位让P2^7的值跳到P2^0上

}
}
else if(K1)
{mark1=0;}

if(!K2&!mark2)
{ delay(10);
if(!K2)
{
mark2=1;
if((a!=0xff)&&(a!=0xfe))
{
if(a&0x01)
{ a=(a>>1)|0x80;pulse();}
}
else if(a==0xfe)
{a=0xff;b=0x7f;pulse();}
if((b!=0xff)&&(b!=0xfe))
{
if(b&0x01)
{ b=(b>>1)|0x80;pulse();}
}
else if(b==0xfe)
{a=0x7f;b=0xff;pulse();}
}
}
else if(K2)
mark2=0;
}
while(K3)
{
if(!K1&!mark1)
{delay(10);
if(!K1)
{mark1=1;
for(x=0;x<=16;x++)
{ P0=a;P2=b;
delay(100);
if((a&0x80)&&(a!=0xff))
{a=(a<<1)|0x01;}
else if(a==0x7f)
{a=0xff;b=0xfe;}
else if((b&0x80)&&(b!=0xff))
{b=(b<<1)|0x01;}
else if(b==0x7f)
{b=0xff;a=0xff;}
}
}
}
else if(K1)
{mark1=0;}
if(!K2&!mark2)
{delay(10);
if(!K2)
{mark2=1;
for(x=0;x<=16;x++)
{P0=c;P2=d;
delay(100);
if((c&0x01)&&(c!=0xff))
{c=(c>>1)|0x80;}
else if(c==0xfe)
{c=0xff;d=0x7f;}
else if((d&0x01)&&(d!=0xff))
{d=(d>>1)|0x80;}
else if(d==0xfe)
{d=0xff;c=0xff;}
}
}
}
else if(K2)
{mark2=0;}
}
}
void delay(int n)
{
int i,j;
for(i=0;i<=n;i++)
for(j=0;j<=320;j++);
}
void pulse(void)
{
P1=0xfe;
delay(100);
P1=0xfd;
delay(100);
P1=0xfb;
delay(100);
P1=0xf7;
delay(100);
P1=0xff;
}

51单片机怎么用一个按键控制P0,P2顺序输出高电平

这个问题我知道

推荐您使用“赛思QQ陌生人推广小助手 ”

不用加好友 直接发消息

日引1万独立IP 绝对没有问题

C还是汇编?

51单片机怎么用一个按键控制P0,P2顺序输出高电平
void delay(int n);sbit K1=P3^3; \/\/LED左移按键 sbit K2=P3^5; \/\/LED右移按键 sbit K3=P3^6; \/\/开启手动按键 sbit K4=P3^7; \/\/开启自动按键 bit mark1=0;bit mark2=0;unsigned char a,b,c,d;int x;void pulse(void);void main(){ a=0xfe;b=0xff;c=0x7f...

编个单片机程序,按键控制动态数码管显示00-32,位码是P1-6,P1-7,段码...
在51单片机上编写一个程序,实现按键控制数码管显示00到32,位码使用P1-6和P1-7,段码使用P0口。程序中定义了数码管显示和按键控制的函数。程序包含主函数main和两个子函数YS和XS。主函数中通过while循环不断检查按键状态,若按键被按下则调用YS函数去抖动后更新显示值,若数值超过99则置为0,若数值...

单片机 请问流水灯程序一个按键单次按下控制改变 P0.0到P0.7不断循环...
定义一个位变量 bit fangxiang=1 ; \/\/1表示一个方向,0表示另一个方向。用定时器自动控制灯移动。主循环里面这样写 while(1){ 检测P10按键;如果有按键;fangxiang=!方向;} 定时器函数里这样写 { if(方向==1){ 右移;} else { 左移;} } 这样主循环只检测按键,检测到之后改变方向值...

51单片机一个外部按键控制两个外部引脚交替的输出并且不要保持状态...
51单片机一个外部按键控制两个外部引脚交替输出并且不要保持状态。但看这个要求,用51单片机是很容易实现的。如果想实现你的功能,建议你看看51单片机方面的书籍

51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示
1、首先,要把代码写好,点亮数码管。2、代码写完后,要确认原先写好的代码是不是正确的。3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。5、这里改成的是代表数字0的代码,如图所示。6、...

单片机独立按键0是接通
单片机独立按键:一个按键占用单独的一个IO口,矩阵键盘为了节省IO口,通常将按键排列成矩阵形式,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。51单片机接按键,按键一端接地,另一端与IO引脚相连,按键按下为低电平,未按下为高电平。 思路正确,如果用P0口需要加上拉电阻,其他...

51单片机怎么用一个按键控两个数码管,按一下改变两个数字的显示速度_百 ...
if(number>1)number=0;switch(number){ case 0:P2=0x02;P0=distab[dat\/10];break;case 1:P2=0x01;P0=distab[dat%10];break;default:break;} } void t1isr() interrupt 3 { TH1=(65536-10000)\/256;TL1=(65536-10000)%256;cnt++;if(cnt>=dattop){ cnt=0;dat++;dat%=100;} } m...

单片机怎么实现一个开关控制八个灯按一下亮一个按
用一个寄存器做变量就可以。假如按键是一个开个,接在P1.0,八个灯在P0,低电平灯亮 程序是这样的 MOV 30H ,#00 LOP :SETB P1.0 JNB P1.0, PRESS AJMP LOP PRESS:INC 30H MOV A,30H CJNE A,#9,L_NEXT MOV 30H,#1 L_NEXT:JNB P1.0,MOV A,30H CJNE A,#1 ,LED1...

使用连接到P0_1口的按键进行流水灯控制,程序应该如何修改
51单片机一次只能操作一个8位端口的寄存器用C语言编程虽然可以实现16位数据的左移和右移,但控制LED时还是要分两个端口写入例如: uint a=0x1000; a>>=1;\/\/貌似一次可以对16位二进制数操作,实际上要分好多步 P0=a; \/\/P0上得到的是低8位,高8 位丢失 P1=a>>8;\/\/P1上得到高8位 ...

如何用C51单片机实现P0口接两个按键,P1口接8个LED灯。key1按下左移动...
给个四路:定意一个变量;if(按键1按下)变量为1;if(按键2按下)变量为2;if(变量==1){ 左移控制;} else if(变量==2){ 右移控制;}