第一讲 C与8051基础 C51数据与数据类型

更新时间:2023-06-06 22:39:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C与8051基础 C51数据与数据类型

第一讲 C与8051基础 C51数据与数据类型

课程介绍:

本课程的教学在学生已经学习过单片机的基础上开设的又一门单片机的课程,联系单片机课程,达到温故而知新的目的。

本课程与汇编存在较大差异,应注意基础知识的学习与巩固。

本课程实践性较强,大家应注重实验环节。

本课程主要学习单片机C语言编程语法,即程序结构、各种语句、数组、指针、函数调用、中断与定时计数等的用法。

考核办法:

1、分理论考核和实践考核,其中实验考核为期末对硬件接口知识程序设计,程序调

试方法进行综合考核,理论和实践都是通过笔试来时进行考核的;

2、成绩评定,期末考试为60%,平时为40%,平时成绩包括:1)考勤5%,2)平

时作业(主要为平时实验成绩)30%,提问5%。

实验要求:每个同学必须认真预习实验并提前编写本实验程序,实验时将检查。实

验结果当堂检查并签字

一、C与8051基础:

对于8051C语言是 一种源于编写UNIX操作系统的语言,是一种结构化的语言,与汇编语言相比,C语言有许多优点。(见书P37)

尽管C语言是一种较汇编语言方便的语言而得到了广泛支持,但看懂一些汇编 语言可以帮助了解影响语言效率的8051特殊限定,避免产生庞大的效率低的程序。最好的编程者是由汇编转用C语言的人。

1、C源程序书写格式的要求:(见书P47)

一般情况下,每个语句占用一行;不同结构层次的语句,从不同的起始位置开始,而同

一结构层次中的语句,缩进同样的字数;表示结构层次的大括号通常写在该结构语句第一字母的下方,与结构化语句对齐,并占用一行。

2、C51编程结构:(见书P48)

Cx51的一般格式如下:

类型 函数名(参数表)

参数说明:

C与8051基础 C51数据与数据类型

{

数据说明部分;

执行语句部分;

}

例1-1: 让接在P1.0引脚上的LED发光。(如图1-1所示)

用Cx51设计程序如下:

这个程序的作用是让接在P1.0引脚上的LED点亮。下面来分析一下这个C语言程序包含了哪些信息。

1. #include “reg51.h”

2. sbit P1_0=P1^0;

3. void main()

4. { P1_0=0;

5. }

1)“文件包含”处理:

程序的第1行是一个“文件包含”处理。

所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的时候却要处理几十或几百行。这里程序中包含REG51.h文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量。这是如何做到的呢?

从补充资料不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。注

意其中有sfr P1 = 0x90;

这样的一行,即定义P1与地址0x90对应,P1口的地址就是0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。

2)符号P1_0来表示P1.0引脚:

在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit来定义,sbit的用法有三种:

第一种方法:sbit 位变量名=地址值

第二种方法:sbit 位变量名=SFR名称^变量位地址值

第三种方法:sbit 位变量名=SFR地址值^变量位地址值

如定义P1中的P1.0可以用以下三种方法:

sbit P1_0=0x90 (1)说明:0x90是P0.1的位地址值

sbit P1_0=P1^0 (2)说明:其中P1必须先用sfr定义好(即sfr P1 = 0x90;)

C与8051基础 C51数据与数据类型

sbit P1_0=0x90^0 (3)说明:0x90就是P1的地址值

所以在程序的第2行对于P1.0的定义是正确的。

3)main称为“主函数”:

每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号“{}”,在大括号

里面书写其它程序。

在第3行中定义了一个主函数,前面加了void表示该主函数没有返回类型。 在这个函数中只有一条语句:P1_0=0;因为从电路图分析可以清楚地知道,只有当P1.0

引脚上输出低电平是发光二极管才会被点亮。

例1-2: 在programming和language两个单词中,查找相同位置是否有相同的字母,若有则输出该字母,若无则输出为空。

main( )

{

char a[ ]="programming",b[ ]="language";

char *p1,*p2 ;

int i ;

p1=a;p2=b ;

for(i=0;i<7;i++)

{

if(*(p1+i)==*(p2+i))

printf("%c",*(p1+i));

}

}

输出结果是( )

A)gm B)rg C)or D)ga

通过上述的几个例子,可以得出一些结论:

1、 C程序是由函数构成的,一个C源程序至少包括一个函数,一个C源程序有且

只有

一个名为main()的函数,也可能包含其它函数,因此,函数是C程序的基本单位;

2、一个函数由两部份组成:

(1)函数的首部、即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形

参)名、参数类型。

例如:void mDelay (unsigned int DelayTime)一个函数名后面必须跟一对圆括号,即

C与8051基础 C51数据与数据类型

便没

有任何参数也是如此。

(2)函数体,即函数首部下面的大括号“{}”内的部份。如果一个函数内有多个大括号,则最外层的一对“{}”为函数体的范围。

函数体一般包括:

声明部份:在这部份中定义所用到的变量,例1.2中unsigned char j。

执行部份:由若干个语句组成。

在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如:

void mDelay()

{ }

这是一个空函数,什么也不干,但它是合法的。在编写程序时,可以利用空函数,来搭建一个延时程序。就如汇编语言程序中的NOP空操作指令。

3、一个C语言程序,总是从main函数开始执行的,而不管物理位置上这个main()放在什么地方;

4、C语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定;

5、C语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行。没有行号(但可以有标号),书写的缩进没有要求。但是建议编者自己按一定的规范来写,可以给自己带来方便;

6、 每个语句和资料定义的最后必须有一个分号,分号是C语句的必要组成部份;

7、可以用/*…..*/的形式为C程序的任何一部份作注释,在“/*”开始后,一直到“*/”为止的中间的任何内容都被认为是注释,所以在书写特别是修改源程序时特别要注意,有时无意之中删掉一个“*/”,结果,从这里开始一直要遇到下一个“*/”中的全部内容都被认为是注释了。

特别地,Keil C也支持C++风格的注释,就是用“//”引导的后面的语句是注释,例: P1_0=!P1_0; //取反P1.0

二、C51的数据与数据类型:

1、数据及数据类型的定义:(见书P50及表1-1)

2、C51提供的数据类型及Cx51编译器具体支持的数据类型(见书P50)

注:数据类型的转换,当计算结果隐含着另一种数据类型时,需将类型转换为同类型,

转换方式有两种(见书P64):

自动类型转换(如表1-2所示):即在程序编译时由C编译自动进行数据类型转换。如

char,int变量同时存在时,则将char转换成int类型;

C与8051基础 C51数据与数据类型

强制类型转换:需要使用强制类型转换运算符,其形式为 (类型名)(表达式);

如(double) a;将a强制转换成double类型。 解释下面表达式含义:

(1) (float)x (2) (float)(x+y) (3) (long)(y)

本文来源:https://www.bwwdw.com/article/lfj1.html

Top