导航:首页 > 操作系统 > 发光单片机

发光单片机

发布时间:2024-06-16 18:03:07

1. 急求一个单片机控制一个LED灯发光的汇编程序,启动时LED发光有按键按下灯熄灭

一键多功能按键识别技术
1.实验任务
开关K1接在P3.2管脚上,在AT89S51单片机的P0.0端口接有1个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在亮,当一次按下开关K1的时候,灯灭,再按一次,灯亮,如此轮流下去。
2.系统板上硬件连线
把“单片机系统”区域中的P3.2端口连接到“独立式键盘”区域中的K1端口上;把P0.0连到L1上
3.程序设计方法
(1. 设计思想由来
在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。
(2. 设计方法
从上面的要求我们可以看出,L1到亮灭受开关K1来控制,我们给L1亮灭定义出不同的ID号,当L1在亮时,ID=0;当L1在灭时,ID=1;分别给出不同的ID号我们就能够完成上面的任务了
4.汇编程序:
ID EQU 30H
K1 BIT P3.2
L1 BIT P0.0
ORG 0000H
CLR P1.7
MOV ID,#00H
START: JB K1,REL ;K1没闭合转
LCALL DELAY10MS ;K1闭合,延时消抖动
JB K1,REL :再判断
INC ID
MOV A,ID
CJNE A,#02,REL
MOV ID,#00H
REL: JNB K1,$ ;等待开关弹起
MOV A,ID
CJNE A,#00H,IS0 ;判断相应ID
CLR L1 :ID=0,灯亮
LCALL DELAY光 ;延时
SJMP START
IS0: CJNE A,#01H,START;
SETB L1
LCALL DELAY
SJMP START

DELAY10MS: MOV R6,#20 ;延时10MS子程序
LOOP1: MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP1
RET
DELAY: MOV R5,#20 ;延时20MS子程序
LOOP2: LCALL DELAY10MS
DJNZ R5,LOOP2
RET
END

2. 用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)

#include<reg51.h>

voiddelay(void)

{

unsignedinti,j;

for(i=0;i<200;i++)

for(j=0;j<1000;j++)

;

}

voidmain(void)

{

while(1)

{

P3=0xfe;//第一个灯亮

delay();//延时

P3=0xfd;//第二个灯亮

delay();

P3=0xfb;//第三个灯亮

delay();

P3=0xf7;//第四个灯亮

delay();

P3=0xef;//第五个灯亮

delay();

P3=0xdf;//第六个灯亮

delay();

P3=0xbf;//第七个灯亮

delay();

P3=0x7f;//第八个灯亮

delay();

}

}

(2)发光单片机扩展阅读

单片机C语言16种方式流水灯

voidmain()

{

while(1)

{

P1=0xfe;//点亮第一个发光管

Delay(5000);

P1=0xfd;//点亮第二个发光管

Delay(5000);

P1=0xfb;

Delay(5000);

P1=0xf7;

Delay(5000);

P1=0xef;

Delay(5000);

P1=0xdf;

Delay(5000);

P1=0xbf;

Delay(5000);

P1=0x7f;//点亮第八个发光管

}

}

3. 用单片机控制8个发光二极管依次发光,产生跑马灯的效果,3种效果循环,要求通过按钮切换效果!

这个程序的关键点是要在显示子程序执行的过程中,多对按键进行检测。检测到有按键按下时,即退出子程序,返回到主函数的按键检测,对num
加一。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^5;
uchar temp;
uchar num;

void delay(uint z)//延时程序
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void display0()//显示效果1
{
uchar i;
temp=0xfe;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0x7f;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_cror_(temp,1);
delay(50);
}

}
void display1()//显示效果2
{
uchar i;
temp=0xf8;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0x1f;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_cror_(temp,1);
delay(50);
}
}
void display2()//显示效果3
{
uchar i;
temp=0x99;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0xcc;
for(i=0;i<8;i++)
{
if(key1==0) break;//对按键进行检测
P1=temp;
temp=_cror_(temp,1);
delay(50);
}
}

void anjian()
{
if(key1==0)//按键检测
{
delay(5);//按键消抖延时
if(key1==0)
{
num++;
if(num==3) num=0;
}
while(!key1);
}
}

void main()
{
while(1)
{
anjian();//按键检测并赋num值
switch(num)
{
case 0:display0();break;
case 1:display1();break;
case 2:display2();break;
}
}

}

4. 单片机驱动一个led的工作原理是什么

对于小功率LED,单片机IO驱动能力可以直接驱动。当LED的阳极接电源正时,单片机IO口如果为低电平将形成电流通路,所以可以使LED发光。

5. 单片机控制led灯的创新点是什么

