proteus仿真按理来说是不可能达得到效果的,因为这种仿真得有非常快的处理速度。我刚动手试了下和自己的想法相同,LED只会间断的闪烁。我是用AVR单片机,用51也是一样的。我这个程序也在实物试过效果很好。演示定时器1的
这位朋友你好,51单片机,如果他的呼吸灯代码,你可以参考他的使用说明书,也就是说他技术指导说明书上会有表达。
单片机最小系统(单片机、晶振、电容、电阻,包括复位电路和震荡电路),+ LED和限流电阻
include "reg51.h" //包含头文件 define uchar unsigned char define uint unsigned int // //延时函数 // delay(uint time) //int型数据为16位,所以最大值为65535 { uint i,j; //定义变量i,j,用
呼吸灯的程序,如果有硬件的PWM模块,是很简单的,按一定的规律让PWM的输出变化就可以。像这样输出10%亮度,持续200ms,输出20%亮度,持续200ms,输出30%亮度,持续200ms。。。如果没有硬件PWM模块,可以用软件来模拟,比如
方法1:1000个左右的灯,需要10根地址线选通,51的IO管脚应该是没有问题。剩下的就是要用大量的译码器,把二进制信息转换为管脚信息。估计你仅仅是控制亮和灭,如果是这样选通也就可以进行明暗的控制,否则输出的信息也要
AJMP START START:MOV P0,#01H;()只有第一个灯亮 ACALL DELAY;延迟,不加延迟的话 你根本看不起清到底那个灯亮的 MOV P0,#02H;()只有第二个灯亮 ACALL DELAY MOV P0,#04H;()只有第三个灯亮 ACALL DELAY M
51单片机设计呼吸灯
简单点的,用表格,事先计算好,放到ROM中,用的时候逐行编译输出就可以。复杂点的,开一个缓冲区,用循环程序,根据花样的不同,每次填充一行,并输出,然后再计算一下行。除非表格太大,不建议这样用。define len
#0FEH MOV LED,A MOV R2,#0 CLR 00HLOOP: CLR TR0LOOPL: JB KEYL,LOOPR SETB TR0 RL A MOV LED,A JNB 00H,$ CLR 00H SJMP LOOPLLOOPR: JB KEYR,LOOP SETB TR
1、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。2、#include "reg51.h"首先写出单片机的头函数。3、#include "intrins.h"输入位移函数。4、unsigned int count=0,led;定义函数。5、输入主函数,定
while(ms--){ for(i=0;i<120;t++){ ; } }}void main(){ unsigned char i=0,j=0; PData=0x00;//全灭状态 for (i=8;i>0;i--){//控制常亮的位置,先从最高位开始,依次循环到最低
51单片机用汇编语言如何设计8个轮流呼吸的呼吸灯?
include
include
GREEN = G; BLUE = B; Delay(pwm);//延时长度,500次循环中从1加至599 }}//改变set可以改变变化快慢//同理你可以写出7色逐渐变暗的程序这里的程序只是提供一个思路,你如果直接复制粘贴的话会出现格式
include
ACALL DELAY MOV P0,#04H;()只有第三个灯亮 ACALL DELAY MOV P0,#08H;()只有第四个灯亮 ACALL DELAY MOV P0,#10H;()只有第五个灯亮 ACALL DELAY MOV P0,#20H;()只有第六个灯亮 ACALL DELAY MOV P0,#40
这位朋友你好,51单片机,如果他的呼吸灯代码,你可以参考他的使用说明书,也就是说他技术指导说明书上会有表达。
include "reg51.h" //包含头文件 define uchar unsigned char define uint unsigned int // //延时函数 // delay(uint time) //int型数据为16位,所以最大值为65535 { uint i,j; //定义变量i,j,用
51单片机led呼吸灯代码
以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。程序中使用了P1.0到P1.3作为控制灯的引脚,P3.2作为按键的引脚。每当按下
以4到5秒的频率变化,先从暗到亮,再从亮到暗,用定时器或软延时,产生频率1KHZ以上的占空比可变的方波。
可以实现 这个有个高大上的名字:呼吸灯 可以自动慢慢亮然后慢慢灭,也可以增加按键控制亮灭的程度 原理是用PWM实现不同电压的输出来实现灯的变亮和变暗,下面是网上截的图,比较容易理解,具体程序的话,就自己动手吧
4.上传程序:将编写好的程序上传到单片机中。将单片机通过USB线连接到计算机,选择正确的开发板和端口,然后点击上传按钮将程序烧录到单片机中。5.测试控制:完成上传后,单片机将开始执行程序。LED灯应该会按照程序中定义的亮灭
一般是用PWM方式控制LED亮度,PWM的输出按照一定的规律变化,就可以做出呼吸灯的效果。再说30个LED的控制,如果要简单点做,30个LED可以串起来串一个电阻,接高点的电源电压,30个LED用同一个信号控制,当然,亮度也是同步变
一般是用PWM方式控制LED亮度,PWM的输出按照一定的规律变化,就可以做出呼吸灯的效果。再说30个LED的控制,如果要简单点做,30个LED可以串起来串一个电阻,接高点的电源电压,30个LED用同一个信号控制,当然,亮度也是同步变
单片机式的呼吸灯控制方法
51单片机高电平驱动能力很弱,输出电流只有300到500uA 因此直接接LED的话,电流很小,亮度很低,就别提加限流电阻了 负载电流大时,需加三极管驱动,但也要求三极管的放大倍数大一些 如果是低电平点亮LED,为了保证LED和单片机
而有些如CM一类的第三方ROM会提供系统级的分应用LED灯设置,不过在实际使用中的表现也不够完美。所以虽然LED呼吸灯本来是一个很好的设计,但是安卓系统却没有做好,于是有些厂商索性就取消了LED灯,或者取消了LED灯的呼吸功
这是正常的,因为你灯的亮灭是由单片机的低电平驱动的(从你程序里看出),而单片机给的高低电平带负载能力不是很强,也就是说它虽然电压达到了,但是电流比较小,我们写程序也是一样的情况。没问题的,不用担心。
所以要确定端口的电平,如果端口输出的是一个脉冲,并且受占空比的影响,那么其端口上所接的led发光也会比较暗。"我是用面包板搭接的电路。我LED阴极接地,阳极接单片机的P1.0,并且输出高电平。",可能问题在这里,你所用
51单片机呼吸灯很暗
点阵的话,我想应该可以通过修改扫描的延时来实现呼吸效果。 例如:行扫描,行切换之间的延时修改,亮度会不一样。 其实扫描对于每个led来说,也是占空比的方波。proteus仿真按理来说是不可能达得到效果的,因为这种仿真得有非常快的处理速度。我刚动手试了下和自己的想法相同,LED只会间断的闪烁。我是用AVR单片机,用51也是一样的。我这个程序也在实物试过效果很好。 *@演示定时器1的快速PWM输出@利用快速PWM输出控制LED的亮度变化,达到呼吸灯的效果*/ #include#include"port_set.h"#include"delay.h" /*********************************************@函数功能:定时器1初始化@说明:定时器初始化为快速PWM,TOP为8位(0x00FF)时钟输入为系统时钟匹配时OC1A输出0,在TOP时输出1OC1B为普通端口输入捕捉触发沿选择下降沿触发捕捉捕捉中断禁止,通道A比较中断禁止通道B比较中断禁止,溢出中断禁止*********************************************/void Timer1_Init(void){TCCR1A = 0x81;TCCR1B = 0x89;OCR1A = (unsigned int)0x0;OCR1B = (unsigned int)0x0;ICR1 = (unsigned int)0x0;TCNT0 = (unsigned int)0x0;SFIOR |= 0x1;TIMSK |= 0x0;} void main(void){unsigned char ocr = 0; //比较值signed char ddr_flag = 1; //比较值的增长方向IO_SET_OUT(B,1); //T1的比较输出端口设置为输出Timer1_Init();while(1){delay_ms(5);//延时一定时间改变一次比较值ocr += ddr_flag;OCR1A = (unsigned int)ocr;/*改变比较值的增长方向*/if(ocr>0xFE)ddr_flag = -1;else if(ocr<0x1)ddr_flag = 1;}}
#include "reg51.h" //包含头文件 #define uchar unsigned char #define uint unsigned int //************************************************************************************************** //延时函数 //************************************************************************************************** delay(uint time) //int型数据为16位,所以最大值为65535 { uint i,j; //定义变量i,j,用于循环语句 for(i=0;i<time;i++) //for循环,循环50*time次 for(j=0;j<50;j++); //for循环,循环50次 } //************************************************************************************************** //主函数 //************************************************************************************************** void main() //主函数 { uint i; //定义变亮i while(1) //进入while死循环 { for(i=0;i<200;i++) //for循环,实现LED由亮逐渐变暗 { P0=0xff; //熄灭8位发光二极管 delay(i); //延时保持熄灭状态i个时间单位 P0=0x00; //点亮8位发光二极管 delay(200-i); //延时保持点亮状态200-i个时间单位 } P0=0xff; //熄灭8位发光二极管 delay(5000); //延时保持熄灭状态5000个时间单位,使现象更明显 for(i=0;i<200;i++) //for循环,实现LED由暗逐渐变亮 { P0=0x00; //点亮8位发光二极管 delay(i); //延时保持熄灭状态i个时间单位 P0=0xff; //熄灭8位发光二极管 delay(200-i); //延时保持点亮状态200-i个时间单位 } } }
用汇编语言让51单片机八个灯从左到右依次点亮且都不灭,每个灯亮的时间间隔0.5秒,然后全灭,再循环之前的步骤。参考如下: 电路 代码 LED_COUNT DATA 30H T0_COUNT DATA 31H ORG 0000H LJMP MAIN ORG 000BH LJMP T0_INT ORG 0030HMAIN: ANL TMOD,#0F0H ORL TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H ORL IE,#82H SETB TR0 CLR F0 MOV LED_COUNT,#00H MOV T0_COUNT,#00H MOV DPTR,#TABM1: JNB F0,M2 CLR F0 MOV A,LED_COUNT MOVC A,@A+DPTR MOV P2,A INC LED_COUNT MOV A,#9 CJNE A,LED_COUNT,M2 MOV LED_COUNT,#00HM2: SJMP M1T0_INT: MOV TH0,#3CH MOV TL0,#0B0H INC T0_COUNT MOV A,#10 CJNE A,T0_COUNT,T MOV T0_COUNT,#00H SETB F0T: RETITAB: DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH END希望能达到你的要求!!!!!
大致看了下,定时器中断直接调用zhankong()这个函数,写在外面的话,由於有其它代码,不可能每次都执行
这个需要看你的芯片那也识别需求了哦,毕竟代码不同的呢,那个需要编码处理的哦。 所以解码方法也不同