STC51入门笔记(郭天祥C语言)—第二节:Keil 软件使用及流水灯设计

本章详细介绍单片机程序常用编译软件 Keil 的用法,包括用Kei 建立工程、工程配置、C51单片机程序软件仿真、单步、全速、断点设置、变量查看等。同时还介绍如何使用SST89E516RD 单片机进行计算机与 TX- lC单片机学习板之间的硬件仿真。用一个完整的C51程序来操作发光二极管的点亮与熄灭,然后调用C51库函数来方便地实现流水灯,最后为大家补充蜂鸣器与继电器的操作方法及栠电极开路与漏极开路的概念。从这一章开始我们将手把手地讲解单片机C语言编程。认真学好本章,对千初学者来说将会是一个非常好的开头。

一、Keil 工程建立及常用按钮介绍

1、Keil 工程的建立:

进入 Keil后,屏幕如下图所示:

二、点亮第一个发光二极管

大家是不是已经迫不及待地想编写程序了, 接下来我们就用 C 语言编写一个点亮TX- l C 实验板上第一个发光二极管的程序。由千这是本书的第一个程序,看懂了它,也就意味若你已经踏入了单片机 C 语言编程的第一道门槛, 因此我们在这里要花些时间讲解它, 大家一定要有耐心,认真地弄明臼它。

【例 2.2.1】编写程序, 点亮第一个发光二极管。

创建目标 “Target’1’’
编译文件 Sumjess.c:’ . ,.
链接..
工 程 “Sumjess”’ 编译结果-0 个错误, 0 个 警告。

以上信息表示此工程成功编译通过。

知识点: reg52.h 头文件的作用

在代码中引用头文件,其实际意义就是将这个头文件中的全部内容放到引用头文件的位 置处,免去我们每次编写同类程序都要将头文件中的语句重复编写。

在代码中加入头文件有两种书写方法,分别为==# include <reg52.h>和#include “reg52.h”==, 包含头文件时都不需要在后面加分 。

两种写法区别如下:

当使用<>包含头文件时,编译器先进入到软件安装文件夹处开始搜索这个头文件,也就 是 KeilCS1INC 这个文件夹下, 如果这个文件夹下没有引用的头文件, 编译器将会 错。

当使用双撇 ”“包含头文件时,编译器先进入到当前工程所在文件夹处开始搜索该头文件,如果当前工程所在文件夹下没有该头文件,编译器将继续回到软件安装文件夹处搜索这 个头文件, 若找不到该头文件, 编译器将 错。reg52.h 在软件安装文件夹处存在, 所以我们一般写成#include <reg52.h>。

打开该头文件查看其内容, 将鼠标移动到 reg52.h 上, 单击右键, 选择 [ Open document<reg52.h> ], 即可打开该头文件,如下图所示。以后若需打开工程中的其他头文件,也可采用这种方式。或者手动定位到头文件所在的文件夹也可。

知识点:C 语言中注释的写法

在C语言中,注释有两种写法:

(1) //…,两个斜扛后面跟着的为注释语句。这种写法只能注释一行,当换行时,又必须在新行上重新写两个斜扛。
(2) //,斜扛与星 结合使用,这种写法可以注释任意行,即斜扛星 与星 斜扛之间的所有文字都作为注释。

所有注释都不参与程序编译,编译器在编译过程会自动删去注释,注释的目的是为了我们读程序方便,一般在编写较大的程序时,分段加入注释,这样当我们回过头来再次读程序时,因为有了注释,其代码的意义便一目了然了。若无注释,我们不得不特别费力地将程序重新阅读一遍方可知道代码含义。养成良好的书写代码格式的习惯,经常为自己编写的代码加入注释,以后定能方便许多。

例 2.2.1 程序中接着往下看, “sbit ledl=P1^0; ” 语句的含义是, 将单片机 P0 口的最低位定义为 led1。在TX- lC实验板上,8个发光二极管的阴极通过一个 74HC573 锁存器分别连接至单片机的 P0 口, 若要控制某一个发光二极管, 也就是要控制单片机 P0 口的某一位, 必定要声明这一位, 否 则单片机肯定不知道我们要操作的是什么东东。需要注意的是, 这里的 P1 不可随意写, P 是大写, 若写成 p, 编译程序时将 错, 因为编译器并不认识 p1, 而它只认识P1 , 这是因为我们在头文件中定义的是 ” sfr P1= 0x90;”。这也是大多初学者编写第一个程序时常犯的错误。

