资讯详情

第4课 点亮发光管程序分析

上面我们的叙述了一个程序的编辑、编译和下载完整的过程,最终点亮了第一个 ,不过这个程序到底是什么意思,为什么应该这么写,可能有些人还不是很懂,下面给大家分析,并对里面涉及到的C语言知识进行讲解。 为了便于讲解,这里把上节课的程序一并给出: 例1 点亮第一个发光二极管程序 (1)输入源程序(又称为程序编辑) #include //52系列单片机头文件 sbit D1=P1^0;//位定义单片机P1口的第1位 void main()//主函数 { D1=0;//点亮第一个发光二极管 } 1 、头文件 程序的第一句#include<reg52.h>称为头文件,头文件就是C语言中的“文件包含的”的意思。所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg52.h,然后用#include<reg52.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。 在程序中加入头文件通常有两种方法,分别是#include<reg52.h>和#include“reg52.h”,注意头文件句末不需要加“;”否者编译器编译时会报错。加头文件时< >和“”两者是有区别的,主要如下: 当使用< >包含头文件时,程序编译时编译器会首先到keil软件的安装文件下进行寻找,具体在keil\C51\INC这个文件下,如果没有找到,刚编译时会报错。 当使用“”包含头文件时,程序编译时编译器会首先到当前工程所在的文件夹下寻找,如果没有找到,则马上到keil软件的安装文件下进行寻找,如果都没有找到,则编译时会报错。由于<reg52.h>在安装文件下,所以一般写成#include<reg52.h>,就可以了。 现在我们打开reg52.h文件,看里面具体内容,可以直接在安装文件keil\C51\INC直接找到reg52.h文件,也可以在编辑界面将鼠标箭头放在#include<reg52.h>,然后右键再选择 Open docment <reg52.h>, 如图12所示。 图12 打开头文件 此时会出现reg52.h的内容如下: /*-------------------------------------------------------------------------- REG52.H Header file for generic 80C52 and 80C32 microcontroller. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. --------------------------------------------------------------------------*/ #ifndef __REG52_H__ #define __REG52_H__ /* BY Registers */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr = 0x81; sfr L = 0x82; sfr DPH = 0x83; sfr PC = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8; sfr SCON = 0x98; sfr SBUF = 0x99; /* 8052 Extensions */ sfr T2CON = 0xC8; sfr P2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD; /* BIT Registers */ /* PSW */ sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; //8052 only /* TCON */ sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; /* IE */ sbit EA = IE^7; sbit ET2 = IE^5; //8052 only sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; /* IP */ sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; /* P3 */ sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit I 1 = P3^3; sbit INT0 = P3^2; sbit TXD = P3^1; sbit RXD = P3^0; /* SCON */ sbit SM0 = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit = SCON^1; sbit RI = SCON^0; /* P1 */ sbit T2EX = P1^1; // 8052 only sbit T2 = P1^0; // 8052 only /* T2CON */ sbit TF2 = T2CON^7; sbit EXF2 = T2CON^6; sbit RCLK = T2CON^5; sbit TCLK = T2CON^4; sbit EXEN2 = T2CON^3; sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; sbit CP_RL2 = T2CON^0; #endif 该头文件主要是对52单片机所有特殊功能寄存器的地址进行声明。 sfr P1 = 0x90 这句话表示: P1 口所对应的特殊功能寄存器 P1 在内存中的地址为 0x80 。换另一种说法就是我们对 0x80 处的寄存器重新取名P0 ,以后我们在程序中对P0进行操作,就相当于直接对 0x80 处的寄存器进行操作。 sfr 表示特殊功能寄存器的意思,它并非标准 C 语言的关键字,而是 Keil 为能直接访问 80C51 中的 SFR 而提供了一个新的关键词,其用法是:sfr 特殊功能寄存器名=地址值 (注意 对于头文件里“特殊功能寄存器名”,用户实际上也可以修改的,如P1=0x80,也可改为A1=0x80,但 sfr 和地址值则不能更改,否者会编译出错。) 以上是对寄存器地址和定义和声明作了解释,大家需要牢牢记住:只有对寄存器进行声明地址后,我们才能对其进行赋相关的值,keil软件才能编译通。 实际上就本程序来说,我们也可以不包含该头文件,而加上一句话,“ sfr P1=0x90; ”也是可以的,但如果要用到P0 P1 P2 P3就需要写四名话,这样就会显得很麻烦 ,只要大家能理解这个,相信大家对为什么要在些加一直头文件的原因应该理解了,总之以后我们写51的程序时第一句话就直接包含该头文件就行了。 2、程序注释 在对头文件进行解释后,在头文件后面我们可以看到有“//……”符号。“//……”表示语句注释,其作用主要是为了以后阅读程序来方便。“//……”主要是对单句或者比较短的程序进行注释,但如果是对一整段程序进行注释时,这种方法就显得非常麻烦,所以程序注释还有第二种方法,具体的符号是/*****程序*****/,此时斜杠星号与星号斜杠之间的程序将被整体注释掉。 程序被注释掉后,编译器在进行编译时将不会对其进行编译,此时相当于此处的程序被删掉一样。注释的目的是为了方便他人阅读程序,同时也方便自己一段时间后再来阅读程序时能够快速的理解该程序的含义。 3、位声明 程序的第三行出现了”sbit D1=P1^0;”下面进行说明。 sbit 表示位的意思,它也是非标准 C 语言的关键字,编写程序时如需操作寄存器的某一位(可位寻址的寄存器才能用)时,需定义一个位变量,此时就要要到sbit,如上面的程序中D1=P1^0, ; 需要注意的是,位定义时有些特殊,用法有三种 : 第一种方法:sbit 位变量名=寄存器位地址值 第二种方法:sbit 位变量名=SFR 名称^寄存器位值(0-7) 第三种方法:sbit 位变量名=SFR 地址值^寄存器位值 如: sbit IT0=0x88 ( 1 )说明: 0x88 是 IT0 的位地址值 sbit D1=P1^2 ( 2 )说明:其中 P1 必须先用 sfr 定义好 sbit EA=0xA8^7 ( 3 )说明: 0xA8 就是 IE 寄存器的地址值 以上三种定义方法需注意的是 IT0 deng EA可由用户随便定义,但必须满足C语言对变量名的定义规则。除些外其它的则必须按照上面的格式写,如 “名称^变量位地址值 ”中“^”,它是由keil软件的规定的 ,不能写成其它的,只能这样能才编译通过。 这里也就是说像操作单片机某个口(如P1口),需要通过头文件sfr P1 = 0x90对其地址进行声明,同样的对寄存器的某一位操作时,也需要对位地址进行声明,此时我们就采用的是第二种表达法sbit D1=P1^0;程序中对D1的操作就相当于对P1中的位地址0Xaff进行操作。 4、主函数 格式:void main() 特点:无返回值,无参数。 无返回值,是指函数执行完后不会返回任何值,上面void表示“空”的意思,即不返回任何值,此处也可以省略不写。当然函数还有带返回值的,后面具体会讲到。 无参数是指该函数不还有任何参数,即main后面的()没有任何参数,此时也可以在括号内加上void ,如main(void),但通常省略不写。后面也会讲到还有参数的函数,等后面讲到时大家就会理解了。 函数是能够实现特定功能的代码段,需要注意的是,一个C51源程序必须有,且只能有一个主函数main(),它是整个程序开始执行的入口。在void main()后面必须加一对花括号,其内部为一条一条的程序语句。如本例程: void main() { D1=0; } 当然这个主函数相对来说比较简单,里面只有一条语句。 5 、D1=0 这条语句位于主函数内,也是这个程序中最重要的部分。D1相当于单片机P1口的第1个引脚。通过前面的知识我们也知道,数字电路中有两种电平,高电平和低电平,0表示低电平或者说低电压,1表示高电平或者说高电压。由于发光管阳极是通过限流 接的5V高电压 ,而阴极 接的 P1 口的第1个引脚,通过程序D1=0让其为低电压 ,所以此时程序一执行后,该发光二极管就会发光。 6、利用总线操作法点亮发光二极管 在例1中,要实现让一个管发光,我们采用了位操作法,位操作法其实就是对单片机的每一个引脚单独操作,如例中就是先作位定义sbit D1=P1^0,然后让D1=0,最终实现了功能。一个灯会点亮,相信大家也会同点多个灯,如要让1、3、5、7灯亮时,按前面的方法程序应该写为:<
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台