【学习笔记】C51语言入门

C51

在这里插入图片描述

程序结构

  1. 汇编语言

    • 面向机器的编程语言(能直接操作单片机的系统硬件)
    • 具有指令效率高、执行速度快的优点
    • 低级编程语言
    • 程序可读性差,移植困难,且编程时必须具体组织、分配存储器资源和处理端口数据
  2. C51语言

    • 为51系列单片机设计的一种C语言,是标准C语言的子集
    • 具有结构化语言特点和机器级控制能力,代码紧凑,效率可与汇编语言媲美
    • 程序的可读性强,易于调试维护,编程工作量小,产品开发周期短
  3. C51程序结构

    • C51程序的基本单元是函数

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

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

    • C51语言程序基本结构

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

数据结构

  1. C51变量(在程序执行过程中,数值可以发生变化的量)

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

    • 定义变量

      [存储种类]    数据类型    [存储类型]    变量名;
      
      • 数据类型、变量名和末尾的英文分号是不能省略的部分
  2. 变量存储种类(变量在程序执行过程中的作用范围):自动(auto)、外部(extern)、静态(static)、寄存器(register)

    • 自动变量:使用存储种类说明符auto定义的变量
      • 作用范围在定义它的函数体或复合语句内部
      • 如果省略存储种类,则变量默认为自动变量
      • 将函数体内和复合语句中使用频繁的变量放在片内RAM中,且定义为自动变量(有效利用片内有限的RAM资源)
    • 外部变量:使用存储种类说明符extern定义的变量
      • 将多个函数或模块共享的变量定义为外部变量
      • 外部变量是全局变量,在程序执行期间一直占有固定的内存空间
    • 静态变量:使用存储种类说明符static定义的变量
      • 内部静态变量(当离开函数时数值不被改变):在函数体内部定义的静态变量
      • 外部静态变量:在函数体外部定义的静态变量
    • 寄存器变量:使用存储种类说明符register定义的变量
      • 将使用频率最高的那些变量定义为寄存器变量
  3. 变量数据类型(数据的不同格式)

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

    • 特殊数据类型

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

        bit bit_name [=01]
        
      • sfr特殊功能寄存器型:21个特殊功能寄存器(地址为80H~FFH)

        sfr sfr_name = 地址常数				//8位SFR
        sfr16 sfr16_name = 地址常数		//16位SFR
        
        • sfr sfr_name是一个特殊功能寄存器名
        • “=”后面必须是常数
        • 数值范围必须在特殊功能寄存器地址范围内(0x80~0xFF)
      • sbit可位寻址型:定义可寻址的特殊功能寄存器的位寻址对象

        • sbit 位变量=位地址

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

          sfr PSW=0xD0
          sbit CY=PSW^7
          //SFR名称必须是己定义的SFR名字
          //位位置是一个0~7之间的常数
          
        • sbit 位变量名=字节地址^位位置

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

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

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

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

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

  4. 变量存储类型

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

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

      • 变量定义时必须指明其所属类型,否则无法选择存储空间
      • 如果再定义变量时省略了存储类型说明符,C51编译器会根据当前编译模式自动认定默认存储变量
    • 编译模式(3种):小编译模式(Small)、紧凑编译模式(Compact)、大编译模式(Large)

  5. 变量名

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

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

    • 变量名除了应避免使用标准C语言的32个关键字外,还要避免使用C51拓展的新关键字

    • C51拓展的21个关键字

    • 所有变量在使用前必须声明(变量须“先定义,后使用”)

  6. C51指针

    • 标准C语言指针的一般定义形式

      数据类型*指针变量名;			//被指变量和指针变量都位于C编译器默认的存储区中
      
    • C51指针的一般定义形式

      数据类型	[存储类型1] * [存储类型2]	指针变量名
      //数据类型:被指向变量的数据类型
      //存储类型1:被指向变量所在的存储区类型
      //存储类型2:指针变量所在的存储区类型
      

混编

  1. 在C51中调用汇编程序

    • C51编译器的编译规则
      • 程序的寻址:通过在汇编文件中定义同名的“函数”来实现
        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5GrEuLi-1651500663261)(/Users/jermy/Library/Application Support/typora-user-images/截屏2022-05-02 21.59.34.png)]

      • 参数传递:使用寄存器

      • 返回值传递:汇编语言通过寄存器或存储器传递参数给C语言程序

  2. 在C51中嵌入汇编程序

    • 汇编代码必须放在两条预处理命令#pragma asm和#pragma endasm之间(预处理命令必须用小写字母)

      #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
      }
      

  • 12
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chency.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值