A. 单片机按键按五次灯亮
单片机如何设置灯L1到L8循环亮基伏扮5次的程厅陪序:例题:使LED灯先全部闪五次,再实现从L1到L8依次亮起,最后实现从L1到L8依次熄灭。(注:扩展方式为io,即J13跳帽接到io处)#include"reg52.h"流水灯程搏灶序最简单了,而且在知道这里可以搜到无数个例子。循环5次停下来,用for控制循环5次,结束后,用一个while(1); 语句就停了。
B. 单片机怎么实现一个开关控制八个灯按一下亮一个按八下八个灯都亮汇编语言程序
用一个寄存器做变量就可以。
假如按键是一个开个,接在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_ON
CJNE A,#2, LED2_ON
CJNE A,#3, LED3_ON
CJNE A,#4, LED4_ON
CJNE A,#5, LED5_ON
CJNE A,#6, LED6_ON
CJNE A,#7, LED7_ON
CJNE A,#8, LED8_ON
LJMP LOP
LED1_ON: MOV P0,#0FEH //亮一个灯
LJMP LOP
LED2_ON: MOV P0,#0FDH //亮一个灯
LJMP LOP
LED3_ON: MOV P0,#0F8H //亮一个灯
LJMP LOP
LED4_ON: MOV P0,#0F0H //亮一个灯
LJMP LOP
LED5_ON: MOV P0,#0E0H //亮一个灯
LJMP LOP
LED6_ON: MOV P0,#0D0H //亮一个灯
LJMP LOP
LED7_ON: MOV P0,#080H //亮一个灯
LJMP LOP
LED8_ON: MOV P0,#00H //亮一个灯
LJMP LOP
C. 如何用单片机一个按钮开关控制3个灯3种效果。流水。闪烁。还有一直亮。用keil编程。
下面是用C51编写的简单程序:
#include <reg51.h>
#include <intrins.h>
sbit io_Key = P1 ^ 1;
sbit led1 = P1 ^ 2;
sbit led2 = P1 ^ 3;
sbit led3 = P1 ^ 4;
unsigned char ucCount = 0;
bit flag05s = 0;
//---------------------------------
void delay125us(void) //@12.000MHz
{
unsigned char i;
i = 60;
while (--i);
}
void Timer0Init(void) //10毫秒@12MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xF0; //设置定时初值
TH0 = 0xD8; //设置定时初值
TR0 = 1; //开定时器0
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
}
//T0中断用来计数器溢出
void zd0(void) interrupt 1
{
TL0 = 0xF0; //设置定时初值
TH0 = 0xD8; //设置定时初值
if(++ucCount >= 50)
{
ucCount = 0;
flag05s = 1; //g_flag05s = isYes定时0.52秒到,用于测量周期延时
}
}
void main(void)
{
unsigned char CountTemp = 0, ucState = 0;
Timer0Init();
while(1)
{
//-------------------------------
//简单的按键检测程序:
io_Key = 1;
_nop_();
if( io_Key == 0 )
{
CountTemp = 0;
do
{
delay125us();
if( io_Key != 0 ) break;
} while(++CountTemp > 160); // 延时20ms去抖动
if(CountTemp > 160)//如果按键时间有效,改变状态
{
switch(ucState)
{
case(0):
{
ucState = 1;
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(1):
{
ucState = 2;
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(2):
{
ucState = 0;
led1 = 0;
led2 = 1;
led3 = 1;
}
break;
}
while(io_Key == 0); //等待按键释放
}
}
//------------------------------
//每0.5秒改变一下LED状态
if(flag05s == 1)
{
flag05s = 0;
switch(ucState)
{
case(0):
{
led1 = !led1;
led2 = !led2;
led3 = !led3;
}
break;
case(1):
{
bit ledTemp = led1;
led1 = led2;
led2 = led3;
led3 = ledTemp;
}
break;
//LED常亮可以忽略改变LED状态
/*
case(2):
{
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
*/
}
}
}
}
//-----------------------------------------------
//上面程序中有很多地方可以优化,这里只是给出一个参考供学习。
D. 用汇编语言编写一个按钮控制8个流水灯的亮灭
51单片机汇编语言程序设计如下,实现通过按键控制8个流水灯的亮灭功能:
KEY被定义为P3.2端口,LED被定义为P1端口。
程序起始地址为0000H,跳转到主程序MAIN。
主程序MAIN从0030H地址开始:
清除00H单元的内容。
将0FEH的值送入累加器A。
进入循环LOOP。
检查P3.2端口的状态,如果为低电平,跳转到LOOP1。
如果P3.2端口为高电平,则执行下一条指令。
将0FFH的值送入LED端口。
跳转到LOOP2。
进入LOOP2,检查00H单元状态,如果为高电平,则跳转到LOOP2。
将0FFH的值送入P1端口。
右移累加器A的内容。
调用延时子程序DELAY。
返回到LOOP。
延时子程序DELAY从200H地址开始:
将200H送入R2。
进入循环DLY1。
将250H送入R3。
当R3不为0时,循环继续。
R2减1,直到为0,跳出循环。
返回到调用处。
这个程序通过按键P3.2控制8个流水灯P1端口的亮灭,通过右移操作实现流水效果,并通过延时子程序实现一定的视觉效果。在实际应用中,可以根据需求调整延时子程序的延时时间,以适应不同的显示效果要求。
在编写和调试此类程序时,需要注意按键的抖动问题,以及单片机的时钟频率对延时时间的影响。此外,还可以通过增加更多的逻辑判断,实现更加复杂的功能,比如增加计数器,实现流水灯的计数显示,或者加入更多的控制逻辑,实现更复杂的灯光控制效果。
通过这种编程方式,可以实现对单片机的精细控制,满足各种不同的应用需求。在实际应用中,这种编程方式还可以与外部设备或传感器结合,实现更加复杂的功能。