蓥点曼,什么是c语言

语言 1
习卑 机  维普资讯 手把手教你学单片机的C语言程序设计(四)  C语言的标识符和关键字  ◆周兴华  标识符是用来标识源程序中某个 对象的名字的.这些对象可以是语句、  数据类型、函数、变量、常量、数组等。

一  个标识符由字符串、数字和下划线等组 成.第一个字符必须是字母或下划线,  通常以下划线开头的标识符是编译系 统专用的.因此在编写c语言源程序  时一般不要使用以下划线开头的标识 符.而将下划线用作分段符。
C51编译  器规定标识符最长可达255个字符. 但只有前面32个字符在编译时有效.  因此在编写源程序时标识符的长度不 要超过32个字符.这对于一般应用程  序来说已经足够了 c语言是大小字敏 感的一种高级语言,如果我们要定义
一  个时间。
秒”标识 1 符.可以写做  “sec” . 如果程  序中有“SEC .  那么这两个是完 全不同定义的标  识符。
 关键字则是  编程语言保髓的  特殊标识符.有 时又称为保留  字.它们具有固 定名称和含义,  在C语言的程 序编写中不允许  标识符与关键宇  相同。
与其他计 算机语言相比. C语言的关键宇  较少.ANSI C标 准一共规定了  32个关键字,见 表1。
  Keil C51  编译器除了有 ANSI C标准的  32个关键字外  还根据51单片机的特点扩展了相  关的关键宇。
