89C2051单片机按键控制一只led,按键按下闪5次灭30秒一直循环,松开就灭。
LED=~LED;
取反的速度太快
按键按下 实际是led高频闪烁
按键松开后 跳出while(1)松手检测
然后在main的while(1)里面一直等待按键再次按下,同时led=1,也就是说是亮 因此
你的函数的功能基本上可以是 按键按下 led高频闪烁
按键松开 led常亮
所以你要改逻辑结构才行
你可以简单地认为单片机只能输出5V或者0V的电压 分别对应1和0,那么LED灯的另一端接地或者接5V,如果你 的单片机输出5V接到LED灯,LED灯另一端接地 , 那就产生电压了,电路就导通了,灯就亮了 ,反之也是这个道理。时间方面可以写大致的延时,或者用定时器,这样就比较精确了,你学会了这个就可以说入门了。
程序在执行延时的时候根本就没有检测按键,所以你可以加以个中断或者是在程序执行中检测按键,如果检测到了按键松开就用break跳出。#include <reg51.h>
sbit L1=P1^1;
sbit K1=P1^2;
unsigned char i,j;
void delay(int k);
void delay10s(void);
void scan();
void scan()
{
while(1)
{
while(K1==1) L1=0;
if(K1==0) { delay(100);
if(K1==0 ) { for(i=0;i<10;i++)
{ L1=~L1;delay(1000); if(K1==1) break ; }
delay(10000);
}
}
}
}
void main() // 主函数
{
while(1)
{
scan(); //扫描按键
}
}
//--------------------------------
void delay(int k) //延时函数
{
unsigned char i; //定义i为无符号字符型,最大255
for( ;k>0;k--) //外循环
{ if(K1==1) break ;
for(i=250;i>0;i--) if(K1==1) break ; //内循环
}
}
硬件工程师是做什么的?
像51 类单片机的引脚不是很多,但是FPGA 就不一样了,往往有几十个甚至一百多的引脚,我用的altera 的ep1c20 有144 个引脚,全贴片工艺,所以这个时候我们就必须在市场上买一个开发板了。我用的是altera 公司的EP1C20cyclone 系列的开发板,是我们办公室的人以前买的,现在正好我用。据说是5000 元,还是大学计划时候...
什么是单片机中的负跳变呀
为您推荐: 单片机gate SETB单片机 辅助进位单片机 单片机c20ms 单片机与门非门 其他类似问题2007-08-19 在单片机中,负跳变和高脉冲是什么意思? 26 2013-12-24 51单片机INT1中断电平触发方式和跳变沿触发方式有什么区别 20 2012-02-14 请给我解释一下单片机中的跳冒是什么?有什么用?谢谢 2 2009-...
储终长龙: 程序在执行延时的时候根本就没有检测按键,所以你可以加以个中断或者是在程序执行中检测按键,如果检测到了按键松开就用break跳出.#include <reg51.h>sbit L1=P1^1;sbit K1=P1^2;unsigned char i,j;void delay(int k);void delay10s(...
丛台区15250895341: 使用89C51单片机单个按键控制一个数码管,当按键按下时数码管显示1,再次按下时显示0. - ?
储终长龙: SBUF=dispcode[num0];//第回1位答 while(!TI); TI=0; led0=0; delay(2); led0=1; SBUF=dispcode[num1];//第2位 while(!TI); TI=0; led1=0; delay(2); led1=1; SBUF=dispcode[num2];//第3位 while(!TI); TI=0; led2=0; delay(2); led2=1;
丛台区15250895341: 单片机怎样用一个键控制一个io口的高低电位 - ?
储终长龙: 这个很简单,比如:KEY EQU P1.0 CHK_IO EQU P1.4 KEYCIO:JB KEY,$ ;键按下 JNB KEY,$ ;等键抬起 CPL CHK_IO ;IO口取反 RET
丛台区15250895341: at89c51单片机一个开关控制一个灯的程序 - ?
储终长龙: 假如 开关在P1.0, 灯在P1.1 sbit sw= P1^0; sbit led = P1^1; #include "reg52.h" void main(void ) { if(sw==0) { led =0; } else { led =1; } }
丛台区15250895341: 在写51单片机程序的时候,对于用独立按键控制led.比如我按下按键1号,8个灯以1方式流动亮,问题 - ?
储终长龙: 解决这个问题,首先你得会检测按键,其次至少会做2种流水灯效果.基于以上基础,那么程序的架构可以这样来实现:1、定义一个全局变量,存放运行状态2、检测按键,如果key1被按下,那么运行状态为1;如果key2被按下,那么运行状态为23、死循环中,判断这个全局运行状态变量,如果为1,那么就执行流水灯程序1;如果为2,那么就执行流水灯程序2.加油!
丛台区15250895341: 求一段51单片机用按键控制LED的程序. - ?
储终长龙: while(1) { if(num>=20) //num==20最好改成 >=20 防止由于按銉延时而错过num==20的机会而使程序出现长时的混乱 { num=0; led1=~led1; led2=~led2; } if (key==0)//按键是否按下 { 延时10-20ms; while(key==0);//按键是否抬起 if (tr0==1)tr0=0: else tr0=1: } } 也可以用开关中断来实现 如果按键不听使唤,在if (key==0)后大括号里的延时语句后再加一次if (key==0)判断
丛台区15250895341: AT 89c 52单片机两个按键控制一个数码管加减 - ?
储终长龙: 用一位共阳数码管接在P0口,用两个开关,分别接在P3.2和P3.3脚上.仿真图如下
丛台区15250895341: 单片机一个按键控制一个程序 - ?
储终长龙: 这个简单了. 给你一个程序框架 sbit key1=P0^0; sbit key2=P0^1; sbit key3=P0^2; //还可以多写几个键 void main(){ unsigned char zt=0;//程序运行状态变量,用它来标定程序运行在哪个段 while(1){ //按键扫描没加滤波这个如果有需要你自己加...
丛台区15250895341: 单片机AT89C51用C语言编,两个按钮分别控制一个数码管加减数,最好用中 - ?
储终长龙: #include<reg51.h>#define uchar unsigned char uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar dat; void ext0() interrupt 0 { dat++; dat%=10; P1=distab[dat]; } ext1() interrupt 2 ...
丛台区15250895341: 求大神写一个用51单片机和pcf8951,用按键控制输出电压的程序. - ?
储终长龙: 容易理解写:设置b1、b2、b3、reset四按钮(按0)应LED1、LED2、LED3三灯(点亮0) int reset, b1,b2,b3,LED1,LED2,LED3; while(1) {(读取reset) if(reset==0) { LED1=LED2=LED3=1; read=1; } if(read==1) { (读取b1, b2, b3); if(b1==0) { LED1=0; read=0; } elseif(b2==0) { LED2=0; read=0; } elseif(b3==0) { LED3=0; read=0 } else LED1=LED2=LED3=1; } }