学习了最小系统电路后,从最基本的LED控制开始入手,也就是输出控制


LED控制和流水灯

  • 1.LED仿真电路绘制
  • 2.Keil 51工程创建
  • 3.LED单灯编程
  • 4.LED单灯仿真
  • 5.LED流水灯编写
    • 1.位输出操作
    • 2.移位方式
    • 3.循环移位

1.LED仿真电路绘制

LED就不展开介绍了,二极管单向导通电能转换光能,直接上原理图,可以看到LED灯D1连接在51单片机P1.0引脚

在Protues元器件查找输入关键词LED,在详细列表下拉找到几个颜色的LED,分别是蓝、绿、红、黄,随便找一个颜色的LED即可

单个LED的接线按照原理图如下进行仿真电路绘制,注意LED的朝向(LED阳极接限流电阻R2,阴极接芯片引脚P1.0)

2.Keil 51工程创建

打开Keil软件,先关掉当前打开的工程,菜单栏 Project -> Close Project

新建一个文件夹以存放工程文件,Keil新建工程

选择新建的文件夹存放工程,并给工程命名

选择工程对应的处理芯片,找到Atmel的AT89C52,除了和STC89C52复位电平不同外,其他基本一样

拷贝51单片机相关启动文件,是

创建好的工程列表如下

新建文件并命名为main.c保存在工程路径下

右键工程目录,添加main.c到工程目录中(添加方式可双击main.c直接添加或选中main.c点add添加)

3.LED单灯编程

在main.c添加51单片机头文件 reg52.h ,编写延时函数,延时函数参数为1时刚好延时1ms,先写好框架代码,如下

#include <reg52.h>void delay_ms(unsigned int nms)
{unsigned int i,j;for(i=nms;i>0;i--)for(j=113;j>0;j--);
}void main()
{while(1);
}

进行工程编译检查代码是否有误,只要error不出现错误,工程就没问题,这里出现一个警告是因为定义了延时函数没有被调用

sbit 位寄存器定义LED引脚变量名,在main函数中对LED赋值高低电平进行点亮LED和关闭LED的操作

#include <reg52.h>sbit LED1 = P1^0;void delay_ms(unsigned int nms)
{unsigned int i,j;for(i=nms;i>0;i--)for(j=113;j>0;j--);
}void main()
{LED1 = 0;delay_ms(500);LED1 = 1;delay_ms(500);while(1);
}

勾选工程编译输出hex文件,不管是仿真电路运行,还是将程序下载到开发板上,都需要hex文件,勾选后重新编译一次工程,会发现工程文件夹多了个hex文件

4.LED单灯仿真

回到LED仿真电路,双击51芯片,选择工程生成的hex文件(除了hex文件其他文件不识别),ok

开启电路仿真,可以发现LED点亮一会儿就灭了(如果把仿真电路LED的限流电阻改小,LED亮起的时候亮度会更亮,仿真电路可以将电阻改小以加强视觉效果,但现实电路不建议这么做,还是需要串联1个1k左右的电阻做限流)

5.LED流水灯编写

流水灯需要把开发板上的8个LED灯都用上,按原理图进行仿真电路连接,原理图上面有,仿真电路画完是这样的,4个颜色的LED都用上了,是不是觉得有点花里胡哨呢,其实我也这么觉得哈哈哈哈哈哈哈哈哈

1.位输出操作

最偷懒式的流水灯程序编写,其实也就是将单灯点亮代码copy成8个灯,一直在while(1)里面循环(8个灯都需要单独定义位寄存器变量名),如下

#include <reg52.h>sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;void delay_ms(unsigned int nms)
{unsigned int i,j;for(i=nms;i>0;i--)for(j=113;j>0;j--);
}void main()
{   while(1){LED1 = 0;delay_ms(200);LED1 = 1;LED2 = 0;delay_ms(200);LED2 = 1;LED3 = 0;delay_ms(200);LED3 = 1;LED4 = 0;delay_ms(200);LED4 = 1;LED5 = 0;delay_ms(200);LED5 = 1;LED6 = 0;delay_ms(200);LED6 = 1;LED7 = 0;delay_ms(200);LED7 = 1;LED8 = 0;delay_ms(200);LED8 = 1;}
}

仿真现象如下

2.移位方式

移位方式为流水灯代码编写的另一种方式,比第一种方式要简便点,参考代码如下,主要是针对P1端口进行16进制赋值,每次左移后将补位置1让流水灯同时只亮一个灯

#include<reg52.h>void delay(unsigned int xms); //延迟函数的声明 void main()
{unsigned char i;       //0-255while(1){P1=0xfe;           //1111 1110for(i=0;i<8;i++){delay(200);P1<<=1;         //P1=P1<<1    P1=P1|0X01;       //0000 0001 }}
}void delay(unsigned int xms)        //延迟函数
{unsigned int i,j;for(i=xms;i>0;i--)                 //i=xms即延时约xms毫秒for(j=113;j>0;j--);
}

3.循环移位

在51的函数库中,还有这么一个函数,能令一个16进制数一直旋转左移,如果让这个一直旋转左移的16进制数赋值给P1端口,那么也能让LED灯带产生流水灯效果,先来看看代码是怎么写的

#include<reg52.h>
#include<intrins.h>
#include"delay.h"void main()
{P1=0Xfe;               //1111 1110while(1){delay(200);P1=_crol_(P1,1);     //循环移位函数 把P1寄存器内的数向左移1位}
}

是不是觉得代码量少了很多,其实只是因为调用了_crol_函数,函数手册中对这个函数的介绍是这样的

