设计与开发

stc单片机c语言 单片机C语言基础入门第七章:单片机C程序的编写

小编 2024-10-12 设计与开发 23 0

单片机C语言基础入门第七章:单片机C程序的编写

大家好,今天我们就开始了单片机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%方波如下所示:

添加头文件以后,在以后的编程中就根据手册的寄存器的控制就可以了,这样就可以基本可以对单片机进行开发了,通过单片机产生波形也行也好,实现控制也好,只要根据手册上对特殊寄存器的操作来实现对硬件的控制。

最后还希望大家多多阅读好好的层序源码来提高程序的编写能力,谢谢大家。

如果你觉得本文不错,请点个赞吧,你们的认可是我们奋斗的动力,谢谢!

单片机C语言简介与第一个C语言程序

单片机有些人也称为是MCU(Micro-ControllerUnit)微控制单元是一种集成电路芯片。它是将中央处理器(对于单片机来讲是内核更贴切)单元,数据存储器RAM,程序存储器ROM,输入输出端I/O,中断系统,以及外设单元(定时器、脉宽调制PWM发生器、AD转换器等)全部集成到一块芯片内部,使之成为具有运算和控制功能的微小计算机系统。

目前随着微电子技术的不断发展,能够设计单片机的公司越来越多,因此市场上的单片机型号也各种各样,但是内核单元基本相同,只是不同公司的单片机在外设和功耗上有所区别。因此对于不同类型单片机的开发程序流程的原理基本还是一致的。目前,常见的单片机内核有51的,代表的单片机有:宏晶的STC系列比如:STC89、STC12、STC15等等;Atmel(已经被microchip收购)的AT89系列;还有Philips(飞利浦)、华邦、Dallas(拉达斯)、Siemens(西门子)等公司的许多产品。另外还有一些其他内核的单片机,比如AVR系列、PIC系列、STM8系列等。再就是基于ARM内核的单片机常见的比如ST公司的STM32系列(16位)。根据单片机处理字长的大小可以分为8位、16位以及32位单片机。在初学者中最常用的是8位的单片机。

单片机在工作中通过运行存储在ROM里面的指令(二进制码)来实现运算和控制的。而存储在ROM内的指令是我们人为的设计的流程(称为是程序)。因此要实现对单片机各个资源(端口,定时器,计数器等)的控制就需要通过编写程序烧写到单片机的ROM内,从而实现对单片机的控制。实际在编写单片机程序的时候,很多有经验的都采用汇编语言来实现对程序的编写,但是由于不同内核单片机的汇编指令有所不同,因此汇编语言的通用性比较差。由于目前编译器的不断完善,使得C语言越来越成为了开发单片机程序的机器语言,由于C语言的标准化,使得其具有通用性,使用不同的编译软件可以实现C编写的程序在不同单片机之间进行移植。

单片机的C语言的标准的C语言区别不是特别明显,只是由于单片机资源的限制(RAM和ROM一般都比较小),使得单片机C语言中的数据类型的长度会有所不同(实际是编译器来决定的)。同时也由于单片机自身的特点也使得C语言有了扩展,比如单片机中位定义sbit的用法,这在后面的课程中会用到。

因此对于单片机的开发的主要流程是:

后面的课程中我们选用的是基于51内核的宏晶的STC15系列单片,和Keil V4软件来进行讲解,在讲解过程中也有可能会涉及到STM8(ISA软件)的开发。

最后我们利用C语言中最经典的Hello World来实现我们的第一个程序。在这里我们直接使用printf函数向串口输出“Welcome To MCU World!”(其函数的意义和用法将会在串口中讲解),其代码如下:

<font size="3">#include <REG51.H> //包含51单片机的寄存器头文件

#include <stdio.h> //包含C库的标准IO文件

void main (void) {//主函数

SCON = 0x50; //单片机的串口方式选择

TMOD |= 0x20; //波特率时钟发生器

TH1 = 221; //波特率

TR1 = 1; //开启时钟

TI = 1; // TI:调用putchar()的时候判断发送是否完成,有点类似于非

//中断内发送数据的格式

while (1) { //死循环

printf ("Welcome To MCU World\n"); // 向串口发送 "Welcome To MCU World!"

}

}

</font>

这是运行的结果,欢迎来到单片机世界,希望我的讲解能够该大家带来一定的帮助。

下次我们的主要内容是讲解单片机的内部资源和Keil开发软件的使用,如何搭建单片机的开发环境,并进行实践,将前面的开发流程和实际联系起来,从实践上有个了解,谢谢大家!

相关问答

STC 89C52的 单片机 跑马灯 C语言 程序?

STC89C52是常用的单片机芯片,以下是该型号单片机跑马灯的C语言程序示例,希望能对您有帮助:```c#includeSTC89C52是常用的单片机芯片,以下是该型号单片机跑...

如何给 stc 89 c 51 单片机 烧写程序?

朋友们好,我是电子及工控技术,我来回答这个问题。对于给单片机烧写程序是每位学习单片机技术的朋友必须要掌握的一种技能,下面我给朋友们分享一下我是如何给单...

我的 单片机 stc 89 c51 ,用keil建工程时选的也是此型号,但是烧...

STC系列单片机,型号有STC89C51RC、STC89C52RC、STC89C53RC、等等。STC系列单片机用STC-ISP软件下载程序,如果选择错误就会显示MCU型号不对。下载时只是...

proteus可以仿真 stc 89 c 52 单片机 吗?

proteus可以仿真普通89c52单片机stc89c52单片机用普通89C52替代就可以了。只是不能直接仿真读写内部EEPROM。其它都没有问题。proteus可以仿真普通89c52单片...

如何向 单片机STC 89 C 58RD+烧写程序?

先生成hex文件,而且你得有烧写软件,先设置好,再打开文件,然后点击download/下载,然后打开学习板上开关先生成hex文件,而且你得有烧写软件,先设置好,再打开...

stc 89 c 51和 stc 89 c 52的区别是什么?

有以下区别:1、两者都是直流供电电压单片机,STC89C51电压为4.5V-5.5V,STC89LE52的电压为2.0V-3.8V;2、STC89c51/52的存储器不一样,51有4K,52有8K...

STC 不同型号 单片机 差异大吗?

内部硬件结构不一样,如at89c51和stc89c51,内部硬件资源不一样,相比之下,一般stc的同类型的单片机资源比at的多,执行速度也快。目前国内流行STC,我们公司就用...

i--)for(j=20;j> 20;j--)",时间增加一倍,为何?我的 单片机 ...

[最佳回答]你的标题的问题没在你内容里体现.你应该把问题描述的更清楚一点.for(i=400;i>0;i--)"改成"for(i=20;i>0;i--)for(j=20;j&...

STC单片机 工作电压是5V,电流是多少? 怎么用3--4节干电池(5...

STC89C52RC的工作电压范围是:3.3V~5.5V,整体流过单片机的电流总和不要超过70mA。你直接用三颗1.5V的电池串联供电就可以了。40引脚的单片机简单接...

单片机 怎么用 c语言 设置I/O口输入或输出?

单片机的IO口缺省时一般都是双向,既可以是输入又可以是输出,C语言中判断这个口是输入还是输出要看表达式的形式,比如:sbitkey=P1^0;if(key==1).....这里是作...

猜你喜欢