当前位置: 首页 > news >正文

###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯

 

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。

 

 

 

目录

一.  延时函数的生成 

1.通过延时计算器得到延时函数 

2.可赋值改变的延时函数 

二.  LED模块编写原理 

1.LED模块图  

2.编写原理

(1)编写原理

(2)快捷编程 

(3)十六进制编程 

三.  具体编写程序 

1.通过生成没有改写的延时函数 

2.可赋值延时函数编写 

四.  LED流水灯视频

 

一.  延时函数的生成 

 

1.通过延时计算器得到延时函数 

 

 

步骤:

1.打开STC-ISP找到软件延时计算器

2.先了解所用51单片机的频率(这里的51单片机频率为11.0592),选择你需要定时的长度,然后注意这里51单片机为AT89C52属于89系列,所以8051指令集选择STC-Y1。

3.点击生成C代码再复制代码

源码如下:

void Delay250ms(void)	//@11.0592MHz
{unsigned char data i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}

 

2.可赋值改变的延时函数 

   这里我们可以在原有的延时函数的基础上,进行变量定义并运用while语句生成可赋值改变的延时函数。 

源码:

void Delay(unsigned int xms)	//@11.0592MHz//在Delay延时函数中新定义一个整型变量xms
{unsigned char data i, j;while(xms)     //运用while循环,注意while循环括号内非零即增{i = 2;j = 199;    do{while (--j);} while (--i);xms--;      //注意这里为循环条件改变,不改变无法实现同时写成xms++也无法实现
}}

 

二.  LED模块编写原理 

 

1.LED模块图  

1.单片机多个接口图,LED模块接在P2口 

 

 

2.LED模块图,这里我们需要注意LED的走向便于理解编写原理

 

 

3.LED与单片机连接部分

 

 

2.编写原理

(1)编写原理

  从上面LED的原理图中,我们对于LED知道LED具有单向导电的特征,而反向则电阻很大,所以我们需要使LED单向导电,这里我们规定0为低电平而1为高电平,根据电流的流向,判断当P2口接0即低电平时LED点亮,当P2口接1即高电平时LED不亮。

(2)快捷编程 

 1. 在编写时我们需要加上一个定义了P2口的头文件如下:

#include <REGX52.H>

该头文件定义了所有的接口,一般编写都需要,我们可以在开始时鼠标右键空白处找到并添加。 

2.由于该头文件定义了确切的接口如图:

点击打开

查看接口

 

这里直接定义了接口转为十六进制所以只需要对接口赋值0或1,即加高电平还是低电平。

例如:

1.定义第一个LED点亮 

P2_0=0;

2.定义第一个LED熄灭

P2_0=1;

(3)十六进制编程 

  十六进制编程与上述类似即对于接口没有转换为十六进制需要自己通过原理来设计编写,即对于每个LED的状态进行规定,然后写成一个二进制代码再转为十六进制。(之前的博客有具体的转换过程)。 

例如:

 

  这里定义D1接0,其余接1,则表示只让D1亮,这里写成二进制串需要从下往上写成1111 1110,接着由二进制转十六进制为FE,部分二进制转十六进制如图:

 

 

例如:这里在FE前面需要加上0x用于表明为十六进制,

	P2=0xFE;

对比:对于快捷编写来说即让人容易明白且编写方便,而对于十六进制编写则过于麻烦,但是该编写方式可以让人更加清楚的熟悉编写原理,从而更加灵活的编写同时有利于后续的编写。 

 

三.  具体编写程序 

 

1.通过生成没有改写的延时函数 

这里在程序中我们还要引入另一个头文件,由于自动生成的延时函数中有一个语句需要被调用,为了完善程序,我们需要调用该头文件。

需要被调用的语句:

	_nop_();

需要被调用的头文件:

#include <INTRINS.H>

打开可看到(打开方式同另一个头文件)

 

下面就是一个具体的程序(C语言编写的):

