深圳市华胄科技有限公司 >> MCU专题 >> 单片机教程


单片机教程,51单片机C语言学习(四)



提交者 烟如人生  在  2007-9-26 14:29:30 

上一篇 下一篇

单片机教程,51单片机C语言学习


第四讲


  先来简单说说C语言的标识符和关键字。标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、数组等等。C语言是大小字敏感的一种高级语言,如果我们要定义一个定时器1,可以写做"Timer1",如果程序中有"TIMER1",那么这两个是完全不同定义的标识符。标识符由字符串,数字和下划线等组成,注意的是第一个字符必须是字母或下划线,如"1Timer"是错误的,编译时便会有错误提示。有些编译系统专用的标识符是以下划线开头,所以一般不要以下划线开头命名标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。在C51编译器中,只支持标识符的前32位为有效标识,一般情况下也足够用了,除非你要写天书:P。


  关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEIL uVision2中的关键字除了有ANSI C标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。其实在KEIL uVision2的文本编辑器中编写C程序,系统可以把保留字以不同颜色显示,缺省颜色为天蓝色。


  先看表4-1,表中列出了KEIL uVision2 C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,而在C51编译器中int和short相同,float和double相同,这里就不列出说明了。下面来看看它们的具体定义:



数据类型

长 度

值 域

unsigned char

单字节

0~255

signed char

单字节

-128~+127

unsigned int

双字节

0~65535

signed int

双字节

-32768~+32767

unsigned long

四字节

0~4294967295

signed long

四字节

-2147483648~+2147483647

float

四字节

±1.175494E-38~±3.402823E+38

*

1~3字节

对象的地址

bit

0或1

sfr

单字节

0~255

sfr16

双字节

0~65535

sbit

0或1



4-1 KEIL uVision2 C51编译器所支持的数据类型



1. char字符类型


char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char和有符号字符类型signed char,默认值为signed char类型。unsigned char类型用字节中所有的位来表示数值,所可以表达的数值范围是0~255。signed char类型用字节中最高位字节表示数据的符号,"0"表示正数,"1"表示负数,负数用补码表示。所能表示的数值范围是-128~+127。unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。


*正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。


2. int整型


int整型长度为两个字节,用于存放一个双字节数据。分有符号int整型数signed int和无符号整型数unsigned int,默认值为signed int类型。signed int表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,"0"表示正数,"1"表示负数。unsigned int表示的数值范围是0~65535。


好了,先停一下吧,我们来写个小程序看看unsigned char和unsigned int用于延时的不同效果,说明它们的长度是不同的,呵,尽管它并没有实际的应用意义,这里我们学习它们的用法就行。依旧用我们上一课的最小化系统做实验,不过要加多一个电阻和LED,如图4-1。实验中用D1的点亮表明正在用unsigned int数值延时,用D2点亮表明正在用unsigned char数值延时。


51<b><b>单片机</b></b>教程


我们把这个项目称为TwoLED,实验程序如下:


#include //预处理命令


void main(void) //主函数名


{


unsigned int a; //定义变量a为unsigned int类型


unsigned char b; //定义变量b为unsigned char类型


do


{ //do while组成循环


for (a=0; a<65535; a++)


P1_0 = 0; //65535次设P1.0口为低电平,点亮LED


P1_0 = 1; //设P1.0口为高电平,熄灭LED


for (a=0; a<30000; a++); //空循环


for (b=0; b<255; b++)


P1_1 = 0; //255次设P1.1口为低电平,点亮LED


P1_1 = 1; //设P1.1口为高电平,熄灭LED




for (a=0; a<30000; a++); //空循环


}


while(1);


}


同样编译烧写,上电运行您就可以看到结果了。很明显D1点亮的时间长于D2点亮的时间。程序中的循环延时时间并不是很好确定,并不太适合要求精确延时的场合,关于这方面我们以后也会做讨论。这里必须要讲的是,当定义一个变量为特定的数据类型时,在程序使用该变量不应使它的值超过数据类型的值域。如本例中的变量b不能赋超出0~255的值,如for (b=0; b<255; b++)改为for (b=0; b<256; b++),编译是可以通过的,但运行时就会有问题出现,就是说b的值永远都是小于256的,所以无法跳出循环执行下一句P1_1 = 1,从而造成死循环。同理a的值不应超出0~65535。大家可以烧片看看实验的运行结果,同样软件仿真也是可以看到结果的。


