单片机C语言变量定义

合集下载

单片机C语言 必知的数据存储与程序编写知识 附单片机应用编程知识介绍

单片机C语言 必知的数据存储与程序编写知识 附单片机应用编程知识介绍

一、五大内存分区内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

1、栈区(StaCk):FIFo就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。

里面的变量通常是局部变量、函数参数等。

2、堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。

如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3、自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free 来结束自己的生命。

4、全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5、常量存储区:这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)code/data/stack内存主要分为代码段,数据段和堆栈。

代码段放程序代码,属于只读内存。

数据段存放全局变量,静态变量,常量等,堆里存放自己malloc或new出来的变量,其他变量就存放在栈里,堆栈之间空间是有浮动的。

数据段的内存会到程序执行完才释放。

调用函数先找到函数的入口地址,然后计算给函数的形参和临时变量在栈里分配空间,拷贝实参的副本传给形参,然后进行压栈操作,函数执行完再进行弹栈操作。

字符常量一般放在数据段,而且相同的字符常量只会存一份。

二、C语言程序的存储区域1、由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。

编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。

2、C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。

32单片机和8位单片机 c语言结构

32单片机和8位单片机 c语言结构

32单片机和8位单片机 c语言结构一、概述单片机是一种集成了微处理器、存储器、输入输出端口和定时器等功能于一体的集成电路芯片。

它具有体积小、功耗低、成本低廉等特点,被广泛应用于各种电子设备中。

32单片机和8位单片机是常见的两种类型,其中32单片机具有更高的性能和更大的存储空间。

二、32单片机的C语言结构1.头文件引用在编写32单片机的C语言程序时,首先需要引用一些头文件,以便使用库函数和定义一些常量。

常用的头文件有:<reg52.h>、<intrins.h>等。

其中,<reg52.h>是用于访问单片机寄存器的头文件,<intrins.h>是用于访问特殊功能寄存器的头文件。

2.全局变量和宏定义在程序的开头,通常定义一些全局变量和宏定义,以便在整个程序中使用。

全局变量是指在函数外部定义的变量,其作用域为整个程序。

宏定义是用来定义一些常量或函数的快捷方式,可以简化程序的编写。

3.函数声明在使用函数之前,需要进行函数的声明,以便编译器知道该函数的存在和参数类型。

函数声明一般放在全局变量和宏定义之后,函数定义之前。

4.中断处理函数32单片机具有强大的中断功能,可以在程序运行过程中响应外部中断信号。

在编写32单片机程序时,需要定义中断处理函数,以便在中断事件发生时执行相应的操作。

中断处理函数的定义一般在函数声明之后,函数定义之前。

5.主函数主函数是每个程序的入口,其中包含了程序的主要逻辑。

