点亮LED灯(包括延时函数即原理)


前言

介绍相关的基础代码书写以及理解


一、LED模块

写代码时需要与模块的接口一一对应,所以需要查看LED模块的接口分配。

二、使用keil编写程序

1.创建项目

如下图操作
在这里插入图片描述
选择项目保存位置在这里插入图片描述
选择单片机型号,由于没有stc,这里使用类似的atmel替代,选择AT89C52在这里插入图片描述
添加新的文件到组内(一般使用c语言文件)在这里插入图片描述

2.编写程序

由于代码原本运行是非常快速的,而我们需要供人眼观察,所以需要利用延时函数,使代码运算速度导致的现象可以被我们所观察到,用到的延迟函数如下

void delay_ms(unsigned int x){
	unsigned int i,j;
	for(i=0;i<x;i++){
		for(j=0;j<115;j++);
	}
}

3.关于延时函数

需要了解时钟周期、时钟频率、机器周期、指令周期、晶振频率

时钟周期CPI

时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。时钟周期表示了SDRAM所能运行的最高频率。更小的时钟周期就意味着更高的工作频率

指令周期

CPU从存储器中取出并执行一条指令所需的全部时间称之为指令周期,包括取指令、译码、执行。

机器周期

机器周期是为了实现指令流水线而引入的概念,实际上对应的是指令流水线的各个阶段,称之为流水阶段(或功能段,流水级等)。
机器周期也称为CPU周期。 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。 完成一个基本操作所需要的时间称为机器周期。 一般情况下,一个机器周期由若干个时钟周期组成。

晶振频率

单位时间内完成振动的次数,单片机的运行与其直接相关,根据单片机的晶振频率就可以知道执行一次程序所需要的循环次数

延时具体原理

在stc软件中可以直接看到我们的单片机频率以及相应的延时函数。
在这里插入图片描述
单片机的时钟周期=1/单片机的晶振频率,我们的51单片机是11.0592MHz的,指令集是STC-Y1,这些需要在stc中改过来,所以我们的时钟周期为(1/11.0592)um
在这里插入图片描述

不过我这里以for循环为例,单片机执行一条语句需要12个时钟周期,即机器周期=12时钟周期,约1.0850694um。不过不同的循环的机器周期不同,具体如下:
在这里插入图片描述
因为使用的是unsigned int类型,所以我们需要1/11.0592
12*8=8.680555us,以1ms为例,则需要1000/8.680555=115.2,取整,所以每for循环115次就是单片机执行1ms。不过for循环没有while循环精准。
补充:nop()的延时时间是一个机器周期,与晶振的关系是:osc/12微秒,所以11.0592MHz的_nop_()函数是0.9216um

4.编写点亮LED

补充:
0.3VCC----0V为低电平,0.7VCC—VCC为高电平,一般来讲,对于5V电源的单片机来说,低电平在1.3V以下,高电平在3.7V以上,数字信号尽量不要使用1.3—3.7V这个区间,这有可能会造成单片机无法识别或识别错误,所以我们这里要使用低电平点亮,即给0。

首先,需要引入头文件<reg51.h>,这样才可以使用P2这类操作器件。
找到要点亮的led灯的接口,根据官方的线路图,这里选择D1,即P2的第一位给低电平。
在这里插入图片描述
具体实现如下

#include<reg51.h>

void delay_ms(unsigned int x){
	unsigned int i,j;
	for(i=0;i<x;i++){
		for(j=0;j<115;j++);
	}
}

int main(){
	delay_ms(500);  //  延时500ms
	P2 = 0xfe;  //	 1111 1110
	return 0;
}

这里要生成.hex文件,用于stc下载到单片机。然后点击编译
在这里插入图片描述
在这里插入图片描述

5.使用stc下载到单片机

首先要选择对应单片机型号,然后选择对应的.hex文件,如下图
在这里插入图片描述

总结

需要记住几点:

  • 头文件<reg51.h>的引入
  • 使用低电平
  • 需要生成.hex文件才可以供单片机使用
  • 要在stc选择正确的单片机型号
  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值