单片机控制led灯的创新点是,LED的阳极全部接到了正极(电源),当负极接到LED的阴极时就会发光,因为LED的阴极与单片机的P2口相接,如果你想点亮那一个LED就把单片机相应的引脚赋值为低电平。具体如下:1、LED基础知识
LED是发光二极管的一种,它具有单向导电的特点,在51开发板上使用的是贴片式发光二极管,正向导电电压在1.8-2.2v之间,工作时的电流在1-20mA。当电流在1-5mA之间变化时,肉眼可以观测到亮度的变化,但是当电流在5-20mA之间变化时,亮度变化不太明显。如果电流一直增大二极管可能会烧坏。其余LED知识就不再进行叙述,其中LED原理图如下图所示。
LED原理图

2、点亮第一个LED灯
由原理图可知,LED的阳极全部接到了正极(电源),当负极接到LED的阴极时才会发光,因为LED的阴极与单片机的P2口相接,如果你想点亮那一个LED就把单片机相应的引脚赋值为低电平,具体程序如下:

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

sbit led=P2^0; //将单片机的P2.0端口定义为led

void main()
{

while(1)
{
led=0;//P2.0端口设置为低电平
}
}
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
3、LED闪烁
如果想让LED进行闪烁就要涉及到延时,针对单片机进行延时的方法有很多,在此向大家推荐一种比较简单的程序助手—单片机小精灵,可以直接进行设置时间,并且生成相应的代码。
将P2^0引脚的LED进行间隔一秒闪烁的程序如下:

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h" //头文件

sbit led=P2^0; //将单片机的P2.0端口定义为led

void delay1s() //延时1s,误差 0us
{
unsigned char a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void main()//主程序
{

while(1)
{
led=0;//P2.0端口设置为低电平
delay1s();//调用延时函数
led=1;//P2.0端口设置为低电平
delay1s();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
为了使程序更好的进行表达,使用16进制进行表述,程序如下:

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h" //头文件

void delay1s() //延时1s,误差 0us
{
unsigned char a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void main()//主程序
{

while(1)
{
P2=0xFE;//P2.0端口设置为低电平
delay1s();//调用延时函数
P2=0xFF;//P2.0端口设置为低电平
delay1s();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
上面是针对一个LED灯进行的设计,下面针对8个LED灯依次闪烁进行设计,具体程序如下:

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h" //头文件

void delay1s() //延时1s,误差 0us
{
unsigned char a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void main()//主程序
{

while(1)
{
P2=0xFE;//1111 1110
delay1s();//调用延时函数
P2=0xFD;//1111 1101
delay1s();
P2=0xFB;//1111 1011
delay1s();
P2=0xF7;//1111 0111
delay1s();
P2=0xEF;//1110 1111
delay1s();
P2=0xDF;//1101 1111
delay1s();
P2=0xBF;//1011 1111
delay1s();
P2=0x7F;//0111 1111
delay1s();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
4、LED左右移动
上面进行描述的是利用延时并对P2口引脚进行赋值设计LED灯的闪烁,这样程序较为繁杂,下面将利用“左移”和“右移”进行设计,crol(a,b),左循环,a是左移的值,b是左移的位数;cror(a,b),右循环,a是右移的值,b是右移的位数。包含在instrins.h库函数中。具体程序如下:

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h" //头文件,包含延时(_nop_ )和函数循环

typedef unsigned int u16;//声明新类型名
typedef unsigned char u8;//声明新类型名

#define led P2//宏定义

void delay1s() //延时1s,误差 0us
{
u8 a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void main()//主程序
{
u8 i;//定义i的类型
led=0xFE;
delay1s() ;
while(1)
{
for(i=0;i<7;i++)//左移
{
led=_crol_(led,1);
delay1s() ;
}
for(i=0;i<7;i++)//右移
{
led=_cror_(led,1);
delay1s() ;
}

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
5、总结
以上程序均进行了实验验证,完全正确。针对LED灯的控制,可以和按键进行联合设计,实现更多的功能,后面会进行更新。对于没有单片机开发板的小伙伴可以利用proteus仿真软件进行设计。

阅读全文

与发光单片机相关的资料

热点内容
8x8x为什么没法访问了 浏览:591
今日头条为什么安卓没有专业版 浏览:95
迅雷车牌号怎么上车 浏览:288
minecraft没有登录怎么进服务器 浏览:30
云电脑网页版公用服务器 浏览:690
扫雷算法逻辑 浏览:509
一个程序员的奋斗史下载 浏览:355
思科防火墙重启命令 浏览:33
三角命令打不开 浏览:907
使用命令行修改uefi 浏览:613
pdf压缩mac 浏览:216
多玩盒子为什么了解不到服务器 浏览:499
吴家丽拍过三部电影 浏览:163
能看片的网址 浏览:288
亲嘴电影 浏览:605
linux命令windows 浏览:544
印度程序员对波音公司的影响 浏览:349
华为云服务器授权码 浏览:694
java加密key加密 浏览:676
android软件安全与逆向分析pdf 浏览:134