单片机编程入门之基本思路和写法大全

电子常识

2611人已加入

描述

  单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。

  单片机应用分类

  通用型

  这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。

  总线型

  单片机这是按单片机(Microcontrollers)是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、 数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。

  控制型

  这是按照单片机(Microcontrollers)大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。

  单片机硬件特性

  1、主流单片机包括CPU、4KB容量的RAM、128 KB容量的ROM、 2个16位定时/计数器、4个8位并行口、全双工串口行口、ADC/DAC、SPI、I2C、ISP、IAP。

  2、系统结构简单,使用方便,实现模块化;

  3、单片机可靠性高,可工作到10^6 ~10^7小时无故障;

  4、处理功能强,速度快。

  5、低电压,低功耗,便于生产便携式产品

  6、控制功能强

  7、环境适应能力强

  单片机基本结构

  1.运算器

  运算器由运算部件——算术逻辑单元(Arithmetic & Logical Unit,简称ALU)、累加器和寄存器等几部分组成。ALU的作用是把传来的数据进行算术或逻辑运算,输入来源为两个8位数据,分别来自累加器和数据寄存器。ALU能完成对这两个数据进行加、减、与、或、比较大小等操作,最后将结果存入累加器。例如,两个数6和7相加,在相加之前,操作数6放在累加器中,7放在数据寄存器中,当执行加法指令时,ALU即把两个数相加并把结果13存入累加器,取代累加器原来的内容6。

  运算器有两个功能:

  (1) 执行各种算术运算。

  (2) 执行各种逻辑运算,并进行逻辑测试,如零值测试或两个值的比较。

  运算器所执行全部操作都是由控制器发出的控制信号来指挥的,并且,一个算术操作产生一个运算结果,一个逻辑操作产生一个判决。

  2.控制器

  控制器由程序计数器、指令寄存器、指令译码器、时序发生器和操作控制器等组成,是发布命令的“决策机构”,即协调和指挥整个微机系统的操作。其主要功能有:

  (1) 从内存中取出一条指令,并指出下一条指令在内存中的位置。

  (2) 对指令进行译码和测试,并产生相应的操作控制信号,以便于执行规定的动作。

  (3) 指挥并控制CPU、内存和输入输出设备之间数据流动的方向。

  微处理器内通过内部总线把ALU、计数器、寄存器和控制部分互联,并通过外部总线与外部的存储器、输入输出接口电路联接。外部总线又称为系统总线,分为数据总线DB、地址总线AB和控制总线CB。通过输入输出接口电路,实现与各种外围设备连接。

  3.主要寄存器

  (1)累加器A

  累加器A是微处理器中使用最频繁的寄存器。在算术和逻辑运算时它有双功能:运算前,用于保存一个操作数;运算后,用于保存所得的和、差或逻辑运算结果。

  (2)数据寄存器DR

  数据寄存器通过数据总线向存储器和输入/输出设备送(写)或取(读)数据的暂存单元。它可以保存一条正在译码的指令,也可以保存正在送往存储器中存储的一个数据字节等等。

  (3)指令寄存器IR和指令译码器ID

  指令包括操作码和操作数。指令寄存器是用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存中取到数据寄存器中,然后再传送到指令寄存器。当系统执行给定的指令时,必须对操作码进行译码,以确定所要求的操作,指令译码器就是负责这项工作的。其中,指令寄存器中操作码字段的输出就是指令译码器的输入。

  (4)程序计数器PC

  PC用于确定下一条指令的地址,以保证程序能够连续地执行下去,因此通常又被称为指令地址计数器。在程序开始执行前必须将程序的第一条指令的内存单元地址(即程序的首地址)送入PC,使它总是指向下一条要执行指令的地址。

  (5)地址寄存器AR

  地址寄存器用于保存当前CPU所要访问的内存单元或I/O设备的地址。由于内存与CPU之间存在着速度上的差异,所以必须使用地址寄存器来保持地址信息,直到内存读/写操作完成为止。

  显然,当CPU向存储器存数据、CPU从内存取数据和CPU从内存读出指令时,都要用到地址寄存器和数据寄存器。同样,如果把外围设备的地址作为内存地址单元来看的话,那么当CPU和外围设备交换信息时,也需要用到地址寄存器和数据寄存器。

  单片机编程入门之基本思路和写法

  学习单片机最主要的是学习写程序的方法,程序的功能千变万化,是学不完的,只有掌握了一定方法,才能用这种方法去写新的程序。

  以c语言写的单片机程序为例,程序总是从main程序开始,然后顺序执行到main结束。由此可知,程序必须包含而且只能包含一个main程序,也就是常说的主程序。

  main()

  {

  主程序的内容。。。。。。

  }

  实际使用中还需要在main程序中建立一个主循环体while 或者do while,主循环体可以是死循环,也可以是条件循环,如下:

  main()2 I- l5 q. e, B“ t4 i) ~9 H: U

  {” r h7 F) J5 G$ C5 C

  while(1)

  {

  死循环体内的程序会循环执行* E& K) T7 c7 a7 u

  }

  }

  /////////////////////////////////////////////////////////

  main()

  {

  2 e p# y- J! V/ O

  while(Flag)

  {$ Z8 Y6 y‘ }$ m5 z( k

  条件循环体内的程序会根据Flag的值的变化循环执行或者跳出循环

  }“ J% @0 q* p0 ?: s& C

  }4 Z2 E. ^* K2 [ u+ @. {

  /////////////////////////////////////////////////////////。 u” D6 h! E( m

  main()& ?6 l7 i! x# q+ W/ u

  {

  程序会顺序执行

  while(1); //在此处停止

  }

  ////////////////////////////////////////////////////////

  一般第一种用的最多,所有的需要循环执行的程序都放在主循环体内,然后内部有可以再增加多个条件循环体。

  main程序的开始一般要做哪些工作呢?再单片机中,c语言再进入main程序的入口时会自动添加一些单片机的初始化工作,使单片机处在准备工作的状态。但仅仅单片机内部做的并不一定似乎我们需要的,所以main程序的开始我们还需要些一些自己初始化的代码,比如开机时候的各个端口的状态,声明的一些变量的初始化数值,定时器或者其他外设的初始化等,凡是需要在第一时间就需要设置的部分都再这个部分完成,然后到了主循环while部分,既然是循环,就说明循环体内的程序是顺序并循环执行的,什么语句需要放在这个里面呢?那就是需要随时变化的端口量,数值等,比方说,时钟,时钟是不停变化的,就需要循环的读取时钟的数值,然后更新数据到显示器件上(数码管或液晶或者电脑端),再比方按键,因为我们不知道什么时候会按下按键,所有最简单的方法就是不停的检测按键端口的变化,这个也必须放在主循环体内,以保证检测按键的时效性

  举例说明:开机后P1.1连接的LED点亮,然后随这按键的按下LED熄灭,释放按键在点亮,设置P3.4端口按键3

  sbit LED=P1^1;* k/ ]- L( H. w: `1 B

  sbit KEY=P3^4; //定义按键端口,可以根据硬件连接不同更改到其他端口) i* C; r* m“ O- x! ~3 }

  9 b9 Z, w* j3 ]

  main()

  {。 ]! d& v6 [1 E7 z4 h& o

  LED=0;//这里以低电平点亮LED为例子,这个语句是初始化端口8 p+ h* Q4 B- m! @

  while(1)/ e. a: u( Q1 O. @6 |8 _

  {* w; W# F6 E+ ; r8 R P: I

  if(KEY) //检测按键端口是否为1,如果为1表示没有按下,如果为0表示按键按下% Q% G4 e$ X* ]3 e% ` L

  LED=0;//没有按下则LED点亮: [’ b8 ~) k& Q3 h‘ C r

  else

  LED=1;//按下则LED熄灭+ ]# L& U’ D/ _) K‘ Y4 J

  }% d) D6 g8 9 a2 s5 K1 |$ _* P! o

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分