前言
介绍相关的基础代码书写以及理解
一、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.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。
首先,需要引入头文件<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选择正确的单片机型号