3. long长整型


long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signed long和无符号长整型unsigned long,默认值为signed long类型。signed int表示的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号,"0"表示正数,"1"表示负数。unsigned long表示的数值范围是0~4294967295。


4. float浮点型


float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。 5.* 指针型


指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为1~3个字节。指针变量也具有类型,在以后的课程中有专门一课做探讨,这里就不多说了。


6. bit位标量


bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。


7. sfr特殊功能寄存器


sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。


AT89C51的特殊功能寄存器表请看附录二


8.sfr16 16位特殊功能寄存器


sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0和T1。


9. sbit可录址位


sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了


sfr P1 = 0x90; //因P1端口的寄存器是可位寻址的,所以我们可以定义


sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚


//同样我们可以用P1.1的地址去写,如sbit P1_1 = 0x91;


这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件,用您认为好记的名字。


  关于数据类型转换等相关操作在后面的课程或程序实例中将有所提及。大家可以用所讲到的数据类型改写一下这课的实例程序,加深对各类型的认识。


附录一 C51中的关键字


关键字

用 途

说 明

auto

存储种类说明

用以说明局部变量,缺省值为此

break

程序语句

退出最内层循环

case

程序语句

Switch语句中的选择项

char

数据类型说明

单字节整型数或字符型数据

const

存储类型说明

在程序执行过程中不可更改的常量值

continue

程序语句

转向下一次循环

default

程序语句

Switch语句中的失败选择项

do

程序语句

构成do..while循环结构

double

数据类型说明

双精度浮点数

else

程序语句

构成if..else选择结构

enum

数据类型说明

枚举

extern

存储种类说明

在其他程序模块中说明了的全局变量

flost

数据类型说明

单精度浮点数

for

程序语句

构成for循环结构

goto

程序语句

构成goto转移结构

if

程序语句

构成if..else选择结构

int

数据类型说明

基本整型数

long

数据类型说明

长整型数

register

存储种类说明

使用CPU内部寄存的变量

return

程序语句

函数返回

short

数据类型说明

短整型数

signed

数据类型说明

有符号数,二进制数据的最高位为符号位

sizeof

运算符

计算表达式或数据类型的字节数

static

存储种类说明

静态变量

struct

数据类型说明

结构类型数据

swicth

程序语句

构成switch选择结构

typedef

数据类型说明

重新进行数据类型定义

union

数据类型说明

联合类型数据

unsigned

数据类型说明

无符号数数据

void

数据类型说明

无类型数据

volatile

数据类型说明

该变量在程序执行中可被隐含地改变

while

程序语句

构成while和do..while循环结构



附表1-1 ANSIC标准关键字



关键字

用 途

说 明

bit

位标量声明

声明一个位标量或位类型的函数

sbit

位标量声明

声明一个可位寻址变量

Sfr

特殊功能寄存器声明

声明一个特殊功能寄存器

Sfr16

特殊功能寄存器声明

声明一个16位的特殊功能寄存器

data

存储器类型说明

直接寻址的内部数据存储器

bdata

存储器类型说明

可位寻址的内部数据存储器

idata

存储器类型说明

间接寻址的内部数据存储器

pdata

存储器类型说明

分页寻址的外部数据存储器

xdata

存储器类型说明

外部数据存储器

code

存储器类型说明

程序存储器

interrupt

中断函数说明

定义一个中断函数

reentrant

再入函数说明

定义一个再入函数

using

寄存器组定义

定义芯片的工作寄存器



附表1-2 C51编译器的扩展关键字


附录二 AT89C51特殊功能寄存器列表(适用于同一架构的芯片)



符 号

地 址

注 释

*ACC

E0H

累加器

*B

F0H

乘法寄存器

