R5,D1 RET (2).输出控制 如图所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.
while(1)if(k1==0){ d1=~d1;d2=~d2;delay(1000);} } 因为我偷懒的关系,程序有个小漏洞,延时函数的x和y应该定义成无符号数更合理
先设置一个位变量,表征现在是启动还是停止。再设置一个位变量,表征应该是LED1亮还是LED2亮。然后在检测到按键的同时,启动定时器,取反第一个变量,计时五秒后取反第二个变量。
;P1.0 P1.1接2LED,P2.0接一按键。上电2LED不亮,按第1 次键2LED同时以1S周期闪烁,按第2 次 2LED轮流1S闪烁同此循环。;11 04 17 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN:MOV TMOD,#
51单片机汇编语言程序,一个按键控制两个发光二极管的同时闪烁,交替闪烁,
// 单片机控制八个led灯, 仿真实例 可以改为 各种花样。include
include
依次循环到最低位 for (j=0;j
led_7 BIT P1.7;;定义开关LED的数据,假定LED正极一端接电源,另一端通过限流电阻接I/O端口:DATA_CloseLED EQU 11111111B;DATA_OpenLED EQU 00000000B;ORG 0000H AJMP MAIN ORG 0030H ;
51单片机用汇编语言实现八个LED的全亮全灭
* 实验内容:用汇编指令对单片机I/O口进行编程,控制8个发光二极管的流水亮灭。 */ /* 程序详细功能介绍: *做单一灯的左移右移,八个发光二极管L0-L7分别接在单片机的P0.0-P0.7接口上, *输出“0”时
i];delay(200);} else for(i=3;i>=0;i--){ //run=1,dir=0,自下而上流动 P2=led[i];delay(200);} else P2=0xff; //若run=0,全部灯灭 } }
51单片机汇编语言编程,流水灯如P1口8个Ⅰ/O依次输出低电平点亮发光二极管,思路可以用定时器中断+计数来定时,可以用位移输出或者用状态表(查表法)输出,如表01111111、10111111、---、11111110,就是查表取状态字节再写入P1
发光,其他熄灭,用这种方式顺序移动点亮LED的位置,就形成了流水灯的效果。以下是程序:;假设晶振12MHZ,P1控制8个LED低电平亮 ;启动入口=== ORG 0000H ;复位启动 AJMP START ;ORG 001BH ;T1中断 AJMP T1INT ;;定义
c51单片机中如何用汇编语言编写流水灯
C语言实现LED灯闪烁控制配套51单片机开发板。include //包含单片机寄存器的头文件 /***函数功能:延时一段时间 / void delay(void) //两个void意思分别为无需返回值,没有参数传递。{ unsigned int i; //定义
1.最简方案——利用延时函数:进入主函数后,初始化LED,设置一个延时初始值,然后进入while循环,里边只做四件事,打开LED,利用键盘返回值作延时函数参数,关闭LED,利用键盘返回值作延时函数参数。2.精确解决方案——定时器
led=1;//点亮 delay(100);//延时100MS led=0;//熄灭 } else led=0;} void delay(unsigned int i){自己根据单片机频率写个1MS带形参的演示程序} 这个程序是现写的。。应该能执行,有些细节没有写,自己修改下,
} 单片机驱动LED光源程序:#include//头文件。定义uint无符号int #定义uchar无符号字符 SbitLED1=P1^7;//定义。空白delay_ms(单位);//带参数的ms级延时函数。Voidmain(){ 而(1){ LED1=0;Delay_
说明:单片机控制LED灯间隔时间闪烁 所用程序很简单,实际情况可作相应变化,也有多种方式实现。proteus电路图 所需元件清单:(分别是) 51单片机 电容 瓷片电容(也可用普通电容) 晶振 红色二极管 电阻 (tip:没有给高电
case 0: led = 1; readkey(); break; //熄灭 case 1: delay(); readkey(); //慢速闪烁 case 2: delay(); readkey(); //中速闪烁 case 3: delay(); readkey(); led = ~led; //快速闪烁 } }
请教c51单片机,c语言编程,关于控制LED灯闪烁频率?
51单片机用汇编语言编写流水灯程序,就是控制多个LED ,使其在特定时间间隔内,只有一个LED 发光,其他熄灭,用这种方式顺序移动点亮LED的位置,就形成了流水灯的效果。以下是程序: ;假设晶振12MHZ,P1控制8个LED低电平亮 ;启动入口======================== ORG 0000H ;复位启动 AJMP START ; ORG 001BH ;T1中断 AJMP T1INT ; ;定义变量======================== YSJS EQU 30H;延时计数器 LED EQU 31H;LED控制缓冲器 ;主程序========================== START: MOV LED,#0FEH ;初始化数据 MOV YSJS,#0 ; ; MOV TMOD,#10H ;定时器1工作于方式1,16位定时器 MOV TL1,#0B0H ;设置定时初值 MOV TH1,#3CH ;定时时间=50mS SETB ET1 ;使能定时器1中断 SETB TR1 ;启动定时器1 SETB EA ;开总中断 MOV P1,LED ;初始化流水灯 ; LOOP: JMP LOOP ;循环等待中断 ; ; T1INT: PUSH PSW ;定时器1中断程序 PUSH ACC ;保护现场 ; MOV TH1,#3CH ;定时时间=50mS MOV TL1,#0B0H ; INC YSJS ; PUSH ACC ;保护ACC MOV A,YSJI ; CJNE A,#2,QT1 ;50mS*2=100mS MOV P1,LED ; MOV A,LED ; RL A ;累加器A的值循环左移1位 MOV LED,A ; MOV YSJS,#0 ; ; QT1: POP ACC ;恢复现场 POP PSW ; RETI ;返回主程序 END ;汇编程序结束流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下: ORG 0000H ;复位启动AJMP START ;ORG 001BH ;T1中断AJMP T1INT ; ;定义变量========================YSJS EQU 30H;延时计数器LED EQU 31H;LED控制缓冲器 ;主程序==========================START: MOV LED,#0FEH ;初始化数据MOV YSJS,#0 ;MOV TMOD,#10H ;定时器1工作于方式1,16位定时器MOV TL1,#0B0H ;设置定时初值MOV TH1,#3CH ;定时时间=50mSSETB ET1 ;使能定时器1中断SETB TR1 ;启动定时器1SETB EA ;开总中断 MOV P1,LED ;初始化流水灯LOOP: JMP LOOP ;循环等待中断T1INT: PUSH PSW ;定时器1中断程序PUSH ACC ;保护现场MOV TH1,#3CH ;定时时间=50mSMOV TL1,#0B0H ;INC YSJS ; PUSH ACC ;保护ACCMOV A,YSJI ;CJNE A,#2,QT1 ;50mS*2=100mSMOV P1,LED ;MOV A,LED ;RL A ;累加器A的值循环左移1位MOV LED,A ;MOV YSJS,#0 ;QT1: POP ACC ;恢复现场POP PSW ;RETI ;返回主程序END ;汇编程序结束 扩展资料: 实现流水灯的三个方法: 第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。 第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。 第三种,库函数实现流水灯。利用左移函数进行。
;以89c51单片机为例,假定用P1控制LED: IO_LED EQU P1; led_0 BIT P1.0; led_1 BIT P1.1; led_2 BIT P1.2; led_3 BIT P1.3; led_4 BIT P1.4; led_5 BIT P1.5; led_6 BIT P1.6; led_7 BIT P1.7; ;定义开关LED的数据,假定LED正极一端接电源,另一端通过限流电阻接I/O端口: DATA_CloseLED EQU 11111111B; DATA_OpenLED EQU 00000000B; ORG 0000H AJMP MAIN ORG 0030H ;----------------------- ;延时0.5秒程序(注:此延时函数摘自STC-ISP) DELAY500MS: ;@12.000MHz PUSH 30H PUSH 31H PUSH 32H MOV 30H,#4 MOV 31H,#205 MOV 32H,#180 NEXT: DJNZ 32H,NEXT DJNZ 31H,NEXT DJNZ 30H,NEXT POP 32H POP 31H POP 30H RET ;----------------------- ;下面是主程序 MAIN: MOV IO_LED,#DATA_CloseLED;同时关闭8个LED LCALL DELAY500MS;延时0.5秒 MOV IO_LED,#DATA_OpenLED;同时打开8个LED LCALL DELAY500MS;延时0.5秒 LJMP MAIN;循环 END; 上面程序演示了8个LED间隔0.5秒同时亮和灭的变化。
#include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 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); } }
;间隔时间不计较精度 ORG 00H LOOP: MOV P1.0,C CPL C ;标志取反 MOV P1.1,C ACALL DELAY ;调用延时子程序 JMP LOOP ;返回,继续 DELAY: ;延时子程序 MOV R7,#200 LP7: MOV R6,#200 LP6: MOV R5,#200 DJNZ R5,$ DJNZ R6,LP6 DJNZ R7,LP7 RET
MAIN: MOV P1, #11111110B ; P1 口 点亮一个发光二极管 ACALL DELAY ; 调用延时子程序 MOV P1, #11111101B ; 从左向右移动 一位 ACALL DELAY MOV P1, #11111011B ACALL DELAY MOV P1, #11110111B ACALL DELAY MOV P1, #11101111B ACALL DELAY MOV P1, #11011111B ACALL DELAY MOV P1, #10111111B ACALL DELAY MOV P1, #01111111B ACALL DELAY JMP MAIN ; 转移 至 MAIN 循环 DELAY: MOV R5,#250 ; 延时子程序 6.000 M 晶振 约 0.5 秒 D1: MOV R6,#250 D2: DJNZ R6,$ DJNZ R5,D1 RET