#include <REGX52.H>       //两个头文件的引入
#include <INTRINS.H>void Delay250ms(void)	//@11.0592MHz    //延时250ms
{unsigned char data i, j, k;_nop_();    i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void main()    //函数主体
{while(1)      //通过while循环让程序循环进行{P2=0xFF;   //通过十六进制编写Delay250ms();    //延时函数的调用P2=0xFE;Delay250ms();P2=0xFD;Delay250ms();P2=0xFB;Delay250ms();P2=0xF7;Delay250ms();P2=0xEF;Delay250ms();P2=0xDF;Delay250ms();P2=0xBF;Delay250ms();P2=0x7F;Delay250ms();P2=0xFD;Delay250ms();P2=0xF7;Delay250ms();P2=0xDF;Delay250ms();P2=0x7F;Delay250ms();P2=0xFC;Delay250ms();P2=0xE7;Delay250ms();P2=0x3F;Delay250ms();P2=0xF1;Delay250ms();P2=0x1F;Delay250ms();P2=0xF0;Delay250ms();P2=0x0F;Delay250ms();P2=0x00;Delay250ms();}}

这里主要可以多试试通过十六进制定义LED的亮灭。 

 

2.可赋值延时函数编写 

这里由于改写后没有上面的那个语句,所以也不需要添加那个头文件。

源码:

#include <REGX52.H>void Delay(unsigned int xms)	//@11.0592MHz   //定义变量
{unsigned char data i, j;while(xms)   //while循环{i = 2;j = 199;do{while (--j);} while (--i);xms--;   //循环条件改变
}}void main()   //主函数
{while(1)   //while循环非零即增{P2=0xFE;Delay(100);   //调用延时函数,对于延时可赋值改变P2=0xFD;Delay(200);P2=0xFB;Delay(300);P2=0xF7;Delay(400);P2=0xEF;Delay(500);P2=0xDF;Delay(600);P2=0xBF;Delay(700);P2=0x7F;Delay(800);}}

 

四.  LED流水灯视频

 

大家可以自己设计一个自己的流水灯,如果有问题的话欢迎私聊我哦。 

51单片机LED流水灯

感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 单片机学习笔记---DS18B20温度读取
  • Springmvc 的参数绑定之list集合
  • Mybatis学习笔记
  • LabVIEW智能温度监控系统
  • MySQL监控Innodb信息
  • ES实战-高级聚合
  • springboot180基于spring boot的医院挂号就诊系统
  • Linux_线程
  • win10 环境下Python 3.8按装fastapi paddlepaddle 进行身份证及营业执照的识别2
  • 装箱问题+宠物小精灵之收服+数字组合——01背包
  • 嵌入式Qt Qt Creator安装与工程介绍
  • PHP开发日志 ━━ 深入理解三元操作与一般条件语句的不同
  • Decian 12.x基于LNMP安装phpIPAM(IP管理系统)
  • 考研英语单词25
  • Vivado用ILA抓波形保存为CSV文件
  • [PHP内核探索]PHP中的哈希表
  • (三)从jvm层面了解线程的启动和停止
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【个人向】《HTTP图解》阅后小结
  • Android交互
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS 7 修改主机名
  • download使用浅析
  • Elasticsearch 参考指南(升级前重新索引)
  • exif信息对照
  • Intervention/image 图片处理扩展包的安装和使用
  • javascript 总结(常用工具类的封装)
  • Markdown 语法简单说明
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python爬虫--- 1.3 BS4库的解析器
  • vue 个人积累(使用工具,组件)
  • 创建一个Struts2项目maven 方式
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 两列自适应布局方案整理
  • 前端临床手札——文件上传
  • 浅谈web中前端模板引擎的使用
  • 深入 Nginx 之配置篇
  • 算法-图和图算法
  • 异步
  • 找一份好的前端工作,起点很重要
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (LeetCode) T14. Longest Common Prefix
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一一四)第九章编程练习
  • (转)C语言家族扩展收藏 (转)C语言家族扩展