*PSW

D0H

程序状态字

SP

81H

堆栈指针

DPL

82H

数据存储器指针低8位

DPH

83H

数据存储器指针高8位

*IE

A8H

中断允许控制器

*IP

D8H

中断优先控制器

*P0

80H

端口0

*P1

90H

端口1

*P2

A0H

端口2

*P3

B0H

端口3

PCON

87H

电源控制及波特率选择

*SCON

98H

串行口控制器

SBUF

99H

串行数据缓冲器

*TCON

88H

定时器控制

TMOD

89H

定时器方式选择

TL0

8AH

定时器0低8位

TL1

8BH

定时器1低8位

TH0

8CH

定时器0低8位

TH1

8DH

定时器1高8位




带*号的特殊功能寄存器都是可以位寻址的寄存器




单片机教程,51单片机C语言学习(四)



单片机教程,五系列(55讲)电子书全集下载

论坛精选:
单片机教程,MCS51单片机从零开始 第一讲:初识单片机
http://bbs.huazhoucn.com/Topic.aspx?id=2539
单片机教程,MCS51单片机从零开始 第二讲:MCS-51单片机简述
http://bbs.huazhoucn.com/Topic.aspx?id=2540
单片机教程,MCS51单片机从零开始 第三讲:单片机相关常用名词解释
http://bbs.huazhoucn.com/Topic.aspx?id=2541
单片机教程,MCS51单片机从零开始 第四讲:计算机中数的表示及运算
http://bbs.huazhoucn.com/Topic.aspx?id=2542
单片机教程,MCS51单片机从零开始 第五讲:常用逻辑电路
http://bbs.huazhoucn.com/Topic.aspx?id=2544
单片机教程,MCS51单片机从零开始 第六讲:51单片机的结构及其组成
http://bbs.huazhoucn.com/Topic.aspx?id=2545
单片机教程,MCS51单片机从零开始 第七讲:51单片机的引脚
http://bbs.huazhoucn.com/Topic.aspx?id=2546
单片机教程,MCS51单片机从零开始 第八讲:8051单片机I/O引脚工作原理
http://bbs.huazhoucn.com/Topic.aspx?id=2547
单片机教程,MCS51单片机从零开始 第九讲:8051单片机的存储器结构
http://bbs.huazhoucn.com/Topic.aspx?id=2548
单片机教程,MCS51单片机从零开始 第十讲:编码及译码器工作原理
http://bbs.huazhoucn.com/Topic.aspx?id=2549
单片机教程,MCS51单片机从零开始 第十一讲:存储器的存储原理
http://bbs.huazhoucn.com/Topic.aspx?id=2550
单片机教程,MCS51单片机从零开始 第十二讲:51单片机的特殊功能寄存器
http://bbs.huazhoucn.com/Topic.aspx?id=2551
单片机教程,MCS51单片机从零开始 第十三讲:51单片机CPU的内部结构
http://bbs.huazhoucn.com/Topic.aspx?id=2552
单片机教程,MCS51单片机从零开始 第十四讲:定时器/计数器的基本结构及工作原理
http://bbs.huazhoucn.com/Topic.aspx?id=2553
单片机教程,MCS51单片机从零开始 第十五讲:51单片机的中断系统
http://bbs.huazhoucn.com/Topic.aspx?id=2554
单片机教程,MCS51单片机从零开始 第十六讲:51单片机的复位
http://bbs.huazhoucn.com/Topic.aspx?id=2555
单片机教程,MCS51单片机从零开始 第十七讲:51单片机执行指令的过程
http://bbs.huazhoucn.com/Topic.aspx?id=2556
单片机教程,MCS51单片机从零开始 第十八讲:51单片机的延时及时序分析
http://bbs.huazhoucn.com/Topic.aspx?id=2557
单片机教程,MCS51单片机从零开始 第十九讲:汇编语言基础
http://bbs.huazhoucn.com/Topic.aspx?id=2558
单片机教程,MCS51单片机从零开始 第二十讲:汇编语言及汇编过程
http://bbs.huazhoucn.com/Topic.aspx?id=2556
单片机教程,MCS51单片机从零开始 第二十一讲:汇编程序的基本结构
http://bbs.huazhoucn.com/Topic.aspx?id=2560
单片机教程,MCS51单片机从零开始 第二十二讲:51单片机的寻址方式
http://bbs.huazhoucn.com/Topic.aspx?id=2561
单片机教程,MCS51单片机从零开始 第二十三讲:数据传送类指令分析
http://bbs.huazhoucn.com/Topic.aspx?id=2562
单片机教程,MCS51单片机从零开始 第二十四讲:算术运算类指令分析
http://bbs.huazhoucn.com/Topic.aspx?id=2563
单片机教程,MCS51单片机从零开始 第二十五讲:逻辑运算及移位指令分析
http://bbs.huazhoucn.com/Topic.aspx?id=2564
单片机教程,MCS51单片机从零开始 第二十六讲:控制转移类指令分析
http://bbs.huazhoucn.com/Topic.aspx?id=2565
单片机教程,MCS51单片机从零开始 第二十七讲:布尔变量操作指令分析
http://bbs.huazhoucn.com/Topic.aspx?id=2566
单片机教程,MCS51单片机从零开始 第二十八讲:伪指令分析
http://bbs.huazhoucn.com/Topic.aspx?id=2567