在Keil C51开发环境  的文本编辑器中编写C程序.系统  可以把保留字衷2  以不同颜色显 示.缺省颜色为 蓝色。
  表2为Keil C51编译器扩展 的关键字。
  下面做一下 实验.使大家实  bJl 位桥量声明 Sbl[ 位变量声明 s” 特殊功能寄存器声明s仃16 特殊功能寄存罾§芦明oala 存储器类型说明 。
DO a[8 存储器类型说婀 Id a 存储器类型说明 po。
a[a 存储器类型说明 xoala 存储器类型说明 际认识标识符与  关键字的作用与 1 nferruDt  reelranI  区别。
  usIng 
一 {蓥点曼  声明一个位标量或位类型的西教 声明一个可位寻址变量 声鲷一个特殊功能寄存器【8位) 声朗一个16位的特殊功能寄存器 直接寻址的8051内部数据存储器 可位寻址的8051内部数据存储器 问接寻址的8051内部数据存储器 。
分页 寻址的8051外部敬据存储器 8051外部数据存储器 8051程序存储器 定义一个中新函数 定义一l十再入函擞 意义8051的工作寄存珊组  在LED/16*2字符液晶试验板上  实现:使4个LED数码管从左至右显 示。
1234 。
在我的文档中建立一个文  件目录(cs3】.然后建立cs3 uv2的工 程项目.最后建立源程序文件(cs3C)。
  输入下面的程序: #include<REG51 H>//序号l以下同】:1  unsigned char dis0=0x99;  if2  unsigned char dis1=0xbO;  //3  unsigned char dis2=0xa4;  /4  unsigned char dis3=0xfg; , 一一一一一6一
//5 == /  void delay{void)  //7 /8  unsigned lnt I,J.  /9  fO _.0.1(500.I++  if10  们1  f0 J;O;J(120:j++  2  //13  //14  }  //15  一一…一==16一一…  void main(void】  /17  I  //18  while(1) 【  /19 //20  PO=disO:  『/21  习单片机  维普资讯 P1=dis1:  //22  P2=dis2;  //23  P3=die3;  1124  delay().  1125 l|蕊  b21  图1为keil o51软件编译时的界  面.下部的输出窗13显示0错误、0警 告。
将生成的cs3.hex文件烧录到  辫霉 盏  ①  :…  z  鳓黝瓣  89S51芯片中.将芯片插入到 LE 16 2字符液晶试验板上.试验板 接通9V电源 发现4个LED数码管从 左至右显示“1234 。
  对程序进行分析。
 程序详释。
 序号1【程序懈释.以下同):包含头文件  REG51 H  序号2:定义无符号字符型变量.其标识符 为disO.并赋初值0x99。
 序号3:定义无符号字符型变量.其标识符 为dis1.并赋韧值0xb0。
  序号4:定义无符号字符型变量.其标识符 为dis2.并赋初值Oxa4。
 序号5:定义无符号字符型变量.其标识符 为dis3.并赋初值Oxf9。
 序号6:程序分隔。
 序号7:定义函数名为delay的延时子函数, 奠标识符为delay。
 序号8:delay延时子函数开始 序号9:定义两个无符号整形变量I.i。
 序号10—14:两个for语句循环体.作用是 延时。
 序号15:daiay延时子函数结束。
 序号16:程序分隔。
 序号17:定义函数名为main的主函数,其 标识符为main。
 序号18:main的主函数开始。
 序号19:w h}Ie循环语句,这里进行无限循环。
 序号20:while循环语句开始。
 序号21:将disO变量送往P0口 序号22:将dis1变量送往P1口。
 序号23:将dis2变量送往P2 1:3。
  序号24:将dis3变量送往P3口。
 序号25:调用延时子函数模块。
 序号26:while循环语句结束。
 序号27:main的主函数结束  可见我们定义的数据类型、函 数、变量等均未与c语言的关键字 发生冲突。
  下面我们做一下修改.将第2行的 dis0改为do.将第7行、第25行的 delay改为switch。
再进行编译、连接。
 结果出现了一大堆的错误(见图2l。
因 此切记.在程序编写中不允许标识符与 C语言的关键宇相同。
  数据.其字节中的最高位表示该数据的 符号, 0 表示正数. 1”表示负数。
负 数用补码表示。
所能表示的数值范围是 一128 127,unsigned char型数据. 是无符号字符型数据.其字节中的所有 位均用来表示数据的数值.所能表示的 数值范围是0—255。
  2. 整型 有signed int和unsigned int之 分.默认值为signed int。
它们的长度均 为两个字节,用于存放一个双字节的数 据。
Signed int是有符号整型数,字节 中的最高位表示数据的符号,…O表示  麴 熬裁隧   正数. 1 表示负数。
所能表示的数值范 围是一32768一+32767。
unsigned int  .②  是无符号整型数,所能表示的数值范围 是0~65535。
  3.1ong长整型  ~ 0_R_ ’J·  蠹弼 嘛焖  有signed long和unsigned long 之分.默认值为signed long。
它们的长 度均为四个字节。
Singed long是 有符号的长整型数据,字节中的  最高位表示数据的符号. O 表 示正数. 1 表示负数。
数值的表示范  单片机的程序设计离不开对数据 围是-2147483648~+2147483647。
 的处理.数据在单片机内存中的存放情 unsigned long是无符号长整型数据.  况由数据结构决定。
C语言的数据结构 是以数据类型出现的.数据类型可分为  数值的表示范围是0 ̄4294967295。
 4from浮点型  基本数据类型和复杂数据类型.复杂数  它是符合IEEE一754标准的单  据类型由基本数据  精度浮点型数据.在十进制中具有  类型构造而成。
C 裹3为Kei I c5 r编译器所支持的数据类型  要类 型有芋本数据 !! c na『.1n1.  息, 茎 啊__·_。
_._1  夏 _r __—_  short.1ong float讯 unsignedint|戡 嫦  0-65535  double 对干I{,el\ s ̄nedint 毒  -32768一+32767…  C5·编译器来说, 等 嚣. 2147 short型与I n1型相  float 四字节 l±1 175494E-38~ ̄3.402823E+38  同,double型与  1-3 常 对案  ¨0ai型相同c  _ bit。
单 
一  下面对这些数 |_“ 蜊 双{帑i 。

一 o 话535  据类型诗行分搋  曲豁0 “雄 0袭7  1 char字符类型 有signed char和unsigned char 7位有效数字。
float型数据占用4  之分.默认值为signed chef=它们的长 个兰 ‘.32位二进制数)-在内存中  *1  的存放格式如下:  个字节。
用 于存放
一 个单宇节的数据。
对于singedchar型  其中.S为符号位.存放在最高字  47  习单片机  维普资讯 节的最高位。
“1”表示负,“0 表示正。
E 为阶码,占用8位二进制数,存放在高 两个字节中。
注意,阶码E值是以2为 底的指数再加上偏移量127.这样处理 的目的是为了避免出现负的阶码值。
而 指数是可正可负的。
阶码E的正常取 值范围是1~254.而实际指数的取值 范围为一126~+127。
M为尾数的小数 部分.用23位二进制数表示.存放在 低三个字节中。
尾数的整数部分永远为 1,因此不予保存,但它是隐古存在的。
 小数点位于隐含的整数位“1 的后面。
 一个浮点数的数值范围是(一1】 S)(2E+127x(1.M】。
  5指针型 指针型数据不同于以上4种基本 数据类型.它本身是一个变量.但在这 个变量中存放的不是普通的数据而是 指向另一个数据的地址。
指针变量也要 占据一定的内存单元.在Keil C51中. 指针变量的长度一般为1—3个字节。
 指针变量也具有类型,其表示方法是在 指针符号…的前面冠以数据类型符 号。
如“char point”,表示point是一个 字符型的指针变量。
指针变量的类型表 示该指针所指向地址中数据的类型。
使 用指针型变量可以方便地对8051单 片机的各部分物理地址直接进行操作。
 6 b计位标■ 这是C51编译器的一种扩充数据 类型,利用它可定义一个位标量,但不 能定义位指针.也不能定义位数缉。
 7 sfr特殊功能寄存器 这也是C51编译器的一种扩充数 据类型,利用它可以访问8051单片机 的所有内部特殊功能寄存器。
sfr型数 据占用一个内存单元。
其取值范围是 0-255。
 8 sfr16位特殊功能寄存器 它占用两个内存单元,取值范围是 0-65535。
 9.sbit可寻址位 这也是C51编译器的一种扩充数 据类型。
利用它可以访问8051单片机 内部RAM中的可寻址位或特殊功能 寄存器中的可寻址位。
例如采用:sff P0=0x80;可以将8051单片机的P0口 的rn地址定义为8OH。
  以上的介绍中.我们已经初步 认识了数据类型。
下面做一下实验. 来感受一下数据类型的不同对程序 执行的影响。
  在LED/16*2字符液晶试验板上 实现:使4个LED数码管从左至右显  示,熄灭。
0000”。
显示的时间约 10ms.熄灭的时间约10me。
在我的文  档中建立一个文件目录(cs4}.然后建 立cs4 uv2的工程项目.最后建立源程  序文件(cs4 ̄c)。
 输入下面的程序:  #include<REG51 H>//序号【以下同):1 r一一一…==2一一一= ,  void de}ay(unsIgned int k)  //3 //4  unsigned lnt i.j:  //5  fo I=0:i(k:i++)l fer{j=O;[<l21:l++  |l黾 /7 //8  //9  void main(void)  while(1)  PO=Oxc0; P1=DxcO; P2=0xcO; P3=Oxc0; delay(10); P0=0xf; P1=0xf; P2=0xf; P3=0xf; delay(1O)  编译通过后.将生成的cs4hex文 件烧录到89S51芯片中.将芯片插入 到LED/16 2字符液晶试验板上.试验 板上接通9v电源。
发现4个LED数 码管显示“0000。

实际上4个LED数 码管是点亮10ms.熄灭10ms.由于亮 /灭的速度很快.加上人眼的视觉暂留 特性.因此我们看到的是连续发光。
  进行软件仿真时观察到。
数码管点  亮/熄灭的准确时间为10.6836ms。
 分析一下程序。
 序号1(程序解释.以下同):包含头文件  REG51.H。
 序号2:程序分隔。
 序号3:定义函数名为delay的延时子函数 括号中其形式参数传递标识符为k.数据类 型为unsigned int。
  序号4:delay延时子函数开始。
 序号5:定义两个无符号整形变量i, 序号6一B:两个for语句循环体.作用是延 时。
 序号g:delay延时子函数结束。
 序号10:程序分隔。
 序号11:定义函数名为main的主函数。
 序号12:main的主函数开始。
 序号13:whi]e循环语句.这里进行无限循 环。
  序号14:while循环语句开始。
 序号15:将OXC0送往P0口显示 序号16:将0xco送往P1口显示。
 序号17:将0xcO送往P2口显示。
 序号18: 将OxeO送往P3 13显示。
  序号119 :调2用 3延 时4子 5函 数6模 块7  传8递 的9 实0际  1 2 3 4 5 参数为10.即延时1Oms。
 序号20:将0xf送往Po口.关闭显示。
 序号21:将0xf送往P1 1:3.关闭显示 序号22:将0xf送往P2 1:3。
关闭显示。
 序号23:。
将Oxf送往P3口.关闭显示。
 序号24:调用延时子函数模块,传递的实际 参数为10.即延时10ms。
 序号25:while循环语句结柬。
 序号26:main的主函数结束。
  下来我们修改一下程序.将第19 24行的。
delay f10):。
改为“delay (1000);”.再编译。
然后将生成的hex 文件烧录到89S51芯片中.将芯片插 入到LED/16 2字符液晶试验板上。
接 通9V电源。
发现4个LED数码管显示  0000”约1s.然后熄灭约1s.反复循 环。
  这是因为我们将1000这个数传 递给延时子函数delay.大大增加了延 迟时间。
因为延时子函数的形式参数K 的数据类型为unsigned int.其数值范 围为0~65535.可延时长达数十秒,大 大方便了我们在宽广的范围内取延迟  时间。
 如果将延时子函数的数据类型定  义为unsigned char.结果怎么样昵?显  习单片机  维普资讯 然大家已知道。
unsigned char类型的 变量。
其数值范围仅为0—255.因此最 长延时将大大低于采用unsigned int 定义的数据类型的延时时间。
  那么既然这样.有人会说.我们干 脆不用unsigned char的数据类型.而 全部使用unsigned int的数据类型岂 不更好。
  为了证明这样的论点是否合理.我 们再做一下试验,将实验二的程序的第 5行改为“unsigned char i.j: .其它不 变。
再编译。
然后进行软件仿真。
观察 到.数码管点亮,熄灭的准确时间为 4.o8529ms.比原来的10 6836ms要 长。
为什么参数传递的都是10.晶振频 率也不变,但得到的延时时间不一样 昵7原因就是数据类型的区别.显然,计 算机在处理16位的数据类型时要比8 位数据类型多耗时间。
处理几个16位 数据所多耗的时阔可忽略不计,但若要 处理的数据很多.则多耗的时间就非常 可观了。
  这里我们总结出: 1若能预算出变量的变化范围,则 可根据变量长度来选择变量类型.要知 道提高代码效率的最基本方式就是尽 量减小变量的长度,不然既浪费CPU 的时间、又多消耗内存资源。
 2如果程序中不需要负数.则可 使用无符号类型的变量。
 3.如果程序中不需要浮点数.则 避免使用浮点数类型的变量。
要知道。
 在8位单片机上使用32位浮点数会 浪费大量的时间。
  在C语言程序中的表达式或变量 赋值运算中,有时会出现运算对象的数 据不一致的情况.C语言允许任何标准 数据类型之间的隐式转换。
  隐式转换按以下优先级别自动 进行:  bi卜 char— in卜+lOng lOat signed-- ̄unsigned  其中箭头方向仅表示数据类型级 别的高低,转换时由低向高进行.而不 是数据转换时的顺序。
例如.将一个bn  型变量赋给一个_兀1型变量时.不需要 先将blt型变量转换成char型变量之 后再转换成Inl型变量.而是将bll型 变量值直接转换成int型变量值并完成 赋值运算的。
一般来说.如果有几个不 同类型的数据同时参加运算.先将低级 别类型的数据转换成高级别类型。
再作 运算处理.并且运算结果为高级别类型 数据。
C语言除了能对数据类型作自动 的隐式转换之外。
还可以采用强制类型 转换符 () 对数据类型作显式的人为 转换。
  下面我们通过两个实验.让读 者朋友认识数据类型的隐式转换及 强制转换。
  在LE 16 2宇符液晶试验板上 实现:使无符号字符型变量×的值与无 符号整型变量y的值相乘.其积存于无  符号整型变量Z中。
然后将Z的内容送  LED/16 2字符液晶试验板。
使4个  LED数码管显示z的内容。
  在我的文档中建立一个文件目录  (ca5】.然后建立cs5,UV2的工程项目,  最后建立源程序文件(cs5.c)。
  输入下面的程序:  #include<REG51 H>//序号(以下同):1  unsigned char code SEG7【10】=  {0xcO.0xf9.Oxa4.OxbO.0x9g.0x92.0x82.0xf 8.0x8o.0x90.I;fl2  void main(void)  //3  { unsigned char x=30; //4  unsigned int y=55;  //5  unsigned int z.  //6  z=xty。
  //7  P3=SEGF[z./1000]; //8  P2=SEG7[(z%1000)/100];//9 P1=SEG7[(z%100)/10];/10  PO=SEG7[z%10]; //1 1  while(1):  #12  l  //13  编译通过后.将生成的Ca5.hex文  件烧录到89S51芯片中.将芯片插入 到LED/16 2字符液晶试验板上.接通  gv电源。
发现4个LED数码管显示 “1650 。
  程序分析。
  序号1(程序解释.以下同):包含头文件 REG51.H。
 序号2:数码管0—9的字形码。
 序号3:定义函数名为main的主函数。
 序号4:main的主函数开始。
定义无符号字 符型变量x并赋初值30。
 序号5:定义无符号整型变量Y井赋韧 僮55。
 序号6:定义无符号整型变量z。
 序号7:乘法运算。
大家知道,这里x、Y是两 种不同类型的数据,编译器在这里对数据娄 型作自动的隐式转换。
即将×先转换成 unsigned int的数据粪型.然后儆乘法.以保 证运算精度。
 序号8:取出Z的千位数.并据此蠢出字形 码送P3 1:3显示。
 序号9:取出z的百位数,并据此盎出字形 码送口2口显示。
 序号10:取出Z的+位数.并据此查出宇形 码送P1口显示。
 序号11:取出Z的个位数,并据此查出宇形 码送P0口显示。
 序号12:while循环.即原地踏步作动态 停机。
 序号13:main的主函数结束。
  在LE 16 2字符液晶试验板上  实现:使无符号整型变量x的值与无符 号整型变量y的值相乘.其积存于无符  号字符型变量z中。
然后将Z的内容送 LED/16’2字符液晶试验板.使右侧3  个LED数码管显示z的内容。
 在我的文档中建立一个文件目录  (cs6】.然后建立ca6 uv2的工程项目. 最后建立源程序文件(ca6 c)。
  输八下面的程序:  #include<REG51 H>/序号c以下同):1 unsigned char code SEG7【1O]= 【0XC0.Oxf9.0xa4.0xb0.0x99.0x92.0x82,Oxf  8.OxaO.Ox90.};//2  void main(void) 【 unsigned int x=20;  unsigned int y=l1:  //3 //4 //5  unsigned char z:  /6  z=(unsigned ehar)(x y). P2=SEG7[ 100]: P1=SEG7[(z%100)/10]; P0=SEG7[2%1O】:  /7 f /g /10  while(1):  11  习单片机  维普资讯 单片机应用系统及其开发过程(二) ◆ 海  1.一个应用系统的设计要求 时间是人们需要随时掌握的。
除 了时钟外.定时器因为能由使用者随 时设定定时时间.具有剩余时间显示 和语音提醒功能.对于工作忙或记性 不好的人.无疑有很大的帮助 要是再 给它加上多点温度测量和显示.使你  及时了解户内外温度.亦或给它加上 煤气检测和自动排风功能.岂不更妙。
 其实。
实现上述计时和测控功能。
正是 单片机的强项。
  下面是一个带语音提醒的家用多 功能定时器的主要功能和技术要求: ·能够预置并存储16个定时时间: ·定时时间1秒~24小时.定时误差小 于10ms: ·用数码管显示预置时间及剩余时间的 时、分、秒: ·具有语音和数码显示两种时间到提示 方式; ·用按键预置定时时间: ·有时间到开关量输出功能。
  通过用单片机设计该家用多功能 定时器的过程。
我们可以初识单片机应 用系统的构建方法。
  2系统框图及系统工作流程 1)系统框图 如果用传统的电路实现该多功能 定时器,则需要时基电路、定时计数 器、显示及其控制电路、键盘扫描电 路、话音控制电路、存储器及控制电  路,以及输出控制电龉等等.整个系统 会比较复杂。
  要是用单片机.电路就简单多了。
 从上一讲我们已经知道。
在单片机内 部有组成测量和控制系统所需的各种 接口电路.如ADC、DAC、可由用户配 置的高速I/O El、定时计数器、电压比 较器、EEPROM存储器、PWM、DMA 等。
各类串行通信总线.如UART、 总线、SPI、Microwire、以及保证程序可 靠运行的看门狗定时器WDT等.本设 计所需的时基电路、定时计数器、显示 控制电路、键盘扫描电路、语音控制电 路、存储器及控制电路、输出控制电 路。
全部可以用一片单片机取代。
图1 是用单片机实现的带语音提醒的家用 多功能定时器的电路框图。
从圈1可  //12 编译通过后.将生成的cs6 hex文 件烧录到BgS51芯片中.将芯片插入 到LED/16*2字符液晶试验板上.接通 9V电源。
发现右侧3个LED数码管显  示 22o 。
 程序分析。
  序号1(程序解释.以下同):包含头文件 REG51 H。
  序号2:数码管0-9的字形码。
 序号3:定义函数名为main的主函数 序号4:m8in的主函数开始。
定义无符号整 型变量x并赋初值20。
 序号5:定义无符号整型变量Y并赋初 值11。
 序号6:定义无符号字符型变量z。
 序号7:乘法运算。
由于我们事先估计出乘 积的值不会超过一个字节的长度(0—255}. 因此将乘积值强制转换成unsigned char  类型.以节省内存空间。
 序号8:取出z的百位数.并据此查出字形 码送P2 1:3显示。
 序号9:取出z的十位数.并据此盎出字形 码送P1口显示。
 序号10:取出z的个位散 并据此查出字形 码送P0口显示。
 序号12:while循环.即原地踏步作动态停 机。
 序号13:main的主函数结束。
  Keil C51编译器除了能支持以上 这些基本数据之外。
还能支持复杂的构 造型数据。
如结构类型、联合类型等。
这 些复杂的数据类型将在后面逐步介绍。
  配文优惠邮购:Keil C51 Windows集成开发环境(已汉化光盘,邮 购代号:x1):46元 TOP85l多功能鳊程 器(邮购代号:B1):300元。
LED/I 28*64 图形液晶试验板(邮购代号:S3):1 60  元.LED/16.2字符液晶试验板(邮购代 号:s2):i40元.16*2字符型液晶显示 模组(邮购代号:L】):80元。
12 8*64点 阵图型液晶显示模组(邮购代号:L2): 1 60元。
5V高稳定专用稳压电源(邮购 代号:D1):35元.每次邮费保价费12 元。
开发票另加货款7%(;F-款时注明). 邮购时只需在附言栏中写明邮脚代号 蕊数量并附上联系电话即可.邮局汇款 邮购:上海市闽行区莲花路21 51弄5 7 号2 01室邮编:2 O11 03.联系人:吕超 亚,银行汇款购买(汇款后电话告知): 户名:上海红棱电子有限公司,开户行: 上海浦东发展银行是中支行,帐号: 076499-985 3015474 0000965,电话(传 真):021-64654216 1 3044l 52947,网 址:http:// .htclectrom com,技术 支持E-mai I:zxh21 5l ̄sohu.com。
 

标签: #单位 #cpu #什么意思 #cdn #crm #crm #charge #cg