从零开始学习单片机c语言(单片机C语言基础入门第七章)
从零开始学习单片机c语言(单片机C语言基础入门第七章)voidmain()} unsigned char i j; for(i=0;i<=250;i ) for(j=0;j<=200;j );
大家好,今天我们就开始了单片机C程序的编写。首先,由于搬家后一直不能办理上网的事情,所以耽误了到了今天才把这章发出来,实在抱歉。言归正传,我们在前边学习过单片 机的开发流程并且介绍了C语言的表达式和语句的表达,对函数也进行了介绍,有了这些认识我们就可以真正的根据要求编写程序进行单片机的开发了。下面我们细 致的分析一下单片机C程序的编写以及再熟悉一下开发的流程。
下面我们以STC的51单片机为例,其开发环境是用keil V4,烧写软件是STC官网的ISP软件。首先打开keil新建工程,然后选择单片机的型号,由于在前面部分都介绍过,因此在这里就不在重复过程了,新建 工程选好器件后我们就开始编写单片机程序了。如果我们直接就用手册里面的寄存器去操作,发现编译的时候会报错误,如下所示:
voiddelay()
{
unsigned char i j;
for(i=0;i<=250;i )
for(j=0;j<=200;j );
}
voidmain()
{
while(1)
{
P1^0=0;
delay();
P1^0=1;
delay();
}
}
从编译的结果我们可以看到有错误出现,报错的原因是undefined identifier(未定义的标识符),为什么会有这么错误呢?我们不是完全按照手册上来的吗,怎么会出现错误呢?这是因为我们在前面没有定义 P1^0,而直接进行了赋值,编译器当然认为这是错误的,但是又有个问题,如果我们定义了P1^0那也是个变量,撑死是个内存的数据,这又是怎么和硬件的 控制联系在一起的呢?为了解答这个问题我们还得看仔细看一下单片机的手册,看看有没有相关的信息呢。如下图是51单片机RAM的地址分布图:
从图中可以看到,单片机的特殊功能寄存器也在RAM的地址中,换句话讲就是这些特殊功能寄存器也是RAM的一部分,我们如果知道了其所在的地址,然后我们对其进行操作那么就能够实现对硬件的控制,下面是从51单片机手册上得到的特殊功寄存器的地址和功能:
那么我们实现定义变量的话就应该不会出现问题了,那么我们可以将上面的程序修改:
sfr P1=0x90;
sbit P10=P1^0;
void delay()
{
unsigned char i j;
for(i=0;i<=250;i )
for(j=0;j<=200;j );
}
void main()
{
while(1)
{
P10=0;
delay();
P10=1;
delay();
}
}
在修改后的程序中,我们先定义P1,然后在定义P1^0,这样在编译过程中就不会再报错误了。
实际单片机的厂商已经将这些头文件编写成了.h文件,我们只要将头文件包含进来就能用了,如下所示:
如上图所示,我们只需要在开头的位置添加#include<stc15.h>这条预编译指令,即使不在定义P0和P1^0也能够通过编译,这是因为在我们包含的头文件中已经定义了我们需要的变量以及相对应的地址,这是芯片厂商编写的头文件。
上面就是包含的头文件的内容,感兴趣的可以去看一下头文件,里面定义的寄存器的名称,可以认为这个文件是软件和硬件连接的一个接口,实现了硬件和软件的连接目的,让用户可以忽略硬件的地址,直接对变量进行操作就可以。
然后单片机程序采用while(1)死循环的目的是将程序代码这个空间内循环,并根据设计者的需求跳转,而不是跳来跳去。
将上面编译好的程序生成HEX文件后,烧录到单片机的ROM内,然后看到P1^0的输出信号是一个产生频率为12Hz的50%方波如下所示:
添加头文件以后,在以后的编程中就根据手册的寄存器的控制就可以了,这样就可以基本可以对单片机进行开发了,通过单片机产生波形也行也好,实现控制也好,只要根据手册上对特殊寄存器的操作来实现对硬件的控制。
最后还希望大家多多阅读好好的层序源码来提高程序的编写能力,谢谢大家。
如果你觉得本文不错,请点个赞吧,你们的认可是我们奋斗的动力,谢谢!