1 楼  提交者:Guest 在 2007-9-28 12:23:41
sss
2 楼  提交者:Guest 在 2007-9-28 14:33:43
好啊
3 楼  提交者:Guest 在 2007-9-28 23:58:11
太好了, 马上看看
4 楼  提交者:Guest 在 2007-9-29 0:00:34
太好了, 马上看看
5 楼  提交者:美中英 在 2007-10-3 11:13:32
〖电K〗温馨提示:

请注意评语!

6 楼  提交者:Guest 在 2007-10-8 18:56:04
fkasf
7 楼  提交者:Guest 在 2007-10-19 4:37:42
这个社区真好!继续学习中。。
8 楼  提交者:Guest 在 2007-10-19 11:27:17
迫不及待,继续看。。
9 楼  提交者:MiKe 在 2007-10-20 11:33:50
把上面表先存下来先
10 楼  提交者:五月的花 在 2007-10-28 11:00:34
无内容
11 楼  提交者:liwei5613 在 2007-10-31 11:43:54
迫不及待,继续看。。
12 楼  提交者:liwei5613 在 2007-10-31 11:43:58
迫不及待,继续看。。
13 楼  提交者:Guest 在 2007-11-4 19:12:49
无内容
14 楼  提交者:Guest 在 2007-11-4 19:13:19
15 楼  提交者:Guest 在 2007-11-6 22:30:04
什么?
16 楼  提交者:Guest 在 2007-11-11 12:46:17
17 楼  提交者:Guest 在 2007-11-23 16:39:11
hao  
18 楼  提交者:Guest 在 2007-11-28 20:46:35
hao 
19 楼  提交者:Guest 在 2007-11-28 20:47:07
hao 
20 楼  提交者:Guest 在 2007-12-12 22:02:16
无内容
21 楼  提交者:Guest 在 2007-12-28 10:17:03
jjjjjjjjjjjjj
22 楼  提交者:Guest 在 2007-12-28 10:17:17
jjjjjjjj
23 楼  提交者:Guest 在 2007-12-28 10:17:57
ghjnjmmm
24 楼  提交者:Guest 在 2007-12-28 10:20:28
wrww
25 楼  提交者:鲁刚 在 2008-1-21 16:43:24
2
26 楼  提交者:005lyp 在 2008-1-24 12:49:37
ding
27 楼  提交者:Guest 在 2008-2-15 12:45:11
ok!
28 楼  提交者:Guest 在 2008-2-27 20:27:10
1
29 楼  提交者:Guest 在 2008-2-27 20:27:27
1231231
30 楼  提交者:Guest 在 2008-2-27 21:43:36
上一篇 下一篇
当前第〖1〗页 共有4页 转到第 1 2 3 4