_crol_Summary    #include <intrins.h>unsigned char _crol_ (unsigned char c,        /* character to rotate left */unsigned char b);       /* bit positions to rotate */Description        The _crol_ routine rotates the bit pattern for the character c left b bits. This routine is implemented as an intrinsic function.
Return Value      The _crol_ routine returns the rotated value of c.
See Also             _cror_, _irol_, _iror_, _lrol_, _lror_ 

并给出了函数使用demo

//Example
#include <intrins.h>void test_crol (void) {char a;char b;a = 0xA5;b = _crol_(a,3); /* b now is 0x2D */
}

unsigned char crol ( unsigned char c, unsigned char b)
头文件:
intrins.h
参数:
参数1 - 要向左旋转的字符
参数2 - 要旋转的位数(2进制位)
返回值:
向左旋转b(参数2)位后的c(参数1)值

_crol_ 函数对于流水灯而言,将参数1的16进制数左移参数2位,1次左移多少位就将左移出去的位都拼在原16进制数的低位,形成新的16进制数
如果参数2的值为1,也就将参数1的16进制数每调用1次就旋转左移1位,当参数1的初值恰好是0xfe时,在每次调用 _crol_ 函数时加个延时,就直接是流水灯效果了,不明白的小伙伴可以动手操作一遍加深理解,参数2也可以改成2或3或其他数,每次左移2位或3位或**位


哦对了,_crol_ 函数其实也可以做成流水灯旋转右移的效果,可以稍微动动脑筋想想怎么实现的 ~

51单片机学习笔记2 -- 单灯控制及流水灯相关推荐

  1. 51单片机学习笔记5 流水灯实现及蜂鸣器控制

    51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...

  2. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

  3. AutoLeaders控制组—51单片机学习笔记

    文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...

  4. 51单片机学习笔记1 简介及开发环境

    51单片机学习笔记1 简介及开发环境 一.51单片机 1. STC89C52单片机简介 2. 命名规则 3. 封装 (1)PDIP (2)LQFP (3)PLCC (4)PQFP 二.STC8051结 ...

  5. 单片机c语言北航,【下载资料】《51单片机学习笔记》北航版

    原标题:[下载资料]<51单片机学习笔记>北航版 如果手机下载有问题,请移步至电脑端,链接:https://forum.mianbaoban.cn/t/topic/36906 内容简介 本 ...

  6. 51单片机学习笔记2 仿真器的使用及STC89Cxx简介

    51单片机学习笔记2 仿真器的使用及STC89Cxx简介) 一.连接步骤 1. 硬件连接 2. 安装软件驱动 3. 检查是否安装成功 二.仿真步骤 1. 打开一个51工程 2. 选择仿真设备 3. S ...

  7. [51单片机学习笔记TWO]----蜂鸣器

    蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来 ...

  8. 基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计

    基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计 必看!!视频讲解 基于51单片机的LED彩灯霓虹灯心形流水灯设计 这里写目录标题 1 开发环境 2 功能说明介绍 3 仿真图 4 ...

  9. 【51单片机入门】点亮多个LED流水灯

    [51单片机&入门]点亮多个LED流水灯 实验环境 功能实现 PCB原理图 代码 要点 仿真 代码 实验环境 Keil C51 Proteus 8.9 功能实现 LED流水灯依次从右向左亮起, ...

  10. AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

最新文章

  1. python软件怎么使用-Python快速入门—如何选择使用包管理工具?
  2. poi excel设置合并单元格边框格式
  3. harmonyos消息服务器,第三方纯HarmonyOS应用太少,你还愿意升级吗?
  4. thinkphp回调的php调用db类,请问thinkphp中model类自动完成功能 回调函数能不能获取其他字段的值?...
  5. 作为一个新晋测试经理,在软件测试计划之前你必须知道的10件事
  6. (转)淘淘商城系列——商品搜索功能Service实现
  7. 浅谈jQuery WeUI框架
  8. 博世BMI160六轴传感器I2C通信配置
  9. 解决cmd中tomcat中文乱码问题
  10. Video.js - HTML5 视频播放器
  11. 【uni-app踩坑记录】uni-starter本地微信一键授权登录失败
  12. 计算机桌面ie图标无法删除,解决桌面IE图标或者我的电脑无法删除
  13. kvm 监控内存,替换页表(linux版的win VT晶核)(这个整复杂了,不用小内核也可以实现,留着吧,主要记录了bootLoad的启动过程)
  14. Vue+PHP实现个人博客系统
  15. c语言中执行cl exe时出错,VC6.0执行cl.exe时出错
  16. Spring框架学习【从入门到精通】
  17. 宇称(空间反演对称性)算符应用
  18. html购物车收藏夹实现,购物网站设计和实现毕业论文.doc
  19. 高数基础_第2节_序列极限
  20. GPL LGPL Apache2.0 BSD 开源协议扫盲帖

热门文章

  1. 新浪微博开放平台注册样例
  2. Nik Collection 5 Mac,最新PS滤镜插件套装
  3. 千钧一发之际赢得暂缓令,苹果App Store要反败为胜了?
  4. 编译错误: error ‘gets’ was not declared in this scope gets(s)
  5. win10没法进入安全模式的处理办法
  6. mosquitto无法连接
  7. mysql 插入数据 特殊符号_使用特殊字符将数据插入mysql数据库
  8. 【零基础】量子纠缠图像问世,简单解读实验原理
  9. matlab的double和single类型
  10. Excel如何冻结多行多列