\ 学习单片机
所谓螭译预处理,是蝙译嚣在对C语言源程序进行正常墒译之前,先对一些特殊的预处理命令作解释,产生一个新
的源程序.蝙译预处理主要为程序调试.移植等提供便剃,是一个非常实用的功能
在源程序中.为了区分预处理命令
和一般的C语句的不同.所有预处理
命令行都以符号。群”开头.并且结尾不
用分号。预处理命令可以出现在程序任
何位置,但习惯上尽可能地写在源程序
的开头.其作用范围从其出现的位置到
文件尾。
C语言提供的预处理命令主要有:
宏定义、文件包含和条件编译。其中宏
定义分为带参数的宏定义和不带参数
的宏定义。
1.不带参数的宏定义
不带参数的宏定义的一般形式为:
#define
标识
采样口标识规范化 下载危险废物标识 下载医疗器械外包装标识图下载科目一标识图大全免费下载产品包装标识下载
符字符串
它的作用是在编译预处理时。将源
程序中所有标识符替换成字符串。例
如!#d~ine PI 314
#define uint unsigned int
当需要修改元素时.只要直接修改
宏定义即可.无需修改程序中所有出现
元素个数的地方 所以宏定义.不仅提
高了程序的可读性 便于调试.而且也
方便了程序的移植。
无参数的宏定义使用时,要注意以
下几个问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
:
1】.宏名一般用大写字母.以便于
与变量名的区舅0。当然.用小写字母也
不为锚。
2)在编译预处理中宏名与字符串
进行替换时.不作语法检查.只是简单
的字符替换。只有在编译时才对已经展
开宏名的源程序进行语法检查。
3).宏名的有效范围是从定义位置
到文件结束。如果需要终止宏定义的作
用域.可以用#undef命令。例如:
#undef P r
则该语句之后的PI不再代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
3 14,这
样可以曼活控制宏定义的范围。
4)宏定义时可以引用己经定义的
宏名。例如:
#define R 20
#define PI 314
#define ALL PI R
5 对程序中用双引号扩起来的孛
符串内的字符.不进行宏的替换操作。
2.带参数的宏定义
为了进一步扩大宏的应用范围.在
定义宏时.还可以带参数。带参数的宏
定义的一般形式为:
#define标识符(参数表)宇符串
它的作用是在编译预处理时。将源
程序中所有标识符替换成字符串。并且
将字符串中的参数用实际使用的参数
替换。例如:
#define S(a.b)(a+b)/2
则源程序中如果使用了S(3.4).在
编译预处理时将替换为(3+4)/2。
在 LED/16 2字符液晶试验板上
实现两数相加并输出结果,变量的数据
类型用宏定义的缩写形式。
在我的文档中建立一个文件目录
【csl0l。然后建立 cs10.uv2的工程项
目.最后建立源程序文件fcsl0c)。
输入下面的程序:
#include~REG51.H> 序号(以下同】:1
#define uch~'unsigned char//2
uchar code SEG7 f10I一
{Oxc0.0xf9.0Xa4.0xb0.0x99.0xg2.0x82.0xf
8.0x80 0x,gO.}://3
J,一 ⋯ ⋯ 一 一 =4一 一 :
void main(void) //5
f
ucher a.b.sum; //7
a=55; //8
b:20o: //9
sum=a+b; ill0
P2=SEG7[aum/1。0】: Ⅳ1 1
P1=SEG7【(sum%100)/10]; #12
P0=SEG7【sum%10]; #13
while(11、 //14
} //15
编译通过后.将生成的cslO.hex
文件烧录到89S51芯片中。将芯片插
入到 LED/16 2字符液晶试验板上.试
验板上接通 9v电源.右边 3个 LED数
码管显示“255 。通过宕定义.我们发
现原来长长的“unsigned char 现变成
了 uchar 。是不是更方便使用了。
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
程序。
序号1 I程序解释.以下同):包古头文件
REG51 H。
序号2:数据类型。unsigned char‘用宕定
义为简写形式 uchar。。
序号3:数码臂0~9的宇 码。
序号4:程序分隅。
序号5:定义函数名为main的主函教。
序号6:main的主函数开始。
序号7:定义无符号宇符型变量a、b、sum。
序号8:a破值55。
序号9.b赋值 200。
序号 10:a、b作加法运算.其和放 sum。
序号 11:取出sum的首位教送 P2口显示。
序号12:取出sum的十位数送PI口显示。
序号13:取出sum的个位投送PO 13显示。
维普资讯 http://www.cqvip.com
学习单片机
序号14:动态停机。
序号15:main的主函数结束。
使用带参数的宏定义进行运算,结
果送LED/1 6 2字符液晶试验板显示。
在我的文档中建立一个文件目录
(csl1),然后建立csl1.uv2的工程项
目。最后建立源程序文件(csl1.c o
输入下面的程序:
#include
//序号【以下同):1
#define uchar unsigned char//2
#define S(a,b)(a-b) 3 //3
uchar code SEG7 [10】=
10xc0,0xf9,0xa4,0xb0.0x99.0x92,0x82.0xf
8.0x80。0x90。};//4
//===一 一 一 一 一 5一 一 =
void main(void) //6
I ii7
uchar out; //8
out=s(100.50): //9
P2=SEG7[outJl00]; //lO
P1=SEG7【(out%100)/10];//1 1
P0=SEG7【out%10]; //12
while(1): //13
} //14
编译通过后。将生成的csl 1.hex
文件烧录到 89S51芯片中,将芯片插
入到LED/16 2字符液晶试验板上。试
验板上接通9V电源,右边3个 LED数
码管显示“15O”。
分析程序。
序号1【程序解释,以下同):包含头文件
REG51.H。
序号2:数据类型的宏定义。
序号3:带参数的宏定义
序号4:数码管0~9的字形码。
序号5:程序分隔。
序号6:定义函数名为main的主函数。
序号7:main的主函数开始。
序号8:定义无符号字符型变量out。
序号9:使用参数宏.其结果送out。
序号1O:取出out的百位数送P2口显示。
序号 11:取出out的十位数送 P1口显示。
序号12:取出out的个位数送P0 1:3显示。
序号13:动态停机。
序号 14:main的主函数结束。
“文件包含”实际上就是我们前面
已经多次用到的#include命令实现的
功能,即一个源程序文件可以包含另外
一 个源程序文件的全部内容。“文件包
含”不仅可以包含头文件 .例如 :
#include,还可以包含用
户自己编写的源程序文件.例如 :
#include。
文件包含预处理命令的一般形
式为:
#include<文件名 >或 #include
“文件名”
上述两种方式的区别是 :前一
种形式的文件名用尖括弧括起来,
系统将到包含 C语言库函数的头
文件所在的目录(通常是 KEIL目录
中的 include子 目录 )中寻找 文件。
后一种形式的文件名用双引号括起
来,系统先在当前目录下寻找。若找
不到 ,再到其它路径 中查找。
“”文件包含”在使用时要注意:
1.一个#include命令只能指定一
个被包含的文件。
2.“文件包含”可以嵌套。在文件
包含的嵌套时,如果文件 1包含了文件
2。而文件 2包含了文件3。则在文件 1
也要包含文件3。并且文件3的包含要
写在文件 2的包含之前,即文件 I中的
“文件包含”说明如下:
#include<文件名 1>
#include<文件名 2>
“文件包含”命令为多个源程序文
件的组装提供了一种方法。在编写程序
时。习惯上将公共的符号常量定义、数
据类型定义和 extern类型的全局变量
说明构成一个源文件。并以“.H”为文件
名的后缀。如果其他文件用到这些说明
时。只要包含该文件即可。无需再重新
说明,减少了工作量。而且这样编程使
得各源程序文件中的数据结构、符号常
量以及全局变量形式统一,便于程序的
修改和调试。
“条件编译”命令允许对程序中的
内容选择性地编译 。即可以根据一定的
条件选择是否编译。
条件编译的命令主要有以下几种
形式:
形式 1.
#ifdef标识符
程序段 I
#else
程序段 2
#endif
它的作用是当 “标识符”已经由
#define定义过了.则编译“程序段 1”。
否则编译“程序段2”。其中如果不需要
编译“程序段 2”。则上述形式可以变换
为:
#ifdef标识符
程序段 1
#endif
形式 2.
#ifndef标识符
程序段 1
#else
程序段 2
#endif
它的作用是当 “标识符 没有由
#define定义过。则编译“程序段 1”。否
则编译“程序段2”。同样当无“程序段
2”时。则上述形式变换为:
#ifndef标识符
程序段 1
#endif
形式 3.
#If表达式
程序段 1
#elsee
程序段 2
#endif
它的作用是当“表达式”值为真
时。编译程序段 1。番则编译程序段
2。同样当无程序段 2时,则上述形
式变换为:
# 表达式
程序段 1
57
维普资讯 http://www.cqvip.com
#endif
以上三种形式的条件编译预处理
结构都可以嵌套使用。当#else后嵌套
}}lf时,可以使用预处理命令 #elif,它相
当于 #else#if。
在程序中使用条件编译主要是为
了方便程序的调试和移植。
在C语言程序中。用户可以根据
自己的需要对数据类型重新定义。使
用关键字 typedef的定义方法如下:
typedef已有的数据类型新的数据类
型名:
其中“已有的数据类型”是指上面
所介绍的 C语言中所有的数据类型。
包括结构、指针和数组等。“新的数据类
型名”可按用户自己的习惯或根据任务
需要决定。关键字typedef的作用只是
将 C语言中已有的数据类型作了置
换。因此可用置换后的新数据类型名来
进行变量的定义。例如:
typedef int WORD; //定义 word
为新的整型数据类型名
一 般而言。对 typedef定义的新
数据类型用大写字母表示。以便与
C语言中原有的数据类型相区别。
另外还要注意 。用 typedef可 以定义
各种新的数据类型名。但不能直接
用来定义变量。typedef只是对已有
的数据类型作了一个名字上 的置
换。并没有创造出一个新的数据类
型。例如前面例子中的 WORD,它
只是 In1类型的一个新名字而已。采
用 typedef来重新定义数据类型有
利于程序的移植。同时还可以简化
较长的数据类型定义 (如结构数据
类型等 )。在采用多模块程序设计
时,如果不同的模块程序源文件中
用到同一类型的数据时 (尤其是像
数组、指针、结构、联合等复杂数据
类型 )。经常用typedef将这些数据
重新定义并放到一个单独 的文件
中 。需 要 时 再 用 预 处 理 命 令
#include将它们包含进来。
学习单 片机
用typedef重新定义数据类型,变
量val赋值后送LED/1 28 64图形液晶
试验板上的8个 LED显示,模拟彩灯
闪烁。
在我的文档中建立一个文件目录
(cs12)。然后建立 csl2.uv2的工程项
目。最后建立源程序文件(cs12.c o
输入下面的程序:
#include//序号(以下同):1
typedef unsigned char U8一BYTE; //2
typedef unsigned int U16_WORD;//3
void delay(U 1 6_WORD k): //4
//=;;=;一 一 一 =5⋯ ⋯ ⋯ ==
void main(void) //6
I ||
U8
一
BYTE val; //8
while(1) //9
{ //10
val=Ox55; //11
PO=val; //12
delay(500); //1 3
val=Oxaa; //14
PO=val; //15
delay(500); //1 6
1 ,/17
} //18
//一一⋯ 一一一⋯ 一一一1 9⋯ 一⋯ 一
void delay(U 1 6.WORD k) //20
{ //21
U16_WORD i,j: //22
for(i=O:i
本文档为【教你学习单片机】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。