首页 理论教育学习单片机编程:第一个C语言源程序

学习单片机编程:第一个C语言源程序

【摘要】:程序编译通过是进入仿真运行的必要条件,请注意C语言程序的编辑格式,C语言程序对大小写的编译是有区别的,一般均用英语小写字符。C语言程序为什么能与8051系列单片机的硬件联系起来呢?3)第3行,一般在主程序开始前要空出一行,可以加强注意。4)第4行,主程序名要用main表示。对于每一个函数必须成对出现大括号。C语言中规定可连续定义常量和变量,中间可用逗号隔开。8)第8行,作为C语言,到第7行语句就已经结束了。

本书为避免一开始就进入大量概念性文字的叙述,从而影响读者学习兴趣,所以必需的基础知识读者可自行查阅C语言编程的书籍,我们尽量按照边做边学的特点开始C语言的学习。

【例4-1】 计算a+b的和并输出到P1口

(1)编程 (因为对Keil μVision2的操作在汇编语言学习中已练习过,在此不再重复)

1)创建文件夹D:\c51\exam_ 1c(要求每一个文件夹只放一个项目)。

2)进入Keil C51界面。

3)在文件夹内创建项目exam_1c,与文件夹同名,以方便查找。

4)选择器件Atmel AT89C51。

5)单击主菜单“项目/目标”,进入目标窗口,将晶体振荡频率改为6MHz。

6)单击“输出”,进入输出窗口。将hex项写“√”,表示hex文件输出有效,单击“确定”按钮返回。

7)单击“文件/新建”,进入编辑窗口。单击“文件/另存为”,输入新文件名exam_ 1c.c,所有C源文件名后缀必须为“.c”。

8)在编辑窗口键盘输入C源程序,具体如下:

978-7-111-47138-7-Chapter04-1.jpg

程序左侧的行号(1、2、3…)是为了解释的方便而设,不用输入。

9)单击工作区Target1(目标),选择Source Group 1(源文件组),单击鼠标右键,在弹出的菜单中选择“Add Files to Group’Source Group 1”,在文件窗口中选源文件exam_ 1c.c,单击“Add”按钮,再单击“Close”按钮关闭窗口。在工作区即显示源文件exam_ 1c.c,表示源文件已加入目标工作区。

10)单击“文件→保存”,保存源文件。

11)在目标工作区选源文件ex-am_ 1c.c,单击鼠标右键,选目标编译,如果源文件无语法错误,则在窗口下方信息栏会显示编译完成,无错误,无警告,并生成HEX文件,如图4-1所示。

978-7-111-47138-7-Chapter04-2.jpg

图4-1 编译结果信息

若源文件内有语法错误,必须根据信息栏的指示修改源程序,直到文件编译通过为止。程序编译通过是进入仿真运行的必要条件,请注意C语言程序的编辑格式,C语言程序对大小写的编译是有区别的,一般均用英语小写字符

(2)程序解释

1)第1行,说明程序所用的头文件是<reg51.h>。C语言程序为什么能与8051系列单片机的硬件联系起来呢?就是这个头文件的作用。

在头文件中,对8051的各端口及SFR地址都进行了定义。其中P1必须用大写。对于8051兼容的芯片,第1行的头文件<reg51.h>是必要的。否则C语言编译器将编译出错。

2)第2行,是为了对变量的数据类型unsignedchar进行简化而重新定义了一个uchar,这样输入会简化不少。当然,如果你不用这个新定义直接输入unsigned char也可以。

3)第3行,一般在主程序开始前要空出一行,可以加强注意。

4)第4行,主程序名要用main表示。前面的void表示主函数无返回值。后面的(void)表示无形式参数(简称形参)。关于形参与实际参数(简称实参)后面还要介绍。

5)大括号“{”表示函数的开始,第8条语句的大括号“}”表示函数的结束。对于每一个函数必须成对出现大括号。(www.chuimin.cn)

6)第6行,声明常量a、b的数据类型是uchar型。C语言中规定可连续定义常量和变量,中间可用逗号隔开。每条语句最后必须有分号,表示本语句被执行。

7)第7行,执行a+b并将结果赋予端口P1。“+”号与普通算术符号相同。“=”号在这里并不是等号,而是赋值号。其意义是将a+b的结果赋予P1。赋值号与等号不同,使用时要注意。赋值的意义是将运算结果的值赋予端口P1或赋予一个变量。变量的原有内容被改变为新内容。而数学中的等号是两个量相等,并不改变原有值。P1必须大写。

8)第8行,作为C语言,到第7行语句就已经结束了。与主函数开始的大括号成对出现,结束也必须有“}”作为结束。

(3)编译前检查

程序编辑结束后,必须进行编译,生成hex文件,才能下载到目标机中被执行。由于C语言书写格式要求严格,若不注意,往往会导致编译不能通过。为此,程序编辑结束后,应审查以下几点:

1)数据类型如无特别需要,变量类型应尽量采用unsigned char,其范围为0~255。它只占用一个字节,存取速度快。

2)尽量采用局部变量

3)主函数放在最后。

4)一般变量用小写英文字符。单片机内部SFR要用大写英文字符。

5)检查所有标识符,关键字是否正确。

6)所有字符除中文注释外,均用ASCII码编辑。

7)函数如无返回值,前面应加void。如无形参,后面应加(void)。

8)变量使用前,必须先声明,并注意不要超出变量范围。

(4)执行

1)软仿真。我们利用Keil C51的软仿真能力,可以很方便地在编辑平台上进行程序的调试,检验程序的执行结果。它无需连接硬件目标系统,因而称为“软仿真”。这为程序的设计者带来了很大方便。

在主菜单中单击“调试→开始”,进入调试状态。

单击“外围端口/I/O-Ports/Port1”,显示P1状态窗口。

单击“W监视&调用堆栈窗口”,在信息栏显示变量表内容,如图4-2所示。

双击变量a的0x00,输入80,系统将自动变为0x50。双击变量b的0x00,输入60,系统自动变为0x3C,如图4-3所示。

单击“跟踪”(调试工具栏),执行到语句8停止。P1=1000 1100=0x8C。“0x”表示十六进制数,转换为十进制数为8×16+12=140,结果正确,如图4-4所示。

978-7-111-47138-7-Chapter04-3.jpg

图4-2 变量a、b的内容

978-7-111-47138-7-Chapter04-4.jpg

图4-3 变量a、b的赋值

2)下载到目标机 操作方法与第一章中提到的下载方法相同。可以用串行接口,也可以用USB转换器。执行后,“1”灯灭,“0”灯亮。可由灯的状态得到P1=1000 1100,即灯的状态为●○○○●●○○。