在32单片机的C语言程序中,主函数的定义形式如下:int main(){// 程序逻辑return 0;}三、8位单片机的C语言结构1.头文件引用与32单片机类似,8位单片机的C语言程序也需要引用一些头文件,以便使用库函数和定义常量。

常用的头文件有:<reg51.h>、<intrins.h>等。

其中,<reg51.h>是用于访问单片机寄存器的头文件,<intrins.h>是用于访问特殊功能寄存器的头文件。

单片机C语言(模块一)

单片机C语言(模块一)

《单片机原理及应用(二)》模块一C51程序设计基础任务1:实例导航第二章C与80512.1 8051的编程语言1、8051的编程语言(四种):(1)BASIC语言(2)PL/M√(3)汇编语言√(4)C语言目前,汇编语言和C语言是广泛使用的两种单片机编程语言。

在未来的一段时间内,汇编语言和C语言还将同时存在,但从发展趋势看,C语言有逐渐取代汇编语言的可能。

最好的单片机编程者应是具有汇编语言基础,又精通C语言的。

2、C语言的优点(与汇编语言相比):(P41)(1)对单片机的指令系统不要求了解,仅要求对8051的存储器结构有所了解(2)寄存器的分配、不同存储器的寻址及数据类型等细节由编译器管理(3)程序有规范的结构,由不同的函数组成,这种方式可使程序结构化(4)编程及程序调试时间显著缩短,从而提高效率(5)提供库函数,具有较强的数据处理能力3、8051单片机C语言(单片机C51语言)了解一下单片机的种类:(查资料)2.2 Cx51编译器编译:C语言源程序转换成机器语言目标程序的过程,叫做编译。

编译器:能自动完成编译过程的一种计算机软件。

(1)C语言编译器(标准C)(2)C51编译器(经典8051单片机)(3)C x51编译器(经典8051单片机及派生产品)Cx51编译器完全遵照ANSI C语言标准,支持C语言的所有标准特征。

另外,还增加了可以直接支持8051结构的特征。

典型产品:KILE套装工具软件----------uVision2 集成开发环境的使用(P 302)例2-1:用uVision2软件编译调试一个C51程序(HELLO.C)基本步骤:(1)创建一个新项目(建在一个新文件夹下)并为项目选择一个CPU(此时会自动加入启动文件)(2)创建新程序文件(或打开旧程序文件)此例中,打开c:\kile\c51\examples\hello(3)将源文件添加到项目中此时还可修改工具选项(4)编译和链接项目(Build Target命令):翻译和链接源文件,并生成一个可以载入到uvision2调试器进行调试的绝对目标模块。

单片机C语言

单片机C语言

在C51中,函数原型一般形式如下: C51中,函数原型一般形式如下: [extern] 函数类型 函数名(形式参数表); 函数的声明是把函数的名字、函数类型以及形参的类型、 个数和顺序通知编译系统,以便调用函数时系统进行对照 检查。函数的声明后面要加分号。 如果声明的函数在文件内部,则声明时不用extern,如果 如果声明的函数在文件内部,则声明时不用extern,如果 声明的函数不在文件内部,而在另一个文件中,声明时须 带extern,指明使用的函数在另一个文件中。 extern,指明使用的函数在另一个文件中。 5.1函数的调用 例5.1函数的调用 #include<reg51.h> # include<stdio.h> int max(int x,in y) ; void main(void) { int a,b ;
SCON=ox52 ;//串口初始化 ;//串口初始化 TMOD=0x20; TH1=0xf3; TR1=1; scanf(“ scanf(“please input a,b:%d,%d,”,&a,&b); a,b:%d,%d,” printf(“ printf(“max is :%d\n”,max(a,b));//调用比较两数大小函数 :%d\ ,max(a,b));//调用比较两数大小函数 while(1); } int max(int a,int b)//比较两数大小并返回其中较大数 b)//比较两数大小并返回其中较大数 { int z; z=(x>=y ?x :y) ; return(z) ; }
5.3 函数的嵌套与递归
1.函数的嵌套 在一个函数的调用过程中调用另一个函数。 C51编译器通常依靠堆栈来进行参数传递, C51编译器通常依靠堆栈来进行参数传递, 堆栈设在片内RAM中,而片内RAM的空间 堆ቤተ መጻሕፍቲ ባይዱ设在片内RAM中,而片内RAM的空间 有限,因而嵌套的深度比较有限,一般在 几层以内。如果层数过多,就会导致堆栈 空间不够而出错。 5.3函数的嵌套调用 例5.3函数的嵌套调用

(1小时学会C语言51单片机)C语言入门教程1

(1小时学会C语言51单片机)C语言入门教程1

我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。

一般只须连接晶体、VCC、GND、RST即可,一般情况下,A T89C51的31脚须接高电平。

#include<reg51.h> //头文件定义。

或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。

//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。

因为我们把LED的正通过电阻接至VCC。

P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。

那么这样就能达到了我们预先的要求了。

while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。

如果我们要试着点亮其他的LED,也类似上述语句。

这里就不再讲了。

点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。

我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。

假设我们有8个LED分别接在P1口的8个引脚上。

硬件连接,在P1_1--P1_7上再接7个LED即可。

例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。

单片机c语言之五常量

单片机c语言之五常量

第五课常量上一节我们学习了KEIL C51编译器所支持的数据类型。

而这些数据类型又是怎么用在常量和变量的定义中的呢?又有什么要注意的吗?下面就来看看吧。

晕!你还区分不清楚什么是常量,什么是变量。

常量是在程序运行过程中不能改变值的量,而变量是可以在程序运行过程中不断变化的量。

变量的定义可以使用所有C51编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。

这一节我们学习常量定义和用法,而下一节则学习变量。

常量的数据类型说明是这样的1.整型常量可以表示为十进制如123,0,-89等。

十六进制则以0x开头如0x34,-0x3B等。

长整型就在数字后面加字母L,如104L,034L,0xF340等。

2.浮点型常量可分为十进制和指数表示形式。

十进制由数字和小数点组成,如0.888,3345.345,0.0等,整数或小数部分为0,可以省略但必须有小数点。

指数表示形式为[±]数字[.数字]e[±]数字,[]中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。

3.字符型常量是单引号内的字符,如'a','d'等,不可以显示的控制字符,可以在该字符前面加一个反斜杠"\"组成专用转义字符。

常用转义字符表请看表5-1。

4.字符串型常量由双引号内的字符组成,如"test","OK"等。

当引号内的没有字符时,为空字符串。

在使用特殊字符时同样要使用转义字符如双引号。

在C中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上\o转义字符以作为该字符串的结束符。

字符串常量"A"和字符常量'A'是不同的,前者在存储时多占用一个字节的字间。

5.位标量,它的值是一个二进制。

表5-1 常用转义字符表常量可用在不必改变值的场合,如固定的数据表,字库等。

单片机c语言试题及答案

单片机c语言试题及答案

单片机c语言试题及答案试题一:数据类型与变量定义(20分)1. 请问以下哪种数据类型不属于C语言中的基本数据类型?A. intB. floatC. booleanD. char答案:C. boolean2. 在C语言中,下列变量命名中哪个是不合法的?A. myVarB. _dataC. 123abcD. num1答案:C. 123abc3. 下列语句中,哪个是正确的变量定义?A. int num = 10;B. float = 3.14;C. bool flag;D. char = 'A';答案:A. int num = 10;试题二:条件语句与循环结构(30分)1. 下列条件语句中,哪个用于多个选项的判断?A. if语句B. while语句C. for语句D. switch语句答案:D. switch语句2. 请问以下哪个循环结构是先判断后执行?A. while循环B. for循环C. do-while循环D. if语句答案:C. do-while循环3. 下列代码中,哪个选项可以正确打印出10到1的倒序数列?A. for(int i = 10; i > 0; i--)B. while(i >= 1) { i--; }C. do { i--; } while(i >= 1);D. if(i > 0) { i--; }答案:A. for(int i = 10; i > 0; i--)试题三:函数与数组(50分)1. 下列关于函数的说法中,哪个是错误的?A. 函数可以重复定义多次B. 函数可以有返回值也可以没有返回值C. 函数可以调用其他函数D. 函数可以接收参数,也可以不接收参数答案:A. 函数可以重复定义多次2. 请问以下代码片段有什么问题?int sum(int a, int b) {int result = a + b;return result;}int main() {int result = sum(3, 4);printf("The sum is %d", result);}答案:缺少头文件包含和函数调用。

单片机C语言变量定义

单片机C语言变量定义

单片机C语言变量定义 This model paper was revised by LINDA on December 15, 2012.单片机教程,51单片机C语言学习第六课变量上课所提到变量就是一种在程序执行过程中其值能不断变化的量。

要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。

定义一个变量的格式如下:[存储种类] 数据类型[存储器类型] 变量名表在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。

存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。

这些存储种类的具体含义和用法,将在第七课《变量的存储》中进一步进行学习。

而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。

说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。

存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。

表6-1中是KEIL uVision2所能认别的存储器类型。

注意的是在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。

特殊寄存器(SFR)的地址表请看附录二AT89C51特殊功能寄存器列表表6-1 存储器类型如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。

无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显着的提高系统性能。

还有要指出的就是变量的存储种类与存储器类型是完全无关的。

SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机教程,51单片机C语言学习
第六课变量
上课所提到变量就是一种在程序执行过程中其值能不断变化的量。

要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。

定义一个变量的格式如下:[存储种类] 数据类型[存储器类型] 变量名表
在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。

存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。

这些存储种类的具体含义和用法,将在第七课《变量的存储》中进一步进行学习。

而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。

说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。

存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。

表6-1中是KEILuVision2所能认别的存储器类型。

注意的是在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。

特殊寄存器(SFR)的地址表请看附录二
如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。

无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显着的提高系统性能。

还有要指出的就是变量的存储种类与存储器类型是完全无关的。

SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。

在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。

COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。

外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用@R0/R1。

LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。

之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。

sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:sfr特殊功能寄存器名=特殊功能寄存器地址常数;
sfr16特殊功能寄存器名=特殊功能寄存器地址常数;
我们可以这样定义AT89C51的P1口
sfrP1=0x90;//定义P1I/O口,其地址90H
sfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1口可以用P1为名,这样程序会变的好读好多。

等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表。

sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特殊功能寄存器,如8052的
T2定时器,可以定义为:
sfr16T2=0xCC;//这里定义8052定时器2,地址为T2L=CCH,T2H=CDH 用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。

注意的是不能用于定时器0和1的定义。

sbit可定义可位寻址对象。

如访问特殊功能寄存器中的某位。

其实这样应用是经常要用的如要访问P1口中的第2个引脚P1.1。

我们可以照以下的方法去定义:
(1)sbit位变量名=位地址
sbitP1_1=Ox91;
这样是把位的绝对地址赋给位变量。

同sfr一样sbit的位地址必须位于80H-FFH 之间。

(2)Sbit位变量名=特殊功能寄存器名^位位置
sftP1=0x90;
sbitP1_1=P1^1;//先定义一个特殊功能寄存器名再指定位变量名所在的位置
当可寻址位位于特殊功能寄存器中时可采用这种方法
(3)sbit位变量名=字节地址^位位置
sbitP1_1=0x90^1;
这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。

在C51存储器类型中提供有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:
unsignedcharbdataib;//在可位录址区定义ucsignedchar类型的变量ib intbdataab[2];//在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbitib7=ib^7//用关键字sbit定义位变量来独立访问可寻址位对象的其中一位sbitab12=ab[1]^12;
操作符"^"后面的位位置的最大值取决于指定的基址类型,
char0-7,int0-15,long0-31。

下面我们用上一课的电路来实践一下这一课的知识。

同样是做一下简单的跑马灯实验,项目名为RunLED2。

程序如下:
sfrP1=0x90;//这里没有使用预定义文件,
sbitP1_0=P1^0;//而是自己定义特殊寄存器
sbitP1_7=0x90^7;//之前我们使用的预定义文件其实就是这个作用
sbitP1_1=0x91;//这里分别定义P1端口和P10,P11,P17引脚
voidmain(void)
{
unsignedinta;
unsignedcharb;
do{
for(a=0;a<50000;a++)
P1_0=0;//点亮P1_0
for(a=0;a<50000;a++)
P1_7=0;//点亮P1_7
for(b=0;b<255;b++)
{
for(a=0;a<10000;a++)
P1=b;//用b的值来做跑马灯的花样
}
P1=255;//熄灭P1上的LED
for(b=0;b<255;b++)
{
for(a=0;a<10000;a++)//P1_1闪烁
P1_1=0;
for(a=0;a<10000;a++)
P1_1=1;
}
}while(1);
}。

相关文档
最新文档