0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用51单片机点亮LED

天才小狸花 来源:Sigle_chip 作者:Sigle_chip 2022-08-16 08:54 次阅读

导语

根据前面对51单片机的了解和基础理论知识的掌握,经过自己的焊接或钞能力手中有了开发板,就开始了正式的单片机学习实践。

在前续知识的了解和掌握就进入了程序编写以及电路调试等工程开展中,真正做到理论与实践结合。

通过查看原理图可知,主要有P0端口,P1端口,P2端口,P3端口等,这些端口占了端口的大部分,除此之外还有复位端口Rst,时钟电路XTLin和XTLout,电源和其他功能端口,在大多数时候,我们都将使用P0到P3这些端口。

LED

简介

Led为发光二极管光源。此种光源具有体积小、寿命长、效率高等优点。由等半导体材料制成的、直接将电能转变成光能,效率很高。当加上一定的正向电流时,Led发光,并呈现相对稳定的正向电压,随电流变化不明显。

正负极区分

直插

  1. 单色LED有两根引脚,这两根引脚有正、负极之分。长脚为正。
  2. 当长短脚无法观察时,可从侧面观察两条引出线在管体内的形状.较小的是正极,较大的类似于碗状的是负极
  3. 也可通过万用表的蜂鸣挡区分,通过调整红黑表笔在LED的顺序使得LED发光,此时红表笔所在的引脚为正极。

贴片LED

  1. 有色点的为负极,相对的为正极。
  2. “T”一横的一边是正极,相对的为负极。
  3. 三角形底边靠近的是正极,顶角靠近的是负极。
  4. 带小缺角那端就是负极,另一端是正极。

管压降

当电流过LED以后相对于同一参考点的电势(电位)变化称为电压降,简称压降。通常二极管的管压降在0.7V左右,在LED中,红色LED在2v-2.2v,绿色在3v-3.2v,白色蓝色在3.5v。

流水灯电路

正极通过限流电阻连接到5V,负极连接到P1端口。也就是说,当阴极为低电平时,LED通过电流,被点亮。反之LED熄灭。

软件程序

位定义

通过sbit关键字定义IO,是C51专有的关键字。

sbit LED0=P1^0;//LED0
sbit LED1=P1^1;//LED1
sbit LED2=P1^2;//LED2
sbit LED3=P1^3;//LED3
sbit LED4=P1^4;//LED4
sbit LED5=P1^5;//LED5
sbit LED6=P1^6;//LED6
sbit LED7=P1^7;//LED7

延时函数

编写延时函数,实现延时的功能,传参为延时时间,无返回值。

其内部实现与单片机的运行速度有关,主要原理是,单片机在运行程序时,每一条指令会占用单片机的一个机器周期,如12M外部京真心,一条指令会占用1ms时间。通过for循环使得单片机进行大量运算,占用大量机器周期达到目的。延时计算不准确,可通过stc-isp软件生成更精准的值。

void delay_ms(unsignedchar ms)
{
unsignedint i,j;
for(i=0;i for(j=0;j<333;j++); 
};i++)

主函数

void main(void)
{
while(1)
{
LED0=0;delay_ms(1000);LED0=1;//LED0点亮,其余熄灭
LED1=0;delay_ms(1000);LED1=1;//LED1点亮,其余熄灭
LED2=0;delay_ms(1000);LED2=1;//LED2点亮,其余熄灭
LED3=0;delay_ms(1000);LED3=1;//LED3点亮,其余熄灭
LED4=0;delay_ms(1000);LED4=1;//LED4点亮,其余熄灭
LED5=0;delay_ms(1000);LED5=1;//LED5点亮,其余熄灭
LED6=0;delay_ms(1000);LED6=1;//LED6点亮,其余熄灭
LED7=0;delay_ms(1000);LED7=1;//LED7点亮,其余熄灭
}
}

通过while(1)使得函数循环运行,通过定义的IO名称对单个IO进行操作,在多个操作时十分容易出错,所以也可以对IO进行总线操作。

总线IO

当我们使用大量的IO时候,可进行总线操作,对端口直接赋值,可将端口直接看作unsigned char的变量。

P1=0xfe;//相当于二进制 1111 1110
//即P1.1 - P1.7写入1,P10写入0,LED0点亮

对此,我们可以使用位运算操作P1端口。

void main(void)
{
while(1)
{
unsignedchar temp=0xfe,i;
temp=0xfe; // 1111 1110
for(i=0; i< 8; i++) 
{
LED= temp;
temp=(temp<<1) | 1; //1111 1101 
delay_ms(1000);//延时1s
}
}
}

1111 1110 << 1 = 1111 1100,向左移动空位补零

