-基于STC89CXX的学习笔记-

1、单片机介绍

  • 一台能够工作的计算机要有这样几个部份构成: CPU( 进行运算、 控制) 、 RAM(数据存储)、ROM(程序存储) 、 输入/输出设备(例如: 串行口、并行 输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板 的印刷线路板上。而在单片机中,这些部份全部被做到一块集成电路芯片中了, 所以就称为单片机(也称微控制器 MCU),而且有一些单片机中除了上述部份外, 还集成了其它部份如 A/D, D/A 等。体积不大,一般用 40 脚封装, 当然功能 多一些单片机也有引脚比较多的, 如 68 引脚, 功能少的只有 10 多个或 20 多个引脚,有的甚至只 8 只引脚。

  • MCU:微控制单元(Microcontroller Unit) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。

  • AT89C51,AT:ATMEL:(美国)爱特梅尔公司;


  • 51单片机由一个IP核和片上外设组成,IP核(内核)就是上图中的CPU,片上外设就是上图中的:时钟电路、SFR和RAM、ROM、定时/计数器、并行I/O口、串行I/O口、中断系统。IP核跟外设之间由系统总线连接,且是8bit的,速度有限。

  • 51内核是上个世纪70年代Intel公司设计的,速度只有12M,外设是IC厂商(STC)在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色的单片机。这里Intel属于IP核厂商,STC属于IC厂商。我们后面要讲的STM32也一样,ARM属于IP核厂商,ARM给ST授权,ST公司在Cortex-M3内核的基础上设计出STM32单片机。

  • 链接:51与STM32单片机架构(内核和片上外设)的区别汇总+拓展

  • 普中 51-单核-A2 开发板,STC89C52单核A2开发板,这一款开发板采 用的是单 CPU 设计,用的是 STC 公司生产的经典 51 内核芯片 STC89C52,这是一 款拥有 64KB FLASH 超大存储器的 51 单片机,可容纳更大更复杂的程序

  • 宏晶科技STC名字由来:SysTem Chip或者SysTem on Chip(片上系统)

  • STC89Cxx 芯片介绍

  • RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

  • ROM:用以存放程序、一些原始数据和表格;

  • 总线(BUS)是单片机各部件之间传送信息的公共通道。单片机中有内部总 线和外部总线两类,内部总线是 CPU 内部之间的连线,外部总线是指 CPU 与其它 部件之间的连线;外部总线有三种: 数据总线 DB(Data Bus),地址总线 AB (Address Bus)和控制总线 CBControl Bus)。

  • keil编译C51程序的结果
    “Program Size: data=11.0 xdata=0 code=282”
    代表生成的各个段的大小。具体来说
    data=11.0代表你这段程序生成的目标代码所占用单片机的内部RAM空间是11.0个字节;
    xdata是片外RAM空间,xdata=0表示没有使用片外RAM空间数据;code=282代表生成的代码大小(即ROM空间,这里一般指Flash)是282字节。
    链接:ROM、RAM、FLASH区别

