我还附带给你加了按键防抖,程序如下:include
void scan_key(void);//用来控制LED_RED void DelayMS(unsigned int x);void main(){ while(1){ if(K==0)LED_BLUE=1;scan_key();else LED_BLUE=0;} } void scan_key(void){ unsigned int i;for(i=0;i
include
if(key1==0){led1=1;led2=1;} } if(key2=0){deIayms(20);if(key2=0){led1=0;led2=0;} } }
void led_filcker(usigned char x){ while(x){ led1=~led1;x--:} } 如果你是想,按一下,松开也会闪烁,再按一下熄灭。你得定义一个变量来表示按键的按下。include
void main(){ led=1;//初始化输出,可初始化=0 while(1){ if(key1==0){ led=0;//亮 } if(key2==0){ led=1;//灭 } } }
Delay(10);if(!key1) { while(!key1);led1 = ~led1;//KEY1按一下LED1亮 再按一下LED1灭 } } if(!key2) { Delay(10);if(!key2) { while(!key2) led1 = 1; //按下KEY2时LED1灭 led2
求一单片机C语言程序:两个按键控制两个LED KEY1按一下LED1亮 再按一下LED1灭 KEY2按下LED2亮 LED1灭
STM32微控制器的GPIO相关寄存器包括GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_IDR、GPIOx_ODR、GPIOx_BSRR、GPIOx_LCKR等。详细解释:1. GPIOx_MODER寄存器:这个寄存器用于设置GPIO端口的工作模式。
路灯控制器通常不属于可编程PLC(可编程逻辑控制器)。可编程PLC是一种专门用于工业自动化控制的设备,它具有可编程的功能,可以根据不同的需求进行逻辑控制和数据处理。PLC通常用于工业生产线、机械设备等领域,用于控制和监控
GPIO_ResetBits就是将对应的GPIO位输出0,两边电压差为0时就关闭LED灯了。集成嵌入式Flash和SRAM存储器的ARM Cortex-M3内核。和8/16位设备相比,ARM Cortex-M3 32位RISC处理器提供了更高的代码效率。STM32F103xx微控制器带
我不知道为什么中文复制之后这里变乱码了,所以截图作为参照,代码附在后面:include "sys.h"#include "usart.h"#include "delay.h"#include "led.h" #include "key.h" //°´¼ü´¦À
具体步骤如下:1. 确定控制LED的GPIO引脚。在STM32开发板上,通常会有一些可用的GPIO引脚用于控制LED灯。2. 在代码中配置GPIO引脚的模式为输出模式。这可以通过设置GPIOx_MODER寄存器来实现,其中x表示GPIO引脚所在的端口。3
嵌入式智能路灯控制器:STM32的创新解决方案 随着城市化进程的加速,路灯的需求日益增长,但能耗和维护问题成为关注焦点。我们的目标是利用STM32的卓越性能,设计一款具有手动、时间及光敏三种控制模式的智能路灯控制器,配备实时
基于STM32嵌入式开发的路灯控制器
uchar num,temp,times,led;t0isr() interrupt 1 { TH0=(65536-50000)/256;TL0=(65536-50000)%256;times++;if(times>=10){ times=0;P0=led;if(key1==0){ num++;num&=0x07;} else if(key2==0){ if(num
判断开关对应的端口电平,改变led对应端口即可。交替闪烁就是在循环中让两个LED端口交替高低电平。循环中加入延时。延时函数我用循环实现。题目没有要求精准延时,如精准需用中断。include
{ while(key==0)//按键没有抬起 { led=!led; delayms(200);}//LED闪烁 } } else led=0;}
}}按键控制两个灯#include
led1 = ~led1;//KEY1按一下LED1亮 再按一下LED1灭 } } if(!key2) { Delay(10);if(!key2) { while(!key2) led1 = 1; //按下KEY2时LED1灭 led2 = ~led2;//KEY2也是这样 } } } }
if(key1==0){led1=1;led2=1;} } if(key2=0){deIayms(20);if(key2=0){led1=0;led2=0;} } }
两个按键怎么实现两个Led灯切换,单片机c语言怎么写?
{ led1=~led1;x--:} } 如果你是想,按一下,松开也会闪烁,再按一下熄灭。你得定义一个变量来表示按键的按下。include
if(key1==0){led1=1;led2=1;} } if(key2=0){deIayms(20);if(key2=0){led1=0;led2=0;} } }
while(1){ if(key==0)//按键按下 { delayms(20);//延时消抖 if(key==0)//再次判断按键是否按下 { while(key==0)//按键没有抬起 { led=!led; delayms(200);}//LED闪烁 } } else led=0;}
led1 = ~led1;//KEY1按一下LED1亮 再按一下LED1灭 } } if(!key2) { Delay(10);if(!key2) { while(!key2) led1 = 1; //按下KEY2时LED1灭 led2 = ~led2;//KEY2也是这样 } } } }
define K p0^7 define LED_BLUE p0^0 define LED_RED p0^4 void scan_key(void);//用来控制LED_RED void DelayMS(unsigned int x);void main(){ while(1){ if(K==0)LED_BLUE=1;scan_key();else LED_BLUE
单片机编写两个按键控制两个LED灯的程序,要求当按下任何一个按键并松开后,两个LED灯的亮灭状态同时改变
判断开关对应的端口电平,改变led对应端口即可。交替闪烁就是在循环中让两个LED端口交替高低电平。循环中加入延时。延时函数我用循环实现。题目没有要求精准延时,如精准需用中断。include
一个按键时程序如下:while(1){ if(key==0)//按键按下 { delayms(20);//延时消抖 if(key==0)//再次判断按键是否按下 { while(key==0)//按键没有抬起 { led=!led; delayms(200);}//LED闪烁 } } else l
void Delay(unsigned int x){ unsigned int i, j;for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);} //KEY1按一下LED1亮 再按一下LED1灭 //KEY2按下LED2亮 LED1灭 main(){ while(1)
includereg52.h //头文件 //头文件包含特殊功能寄存器的定义 sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 void Delay(unsigned int t); //函数声明 /*--- 主
很简单那就是当按下某个按键时调用对应LED灯闪烁程序就可以了
单片机 两个按键各自控制两个LED以不同频率闪烁,互不影响。就是两组控制。程序该怎么写?
while (1) //主循环,程序无限循环执行该循环体语句 { P0 = ~(0x01 << cnt); //P0等于1左移cnt位,控制8个LED for (i=0; i<20000; i++); //软件延时 cnt++; //移位计数变量自加1 if (cnt
;led1 = ~led1;//KEY1按一下LED1亮 再按一下LED1灭 } } if(!key2) { Delay(10);if(!key2) { while(!key2) led1 = 1; //按下KEY2时LED1灭 led2 = ~led2;//KEY2也是这样 } } } }
实现两个按键控制LED流水灯,按下P3.0,8个LED循环左移,按下P3.1,8个LED循环右移 调试时只能循环一次 10 ORG0000HLJMPMAINORG0030HMAIN:MOVP1,#00HMOVP3,#0FFHLOOP:MOVP1,#00HJNBP3.0,KEY1JNBP3.1,KEY2LJMPLOOPKEY1:ACALL
}void main(void){ while(1) { if( is_key1_press() && is_key2_press()) { set_led_to(LED_
等到执行到 while(!ReadValue);//等待按键被放开 这条指令时 数据仍然是上次采集到的那个值代表按键按下,(!ReadValue)这个值永远成立,所以无法代表按键断开。所以程序一直卡死在这条指令上。如果要通过就必须在判据里重新
define K p0^7 define LED_BLUE p0^0 define LED_RED p0^4 void scan_key(void);//用来控制LED_RED void DelayMS(unsigned int x);void main(){ while(1){ if(K==0)LED_BLUE=1;scan_key();else LED_BLUE
我不知道为什么中文复制之后这里变乱码了,所以截图作为参照,代码附在后面:include "sys.h"#include "usart.h"#include "delay.h"#include "led.h" #include "key.h" //°´¼ü´¦À
基于STM32的嵌入式系统:编程实现2个按钮控制LED灯,按下button1,LED1翻转;按下button2,LED2翻转。
有问题的那个程序 u8 ReadValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10); 只在上面那条指令采集了一次按键数据。 等到执行到 while(!ReadValue);//等待按键被放开 这条指令时 数据仍然是上次采集到的那个值代表按键按下,(!ReadValue)这个值永远成立,所以无法代表按键断开。所以程序一直卡死在这条指令上。如果要通过就必须在判据里重新读取按键状态,像正确的程序那样用这样的指令 while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10));//等待按键被放开 另外因为你只读取了一次按键状态,所以下面那么多一堆软件消除抖动的程序白写了。 综上,正确的程序在每个判断的时刻都要重新读取下按键状态。#include sbit KEY = P3^3; sbit LED = P3^6; void delay20ms(void) { unsigned char a,b; for(b=146;b>0;b--) for(a=67;a>0;a--); } main() { KEY = 1; while(1) { if(KEY==0) { delay20ms(); //消除按键抖动 if(KEY==0) { while(KEY==0); //等待按键放开 LED = ~LED; } } } }
你的led1=~led1;这个语句没有循环,所以只会反转一次。要么加循环,要么再写一个闪烁函数。 void led_filcker(usigned char x) { while(x) { led1=~led1; x--: } } 如果你是想,按一下,松开也会闪烁,再按一下熄灭。你得定义一个变量来表示按键的按下。 #include #define uchar unsigned char bit stop=1; sbit k5=P1^4; void delay(uchar xms) { while(xms--); } void main() { if(k5==0) { delay(1000); if(k5==0) { while(k5==0) { if(stop) <<<<<<<<<<<<<<<此处执行你的语句 else stop=~stop: } } }}
用定时器 int a=0; void Timer0Init(void) //100微秒@11.0592MHz { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x02; //设置定时器模式 TL0 = 0xA4; //设置定时初值 TH0 = 0xA4; //设置定时重载值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 } void interrupt 1 { a++; if(a==5000) P0^0=! P0^0; if(a==10000) { P0^1=! P0^1; P0^0=! P0^0; a=0; } }
如果说用一个按键分别控制两个LED闪烁还有点难度,像你说的那样各控各的还有什么难度吗?
#include #define uchar unsigned char sbit key = P1^0; sbit led0 = P1^1; sbit led1 = P1^2; uchar count = 0; void delayms (uchar time)//延时 { for(time; time>0; time--) { TMOD |= 0x01; TH0 = 0xfc; TL0 = 0x18; TR0 = 1; //启动计数器0 while(TF0!=1);//计数溢出 TF0 = 0; TR0 = 0; } } void scan_key (void) { if (!key) { delayms (5); if (!key) { delayms (1); while (!key); count++; if (count==3) { count = 0; } } } } void main (void) { P1 = 0xff; while (1) { scan_key (); if (count==0) { led0 = 1; led1 = 1; } if (count==1) { led0 = 0; led1 = 1; } if (count==2) { led0 = 1; led1 = 0; } } }
给你个没有按键的,按键程序自己加上就行了 #include void main() { unsigned int i = 0; //定义循环变量i,用于软件延时 unsigned char cnt = 0; //定义计数变量cnt,用于移位控制 while (1) //主循环,程序无限循环执行该循环体语句 { P0 = ~(0x01 << cnt); //P0等于1左移cnt位,控制8个LED for (i=0; i<20000; i++); //软件延时 cnt++; //移位计数变量自加1 if (cnt >= 8) //移位计数超过7后,再重新从0开始 { cnt = 0; } } }
假设高电平点亮led while(1) { if(s1==0){ led1=0;led2=1;delayms(200);led1=1;led2=0;delayms(200);} else{led1=0;led2=0;} }
具体看LED的接法,改变两个if的参数,改变状态效果:例如led一边接了高电平,连接单片机这边给led=0为亮,若led一边为地GND(就是低电平)另外一边就要led=1才亮。 以下程序为一边接高电平,单片机引脚给0亮给1灭 #include sbit led=P1^0; sbit key1=P1^1; sbit key2=P1^2; void main() { led=1;//初始化输出,可初始化=0 while(1) { if(key1==0) { led=0;//亮 } if(key2==0) { led=1;//灭 } } }
P1.0 接KEY1 到地 ,P1.1接KEY2到地,P0.0接LED到高电平。 我还附带给你加了按键防抖,程序如下: #include sbit key1=P1^0; sbit key2=P1^1; sbit led=P0^0; void delay(m) { int i,j; for(i=0;i<m;i++) { for(j=0;j<125;j++) { } } } void main() { while(1) { P1=0xff; if (key1==0) { delay(20); if(key1==0) { while(!key1); led=0; } } if (key2==0) { delay(20); if(key2==0) { while(!key2); led=1; } } } }