苏木三少
错的不是你,而是这个世界。

static变量研究与单片机编程与C的区别

一、static研究

首先上一段代码让我来探究这个static变量到底是什么鬼?

由图可知,在循环执行下静态变量s_1发生了变化,i没有发生变化。在for循环中static变量赋值一次后(初次赋值)就在不会被重新赋值(说白了就是 static int s_1 = 1;这条语句失效)但是变量i可以继续重新被定义和赋值。

二、单片机编程中C语言之间的差别。

1、在C51中多了 特殊功能寄存器型和位类型

(1)特殊功能寄存器型分别定义格式为:

sfr  特殊功能寄存器名 = 特殊功能寄存器地址常数

sfr16 特殊功能寄存器名 =特殊功能寄存器地址常数

eg:对于MCS-51片内I/O口,定义方法如下。

sfr P1 = 0x90;//定义P1口,地址90H

sfr P2 = 0xA0;//定义P2口,地址A0H

sfr16用于定义16位特殊功能寄存器,如8052的T2定时器,可以定义为:

sfr16 T2 = 0xCC;//这里定义8052定时器2,地址为T2L=CCH,T2H=CDH

🐖:sfr16定义一个16位特殊功能寄存器时,等号后面是他的低位地址,高位地址一定要位于位于低位地址之上,所以sfr16不能用于定时器0和1的定义。

(2)位类型

定义格式:sbit 位变量名 = 位地址

sbit P1_1 = 0X91//同sfr一样sbit的为地址必须位于80H~FFH之间。

sbit 位变量名 = 位地址

sbit P3_1=P3^1

sbit 位变量名 = 字节地址^位位置

sbit P3_1 = 0xB0^1

🐖:1、位变量不能定义一个指针,如不能定义bit *aa

2、不能定义位数,如不能定义 bit array[2]

3、bit与sbit不同,bit不能指定位变量的绝对地址,当需要指针定b位变量的绝对地址(范围必须在0x80~0xff)时需要使用sbit来定义 sbit flag=P1^0.

4、变量的存储类型为bdata时,该变量的某一位可以用sbit来定义,当然也可以用bit。eg

bdata char jj;

sbit mybit7=jj^7;

3、运算符与表达式

位运算:   (1)&:按位与    (2)|:按位或      (3) ^:按位异或。      (4)~:按位取反          (5)<<:位左移        (6)>>:位右移

自增自减运算符:(1)++i;//使用i之前,先使i值加1     (2)–i;++i;//使用i之前,先使i值减1            (3)i++;//使用i之后,再使i值加1     (4)i–;//使用i之后,再使i值减1

指针与地址运算符:(1)*:指针运算符。(2)&:取地址运算符

4、函数

函数定义:

函数类型 函数名 (形参表)[reentrant] [interrupt m] [using n]

{函数体;}

函数类型:函数类型说明了函数返回值的类型。

函数名:函数名是用户为自定义函数取的名字以便于调用函数时使用。

形式参数表:用于列录再主函数与被调函数之间进行数据传递的形式参数。

reentrant修饰符

这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归调用的函数。

interrupt m修饰符

中断函数必须通过他定义。函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把安排再程序存储器中的相应位置。

m取值为0~4

0——外部中断0     1——定时/计数器T0     2——-外部中断1     3—-定时/计数器T1          4——-串行口中断

using n 修饰符

用于指定本函数内部使用的工作组寄存器组,其中n取值0~3,表示寄存器组号。

c51编程不用加using n修饰符 由C51编译器自动选择。

赞(3) 打赏
有问题的朋友随时留言,或者加我为好友。我的QQ是805375353. <<苏木三少博客 » static变量研究与单片机编程与C的区别

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    static变量研究与单片机编程与C的区别 – 苏木三少博客

  2. #2

    static变量研究与单片机编程与C的区别 – 苏木三少博客
    http://danskos-shoes.com

    i thought about this7个月前 (12-23)回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

十年之约