一个简单的点亮LED灯程序
- 格式:doc
- 大小:12.00 KB
- 文档页数:1
实验一点亮你的LED灯一、实验目的1.学会使用51单片机开发的两大软件:编程软件Keil μVision4(简称Keil C51)和下载软件STC-ISP。
2.理解单片机最小系统、单片机外围电路、Flash、RAM和SFR概念。
3.了解普通发光二级管的参数,掌握限流电阻的计算方法。
二、实验内容通过对单片机编程来实现LED小灯的亮和灭。
三、实验参考原理3.1 单片机内部资源1)Flash 程序存储空间2)RAM 数据存储空间3)SFR 特殊功能寄存器3.2 单片机最小系统单片机最小系统的三要素是电源、晶振、和复位电路。
1)电源目前主流单片机分为5V和3.3V这两个标准,本实验中的STC89C52为5V供电系统,开发板是使用USB口输出的5v直流直接供电的。
从上图可以看到,供电电路在40引脚和20引脚,40引脚接的是+5V,通常也成为VCC或VDD,代表的是电源正极,20引脚接的GND,代表的是电源负极。
2)晶振晶振,又叫晶体振荡器,它起到的作用是为单片机提供基准时钟信号,单片机内部所有的工作都是以这个时钟信号为步调基准来进行工作的。
SRC89C52单片机的18号引脚和19号引脚是晶振引脚,接了一个11.0592MHZ的晶振(每秒振荡11059200次),外加两个20pf的电容,电容的作用是帮助晶振起振,并维持震荡信号的稳定。
3)复位电路复位电路接到了单片机的9号引脚RST复位引脚上。
单片机复位一般分为3种情况:上电复位、手动复位和程序自动复位。
总之,一个单片机具备这三个条件就可以运行下载的程序,开发板上其它的比如LED小灯、数码管、液晶等设备都是属于单片机的外设设备,最终用户想要的功能,就是通过对单片机编程来控制各种各样的外设实现的。
3.3 LED小灯LED,即发光二极管,俗称LED小灯。
种类很多,KST使用的是普通的贴片发光二极管。
这种发光二极管的正向导通电压是1.8~2.2V之间,工作电流一般在1~20mA之间。
51单片机控制LED灯程序设计首先,我们需要明确要使用到的硬件资源和引脚连接情况。
假设我们使用的是STC89C51单片机,LED灯的正极连接到单片机的P1口,负极通过电阻连接到地。
接下来,我们需要了解一些基本的汇编指令和编程规范。
在编写51单片机程序时,需要使用到一些特定的寄存器和指令。
首先是P1寄存器,它用来控制P1口的输出和输入状态。
然后是MOV指令,这是一个用来将数据从一个寄存器复制到另一个寄存器的指令。
最后是一个延时函数,可以利用循环来实现延时。
首先,我们需要初始化P1口为输出状态。
在51单片机中,IO口可以被配置为输入(1)或输出(0)。
我们可以使用MOV指令将0赋值给P1寄存器,将其配置为输出。
此外,我们还需要一个简单的延时函数,来控制LED灯的亮灭时间。
下面是一个基本的51单片机控制LED灯的程序:```assemblyORG0;程序的起始地址MOVP1,;初始化P1口为输出状态LOOP:;主循环MOVP1,;将P1的状态置为0,LED灯灭ACALLDELAY;调用延时函数,延时一段时间MOVP1,;将P1的状态置为1,LED灯亮ACALLDELAY;调用延时函数,延时一段时间JMPLOOP;无限循环DELAY:;延时函数MOVR3,;初始化循环计数器为250LOOP1:MOVR2,;初始化循环计数器为250LOOP2:MOVR1,;初始化循环计数器为250LOOP3:DJNZR1,LOOP3;内层循环DJNZR2,LOOP2;中层循环DJNZR3,LOOP1;外层循环RET;返回主程序```以上是一个简单的51单片机控制LED灯的汇编程序。
程序中通过不断切换P1口的状态来实现LED灯的亮灭。
同时,通过调用延时函数来实现亮灭的时间间隔。
在主循环中,LED灯会亮和灭各一段时间,然后无限循环。
为了将以上汇编程序烧录到单片机中,需要将其汇编为二进制文件。
通常可以使用Keil C等开发工具进行汇编和烧录操作。
430单片机点亮LED实验报告一.安装实验软件IAR二.编写点亮LED灯程序1.使P1.0口LED灯会不停的闪烁着,程序#include <msp430x14x.h>typedef unsigned int uint;typedef unsigned char uchar;/*延时函数*/void Delay_Ms(uint x){uint i;while(x--)for(i=0;i<250;i++);}/*主函数*/int main( void ){WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out resetP2DIR|=BIT0;//定义P1口为输出while(1)//死循环{P2OUT^=BIT0;//P1.0口输出取反Delay_Ms(600);//稍作延时}}下载进去看到了P1.0口LED灯会不停的闪烁着。
2.实验目的让两盏灯交换闪烁程序#include"msp430g2553.h"void main(void) {void Blink_LED();WDTCTL=WDTPW+WDTHOLD; //关闭看门狗P1DIR=BIT6;P2DIR=BIT0;while(1){Blink_LED();}}void Blink_LED(){_delay_cycles(1000000); //控制第二个LED P1OUT^=BIT6;_delay_cycles(1000000); //控制第一个LEDP2OUT^=BIT0;}我编写这段程序的现象是一个灯先亮,另一个后亮,一个灯先灭,后一个再灭。
就是两个灯的状态没有做到相反。
后来我在我程序上做了一些改动。
#include"msp430g2553.h"void main(void) {void Blink_LED();WDTCTL=WDTPW+WDTHOLD; //关闭看门狗P1DIR=BIT6;P2DIR=BIT0;P1OUT |= BIT6;P2OUT &= ~BIT6;while(1){Blink_LED();}}void Blink_LED(){_delay_cycles(1000000); //控制第二个LEDP1OUT^=BIT6;P2OUT^=BIT0;}3.LED灯逆循环点亮程序#include <reg52.h>typedef unsigned char uint8; typedef unsigned int uint16; sbit ENLED1=P1^4;sbit ENLED2=P1^3;sbit ADDR0 =P1^0;sbit ADDR1 =P1^1;sbit ADDR2 =P1^2;main(){uint16 i;uint8 j;ENLED1=0; ENLED2=1;ADDR0=0; ADDR1=1; ADDR2=1; while(1){P0=~(80>>j++);for(i=1;i<20000;i++);if(j==8)j=0;}}我写好程序了可是运行的时候结果不对),之后继续修改程序while循环都没有对LED的串口做任何处理,把“P0=~(80>>j++); ”改成“P0=~(0x80>>j++); ”#include <reg52.h>typedef unsigned char uint8;typedef unsigned int uint16;sbit ENLED1=P1^4;sbit ENLED2=P1^3;sbit ADDR0 =P1^0;sbit ADDR1 =P1^1;sbit ADDR2 =P1^2;main(){uint16 i;uint8 j;ENLED1=0; ENLED2=1;ADDR0=0; ADDR1=1; ADDR2=1;while(1)P0=~(0x80>>j++); //P0=~(80>>j++);for(i=1;i<20000;i++);if(j==8){j=0;}}四.实验总结由于之前学过一段时间51单片机,所以有些东西比较清楚,但430和51一有很大不同,虽然内部结构很像,但430的寄存器的设置很麻烦,比如P1 P2口,那可真是麻烦得很,430这个IO口设置了如很多的功能,并且单独抽出了好几个设置的寄存器。
led灯的点亮实验报告LED灯的点亮实验报告引言:LED(Light Emitting Diode)是一种能够发光的半导体器件,具有高效、低能耗、长寿命等优点,因此在现代照明领域得到广泛应用。
本次实验旨在通过实际操作,探究LED灯的点亮原理以及相关电路的搭建方法。
一、实验目的通过实验,了解LED灯的工作原理,掌握LED灯的点亮条件,学习搭建简单的LED灯电路。
二、实验材料1. LED灯:一颗红色LED灯2. 电池:一节9V电池3. 电线:两根导线三、实验步骤1. 连接电路将一根导线的一端连接到电池的正极,另一端连接到LED灯的长脚(阳极);将另一根导线的一端连接到电池的负极,另一端连接到LED灯的短脚(阴极)。
2. 观察实验现象打开电池开关,观察LED灯是否点亮。
如果LED灯点亮,则实验成功;如果LED灯未点亮,则检查电路连接是否正确,或更换电池。
四、实验原理LED灯的点亮原理是基于半导体材料的特性。
当电流通过LED灯时,半导体材料中的电子和空穴结合,产生能量,进而发出光线。
LED灯的点亮需要满足以下两个条件:1. 正向电压:LED灯是一种二极管,只有在正向电压下才能正常工作。
正向电压是指将正极连接到LED灯的长脚,负极连接到LED灯的短脚。
2. 适当电流:LED灯的点亮还需要适当的电流通过。
过高或过低的电流都会影响LED灯的亮度和寿命。
五、实验结果与分析通过本次实验,我们成功点亮了LED灯。
LED灯的点亮表明电路连接正确,并且电池提供了足够的正向电压和适当的电流。
LED灯的亮度取决于电流的大小,通过调节电池的电压或电阻的阻值,可以改变LED灯的亮度。
六、实验应用与展望LED灯具有节能、环保、寿命长等优点,因此在照明领域得到广泛应用。
LED灯不仅可以用于室内照明,还可以应用于汽车照明、显示屏、信号灯等领域。
未来,LED技术的发展将更加成熟,LED灯的亮度和效率将进一步提升。
七、实验总结本次实验通过搭建LED灯电路,成功点亮了LED灯。
proteus控制led灯闪烁的简单电路及程序LED灯作为电子元件中广泛应用的一种,通过闪烁可以提供一种视觉提示。
在这篇文章中,我们将介绍如何使用Proteus软件设计一个简单的电路,并编写程序控制LED灯的闪烁效果。
本文将分为以下几个部分展开讨论。
1. 硬件设计在Proteus软件中,我们首先需要设计电路图。
请先插入一个微处理器芯片,例如Arduino UNO,然后将LED灯连接到芯片的一个数字引脚上。
确保LED的正极连接到数字引脚,负极连接到芯片的地线上。
为了实现闪烁效果,可以连接一个电阻到LED的负极,然后将另一端连接到芯片的VCC引脚。
2. 软件编程在设计了硬件电路后,我们需要编写控制LED闪烁的程序。
在Proteus软件中,可以使用Arduino IDE来完成这一任务。
以下是一个简单的C代码示例:```cvoid setup() {pinMode(2, OUTPUT); // 选择使用的数字引脚}void loop() {digitalWrite(2, HIGH); // LED灯亮起delay(1000); // 延时1秒digitalWrite(2, LOW); // LED灯熄灭delay(1000); // 延时1秒}```代码中的`setup`函数用于设置程序运行时的初始状态,其中`pinMode`函数用于配置数字引脚为输出模式。
`loop`函数则是程序的主要循环,其中`digitalWrite`函数用于控制LED灯的亮灭状态,`delay`函数用于给LED保持亮灭状态的时间间隔。
3. 仿真验证完成软件编程后,我们需要在Proteus中进行电路仿真验证。
打开Proteus软件,将设计好的电路图和编写好的程序导入到仿真环境中。
然后点击开始仿真按钮,程序将开始运行,并控制LED灯按照设定的时间间隔闪烁。
通过仿真验证,我们可以判断程序的逻辑是否正确,同时可以观察LED灯的正常工作情况。
试了一下,效果很好,看起来象是模拟开关一样,我已经把部分注解了一下,实现的原理很简单,效果也不错, ;控制P1口LED灯渐亮和渐暗程序ORG 00HJMP MAINORG 30HMAIN:MOV A,#0CALL LOOP ;由暗变亮子程序MOV P1,#0FFH ;关灯,全暗MOV A,#0CALL LOOP2 ;由亮变暗子程序MOV P1,#0 ;开灯,全亮JMP MAIN;以下一段为由暗变亮的子程序,变化程度共255级,由两段程序组成,一段点亮,时间值由A中的数决定;另一段将A取反后作延时时间值,这样无论A是什么值,每个周期时间相等,但点亮和关闭的值就不断变化;类似一个频率一定,占空比可调的方波,从而实现灯光由暗到亮.LOOP:;这一段为点亮灯的延时MOV P1,#0 ;把灯点亮INC A ;A的值加1CJNE A,#0FFH,E2 ;A还没有加到FF,跳转E2E1:JMP OVER ;A加到了FF,结束返回E2:MOV R7,A ;A的值存入R7D1:MOV R6,#30 ;延时子程序DJNZ R6,$DJNZ R7,D1 ;R7-1不为零就转D1,这里R7即上面预置的A值,用在这里,就是每次延时时间不同,有255级MOV P1,#0FFH ;延时时间到,送所有灯;这一段为关掉灯的延时,两段相加,组成占空比可变的方波输出控制灯由暗到亮CPL A ;A的值取反,MOV R7,AD2:MOV R6,#30 ;延时子程序DJNZ R6,$DJNZ R7,D2CPL A ;再取反,恢复原来的值JMP LOOP ;跳回循环OVER:RET;以下为由亮变暗子程序,原理与上面一样.LOOP2:MOV P1,#0FFHINC A ;程序运行到此,A的值为0,经这一步后为1CJNE A,#0FFH,W2W1:JMP OVER2W2:MOV R7,AD11:MOV R6,#30DJNZ R6,$DJNZ R7,D11MOV P1,#0CPL AMOV R7,AD22:MOV R6,#30DJNZ R6,$DJNZ R7,D22CPL AJMP LOOP2OVER2:RETEND补充一下,11.0592M的晶振下,效果很好,6M下,有明显的闪烁感,可以通过修改R6的值来解决这个问题。
1例子1第二个灯亮include<reg52.h>void main{P1=0xfd;}include<reg52.h>Sbit D1=P1^0;Void main{D1=0}注意:稍微改程序时需重新hex化例子2第一个灯亮include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main //主函数{led1=0; //将单片机P1.0口清零while1; //程序停止在这里,在后面会讲到为什么这样写.}例子3第一个灯亮include<reg52.h> //52单片机头文件void main //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110while1; //程序停止在这里,在后面会讲到为什么这样写.}2例子1第三个灯闪烁fir循环include<reg52.h>sbit D2=P1^2;unsigned int a;void main{D2=0;fora=0;a<=10000;a++{};D2=1;fora=0;a<=10000;a++{};}例子2第三个闪烁while循环include<reg52.h>sbit D2=P1^2;unsigned int a;void main{a=5000;D2=0;whilea--;a=5000;D2=1;whilea--;}2.include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main //主函数{unsigned int i; //定义一个int型变量while1{i=50000; //变量赋初值为50000led1=0; //点亮灯whilei--; //延时i=50000;led1=1; //熄灭灯whilei--;}}3例子1 3 5 7灯同时亮include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明sbit led3=P1^2; //单片机管脚位声明sbit led5=P1^4; //单片机管脚位声明sbit led7=P1^6; //单片机管脚位声明void main //主函数{led1=0; //将单片机P1.0口清零led3=0; //将单片机P1.2口清零led5=0; //将单片机P1.4口清零led7=0; //将单片机P1.6口清零while1; //程序停止在这里,在后面会讲到为什么这样写.}例子2 1 3 5 7同时亮include<reg52.h> //52单片机头文件void main //主函数{P1=0xaa; //将单片机P1口的8个口由高到低分别赋值为10101010while1; //程序停止在这里,在后面会讲到为什么这样写.}例子3流水灯一个一个接着亮不循环include<reg52.h> //52单片机头文件void main //主函数{unsigned int i; //定义一个int型变量while1{i=50000; //变量赋初值为50000P1=0xfe; //点亮第一个灯whilei--; //延时i=50000; //变量赋初值为50000P1=0xfd; //点亮第二个灯whilei--; //延时i=50000; //变量赋初值为50000P1=0xfb; //点亮第三个灯whilei--; //延时i=50000; //变量赋初值为50000P1=0xf7; //点亮第四个灯whilei--; //延时i=50000; //变量赋初值为50000P1=0xef; //点亮第五个灯whilei--; //延时i=50000; //变量赋初值为50000P1=0xdf; //点亮第六个灯whilei--; //延时i=50000; //变量赋初值为50000P1=0xbf; //点亮第七个灯whilei--; //延时i=50000; //变量赋初值为50000P1=0x7f; //点亮第八个灯whilei--; //延时}}例子4include<reg52.h>include <intrins.h>define uint unsigned intdefine uchar unsigned char uchar temp,num,num1;sbit beep=P2^3;void delayuint;void main{temp=0xfe;while1{fornum1=0;num1<3;num1++ {fornum=0;num<8;num++{P1=temp;beep=0;delay100;temp=_crol_temp,1;P1=0xff;beep=1;delay100;}}fornum1=0;num1<3;num1++{fornum=0;num<8;num++{P1=temp;beep=0;delay100;temp=_cror_temp,1;P1=0xff;beep=1;delay100;}}while1;}}void delayuint z{uint x,y;forx=z;x>0;x--fory=110;y>0;y--;}4延时子程序void delay{uint x;forx=100;x>0;x--{};}For的嵌套void delay{uint x,y; %局部变量forx=100;x>0;x-- %小括号后不加分号fory=600;y>0;y--; %小括号后的分号表示该语句是上一条语句的,分号将该句与下句隔开或者{fory=600;y>0;y--;}include<reg52.h>例子1include<reg52.h>define uint unsigned intdefine uchar unsigned charsbit D1=P1^0;void delay; %注意分号不能少void main{while1{D1=0;delay;D1=1;delay;}}void delay{uint x,y;forx=100;x>0;x--fory=600;y>0;y--;}带参数的比不带参数的要方便例子2无参和有参的对比include<reg52.h>define uint unsigned intdefine uchar unsigned charsbit D1=P1^0;//void delay;void delayuint;%带一个参数的,参数类型必须要写,参数可不写.比如可以写成uint z.也可以带多个参数void main{while1{D1=0;delay1200;%亮2秒D1=1;delay1200;}}/void delay{uint x,y;forx=100;x>0;x--fory=600;y>0;y--; }/void delayuint z{uint x;uchar y;forx=z;x>0;x--}例子3include<reg52.h> define uint unsigned int define uchar unsigned char sbit D1=P1^0;void delayuint;void main{while1{D1=0;delay1200;D1=1;delay1200;}}void delayuint z{uint x;uchar y;forx=z;x>0;x--}5循环左移三位如10100101a5-001011012d。