2、C语言基础

  • . 数据类型

  • 特殊功能寄存器型

  • 这是 C51 扩充的数据类型,用于访问 51 单片机中的特殊功能寄存器数据, 它分 sfr 和 sfr16 两种类型。其中:sfr 为字节型特殊功能寄存器类型,占一个 内存单元,利用它可以访问 51 内部的所有特殊功能寄存器;sfr16 为双字节型 特殊功能寄存器类型,占用两个字节单元,利用它可以访问 51 内部的所有两个 字节的特殊功能寄存器。在 C51 中对特殊功能寄存器的访问必须先用 sfr 或 sfr16 进行声明。

  • sfr用于将一个单片机的特殊功能寄存器(special funcTIon register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to)该寄存器。sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。

  • 位类型

  • 这也是 C51 中扩充的数据类型,用于访问 51 单片机中的可寻址的位单元。 在 C51 中,支持两种位类型:bit 型和 sbit 型。它们在内存中都只占一个二进 制位,其值可以是“1”或“0”。其中:用 bit 定义的位变量在 C51 编译器编译 时,在不同的时候位地址是可以变化的,而用 sbit 定义的位变量必须与 51 单片 机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在 C51 编译器编译时,其对应的位地址是不可变化的。

  • 指针型: 指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这 个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在 C51 中它 的长度一般为 1~3 个字节。

  • C51 允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下: Bit→char→int→long→float→signed→unsigned

  • 数据类型说明符:

  • typedef unsigned int u8;

  • typedef unsigned char u16;

  • 存储种类

  • 存储种类是指变量在程序执行过程中的作用范围。C51 变量的存储种类有四 种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。

  • a.auto: 使用 auto 定义的变量称为自动变量,其作用范围在定义它的函数体或复合 语句内部,当定义它的函数体或复合语句执行时,C51 才为该变量分配内存空间, 结束时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量 时,如果省略存储种类,则该变量默认为自动(auto)变量。

  • b.extern: 使用 extern 定义的变量称为外部变量。在一个函数体内,要使用一个已在 该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用 extern 说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内 都有效,直到程序结束才释放。

  • c.static: 使用 static 定义的变量称为静态变量。它又分为内部静态变量和外部静态 变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效, 一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护, 还可以实现当离开函数时值不被改变。外部静态变量上在函数外部定义的静态变 量。它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模 块处理中,外部静态变量只在文件内部或模块内部有效。

  • d.register: 使用 register 定义的变量称为寄存器变量。它定义的变量存放在 CPU 内部 的寄存器中,处理速度快,但数目少。C51 编译器编译时能自动识别程序中使用 频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。

  • 存储器类型

  • 存储器类型是用于指明变量所处的单片机的存储器区域情况。存储器类型与 存储种类完全不同。C51 编译器能识别的存储器类型有以下几种,见表所示

  • 复合赋值运算符

  • C51 语言中支持在赋值运算符“=”的前面加上其它运算符,组成复合赋值运 算符。下面是 C51 中支持的复合赋值运算符

  • += 加法赋值

  • ?+ 减法赋值

  • *= 乘法赋值

  • /= 除法赋值

  • %= 取模赋值

  • &= 逻辑与赋值

  • |= 逻辑或赋值

  • ^= 逻辑异或赋值

  • ~= 逻辑非赋值

  • “ >>= 右移位赋值 ”

  • <<= 左移位赋值

  • 逗号运算符

  • 在 C51 语言中,逗号“,”是一个特殊的运算符,可以用它将两个或两个以 上的表达式连接起来,称为逗号表达式。逗号表达式的一般格式为: 表达式 1,表达式 2,……,表达式 n 程序执行时对逗号表达式的处理:按从左至右的顺序依次计算出各个表达式 的值,而整个逗号表达式的值是最右边的表达式(表达式 n)的值。例如: x=(a=3,6*3)结果 x 的值为 18。

  • 条件运算符

  • 条件运算符“?:”是 C51 语言中唯一的一个三目运算符,它要求有三个运 算对象,用它可以将三个表达式连接在一起构成一个条件表达式。条件表达式的 一般格式为: 逻辑表达式?表达式 1:表达式 2 其功能是先计算逻辑表达式的值,当逻辑表达式的值为真(非 0 值)时,将 计算的表达式 1 的值作为整个条件表达式的值;当逻辑表达式的值为假(0 值)时,将计算的表达式 2 的值作为整个条件表达式的值。例如:条件表达式 max=(a>b)?a:b 的执行结果是将 a 和 b 中较大的数赋值给变量 max。

  • 函数的定义 函数定义的一般格式如下:

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

  • reentrant 修饰符

  • 这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归 调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间 接调用函数本身。一般的函数不能做到这样,只有重入函数才允许递归调用。

  • 关于重入函数,注意以下几点:

  • (1)用 reentrant 修饰的重入函数被调用时,实参表内不允许使用 bit 类 型的参数。函数体内也不允许存在任何关于位变量的操作,更不能返回 bit 类型 的值。

  • (2)编译时,系统为重入函数在内部或外部存储器中建立一个模拟堆栈区, 称为重入栈。重入函数的局部变量及参数被放在重入栈中,使重入函数可以实现 递归调用。

  • (3)在参数的传递上,实际参数可以传递给间接调用的重入函数。无重入 属性的间接调用函数不能包含调用参数,但是可以使用定义的全局变量来进行参 数传递。

  • interrupt m 修饰符

  • interrupt m 是 C51 函数中非常重要的一个修饰符,这是因为中断函数必须 通过它进行修饰。在 C51 程序设计中,当函数定义时用了 interrupt m 修饰符, 系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按 51 系 统中断的处理方式自动把它安排在程序存储器中的相应位置。

  • 自定义函数的声明

  • 在 C51 中,函数原型一般形式如下:

  • [extern] 函数类型 函数名(形式参数表); 函数的声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知编 译系统,以便调用函数时系统进行对照检查。函数的声明后面要加分号。

  • 如果声明的函数在文件内部,则声明时不用 extern,如果声明的函数不在文 件内部,而在另一个文件中,声明时须带 extern,指明使用的函数在另一个文 件中。

