//主程序 void main(){ uint s;while(1){ P0=0xfe;DelayMS(150);for(s=8;s>1;s--){ P0=_crol_(P0,1); //P0 的值向左循环移动 DelayMS(150);} P0=0x00;DelayMS(150);p0=0xff;DelayMS(150);
P3=0xbf;//第七个灯亮 delay();P3=0x7f;//第八个灯亮 delay();} }
delay:mov r6,#0ffh loop1: mov r7,#01h djnz r7,djnz r6,loop1 ret end 好像是这样,延迟时间可能不太准,也是P1口接8个LED灯
include
51单片机制作一个由一个按钮控制的8盏流水灯程序,要求按下按钮后流水灯先从左到右闪两次
你首先要确定你的电路。选择什么单片机和数码管,8个按键最简单8个IO口控制。一般简单的是用三极管驱动数码管。如果你会C语言的话,很容易上手。自己先从控制1个数码管学,在控制2个数码管(2个数码管基本上可以完成上面
sbit k = P1^0; //P1.0作为按键输入 int led=0xff;void main(){ P2 = led; //led初始赋给P2口 while(1){ if(k==0) //如果按键按下 { while(k==0); //判断按键松开 led=~led;P2 = le
比如你的8个灯连在 P0口,如果是阴极的 你只要先定义 sbit P0^0=LED0;一定定义下去 然后再定义一个按钮 比如P1.1 sbit P1^1=key;代码里写 while(true){if(key==1){LED0=0;LED1=0;..//把你要亮的
你按一下按钮,给对应LED灯的口赋值#0FEH(1111 1110)第一个灯亮,松开给(1111 1111)都灭,再按一下给(1111 1101),依次这样循环就行了。
首先要知道你控制led灯的芯片是,然后要知道你的led灯是接在哪些io口上的,这样你就可以,还要查看电路图,是低电位有效还是高电位有效,知道这些,你就可以对某一个io口进行置零或置1,进行对led灯进行控制
利用一个按键,控制8个LED流水灯的开始和停止,起始状态为8个LED全亮。用C语言编写
我说一个可行的吧,但是不一定是最好的。定义一个位变量 bit fangxiang=1 ; //1表示一个方向,0表示另一个方向。用定时器自动控制灯移动。主循环里面这样写 while(1){ 检测P10按键;如果有按键;fangxiang=!方向;
流水灯的按键需要一直按着才能改变流水方向,这是由于流水灯的控制方式决定的。流水灯一般是通过微处理器或者电子时钟芯片控制的,其控制方式为循环扫描控制,即不断重复执行一个循环,在每个循环中对流水灯进行控制。按键触发后
51单片机实现方法:按键控制标志位flag取反。然后把下面的代码放到循环里:U8 temp0 = 1。U8 temp1 = 0x80。U8 i = 0。if(flag == 1)。{。for(i=0;i<8;i++)。{。P1=temp0<
简单点的,用表格,事先计算好,放到ROM中,用的时候逐行编译输出就可以。 复杂点的,开一个缓冲区,用循环程序,根据花样的不同,每次填充一行,并输出,然后再计算一下行。除非表格太大,不建议这样用。当单片机接收到按
K1、K3、K4。K1是总开关,当K1首次按下时,流水灯由下往上流动、当K2按下时停止流动、当K3按下时,使灯由上往下流动、K4则是由下往上流动。
可以通过控制按键的次数来控制流水灯的亮度,每次按下按键,流水灯就会改变灯光的亮度。
有没有用一个按键进行流水灯的转换方向
P2=led[i];delay(200);} else for(i=3;i>=0;i--){ //run=1,dir=0,自下而上流动 P2=led[i];delay(200);} else P2=0xff; //若run=0,全部灯灭 } }
include "reg51.h" // 包含头文件 define uchar unsigned char void delay02s(void) // 延时0.2s子程序 { unsigned char i,j,k;for ( i=2;i>0;i-- )for (j=200;j>0;j-- )for (k=250
这是8个流水灯加上3个控制开关,可先画出仿真图,才可以根据仿真图写程序。8个流水灯接在P1口,且二极管负极接P1口引脚,则P1口引脚输出低电平流水灯点亮。3个按键开关接在P3.4、P3.5、P3.6三个脚上。
K1 EQU P1.0K2 EQU P1.1ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,#0FEH CLR 00H CLR 01HLOOP: JB K1,LOOP1 SETB 00H CLR 01H SJMP LOOPLOOP1: JB K2,LOOP2 SETB 01H
对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内
如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED流水灯向左移动?
单片机的P1.0-P1.3接四个发光二极管L1-L4的阴极,P1.4-P1.7接四个开关K1-K4程序:ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP START可以检测单个按键,也可以同时检测多个按键过程:开始--读P1口数据到A--A中的数据右移4次--A中的内容和F0H相或--A中的数据送到P1口--回到开始有这么好的动手机会,就自己做吧。对以后非常有用(过来人的建议。)。 分享下我思路: 1、将你控制用的单片机datasheet下载下来,不用全看,挑需要的看,其他的以后研究。 2、这个项目只是控制单片机的流水灯而已,由于你未提供原理图,我就假设一个IO口控制一盏灯,程序设计流程如下: 初始化单片机(设置定时器的定时时间为0.1s,控制灯,数码管的IO口设置为输出模式,检测按键的IO口设置为输入模式) -----> 写三个函数模块(按键检测函数模块keyscan(char times);,流水灯控制模块LED_Ctrl(char times,char direction)(times为间隔时间,dir为流水灯方向);间隔时间显示函数Display();); -----> 在定时中断函数里分别设置0.1s,0.5s,1s,1.5s,2s的中断标志(即在里面计数,进中断1次,5次,10次,15次,20次。); -----> 主循环重复跑这几个函数模块 以下为伪代码: int main(void) { Initialize(); while(1) { keyscan(); Display(times); LED_Ctrl(times, dir);//times在keyscan()函数里更改. } }
你按一下按钮,给对应LED灯的口赋值#0FEH(1111 1110)第一个灯亮,松开给(1111 1111)都灭, 再按一下给(1111 1101),依次这样循环就行了。
51汇编程序如下: KEY EQU P3.2 LED EQU P1 ORG 0000H LJMP MAIN ORG 0030H MAIN: CLR 00H MOV A,#0FEH LOOP: JB P3.2,LOOP1 JNB P3.2,$ CPL 00H LOOP1: JB 00H,LOOP2 MOV LED,#0FFH SJMP LOOP LOOP2: MOV P1,A RL A LCALL DELAY SJMP LOOP DELAY: MOV R2,#200 DLY1: MOV R3,#250 DJNZ R3,$ DJNZ R2,DLY1 RET END
#include#include#define uchar unsigned charsbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);}main(){uchar flag=0;uchar led=0xff;while(1) { if(k1==0) { delay(10); if(k1==0) { while(k1==0); flag=1; led=0xfe; } } if(k2==0) { delay(10); if(k2==0) { while(k2==0); flag=2; } } if(k3==0) { delay(10); if(k3==0) { while(k3==0); flag=3; } } if(k1==0) { delay(10); if(k4==0) { while(k4==0); flag=4; } } switch(flag) { case 1:P0=led;led=_crol_(led,1);delay(100);break; case 2:P0=0xff;led=0xff;break; case 3:P0=led;break; case 4:P0=led;led=_crol_(led,1);delay(100);break; default:break; } }}
# include "reg51.h" // 包含头文件 #define uchar unsigned char void delay02s(void) // 延时0.2s子程序 { unsigned char i,j,k; for ( i=2;i>0;i-- ) for (j=200;j>0;j-- ) for (k=250;k>0;k-- ); } void main (void) // 主函数 { uchar i,j; while (1) // 死循环 { j=0x01; // j初始化为0x01,左移初始值 for(i=0;i<8;i++) // for循环语句,完成8个循环 { P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出 delay02s( ); // 延时0.2s j= j<<1; // 左移1位 } j=0x80; // 设置右移初始值j为0x80 for (i=0;i<8;i++) { P1= ~ j; delay02s( ); j= j>>1; // 右移1位 } } } 这只是延时的方法实现的。