例 2.2.1 程序中再往下就到了主函数main() , 无论一个单片机程序有多大,或多小,所有的单片机在运行程序时,总是从主函数开始运行,关于主函数的写法,我们看下一个知识点。

知识点: main()主函数的写法

main( )函数

格式:void main( )

注意: 后面没有分 。

特点:无返回值,无参数。

      无返回值表示该函数执行完后不返回任何值, 上面 main前面的 void 表示“空” ,即 不返回值的意思,后面我们会讲到有返回值的函数,到时大家一对比便会更加明白。
      无参数表示该函数不带任何参数, 即 main后面的括 中没有任何参数, 我们只写 “( )”就可以了, 也可以在括 里写上void , 表示“空” 的意思, 如 void main(void)。 .
      任何一个单片机 C 程序有且仅有一个 main 函数, 它是整个程序开始执行的入口。大家注意看,在写完 main( )之后,在下面有两个花括 , 这是C 语言中函数写法的基本要求之一,即在一个函数中,所有的代码都写在这个函数的两个大括 内,每条语句结束后都要加上分 ,语句与语言之间可以用空格或回车隔开。
例如:
void main()

总程序从这里开始执行;
其他语句;

}

例 2.2.1 程序中接下来我们看 ” led1 =0;” 语句,也就是该程序中最核心的语句。在数字电路中, 电平只有两种状态: 高电平,1 ; 低电平,0。显 然,该 语句的意思是, 让P1 口的最低位清 0。由于没有操作其他口, 所以其余口均保持原来状态不变。那么为什么P1 口的最低位清0, 板上的第一个发光二极管就会亮呢下来我们再来讲解电路知识,TX-lC单片机实验板上流水灯与单片机连接方法如下图所示。

知识点:由电阻标 认知阻值

      一般在排阻上都标有阻值 ,其公共端附近也有明显标记。如上图左和上图右中分别为 103 和 150, 103 表示其阻值大小为 10 x10^3Ω, 即10KΩ, 若是102其阻值大小为10×100,即 1 KΩ,150 为15Ω,即 15Ω,其他读法都相同。
      我们有时也会看到标 为 1002, 1001 等。1002 表示100×10^2Ω,即10KΩ。
      3 位数表示与 4位数表示的阻值读法我们都要会,标 位数不同, 其电阻的精度不同, 一般地, 3 位数表示 5%精度, 4 位数表示 1% 精度。TX- l C 实验板上与发光二极管连接的是102 阻值的 9 引脚直插排阻。
      还有的标 如 3R0 ,表示阻值为 3Ω, 4K7 表示阻值为 4.7KΩ , R002 表示阻值为 0.002Ω。
( 2 ) 发光二极管。它具有单向导电性,通过5mA 左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在 3~20mA之间。在这里, 给发光二极管串联一个电阻的目的就是为了限制通过发光二极管的电流不要太大, 因此这个电阻又称为“ 限流电阻"。当发光二极管发光时, 测量它两端电压约为 1.7V, 这个电压又叫做发光二极管的 ” 导通压降"。下图左和下图右分别为直插式发光二极管和贴片式发光二极管实物图。发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。仔细观察贴片式发光二极管正面的一端有彩色标记, 通常有标记的一端为阴极。大家可观察TX- IC 实验板上贴片发光二极管有一端有绿色标记, 此标记即标识它是管子的阴极。

知识点:锁存器

      下图左为 74 HC573 的引脚分布图,先对照引脚图分别介绍各个引脚的作用, OE 的专业术语为三态允许控制端(低电平有效),通常叫做输出使能端,或输出允许端都可以; ID~8D 为数据输入端; 1 Q-8 Q 为数据输出端; LE 为锁存允许端, 或叫锁存控制端。
      右图为74HC573 的真值表。真值表用来表示数字电路或数字芯片 工作状态的直观特性, 大家务必要看明白。下图右真值表中宇母代码含义如下: H—高电平; L—低电平; X—任意电平; Z—高阻态,也就是既 不是高电平也不是低电平,而它的电平状态由与它相连接的其他电气状态决定; Q。—上次的电平状态。

三、while语句