3、最小系统

  • 晶振

  • 我们使用的是 51 单片机,其时钟频率 可在 0-40MHZ 上运行,一般情况下我们建议选择 12M(适合计算延时时间)或者 是 11.0592M(适合串口通信)。若直接将此晶振接入单片机晶振引脚,会发现 系统工作不稳定,这是因为晶振起振的一瞬间会产生一些电感,为了消除这个电 感所带来的干扰,可以在此晶振两端分别加上一个电容,电容的选取需要无极性 的,另一端需要共地。根据选取的晶振大小决定电容值,通常电容可在 10-33PF 值范围内选取

  • 复位电路

  • 手动复位是通过一个按键及电容 电阻所组成,利用按键的开关功能实现复位,按键按下后 VCC 直接进入到单片机 RST 引脚,松开后 VCC 断开,RST 被电阻拉为低电平。这一合一开就实现了手动 复位。而自动复位主要是利用 RC 充放电功能,电源已开启,VCC 直接进入 RST,然后电容开始慢慢充电,直到充电完成,此时 RST 被电阻拉低。 这样就起到上电复位的效果。充电时间t=1.1RC=1.110K10uF=110ms,需求的信号复位时间在1ms左右。

STC8051学习笔记相关推荐

  1. 51单片机学习笔记1 简介及开发环境

    51单片机学习笔记1 简介及开发环境 一.51单片机 1. STC89C52单片机简介 2. 命名规则 3. 封装 (1)PDIP (2)LQFP (3)PLCC (4)PQFP 二.STC8051结 ...

  2. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  3. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  5. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  6. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  7. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  8. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  9. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

最新文章

  1. 不属于JAVA类中的变量_在Java中,不属于整数类型变量的是( )。_学小易找答案...
  2. 在VS2010下使用 UNICODE 和 ANSI 的混合编程
  3. 突袭HTML5之SVG 2D入门1 - SVG综述
  4. 脑电波之父:汉斯·贝格尔_深度学习,认识聪明的汉斯
  5. iOS当中的设计模式
  6. C#区分中英文统计字符串的长度
  7. inode客户端linux 怎样运行,Ubuntu下安装iNode上网客户端
  8. 2019最新高级JAVA架构师之路(价值3万元的教程-年薪百万计划)
  9. 区分PCI总线, PCIe总线和内存总线
  10. 出口托收结算方式DA、DP、CAD详解
  11. 基于单片机的触屏电机控制系统的设计
  12. harbor高可用部署
  13. 【青松资讯】Anonymous匿名者黑客组织公布攻击新目标:100家中国政府网站
  14. 我们为什么要结婚?(特别有道理)
  15. void 和 void *区别(c++)
  16. 维恩贝特面试JAVA后台开发
  17. 目标检测论文解读复现之十五:基于YOLOv5的光学遥感图像舰船 目标检测算法
  18. 《遥感云计算与科学分析》GEE教材中配套代码链接
  19. Go+Python双剑合璧
  20. airship 题解

热门文章

  1. 支付宝支付免费实战公开课
  2. ubuntu重装系统,重新挂载/home
  3. 阿里云旺(即时通讯)基础使用
  4. AD18 所有过孔盖油
  5. 在线文本编辑器(二)—FCKedit
  6. Java 学习--黑马徐老师一
  7. Win11下安装eNSP
  8. 通用PE u盘启动盘制作
  9. 2023年端午节放假通知
  10. 为什么设置不了这是一台家用计算机,图文演示win10专业版更改不了这是一台家庭计算机的详尽处理步骤...