C51编程

程序结构

 

  1. 汇编语言
  • 面向机器的编程语言(能直接操作单片机的系统硬件)

  • 具有指令效率高、执行速度快的优点

  • 低级编程语言

  • 程序可读性差,移植困难,且编程时必须具体组织、分配存储器资源和处理端口数据

  1. C51语言
  • 为51系列单片机设计的一种C语言,是标准C语言的子集

  • 具有结构化语言特点和机器级控制能力,代码紧凑,效率可与汇编语言媲美

  • 程序的可读性强,易于调试维护,编程工作量小,产品开发周期短

  1. C51程序结构
  • C51程序的基本单元是函数

  • 一个C51源程序至少包含一个主函数(主函数是程序的入口)

  • main()函数一对圆括号()必须有,不能省略

  • C51语言程序基本结构

    包含<头文件>
    函数类型说明
    全局变量定义
    main(){
    局部变量定义
    <程序体>
    }
    func1(){
    局部变量定义
    <程序体>
    ...
    }
    funcN(){
    局部变量定义
    <程序体>
    ...
    }

    数据结构

         

  • 变量的基本属性:变量名、变量值(变量名与存储单元地址相对应,变量值与存储单元的内容相对应)

  • 定义变量

[存储种类]    数据类型    [存储类型]    变量名;

1

1

  - sfr特殊功能寄存器型:21个特殊功能寄存器(地址为80H~FFH)

    ```C
sfr sfr_name = 地址常数                //8位SFR
sfr16 sfr16_name = 地址常数        //16位SFR

12
- sfr sfr_name是一个特殊功能寄存器名

- “=”后面必须是常数

- 数值范围必须在特殊功能寄存器地址范围内(0x80~0xFF)

12 ```

12

    - sbit 位变量名=SFR名称^位位置

      ```C
sfr PSW=0xD0
sbit CY=PSW^7
//SFR名称必须是己定义的SFR名字
//位位置是一个0~7之间的常数

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

  ```C

sbit CY=0xD0^7 //以一个常数(字节地址)作为基地址,该常数必须在0x80~0xFF之间

  • 数据类型、变量名和末尾的英文分号是不能省略的部分
  • 自动变量:使用存储种类说明符auto定义的变量

  • 作用范围在定义它的函数体或复合语句内部

  • 如果省略存储种类,则变量默认为自动变量

  • 将函数体内和复合语句中使用频繁的变量放在片内RAM中,且定义为自动变量(有效利用片内有限的RAM资源)

  • 外部变量:使用存储种类说明符extern定义的变量

  • 将多个函数或模块共享的变量定义为外部变量

  • 外部变量是全局变量,在程序执行期间一直占有固定的内存空间

  • 静态变量:使用存储种类说明符static定义的变量

  • 内部静态变量(当离开函数时数值不被改变):在函数体内部定义的静态变量

  • 外部静态变量:在函数体外部定义的静态变量

  • 寄存器变量:使用存储种类说明符register定义的变量

  • 将使用频率最高的那些变量定义为寄存器变量

  • C51基本数据类型(有符号数据类型可忽略signed标识符)

    https://i-blog.csdnimg.cn/blog_migrate/25694c916bf904103db7876ceaa1d1b2.png

  • 特殊数据类型

  • bit位型:定义一个位变量(0或1)

    ```C bit bit_name [=0或1]

  • sbit可位寻址型:定义可寻址的特殊功能寄存器的位寻址对象

    • sbit 位变量=位地址

      ```C sbit CY=0xD7
      //将位的绝对地址赋给变量名(位地址必须位于0x80~0xFF之间)

  • sbit与bit的区别

    • bit型变量的位地址是由编译器为其随机分配的

    • sbit型变量的位地址是由用户指定的

    • sfr型变量和sbit型变量必须定义为全局变量(必须在所有C51函数之前定义)

  • 用预处理命令#include 后可使用特殊功能寄存器明和特殊位名称

  • 逻辑存储空间(3个):片内低128B RAM、片外 64KB RAM、片内外统一编址 64KB ROM

https://i-blog.csdnimg.cn/blog_migrate/4bc38e272063834a60120605db1e0e18.png

存储类型(6种):data、bdata、idata、xdata、pdata、code

https://i-blog.csdnimg.cn/blog_migrate/147b3372bddf8d58c1a7b45a2a2da476.png

https://i-blog.csdnimg.cn/blog_migrate/d21709ce6d6a6defa593efc5de0a9c4c.png

https://i-blog.csdnimg.cn/blog_migrate/d835de14b21b0c95cd753b5786808182.png

数据类型*指针变量名;            //被指变量和指针变量都位于C编译器默认的存储区中

1

C51指针的一般定义形式

#include<reg51.h>
void main(void){
  unsigned char i=0;            //定义变量i
  #pragma asm                            //嵌入汇编代码
      MOV R0,#0AH
    LOOP:INC    A                       //累加器循环加1
    DJNZ    R0,LOOP
  #pragma endasm
    i=ACC;                                  //累加器结果传给i
}
  • 变量定义时必须指明其所属类型,否则无法选择存储空间

  • 如果再定义变量时省略了存储类型说明符,C51编译器会根据当前编译模式自动认定默认存储变量

  • 编译模式(3种):小编译模式(Small)、紧凑编译模式(Compact)、大编译模式(Large

  • C51规定变量名可以由字母、数字和下划线3种字符组成(第一个字符必须为字母或下划线)

  • 大写的变量和小写的变量不同(习惯上变量用小写表示)

  • 所有变量在使用前必须声明(变量须“先定义,后使用”)
    • 变量名除了应避免使用标准C语言的32个关键字外,还要避免使用C51拓展的新关键字

    • C51拓展的21个关键字

    • 标准C语言指针的一般定义形式
    数据类型    [存储类型1] * [存储类型2]   指针变量名
    //数据类型:被指向变量的数据类型
    //存储类型1:被指向变量所在的存储区类型
    //存储类型2:指针变量所在的存储区类型
    

    https://i-blog.csdnimg.cn/blog_migrate/faebcaba9062edfb6dd1a242fa7650d8.png

    https://i-blog.csdnimg.cn/blog_migrate/a0c9d3a9f0a05813a60c8e69bc298530.png

    https://i-blog.csdnimg.cn/blog_migrate/037b8c2176d3c0d55aa960fd53fc19b7.png

    • C51编译器的编译规则

    • 程序的寻址:通过在汇编文件中定义同名的“函数”来实现

    • 参数传递:使用寄存器
    • 返回值传递:汇编语言通过寄存器或存储器传递参数给C语言程序
    • 汇编代码必须放在两条预处理命令#pragma asm和#pragma endasm之间(预处理命令必须用小写字母)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值