80C51符号名与地址的对应关系,你知道吗?

这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。51单片机相关文章:51单片机教程单片机相关文章:单片机教程单片机相关文章:单片机视频教程

sfr P1 = 0x90;

这样一行(如上粗体所示)定义了P1对应地址0x90,P1端口的地址为0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中的90H的写法) 。

从这里还可以看到一个经常出现的词:sfr

sfr不是标准的C语言关键字,但是Keil提供了一个新的关键字来直接访问80C51中的SFR。 它的用法是:

sfrt 变量名 = 地址值。

2) 符号P1_0代表P1.0引脚。

在C语言中,如果直接写P1.0,C编译器将无法识别它,而且P1.0不是合法的C语言变量名,所以必须给它起另一个名字。 这里的名字是P1_0,但是P1_0和P1.0一样吗? 你这么认为,但C编译器不这么认为,所以它们必须是相连的。 这里使用Keil C关键字sbit来定义它。 sbit的使用方法有3种:

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

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

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

例如,可以使用以下三种方法在PSW中定义OV:

sbit OV=0xd2 (1) 说明:0xd2 为 OV 的位地址值

sbit OV=PSW^2 (2) 注意:PSW 必须先用 sfr 定义

sbit OV=0xD0^2 (3) 说明:0xD0 为 PSW 的地址值

因此,sfr P1_0=P1^0; 这里使用符号P1_0来定义代表P1.0引脚。 如果愿意的话,也可以给它起一个像P10这样的名字,只要后面的程序也做相应的改变即可。

3)main被称为“主函数”。

每一个C语言程序都有一个且只有一个主函数。 必须有一个主要功能。 其放置位置不是必需的。 它可以放在程序的末尾(推荐)。 函数后面必须有一对大括号“{}”。 其他程序都写在里面。

从上面的分析中,我们了解了C语言的一些特点。 让我们看一个稍微复杂的例子。

例 1-2 使 P1.0 引脚连接的 LED 闪烁并点亮

/******************************************************** *****

单灯闪烁程序

******************************************************/

#include“reg51.h”

#定义uchar无符号字符

#定义 uint 无符号整型

sbit P10=P1^0;

/*延迟程序

延迟时间由Delay参数决定

*/

void mDelay(无符号整型延迟)

{ 无符号整型 i;

for(;延迟>0;延迟–)

{ for(i=0;i124;i++)

{;}

无效主()

{ 为了(;;)

{ P10=!P10; //反转P1.0引脚

mDelay(1000);

程序分析: 我们先不看主程序的第一行。 第二行是“P1_0=!P1_0;”。 有个符号“!” 在P1_0前面。 符号“!” 是C语言中的运算符,所以和数学中的“+”、“-”一样,是一个算术符号,意思是“取反”,即将符号后面的变量的值取反。

注意:求反运算只对变量的值起作用,并不会自动改变变量本身。 可以认为,C编译器在处理“!P1_0”时,是将P1_0的值赋给临时变量,然后对临时变量取反,而不是直接对P1_0取反,所以取反完成后,赋值符号必须使用(“=”)将反转后的值赋给 P1_0。 这样,如果P1.0本来是低电平(LED亮),则反转后,P1.0为高电平(LED灭),反之亦然,如果P1.0为高电平,反转后,P1 .0 为低电平。 重复执行该指令,P1.0 所连接的灯会不断“亮”和“灭”。

这条指令重复执行的关键在于main中程序的第一行:for(;;)。 这里就不详细介绍了。 现在读者只需要知道这行程序与后面的一对大括号“{}”一起构成了一条无限循环语句,大括号内的语句会被重复执行。

程序第三行是:“mDelay(1000);”。 这行程序的目的是延迟1秒。 由于单片机执行指令的速度非常快,如果没有延迟,灯亮后会立即熄灭。 它亮起的速度如此之快,以至于人眼无法区分。

这里的mDelay(1000)并不是Keil C提供的库函数,也就是说,任何情况下都不能写这样一行程序来实现延迟。 如果你在写其他程序的时候写了这样一行,你会发现编译失败。 那么为什么这又是正确的呢? 注意观察这个程序中有一行像void mDelay(…)这样的行。 可以看到,mDelay这个词是我们自己给自己起的名字,我们为此写了一些程序行。 如果你的程序中没有这样的行,那么你不能使用 mDelay(1000)。 头脑敏捷的人可能会立即想到,我可以将这个程序复制到我的其他程序中,然后使用 mDelay(1000) 吗? 答案是当然。 还有一点需要注意的是,mDelay这个名字是程序员自己命名的,可以自己更改。 但是,一旦更改名称,main()函数中的名称也必须相应更改。

mDelay后面有一个括号,括号内有数据(1000)。 这1000称为“参数”,可以用来在一定范围内调节延迟时间的长短。 这里用1000表示要求延迟时间为1000毫秒。 ,要实现这一点,必须由我们自己编写的mDelay程序来决定。 具体细节会在后面的循环程序中进行分析,这里不再介绍。

80C51符号名与地址的对应关系,你知道吗?

51单片机相关文章:51单片机教程

MCU相关文章:MCU教程

MCU相关文章:MCU视频教程

MCU相关文章:MCU工作原理

单片机

医院病房设计中如何体现出家庭化、人性化和艺术化的理念

2024-2-2 9:05:19

单片机

C语言程序设计语言的特点和优点分析

2024-2-2 10:02:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索