通过上面一节的学习,想必大家已经对点亮实验板上的任意发光二极管轻车熟路了, 但是, 先不要高兴得太早, 上面的程序并不完善, 任何一个程序都要有头有尾才对, 而上面我们写的程序似乎只有头而无尾。我们分析一下看, 当程序运行时, 首先进入主函数,顺序执行里面的所有语句,因为主函数中只有一条语句,当执行完这条语句后,该执行什么了为我们没有给单片机明确指示下一步该做什么, 所以单片机在运行时就很有可能会出错。根据经验(并没有详细记录可查),当 Keil 编译器遇到这种情况时,它 会 自动从主函数开始处重新执行语句,所以单片机在运行上面两个程序时,实际上是在不断地重复点亮发光二极管的 操作,而我们的意图是让单片机点亮二极管后就结束,也就是让程序停止在某处,这样一个 有头有尾的程序才完整。
那么如何让程序停止在某处呢们用 while 语句就可以实现。

知识点: while( ) 语 句

格式: while (表达式)

{内部语句(内部可为空)}

特点:先判断表达式,后执行内部语句。

原则: 若表达式不是0, 即为真, 那么执行语句。 否则跳出 while 语句 ,执行 后面的语句。

需要注意的三点:
( I ) 在 C 语言中我们一般把 “0” 认 为是“假",“ 非 0″ 认 为是 “真”,也就是说,只 要不是 0 就是真, 所以 1, 2, 3 等都是真。
( 2 ) 内部语句可为空, 就是说 while后面的大括 里什么都不写也是可以的, 如”while(l){ };“既然大括 里什么也没有,那么我们就可以直接将大括 也不写,再如”while(1);” 中 “;” 一定不能少, 否则 while( )会把跟在它后面笫一个分 前的语句认 为是 它的内部语句。
例如: while(l)
P1=123;
P2=121;

上面这个例子中, while()会把 “P1=123;” 当做 它的语句,即使 这 条 语 句并 没有 加 大括 。既然如此, 那么我们以后在写程序时,如 果 while( )内部只有一条语句, 我们就可以省去大括 ,而直接将这条语句跟在它的后面。
例如: while(l)
P1=123;
( 3 ) 表达式可以是一个常数、一个运算或一个带返回值的函数。
有了上面的介绍,我 们在程序最后加上 ” while(1);”这样一条语句就可以让程序停止。因为该语句表达式值为 1’ 内 部语句为空,执 行 时 先 判 断 表 达 式 值 ,因 为为真, 所以什么也不执行, 然后再判断表达式, 仍 然 为真, 又 不 执 行 , 因 为只有当表达式值为 0 时才可跳出 while() 语句,所以程序将不停地执行这条语句,也就是说单片机点亮发光管后将永远重复执行这条 语句。
初学者可能会这样想,我让单片机把发光二极管点亮后,就让它停止工作,不再执行别的指令,这样不是更好吗大家注意,单片机是不能停止工作的,只要它有电,有晶振在起振,它就不会停止工作, 每过一个机器周期,它内部的程序指针就要加 1, 程序指针就指向下一条要执行的指令。想让它停止工作的办法就是把电断掉,不过这样发光二极管也就不会亮了。不过我们可以将单片机设置为休眠状态或掉电模式,这样可以最大限度地降低它的功耗。

四、for语句及简单延时语句

知识点: for 语句

格式: for(表达式 l ;表达式 2;表达式 3)

{语句(内部可为空)} 执行过程:

笫1步, 求解一次表达式 l 。
笫2步, 求解表达式 2, 若其值为真( 非 0 即为真 ), 则执行 for 中语句, 然后执行笫 3
步; 否则结束 for 语句, 直接跳出, 不再执行笫 3 步。
笫3步, 求解表达式 3。
笫4步,跳 到笫 2 步重复执行。

需要注意的是, 三个表达式之间必须用隔开。
利用 for 语句和 while 语句可以写出简单的延时语句,下 面就用 for 语句来写一个简单的延时语句, 并进一步讲解 for 语句的用法。
unsigned char i; for(i=2;i>0;i–);
看上面这两句, 首先定义一个无符 字符型变量 i, 然后执行 for 语句, 表 达 式 l 是给 i
赋一个初值 2, 表达式 2 是判断i 大于 0 是真还是假, 表达式 3 是i 自减 1’ 我们分析执行过程:
第 1 步, 给i 赋初值 2, 此时 i=2。
第 2 步, 因为 2>0 条件成立, 所以其值为真, 那么执行一

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年3月1日
下一篇 2019年3月1日

相关推荐