新闻中心

EEPW首页>嵌入式系统>设计应用> 第4课 点亮发光管程序分析

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

作者: 时间:2016-12-01 来源:网络 收藏
实际上就本程序来说,我们也可以不包含该头文件,而加上一句话,“ 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灯亮时,按前面的方法程序应该写为:
例2 位操作法实现1、3、5、7灯亮
#include
sbit D1=P1^0;
sbit D3=P1^2;
sbit D5=P1^4;
sbit D7=P1^6;
void main()
{
D1=0;
D3=0;
D5=0;
D7=0;
}
这种方法当然可以实现1、3、5、7,但这种方法需要定义多个位变量,程序书写起来相对麻烦。下面给出另一个写法,如下:
例3 总线操作法实现1、3、5、7灯亮
#include
void main()
{
P1=0xaa;
}
这个程序同样可能实现把1、3、5、7灯点亮,也就是说程序的功能和上面位操作法写的程序是一样,但却要简单得多,这种方法就称为总线操作法。所谓的总线操作法也就是同时操作单片机P1口的8个引脚(或者说8个I/O口),具体到程序就是通过“P1=0xaa;”实现的, “0x”表示16进制的意思,16进制aa转化成2进制就是10101010,而10101010正好就是让单片机P1口的1、3、5、7引脚输出低电平,2、4、6、8引脚输出高电平,此时就实现让第1、3、5、7发光二极管发光。
把例3的程序下载到实验板上的现象如图13所示:
图13 总线操作法实现1、3、5、7发光二极管发光
在上面三个例子中,我们用两种方法(位操作法和总线操作法)实现点亮发光二极管的目的,目的是达到了,但如若仔细推敲两个程序,实际上是不完善的的。让我们看例三,程序第一句为头文件,是对52单片机一些特殊功能寄存器相关的声明,然后第二句进入主程序执行“P1=0xaa;”,点亮1、3、5、7发光二极管,但执行完这句后单片机又试干嘛呢?这之后我们没有写相关程序让单片机执行什么事情,所以程序执行到这里有可能出错(这里只是说有可能,因为每个编译器不一样),通过反复的实验,我们得出keil软件一般这里会回到主程序的第一句开始执行,也就是说又开始执行“P1=0xaa;”,周而复始,一直这样的执行下去,1、3、5、7发光二极管就一直会亮下去。但从程序开发角度来说,我们说这里就必须做相应的处理,明确告诉下一步程序要做什么事情。比如说我们就是要让主程序周而复始,反复的执行,此时我们就可以利用C语言中的while语句来实现,下面先讲下while语句。
格式:
While(表达式)
{
语句(内部也可为空)
}
特点:
先判断表达式,后执行语句。
原则:若表达式为不是0,即为真,则执行语句,如为0 ,即为假就跳出while 语句。
注意:while语句内部的语句可以为空,即什么也没有,此时就写成while(1){};此时{}可以不写,即写成while(1);意思就是永远为真,执行空语句,相当于程序永远停止在这里。
了解了while语句后,我们就可以把例三的程序进完善了,程序如例四。
例4:完整点亮发光二极管的程序
#include
void main()
{
While(1)
{
P1=0xaa;
}
}
While语句就介绍到这,下面总结一下,单片机软件的学习就是通过我们写程序,控制单片机外部引脚输出“1”(高电平+5V),和“0”(低电平0V),从而达到对各种外设的控制。单片机学习来并不难,只要大家有信心,肯花功夫,学起来也是很容易的。
上一页 1 2 下一页

评论


技术专区

关闭