1111 1100 | 1 = 1111 1101,即1111 1100 | 0000 0001。有1则1。最低位补1;

同样,我们也可以使用数组对其操作。

数组

我们通过盒中与里面的东西来表示。

变量的类型相当于盒子的大小,char可以装255个,int可以装65535个,使用什么数据类型取决于数据的范围,范围大,需要的盒就大。大盒子装的多,占用地方(内存)也多。

一个盒子有唯一的一个名字,称为变量名,给他装上东西,称为赋值。这些盒子没什么联系,当然也有一些盒子里面装了一些小盒子,不过只有大盒子有名字叫LED_DAT,小盒子只能通过大盒子才能获得自己的名字。老大在大盒子里排第一个,我们叫他LED_DAT[0],以此类推。当然,我们再给大盒子装东西的时候就需要考虑,有多少数据,因为有多少数据就需要多少盒子。盒子用多大的,因为盒子大了需要占地方。

因此我们定义了整个大盒子

unsignedchar LED_DAT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

我们选择了unsigned char类型的盒子,因为里面最大的数据也没超过unsigned char的表示范围。同时,我们装了{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}这些数,编译器将数据数出来创建了一个可以装8个unsigned char小盒子的大盒子起名为LED_DAT;并通过LED_DAT[下标]访问或修改里面小盒子的值。

unsignedchar LED_DAT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(void)
{
while(1)
{
unsignedchar i;
for(i=0;i<8;i++) 
{
P1=LED_DAT[i];
delay_ms(1000);
}
}
}

在这个里面,我们通过LED_DAT[i]获得了里面的值,并写入了P1,实现了流水灯的效果。

不太建议使用_crol_()这些循环左移和循环右移函数,建议位运算直接干,位运算YYDS。

快去实现你的炫酷流水灯吧。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23102

    浏览量

    657872
  • 51单片机
    +关注

    关注

    273

    文章

    5697

    浏览量

    123081
收藏 人收藏

    评论

    相关推荐

    如何去完成一种基于51单片机点亮led灯的实验?

    如何去完成一种基于51单片机点亮led灯的实验?怎样去编写实验代码?
    发表于 07-14 07:26

    51单片机点亮led灯实验

    keil + protues 51单片机点亮led灯实验环境:keil4 + proteus 8proteus操作:1.新建工程,名字随意。工程已经搞好。2.搞个芯片进来,爽一波。添加
    发表于 07-15 08:38

    51单片机点亮led灯程序

    51单片机点亮led灯程序——点亮LED灯1、对照开发板原理图对端口进行赋值如下图,要使
    发表于 07-21 08:11

    怎样去实现一种基于51单片机点亮LED的设计

    请教大神怎样去实现一种基于51单片机点亮LED的设计?
    发表于 09-03 06:17

    如何去实现一种基于51单片机点亮led灯的设计

    如何去实现一种基于51单片机点亮led灯的设计?如何对基于51单片机
    发表于 09-28 08:20

    51单片机是如何点亮LED点阵?

    51单片机是如何点亮LED点阵?
    发表于 09-30 06:02

    如何利用51单片机点亮LED灯?

    如何利用51单片机点亮LED灯?
    发表于 10-09 06:18

    C51单片机如何点亮LED灯?

    C51单片机如何点亮LED灯?
    发表于 10-15 06:00

    如何去实现基于一种51单片机点亮LED灯的程序

    如何去实现基于一种51单片机点亮LED灯的程序?
    发表于 10-20 08:05

    如何利用51单片机点亮LED小灯?

    如何利用51单片机点亮LED小灯?
    发表于 10-28 06:47

    如何对基于51单片机点亮LED进行Proteus仿真呢

    如何对基于51单片机点亮LED进行Proteus仿真呢?其实验代码是怎样的?
    发表于 10-28 08:10

    如何利用51单片机点亮LED灯实现跑马灯效果?

    如何利用51单片机点亮LED灯实现跑马灯效果?
    发表于 11-08 06:19

    使用51单片机点亮LED的程序详细资料免费下载

    本文档的主要内容详细介绍的是使用51单片机点亮LED的程序详细资料免费下载。
    发表于 12-18 08:00 13次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>点亮</b><b class='flag-5'>LED</b>的程序详细资料免费下载

    使用51单片机点亮LED的程序免费下载

    本文档的主要内容详细介绍的是使用51单片机点亮LED的C语言程序免费下载。
    发表于 09-02 17:28 0次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>点亮</b><b class='flag-5'>LED</b>的程序免费下载

    hc06蓝牙模块接51单片机点亮LED

    hc06蓝牙模块接51单片机点亮LED
    发表于 11-20 19:06 52次下载
    hc06蓝牙模块接<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>点亮</b><b class='flag-5'>LED</b>