点亮LED灯(包括延时函数即原理)
文章目录
前言一、LED模块二、使用keil编写程序1.创建项目2.编写程序3.关于延时函数时钟周期CPI指令周期机器周期晶振频率延时具体原理
4.编写点亮LED5.使用stc下载到单片机
总结
前言
介绍相关的基础代码书写以及理解
一、LED模块
写代码时需要与模块的接口一一对应,所以需要查看LED模块的接口分配。
二、使用keil编写程序
1.创建项目
如下图操作 选择项目保存位置 选择单片机型号,由于没有stc,这里使用类似的atmel替代,选择AT89C52 添加新的文件到组内(一般使用c语言文件)
2.编写程序
由于代码原本运行是非常快速的,而我们需要供人眼观察,所以需要利用延时函数,使代码运算速度导致的现象可以被我们所观察到,用到的延迟函数如下
void delay_ms(unsigned int x){
unsigned int i,j;
for(i=0;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.059212*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。 首先,需要引入头文件 #include void delay_ms(unsigned int x){ unsigned int i,j; for(i=0;i for(j=0;j<115;j++); } } int main(){ delay_ms(500); // 延时500ms P2 = 0xfe; // 1111 1110 return 0; } 这里要生成.hex文件,用于stc下载到单片机。然后点击编译 5.使用stc下载到单片机 首先要选择对应单片机型号,然后选择对应的.hex文件,如下图 总结 需要记住几点: 头文件