51单片机基础入门
- 格式:pdf
- 大小:860.66 KB
- 文档页数:19
51单片机及C语言入门教程本教程将介绍51单片机及C语言的入门知识,帮助初学者快速掌握这两个方面的基本内容。
以下是本教程的详细内容:一、51单片机概述(200字)51单片机是由Intel公司推出的一种常见的单片机芯片,具有广泛应用的特点。
它采用了Harvard结构,具有8位数据总线和16位地址总线。
其主要特点是结构简单、易于学习、应用广泛,适用于各种嵌入式系统。
二、C语言基础(300字)C语言是一种高级编程语言,具有跨平台、可移植性强等特点,被广泛应用于各种软件开发和嵌入式系统中。
学习C语言的基础知识是学习51单片机编程的必要前提。
C语言基础知识主要包括数据类型、变量、常量、运算符、表达式、流程控制语句等内容。
这些知识是学习C语言和51单片机编程的基础,需要仔细理解和掌握。
三、51单片机编程入门(400字)1. 搭建开发环境:首先需要安装51单片机的开发工具,如KeilC51等。
然后,连接单片机开发板和电脑,确保硬件连接正确。
2.了解开发板:学习使用51单片机的开发板是学习51单片机编程的第一步。
具体包括开发板上各个接口的功能和使用方法。
3.编写第一个程序:根据教材或教程,编写第一个简单的程序,如让LED灯闪烁等。
学习如何通过C语言编写程序,将其烧录到单片机中,并运行和调试。
四、C语言与51单片机的应用(300字)在学习了C语言和51单片机的基础知识之后,可以进一步学习它们的应用。
1.输入输出操作:学习如何通过51单片机与外部设备进行输入输出操作,如控制LED灯的亮灭、读取按键输入等。
2.定时器和中断:学习如何使用51单片机的定时器和中断功能来实现定时任务和外部事件处理。
3.串口通信:学习如何通过51单片机的串口通信功能与其他设备进行数据交换和通信。
五、实例项目及拓展应用(200字)完成了基础学习后,可以尝试一些实例项目,如温度测量系统、遥控器、电子钟等。
同时,可以进一步学习其他相关知识,如LCD显示、SPI 通信等,以扩展自己的应用能力。
51单片机基础知识单片机作为一种嵌入式微控制器,具有广泛的应用领域和技术需求。
本文将介绍51单片机的基础知识,包括其概述、硬件结构、编程语言和开发环境等内容。
通过本文的学习,读者可以对51单片机有初步了解,并为之后的学习和应用打下基础。
一、概述51单片机,是指Intel公司开发的一种8位微处理器。
它以其简单、稳定和可靠的特点,成为嵌入式系统开发中最常用的单片机之一。
51单片机由存储器、中央处理器、输入输出端口、计时器/计数器和各种外围设备组成。
二、硬件结构51单片机的硬件结构主要包括中央处理器、存储器、输入输出端口和计时器/计数器。
1.中央处理器51单片机的中央处理器是一种基于哈佛架构的8位微处理器,具有高性能和低功耗的特点。
它可以执行指令、进行算术逻辑运算和控制外围设备的工作。
2.存储器51单片机的存储器包括程序存储器和数据存储器。
程序存储器用来存储运行的程序代码,而数据存储器用于存储程序需要的数据。
3.输入输出端口51单片机通过输入输出端口与外部设备进行通信。
输入端口用于接收外部信号,输出端口用于输出控制信号。
4.计时器/计数器51单片机内置了多个计时器/计数器,用于定时和计数应用。
它们可以实现精确的时间控制,并为系统提供准确的时间基准。
三、编程语言51单片机的常用编程语言有汇编语言和C语言。
汇编语言是51单片机最早的编程语言,它直接与硬件进行交互,执行效率高。
而C语言是一种高级编程语言,具有结构化、可移植等特点,编写的程序更加易读易维护。
1.汇编语言汇编语言是一种低级别的编程语言,需要程序员直接处理寄存器和内存地址。
它的语法相对复杂,但可以更直接地控制硬件资源,实现更高效的程序执行。
2.C语言C语言是一种结构化的高级编程语言,具有简洁、易读和可移植等特点。
C语言程序需要通过编译器将源代码转化为机器指令,然后才能在51单片机上运行。
四、开发环境51单片机的开发环境包括硬件开发工具和软件开发工具。
51单片机基本知识汇总51单片机是一种常见的微控制器,广泛应用于各种电子设备中。
本文将对51单片机的基本知识进行汇总,包括其特点、应用领域、工作原理以及相关开发工具等内容。
一、51单片机的特点51单片机是一种8位微控制器,具有体积小、功耗低、价格便宜等特点。
它采用哈佛结构,具有较好的实时性能和嵌入式系统特性。
此外,51单片机还具备较强的扩展性,可通过外部器件和接口扩展其功能。
二、51单片机的应用领域由于其成本低、易学易用的特点,51单片机在各种电子设备中被广泛应用。
比如家用电器、汽车电子、工控设备、通信设备等领域。
在家用电器中,51单片机可以用于控制空调、洗衣机、电视等设备的运行;在汽车电子方面,它可以用于控制车载音响、车灯等;在工控设备中,51单片机可用于控制机械手臂、传感器等;在通信设备方面,它可以用于控制无线路由器、手机等。
三、51单片机的工作原理51单片机的工作原理可以简单概括为:通过外部输入设备(如按键、传感器)获取输入信号,经过A/D转换后输入到单片机内部;单片机根据预先设定的程序进行运算、判断和控制,然后通过输出端口控制外部输出设备(如LED灯、电机)工作。
整个过程是通过时钟信号进行同步控制的。
四、51单片机的开发工具为了方便开发人员进行程序设计和调试,51单片机有一系列的开发工具可供选择。
常用的开发工具有Keil C51、Proteus、IAR等。
Keil C51是一种集成开发环境,提供了编译、调试、仿真等功能,可以方便地编写和调试51单片机的程序。
Proteus是一种虚拟电子电路设计与仿真软件,可用于模拟51单片机的工作过程。
IAR是一种集成开发环境,也是一种常用的编译器,适用于多种单片机开发。
总结:本文对51单片机的基本知识进行了汇总,包括其特点、应用领域、工作原理以及相关开发工具等内容。
51单片机作为一种常见的微控制器,具有广泛的应用前景。
掌握了51单片机的基本知识,可以更好地应用于各种电子设备的开发与控制。
一、51单片机的硬件结构1. 硬件结构框图说明:○1微处理器(CPU):51单片机含一个8位CPU,与通用的CPU功能基本相同,含运算器和控制器,不仅可以字节处理,还可以位处理。
例如:未处理、查表、状态检测、中断处理等。
○2数据存储器(RAM):51为128B,52为256B;片外最大可扩展到64K。
○3程序存储器(ROM/EPROM):8031没有,8051有4K的ROM,8751有4K的EPROM;片外可扩展至64K。
○4中断系统:5个中断源,2级优先权。
○5定时器/计数器:2个16位定时/计数器,四种工作方式。
○6串行口:1个全双工串行口,四种工作方式。
可进行串口通信,扩展并行I/O口,多机通信等。
○7P1、P2、P3、P0口:四个8位并行I/O口。
○8特殊功能寄存器(SFR):共21个,对片内部件进行管理、控制、监视;实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。
2. 引脚排列(1)电源及时钟引脚○1电源引脚:Vcc(40脚)解5V电源、Vss(20脚)接地。
○2时钟引脚:两个始终引脚XTAL1、XTAL2外接晶振,或接晶体与片内反相放大器构成振荡器。
XTAL1(19脚):内部反相放大器的输入端。
若接晶振则应接地;XTAL2(18脚):内部反相放大器的输出端。
若采用外部时钟振荡器,该引脚接收时钟振荡信号。
(2)控制引脚○1RST/Vpd(9脚):复位信号输入,高电平有效。
单片机运行时,此脚持续2个机器周期(24个时钟振荡周期)的高电平,就可复位。
平时应为0.5V低电平;Vpd为第二功能,备用电源输入端。
○2:ALE为地址锁存允许,正常工作时,ALE不断输出正脉冲信号。
当访问外部存储器时,ALE输出信号的负跳变沿用作低8位地址的锁存信号;PROG’为编程脉冲输入端。
○3PSEN’(Program Strobe Enable,29脚):程序存储器允许输出控制端。
低电平是外部程序存储器选通。
51单片机教程单片机作为嵌入式系统的关键元素之一,具有广泛的应用前景。
本教程将为大家介绍51单片机的基本知识、应用案例以及编程技巧。
通过学习本教程,读者将能够掌握51单片机的原理和基本操作,为进一步深入学习和应用打下坚实的基础。
一、简介51单片机指的是Intel公司推出的一种经典的8位单片机,广泛应用于电子产品中。
它使用的是哈弗小端字节序,运行稳定可靠,并具备强大的扩展性,便于工程师进行开发和应用。
二、基本原理1. 51单片机的结构51单片机包括中央处理器、存储器和各种外设。
中央处理器由ALU、寄存器组、程序计数器、指令译码器等组成。
存储器包括片内RAM和片内ROM,外设包括I/O口、定时器等。
2. 时序控制51单片机的时序控制通过晶振、分频器和定时器来实现。
晶振提供时钟信号,分频器控制时钟信号的频率,定时器用于定时和计数。
三、编程环境搭建1. 安装编程软件在学习51单片机之前,我们需要安装相应的编程软件。
常用的有Keil C51、WinAVR等。
根据自己的需求选择一个适合的软件进行安装。
2. 设置开发板将开发板与计算机连接,并进行相应的设置。
确认开发板的连接方式和COM口设置正确。
四、基本操作1. 点亮LED灯首先,我们从最简单的实验开始,通过51单片机控制LED灯的点亮和熄灭。
连接好电路后,编写相应的程序,即可实现LED灯的亮灭控制。
2. 按键输入与输出通过接入按键开关,我们可以实现通过按键输入不同的命令,控制LED灯的亮灭。
通过读取按键输入的状态,编写相应的程序进行判断和控制。
五、应用案例1. 温度检测系统通过连接温度传感器,我们可以使用51单片机对周围环境的温度进行检测,并通过LED灯或LCD显示屏来显示当前的温度数值。
2. 蜂鸣器控制将蜂鸣器与51单片机连接,通过编写程序控制蜂鸣器的频率和节奏,可以实现不同的音乐或警报声音。
六、编程技巧1. 中断编程中断编程是51单片机常用的一种编程方式。
引言概述:51单片机是一种常见的单片机型号,它具有广泛的应用领域和较高的使用率。
本教程旨在为初学者提供51单片机的入门知识和基础操作指南。
本文将介绍51单片机的基本概念,硬件配置,编程语言,程序以及常见问题解答。
通过学习本教程,读者可以对51单片机有一个全面的了解,并在实践中掌握其基本应用。
正文内容:1.51单片机基本概念介绍单片机的定义和类型,包括其基本构成和特点。
详细解释51单片机的命名由来,并介绍其典型应用场景。
探讨51单片机与其他单片机型号的区别和优势。
2.51单片机硬件配置介绍51单片机开发板的主要组成部分和功能。
讲解51单片机的复位电路、晶振电路以及外部扩展接口。
提供常见的硬件错误排查方法,如常见的电路连接问题和芯片供电问题。
3.51单片机编程语言简要介绍51单片机所支持的主要编程语言。
详细解释汇编语言和C语言在51单片机编程中的应用。
提供汇编语言和C语言的编译和调试方法,以及注意事项。
4.51单片机程序介绍不同的程序方法,如串口、ISP以及仿真器。
解释如何选择合适的方法和调试工具。
提供常见错误和解决方法,如速度慢、失败等问题。
5.51单片机常见问题解答回答常见的初学者问题,如51单片机如何上电启动、如何设置端口输入输出、如何控制LED等。
解决常见的编程问题和错误,如程序死循环、程序崩溃等。
提供进一步学习资源和推荐书籍,以帮助读者更深入地理解和掌握51单片机。
总结:通过本教程的学习,读者获得了对51单片机的基本概念、硬件配置、编程语言、程序以及常见问题解答等方面的全面了解。
无论是初学者还是有一定经验的工程师,都可以通过实践操作和进一步学习,掌握51单片机的基本应用和进阶技巧。
希望本教程能给读者带来实际帮助,并激发更多的学习兴趣和创造力。
引言概述:本文主要介绍了51单片机入门教程。
51单片机是一种非常常见的单片机,广泛应用于各种电子设备和嵌入式系统中。
本文将详细介绍51单片机的基本原理、开发环境、编程语言以及常用功能及应用等方面的内容。
单片机教程第一课:概述1、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。
而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。
天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。
不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。
为什么会这样呢?功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。
另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。
既然如此,单片机的功能肯定不强,干吗要学它呢?话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。
所以8051出来十多年,依然没有被淘汰,还在不断的发展中。
2、MCS51单片机和8051、8031、89C51等的关系:我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系? MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。
C51单片机是一种基于C语言的微控制器,具有强大的处理能力和灵活的编程特性。
以下是一些关于C51单片机的基础知识:
硬件结构:C51单片机采用冯·诺依曼结构,由运算器、控制器、存储器、输入输出设备等组成。
存储器:C51单片机内部有一个程序存储器(Flash ROM)、一个数据存储器(RAM)和一个特殊功能寄存器(SFR)。
程序存储器用于存储程序,数据存储器用于存储变量和临时数据,特殊功能寄存器用于控制各种外设和功能。
指令系统:C51单片机的指令系统类似于C语言,包括算术指令、逻辑指令、数据传输指令、程序控制指令等。
外设:C51单片机有多种外设,如定时器/计数器、串行通信接口、中断控制器、I/O端口等。
这些外设可以通过特殊功能寄存器进行配置和控制。
开发环境:C51单片机的开发环境通常包括编译器、调试器和集成开发环境(IDE)。
编译器将C语言代码转换为单片机可执行的机器码,调试器用于在单片机上进行程序调试和仿真,IDE提供了代码编写、编译、调试和下载的一体化环境。
应用领域:C51单片机广泛应用于各种嵌入式系统,如智能仪表、家电控制、通信设备、工业自动化等领域。
总之,C51单片机是一种功能强大、易于编程的微控制器,通过学习和掌握其基础知识,可以开发出各种高效的嵌入式应用系统。
第1章 51单片机的基础知识51单片机是一种广泛应用的嵌入式微控制器,具有强大的功能和灵活性。
在学习和使用51单片机之前,了解其基础知识是至关重要的。
本章将介绍51单片机的基础知识,包括硬件结构、寄存器、指令集和编程语言。
1.1 51单片机的硬件结构51单片机的硬件结构是指其内部的组成部分和外部连接。
51单片机包含中央处理器(CPU)、存储器、输入/输出(I/O)口、定时器/计数器、串行通信口等功能模块。
这些功能模块共同协作,完成各种任务。
1.1.1 中央处理器(CPU)51单片机的中央处理器是核心部件,负责执行指令、控制程序运行和处理数据。
51单片机采用哈佛结构,将程序存储器和数据存储器分开。
它包含一个8位的累加器(A)和一个指令寄存器(IR),用于指令的执行。
1.1.2 存储器51单片机的存储器包括程序存储器和数据存储器。
程序存储器用于存储程序指令,可以是内部存储器或外部存储器。
数据存储器用于存储程序运行中产生的数据,包括RAM和ROM。
1.1.3 输入/输出(I/O)口51单片机具有一定数量的I/O口,用于与外部设备进行数据交互。
输入口用于接收外部信号,输出口用于发送数据或控制外部设备。
它们可以是并行口或串行口,根据需要进行配置。
1.1.4 定时器/计数器定时器/计数器是51单片机的重要组成部分,用于产生定时延迟和计数脉冲。
定时器可以设置为定时模式或计数模式,定时器中断可用于实现时间控制和精确计时。
1.1.5 串行通信口串行通信口是51单片机与外部设备进行串行通信的接口,常用的有UART和SPI。
它们通过串行传输数据,实现与外部设备的数据交换和通信。
1.2 51单片机的寄存器51单片机具有一组特殊功能寄存器,用于配置和控制其各项功能。
这些寄存器负责存储和传输数据,执行各种功能操作。
常见的寄存器包括通用寄存器、状态寄存器、特殊功能寄存器等。
1.2.1 通用寄存器通用寄存器是用于存储临时数据的寄存器,包括8个存储器编号,分别为R0 - R7。
51单片机教程51单片机是一种常用的微控制器,学习51单片机的教程可以帮助初学者快速入门。
在本篇教程中,将介绍51单片机的基本知识和编程技巧。
1. 概述51单片机是基于哈佛体系结构的8位微控制器。
它具有丰富的外设和接口,适用于各种嵌入式应用。
在学习51单片机之前,需要了解单片机的基本结构、寄存器和指令集等重要概念。
2. 开发环境搭建搭建合适的开发环境对学习51单片机至关重要。
可以选择Keil C51或者SDCC等集成开发环境,并安装相应的编译器和调试器。
此外,还需要连接51单片机与电脑,才能进行程序下载和调试。
3. 程序编写与调试使用C语言编写51单片机的程序是最常见的方法。
首先,需要了解51单片机的IO口、定时器、中断等基本知识,以及相应的编程方法。
然后,可以通过编写简单的程序,例如LED闪烁、计数器等,来测试和调试开发板。
4. 外设和接口的应用51单片机具有丰富的外设和接口,例如串口、SPI、I2C等。
学习如何使用这些外设和接口,可以帮助实现更多功能。
例如,可以使用串口进行与计算机的通信,或者通过SPI接口与外部设备进行数据交换。
5. 项目实践通过完成具体的项目,可以深入理解51单片机的应用。
例如,可以设计一个温度测量系统、一个电子钟或者一个自动控制系统等。
在实践过程中,可以遇到各种问题和挑战,通过解决问题,可以提高面对实际问题的能力。
总结:通过本篇教程,介绍了51单片机的基本知识和编程技巧。
希望读者可以通过学习,掌握51单片机的应用和开发方法。
在学习过程中,需要勤加练习,不断积累经验,才能更好地应用单片机技术。
51单片机?又该如何自学51单片机? 51单片机是目前使用最多的单片机之一,那么什么是51单片机呢?作为新手,又该如何自学51单片机?为帮助大家更好的学习51单片机,本文将对这两个问题予以阐述。
如果你对51单片机具有兴趣,不妨继续往下阅读哦。
一、何为51单片机51单片机是对所有兼容Intel8031指令系统的单片机的统称。
该系列单片机的始祖是Intel的8004单片机,后来随着Flashrom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
需要注意的是51系列的单片机一般不具备自编程能力。
二、51单片机入门自学建议作为一个初学者,如何51单片机入门?实际上,其实不需要多少东西,会简单的C语言,知道51单片机的基本结构就可以了。
一般的大学毕业生都可以了,自学过这2门课程的高中生也够条件。
设备上,一般是建议购买一个仿真器,例如,的“双功能下载线”就具有良好的稳定性和较快的下载速度,上位机可扩展,可以下载更多的单片机及嵌入式芯片。
通过实验,这样才可以进行实际的,全面的学习。
日后在工作上,仿真器也大有用处。
还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板,如图,即为,单片机最小系统。
学习板以强大的接口为主,单片机的学习分两方面,一方面是单片机的原理及内部结构,另一方面是单片机的接口技术。
这些都是需要平时多积累,多动手,多思考,这样才能学好单片机技术。
注:“双功能下载线”在百度文库里有详细的使用说明,并且上位机会定期更新以支持更多的单片机。
单片机学习的4个阶段:(一)整体了解要知道单片机是什么?单片机有何用?如何系统学习单片机?单片机系统设计的流程是怎样的,需要掌握哪些辅助软件?了解这些之后,我们的学习就有了目标和方向。
单片机基础知识点总结第1篇MCS-51单片机是标准数字电路芯片,其输入输出引脚电平符合TTL电平规则(高电平逻辑3 -5V,低电平逻辑0-1V),该电平标准有效传输距离较短(15米以内),不适于远距离通信信号传输。
为了提高串行通信可靠性,增大通信距离,人们定义了各种新的通信电平标准。
后经美国电子工业协会(EIA)指定标准规范化,形成RS422,RS232,RS485三种异步串行通信电平标准和硬件接口协议。
RS232接口标准是一种用于短距离或带调制解调器(Modem)的串行通信接口标准,1 970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的。
MCS-51单片机串行口主要由发送数据寄存器、发送控制器、输出控制门、接收数据寄存器、接收控制器、输入移位寄存器等组成SM0、 SM1:串行口工作方式选择位。
SM2:多机通信控制位。
REN:允许接收控制位。
TB8:发送的第9位数据RB8:接收的第9位数据。
TI:发送中断标志位。
RI:接收中断标志位。
当SMOD位为1,则串行口方式1、方式2、方式3的波特率加倍。
方式o通常用来外接移位寄存器,用作扩展I/O口。
方式0工作时波特率固定为: f o s c / 12 f_{osc} /12 fosc/12。
工作时,串行数据通过RXD输入和输出,同步时钟通过TXD输出。
在TI=0时,当CPU执行一条向SBUF写数据的指令时,启动发送过程。
从RXD依次发送出去,同步时钟从TXD送出。
8位数据发送完后,发送中断标志TI置位,并向CPU申请中断。
在RI=0的条件下,将REN置 “1”就启动一次接收过程。
在移位脉冲的控制下,RXD上的串行数据依次移入移位寄存器。
当8位数据全部移入移位寄存器后,8位数据送入接收数据缓冲器SBUF中,同时,接收中断标志RI置位,向CPU申请中断。
单片机基础知识点总结第2篇为了方便用户,C51编译器把S1单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“regsl。
51单片机C语言学习杂记学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语言,还有众多种类的单片机选择真是件让人头痛的事。
在众多单片机中51架构的芯片风行很久,学习资料也相对很多,是初学的较好的选择之一。
51的编程语言常用的有二种,一种是汇编语言,一种是C语言。
汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C语言还可以嵌入汇编来解决高时效性的代码编写问题。
对于开发周期来说,中大型的软件编写用C语言的开发周期通常要小于汇编语言很多。
综合以上C语言的优点,我在学习时选择了C语言。
以后的教程也只是我在学习过程中的一些学习笔记和随笔,在这里加以整理和修改,希望和大家一起分享,一起交流,一起学习,一起进步。
*注:可以肯定的说这个教程只是为初学或入门者准备的,笔者本人也只是菜鸟一只,有望各位大侠高手指点错误提出建议。
明浩2003-3-30pnzwzw@第一课建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。
KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。
一、单片机基础知识1.1介绍:单片机,简称MCU.内部集成了CPU,RAM,ROM,定时器,终端系统,通讯接口等一系列电脑的常用硬件功能1.1.1点亮一个LED:安装好stc-isp与Keil5C51,配置USB驱动;建立一个新工程,选择AT89C52型号添加新文件选择C语言(通常情况下)通过调节P20的电压实现点亮/熄灭写好程序勾选创建HEX文件,再次编译;配置芯片型号(带RC选RC)与串口点击打开程序文件打开HEX文件下载到单片机;查找时重启单片机电源;成功点亮1.1.2LED闪烁:可从此处进行延时函数复制(系统频率一般默认为12Hz)#include<REGX52.H>//The Definition#include<INTRINS.H>//Using the _nop_()void Delay500ms() //@12.000MHz{unsigned char i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i);}void main(){while(1){P2 = 0xFE;//1111 1110 There is a pressure drop across the diode Delay500ms();P2 = 0xFF;//1111 1111 There isn't a pressure drop across the diode Delay500ms();}}使用此函数进行LED闪烁;1.1.3LED流水灯:通过控制P2管脚的十六进制数值改变对应LED灯的压降,实现亮/灭;P2实际上为8位一体的导线;P2_X则可以操作单独的LED控件#include<REGX52.H>//The Definition#include<INTRINS.H>//Using the _nop_()void Delay1ms(unsigned int xms) //@12.000MHz{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main(){while(1){P2=0xFE;//1111 1110 D1Delay1ms(500);P2=0xFD;//1111 1101 D2Delay1ms(500);P2=0xFB;//1111 1011 D3Delay1ms(500);P2=0xF7;//1111 0111 D4Delay1ms(500);P2=0xEF;//1110 1111 D5Delay1ms(500);P2=0xDF;//1101 1111 D6Delay1ms(500);P2=0xBF;//1011 1111 D7Delay1ms(500);P2=0x7F;//0111 1111 D8Delay1ms(500);}}1.2独立按键控制LED亮灭:通过查询原理图发现,K1独立按键对应P3_1;#include<REGX52.H>//The Definitionvoid main(){while(1){if(P3_1){//UPP2_0=1;//D1 Dark}else{//DOWNP2_0=0;//D1 Light}}}1.2.1独立按键控制LED状态:按键抖动:对于机械开关,当机械触点断开,闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会立刻断开,开关闭合/断开时往往伴随着波动#include<INTRINS.H>//Using the _nop_()void Delay(unsigned int xms){unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main(){while(1){if(!P3_1){//DOWNDelay(20);while(!P3_1);Delay(20);P2_0=~P2_0;}}}消除误差1.2.2独立按键控制LED显示二进制unsigned char 用来表示一个寄存器#include<REGX52.H>//The Definition#include<INTRINS.H>//Using the _nop_() void Delay(unsigned int xms){unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main(){unsigned char LEDNumber = 0;while(1){if(!P3_1){//DOWNDelay(20);while(!P3_1);Delay(20);LEDNumber++;P2=~LEDNumber;}}}对P2进行取反操作则为计算二进制数值1.2.3独立按键控制LED移位:#include<REGX52.H>//The Definition#include<INTRINS.H>//Using the _nop_() void Delay(unsigned int xms){unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main(){unsigned char LEDNumber=0;P2=~0x01;//Rename the character while(1){if(!P3_0){//K2 DOWN Moving RightDelay(20);while(!P3_0);Delay(20);LEDNumber++;if(LEDNumber>=8){LEDNumber=0;}P2=~(0x01<<LEDNumber);}if(!P3_1){//K1 DOWN Moving LeftDelay(20);while(!P3_1);Delay(20);if(!LEDNumber){LEDNumber=7;}else{LEDNumber--;}P2=~(0x01<<LEDNumber);}}}包括左移(K1)和右移(K2);if语句中为消除误差+移动计算;通过改变P2总导线压降,来控制对应LED灯的亮灭首先对P2进行初始化0000 0001 D1亮0x01<<00000 0010 D2 亮0x00<<1....1000 0000 D8亮0x00<<81.3静态数码管显示:确定静态数码管显示时,先根据所选型号与待输出数据确定位选(3.8引脚的高低电平)与段码(剩下引脚的高低电平)通过此两排端口进行控制,下方端口由P0控制通过138译码器实现仅一位LED为1的操作(其余为0),通过观察真值表确定端口: 三端口为P2引脚.C B A Y0 0 0 70 0 1 60 1 0 50 1 1 41 0 0 31 0 1 21 1 0 11 1 1 0DIR控制数据传输方向DIR通过J24控制电平高低.当DIR接高电平时,从左向右传输数据#include<REGX52.H>//The Definition#include<INTRINS.H>//Using the _nop_()void Delay(unsigned int xms){unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}unsigned char NixieTabel[]={0x3F,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07};void Nixie(unsigned char Location, Number){ switch(Location){case8:{P2_4=0;P2_3=0;P2_2=0;break;}case7:{P2_4=0;P2_3=0;P2_2=1;break;}case6:{P2_4=0;P2_3=1;P2_2=0;break;}case5:{P2_4=0;P2_3=1;P2_2=1;break;}case4:{P2_4=1;P2_3=0;P2_2=0;break;}case3:{P2_4=1;P2_3=0;P2_2=1;break;}case2:{P2_4=1;P2_3=1;P2_2=0;break;}case1:{P2_4=1;P2_3=1;P2_2=1;break;}}P0=NixieTabel[Number];}void main(){unsigned int location = 1, number = 0;while(1){if(location > 8){location = 1;number = 0;}Delay(1000);Nixie(location,number);location++;number++;}}1.3.1动态数码管显示在实现显示多个数据时,清零上一个数据,实现消影#include<REGX52.H>//The Definition#include<INTRINS.H>//Using the _nop_()void Delay(unsigned int xms){unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}unsigned char NixieTabel[]={0x3F,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07};void Nixie(unsigned char Location, Number){switch(Location){case8:{P2_4=0;P2_3=0;P2_2=0;break;}case7:{P2_4=0;P2_3=0;P2_2=1;break;}case6:{P2_4=0;P2_3=1;P2_2=0;break;}case5:{P2_4=0;P2_3=1;P2_2=1;break;}case4:{P2_4=1;P2_3=0;P2_2=0;break;}case3:{P2_4=1;P2_3=0;P2_2=1;break;}case2:{P2_4=1;P2_3=1;P2_2=0;break;}case1:{P2_4=1;P2_3=1;P2_2=1;break;}}P0=NixieTabel[Number];Delay(1);P0=0x00;//Creat Last digit.}void main(){while(1){Nixie(1,5);Nixie(2,2);Nixie(3,0);}}1.3.2LCD1602调试工具LCD_Init();//初始化LCD_ShowChar(1,1,'A');//显示一个字符LCD_ShowString(1,3,"Hello");//显示字符串LCD_ShowNum(1,9,123,3);//显示十进制数字LCD_ShowSignedNum(1,13,-66,2);//显示有符号十进制数字LCD_ShowHexNum(2,1,0xA8,2);//显示十六进制数字LCD_ShowBinNum(2,4,0xAA,8);//显示二进制数字1.4矩阵键盘:矩阵按键按列扫描P引脚均为弱上拉,即同时输入1&&0,输出0添加如下文件:#include <REGX52.H>#include "Delay.h"unsigned char MatrixKey(){unsigned char KeyNumber=0;//先判断列数,再判断行数,避免电平错位P1=0xFF;//全部置为高电平P1_3=0;//仅启动P1_3--即第一列 if(!P1_7){Delay(20);while(!P1_7);Delay(20);KeyNumber=1;}if(!P1_6){Delay(20);while(!P1_6);Delay(20);KeyNumber=5;}if(!P1_5){Delay(20);while(!P1_5);Delay(20);KeyNumber=9;}if(!P1_4){Delay(20);while(!P1_4);Delay(20);KeyNumber=13;}P1=0xFF;//全部置为高电平P1_2=0;//仅启动P1_2--即第二列 if(!P1_7){Delay(20);while(!P1_7);Delay(20);KeyNumber=2;}if(!P1_6){Delay(20);while(!P1_6);Delay(20);KeyNumber=6;}if(!P1_5){Delay(20);while(!P1_5);Delay(20);KeyNumber=10;}if(!P1_4){Delay(20);while(!P1_4);Delay(20);KeyNumber=14;}P1=0xFF;//全部置为高电平P1_1=0;//仅启动P1_1--即第三列 if(!P1_7){Delay(20);while(!P1_7);Delay(20);KeyNumber=3;}if(!P1_6){Delay(20);while(!P1_6);Delay(20);KeyNumber=7;}if(!P1_5){Delay(20);while(!P1_5);Delay(20);KeyNumber=11;}if(!P1_4){Delay(20);while(!P1_4);Delay(20);KeyNumber=15;}P1=0xFF;//全部置为高电平P1_0=0;//仅启动P1_0--即第四列if(!P1_7){Delay(20);while(!P1_7);Delay(20);KeyNumber=4;}if(!P1_6){Delay(20);while(!P1_6);Delay(20);KeyNumber=8;}if(!P1_5){Delay(20);while(!P1_5);Delay(20);KeyNumber=12;}if(!P1_4){Delay(20);while(!P1_4);Delay(20);KeyNumber=16;}return KeyNumber;}1.4.1矩阵键盘密码锁main函数:#include <REGX52.H>#include "Delay.h"#include "LCD1602.h"#include "MatrixKey.h"unsigned int KeyNumber;unsigned int PassWord,Count;//密码,位数void main(){LCD_Init();LCD_ShowString(1,1,"PassWord:");while(1){KeyNumber=MatrixKey();if(KeyNumber){if(KeyNumber<=10){//将10变成0,仅考虑0~9范围内if(Count<4){PassWord*=10;//每输入一位密码,当前密码左移一位 PassWord+=KeyNumber%10;//获取一位密码Count++;//计次}LCD_ShowNum(2,1,PassWord,4);//输出密码}if(KeyNumber==11){//清零Count=0;//清零次数PassWord=0;//清零密码LCD_ShowNum(2,1,PassWord,4);//更新显示}if(KeyNumber==12){//确认LCD_ShowString(1,12," ");if(PassWord==1976){LCD_ShowString(1,12,"OK");}else{LCD_ShowString(1,12,"ERROR");}//清零Count=0;PassWord=0;LCD_ShowNum(2,1,PassWord,4);//更新显示}}}}1.5定时器1.5.1按键控制LED流水灯模式TMOD:定时器寄存器:配置M1,M2为1 0-更改为16定时器模式0~65535:溢出时才进行中断判断每隔1us计数加一,总共定时时间65535us;赋初值64535-1000us(1ms)后计数器溢出,进行中断操作快捷生成定时器模块该函数未配置中断与中断优先级,且定时器时钟模式不需要定义定时器函数://1ms定时器void Timer0_Init(){//模式寄存器,高四位为计时器1,低四位为计时器2//高四位不变,低四位清零:10101100&11110000=10100000TMOD&=0xF0;//高四位不变,低四位赋1:10101100|00000001=10100001TMOD|=0x01;//控制寄存器;能单独对部分赋值TF0=0;//中断标志TR0=1;//运行控制位;1时运行T0进行计数//给定时器赋初值TH0=0xFC;//64535高八位TL0=0x18;//64535低八位//配置中断ET0=1;EA=1;//优先级选取PT0=0;}中断函数://定时器中断函数void Timer0_Rountine() interrupt 1{static unsigned int T0Count;//计数//复位TH0=0xFC;//64535高八位TL0=0x18;//64535低八位T0Count++;//每中断一次计数加一if(T0Count>=1000){//1ms中断一次,中断1000次则为1s //具体操作T0Count=0;P2_0=~P2_0;//闪烁}}主函数:#include <REGX52.H>#include <INTRINS.H>#include "Timer0.h"#include "Key.h"unsigned char KeyNumber,LEDMode;void main(){P2=0xFE;//点亮D1,给予循环移位初值Timer0_Init();//启用定时器while(1){KeyNumber=Key();if(KeyNumber){//按下独立按键if(KeyNumber==1){//S1为模式改变按键LEDMode++;if(LEDMode>=2){//仅有0|1两种模式LEDMode=0;}}}}}//中断操作void Timer0_Rountine() interrupt 1{ static unsigned int T0Count;//计数//给定时器赋初值复位TH0=0xFC;//64535高八位TL0=0x18;//64535低八位T0Count++;//每中断一次计数加一if(T0Count>=500){//0.5s操作一次T0Count=0;if(LEDMode){//模式1P2=_cror_(P2,1);//右移一位}else{//模式0P2=_crol_(P2,1);//左移一位}}}1.5.2定时器时钟:#include <REGX52.H>#include <INTRINS.H>#include "Timer0.h"#include "LCD1602.h"unsigned char Second,Minute,Hour;void main(){LCD_Init();//显示屏初始化LCD_ShowString(1,1,"Clock:");Timer0_Init();//启用定时器while(1){LCD_ShowNum(2,1,Hour,2);LCD_ShowString(2,3,":");LCD_ShowNum(2,4,Minute,2);LCD_ShowString(2,6,":");LCD_ShowNum(2,7,Second,2);}}//中断操作void Timer0_Rountine() interrupt 1{static unsigned int T0Count;//计数//给定时器赋初值复位TH0=0xFC;//64535高八位TL0=0x18;//64535低八位T0Count++;//每中断一次计数加一if(T0Count>=1000){//0.5s操作一次T0Count=0;Second++;if(Second==60){Minute++;Second=0;if(Minute==60){Hour++;Minute=0;if(Hour==25){Hour=Minute=Second=0;}}}}}1.6串口:1.6.1串口通信:配置波特率:1.6.2交互数据传输:#include <REGX52.H>//串口函数******************void UART_Init(){//配置串行控制寄存器,调整工作模式1SCON=0x50;//允许双向传输,REN置为1,配置使能//配置波特率选择位--需要配置定时器PCON|=0x80;//最高位置1,波特率加倍//定时器模式寄存器式//使用双八位模式(复位与计数分开)提高精度//清除定时器1模式位TMOD&=0x0F;//设定定时器1为八位自动重装方式TMOD|=0x20;//256溢出一次TL1=0xF4;//设定定时器初值TH1=0xF4;//设定定时器重装值ET1=0;//禁止定时器1中断TR1=1;//启动定时器1//使能中断EA=1;ES=1;}//发送函数void UART_SendByte(unsigned char Byte){SBUF=Byte;//发送数据到SBUF缓存器中即可进行传输//检测是否完成while(!TI);TI=0;}#ifndef __UART_H__#define __UART_H__/*串口函数输入:void输出:void功能:实现串口使用的初始化*/void UART_Init();/*串口发送函数输入:void输出:void功能:通过串口发送数据至接收端*/void UART_SendByte(unsigned char Byte);#endifmain:#include <REGX52.H>#include "Delay.h"#include "UART.h"void main(){UART_Init();while(1){}}//使能中断函数;发送/接收中断函数void UART_Routine() interrupt 4{if(RI==1){//限制仅为接收中断才进行后续操作P2=~SBUF;//外部设备传输数据存放在SBUF缓存器内 UART_SendByte(SBUF);//输出传入数据RI=0;}}1.7LED点阵屏:通过74HC595三个引脚控制八个LED 显示(新版板子是没有该八位LED 的)通过控制75HC595进行数据传输: #include <REGX52.H>//重新进行声明sbit RCK = P 3^5; //RCLKsbit SCK = P 3^6; //SRCLKsbit SER = P 3^4;//移位寄存器输入数据void _74HC595_WriteByte(unsigned char Byte){unsigned char i;for(i=0;i<8;i++){//从高位开始缓存数据SER=Byte&(0x80>>i);//非零置一0x80--10000000SCK=1;//赋予高电平进行移位SCK=0;//复位}RCK=1;//传输数据RCK=0;//复位}void main(){//初始化SCK=0;RCK=0;_74HC595_WriteByte(0xF0);while(1){}}1.7.1LED点阵屏显示动画:使用该软件进行数据读取MatrixLED_ShowColumn.c:#include <REGX52.H>#include "Delay.h"#include "MatrixLED_ShowColumn.h"//移位寄存器输入数据,控制段选void _74HC595_WriteByte(unsigned char Byte){unsigned char i;for(i=0;i<8;i++){//从高位开始缓存数据SER=Byte&(0x80>>i);//非零置一0x80--10000000SCK=1;//赋予高电平进行移位SCK=0;//复位}RCK=1;//传输数据RCK=0;//复位}//LED点阵屏void MatrixLED_ShowColumn(unsigned char Column,unsigned char Data){ _74HC595_WriteByte(Data);//段选MATRIX_LED_PORT=~(0x80>>Column);//位选0时出现压降,导通Delay(1);MATRIX_LED_PORT=0xFF;//位清零}//初始化void MatrixLED_Init(){SCK=0;RCK=0;}MatrixLED_ShowColumn.h:#ifndef _MATRIXLED_H__#define _MATRIXLED_H__//重新进行声明sbit RCK= P3^5;//RCLKsbit SCK= P3^6;//SRCLKsbit SER= P3^4;#define MATRIX_LED_PORT P0/*移位寄存器函数输入:Byte-点阵屏行数据输出:void功能:通过输入数据对LED点阵屏行(即位选)进行调整范围:0~7*/void _74HC595_WriteByte(unsigned char Byte);/*LED点阵屏函数输入:Column-位选 Data-段选输出:void功能:通过输入位选与段选实现LED点阵屏的动画演示*/void MatrixLED_ShowColumn(unsigned char Column,unsigned char Data);/*LED点阵屏初始化函数输入:void输出:void功能:对LED相关参数进行初始化*/void MatrixLED_Init();#endifmain.c:#include <REGX52.H>#include "Delay.h"#include "MatrixLED_ShowColumn.h"unsigned char code Animation[]={//存放在flash内存中,避免占用RAM内存0x00,0x40,0x20,0x1F,0x20,0x40,0x00,0x00,0x00,0x40,0x40,0x7F,0x40,0x40,0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x76,0x91,0x89,0x6E,0x00,0x00,0x00,0x00,0x7F,0x88,0x88,0x70,0x00,0x00,};void main(){//只要是局部变量的定义都要放在所在函数体内的第一行unsigned char j,Offset,Count;MatrixLED_Init();while(1){for(j=0;j<8;j++){MatrixLED_ShowColumn(j,Animation[j+Offset]);}Count++;if(Count>10){//扫描十遍偏移一次Count=0;Offset+=8;Delay(200);if(Offset>32){//防止溢出Offset=0;}}}}1.8DS1032定时时钟:从上到下依次存储不同的时间左边两列为其地址命令字第六位:1-RAM;0-CK,对时钟进行操作(有横线代表低电平有效)仅改变前七位,最后一位恒为1前一个字节是命令字,后一个是数据重新定义该三个端口1.8.1DS1302固定时钟主函数:#include <REGX52.H>#include "Delay.h"#include "DS1302.h"#include "LCD1602.h"void main(){LCD_Init();DS1302_Init();LCD_ShowString(1,1," - - ");LCD_ShowString(2,1," : : ");DS1302_SetTime();//设置时间//DS1302芯片内部自动会进行时间进位,不需要手动设置,只需要输入初始时间即可while(1){DS1302_ReadTime();//读入时间LCD_ShowNum(1,1,DS1302_Time[0],2);LCD_ShowNum(1,4,DS1302_Time[1],2);LCD_ShowNum(1,7,DS1302_Time[2],2);LCD_ShowNum(2,1,DS1302_Time[3],2);LCD_ShowNum(2,4,DS1302_Time[4],2);LCD_ShowNum(2,7,DS1302_Time[5],2);}}DS1302.c:#include <REGX52.H>#include "Delay.h"//重新定义端口名称,便于模块化集成sbit DS1302_SCLK=P3^6;sbit DS1302_IO=P3^4;sbit DS1302_CE=P3^5;#define DS1302_SECOND 0x80#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_DATE 0x86#define DS1302_MONTH 0x88#define DS1302_DAY 0x8A#define DS1302_YEAR 0x8C#define DS1302_WP 0x8E//Year,Month,Day,Hour,Minute,Second,Weekdayunsigned char DS1302_Time[]={22,5,22,21,19,55,7};//DS1302初始化,将使能端置0,SCLK置0void DS1302_Init(void){DS1302_CE=0;DS1302_SCLK=0;}//写入操作void DS1302_WriteByte(unsigned char Command, unsigned char Data){ //写入预操作//Command的第零位赋予IO口,第零位是标志位,判断读/写//Command与Data都是通过上升沿进行判断,因此总共有16个脉冲unsigned char i;DS1302_CE=1;//进行Command判断for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);//进行电平变化,产生上升沿与下降沿DS1302_SCLK=1;Delay(1);//一般需要增加延时,具体参考芯片手册DS1302_SCLK=0;}//进行数据写入for(i=0;i<8;i++){DS1302_IO=Data&(0x01<<i);DS1302_SCLK=1;Delay(1);DS1302_SCLK=0;}//写入末操作DS1302_CE=0;}unsigned char DS1302_ReadByte(unsigned char Command){//读入预操作unsigned char i;unsigned char Data=0x00;Command|=0x01;//此处将最低位,置成1,使输入的写Command变成读Command DS1302_CE=1;//读入的Command是上升沿,而Data是下降沿,因此总共有15个脉冲for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);//调整位置确保脉冲与Data一致DS1302_SCLK=0;DS1302_SCLK=1;}//读入数据//IO口默认为0,因此输入的数据为1时,for(i=0;i<8;i++){DS1302_SCLK=1;DS1302_SCLK=0;if(DS1302_IO){Data|=(0x01<<i);}}//读入末操作DS1302_CE=0;DS1302_IO=0;return Data;}unsigned char ChangeToDec(unsigned char Number){return (Number/16*10+Number%16);}。
51单片机知识基础51单片机是一种非常常见的嵌入式系统开发平台,广泛应用于各个领域,如工业控制、智能家居、物联网等。
要想在嵌入式系统开发中熟练运用51单片机,我们首先需要了解它的基础知识。
本文将从51单片机的概念、特点、原理、编程语言等方面展开论述,以帮助读者全面掌握51单片机的基础知识。
第一部分:51单片机概述51单片机是指Intel公司研发的一种8位单片微控制器,意为“Intel 80系列单片机”。
它由CPU、内存、输入输出端口、定时器、串口等组成,具有较强的数据处理和控制能力。
作为一种非常成熟的单片机,51单片机以其稳定性、成本低、易于使用等特点,受到了广大嵌入式系统开发者的青睐。
第二部分:51单片机特点1. 8位架构:51单片机采用8位架构,即其CPU的位数为8位。
这使得51单片机非常适合于一些对计算能力要求不高的控制应用。
2. 强大的IO口:51单片机内置了大量的IO口,可以方便地与其他设备进行通信,实现各种输入输出功能。
此外,51单片机还支持中断功能,可以提高系统的响应速度。
3. 丰富的外设:51单片机内部集成了多个定时器、串口等外设,可用于实现各种功能,如定时、计数、通信等。
4. 低功耗设计:51单片机在设计时考虑到了功耗的问题,采取了一系列的低功耗技术,可以大大降低系统的能耗。
5. 软件支持:针对51单片机,有丰富的软件开发工具和开发库可供选择,如Keil C51、SDCC等,大大降低了开发的难度。
第三部分:51单片机工作原理51单片机的工作原理主要包括指令执行周期、数据通信、中断机制等。
1. 指令执行周期:51单片机通过时钟控制来执行指令。
每个指令执行周期由若干个机器周期组成,一个机器周期通常为12个时钟周期。
2. 数据通信:51单片机通过内部总线进行数据通信。
在执行指令时,需要从内存或寄存器中读取数据,对数据进行处理,并将处理结果写回内存或寄存器。
3. 中断机制:51单片机支持中断机制,可以在特定条件下触发中断请求,从而暂停当前的程序执行,转而执行中断服务程序。
单片机基础一、 单片机基础知识1.1 51系列单片机简介:51系列单片机是单片机领域中的一类,也是影响最为深远,使用最为广泛的单片机系列。
51单片机是指Intel的MCS‐51系列及和其具有兼容内核的单片机。
51系列单片机最早由Intel公司发展起来,随后将51内核授权给其他各个厂商。
因此,现在MCS‐51兼容的单片机种类繁多,如:Atmel公司的AT889C系列、AT89S系列、Silicon Laboratories的C8051F 系列以及STC的单片机等。
这些系列的单片机都有着十分接近的指令系统和硬件结构,在开发起来很方便移植。
1.2 STC系列单片机:STC89C51RC系列单片机是STC推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统的8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择,HD版本和90C版本内部集成MAX810专用复位电路。
特征:1) 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可任意选择,指令代码完全兼容传统80512)工作电压:5.5V ‐ 3.3V (5V单片机) / 3.8V ‐ 2.0V (3V单片机)3) 工作频率范围:0~40MHz,相当于普通8051的 0~80MHz,实际工作频率可达48MHz.4)用户应用程序空间:4K / 8K / 13K / 16K / 32K / 64K字节5)片上集成1280字节或512字节RAM6)通用I/O口(35/39个),复位后为:P1/P2/P3/P4是准双向口/弱上拉(普通8051传统I/O 口);P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
7)ISP(在系统可编程)/ IAP(在应用可编程),无需专用编程器,无需专用仿真器 可通过串口(RxD/P3.0, TxD/P3.1)直接下载用户程序,数秒即可完成一片8)有EEPROM功能9)看门狗10)内部集成MAX810专用复位电路(HD版本和90C版本才有),外部晶体20M以下时,可省外部复位电路。
11) 共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用。
12) 外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部中断低电平触发中断方式唤醒。
13) 通用异步串行口(UART),还可用定时器软件实现多个UART14) 工作温度范围:‐40 ~ +85℃(工业级) / 0 ~ 75℃(商业级)15) 封装:LQFP‐44,PDIP‐40,PLCC‐44,PQFP‐44.备注:关于12时钟/机器周期和6时钟/机器周期的说明:在单片机中有几个周期,时钟周期、机器周期、指令周期:①时钟周期:时钟周期T又称为振荡周期,由单片机片内振荡电路OSC产生,常定义为时钟脉冲频率的导数,是时序中最小的时间单位。
如某单片机时钟频率为1MHz,那么它的时钟周期T即为1us。
②机器周期:机器周期定义为实现特定功能所需的时间,通常由若干时钟周期T构成。
因此,微型计算机的机器周期常常按其功能来命名,且不同机器周期所包含的时钟周期的个数也不相同。
STC单片机的一个机器周期为12个时钟周期(或6个时钟周期)。
即,若单片机时钟频率为12MHz,那么时钟周期为1/12us,而机器周期可以为1us(或者0.5us)。
③指令周期:指令周期是时序中的最大时间单位,定义是执行一条指令所需的时间。
由于机器执行不同指令所需的时间不同,因此不同指令所包含的机器周期也不相同。
通常,包含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令,等等。
在51单片机中有单周期、双周期和四周期指令。
四周期指令只有乘法和除法两种,其余均为单周期和双周期指令。
1.3 51单片机的一些基础知识1.存储器结构:MCS‐51的存储器不仅有ROM和RAM之分,而且有片内和片外之分。
存储器地址分配:有三个地址空间:1)ROM存储器地址空间(包括片内ROM和片外ROM),地址范围为0000H~FFFFH,当单片机EA脚接地,即EA=0时,均为片外ROM,如EA=1,则0000H~0FFFH为片内ROM,1000H~FFFFH为片外ROM,故通常单片机都会将EA接高,保证从片内ROM启动。
此区也被称为CODE区。
2)片内RAM地址空间,地址范围为00H~FFH。
对于8051来说,00~7FH为低128B RAM 区(也称DATA区),而80H~FFH为SFR区(特殊功能寄存器区);对于8052等,80H~FFH 为高128B RAM区(称IDATA区),与SFR地址是重叠的,通过区分所访问的存储区来解决地址重叠问题,因此IDATA区只能通过间接寻址来访问。
3)片外RAM地址空间,地址范围为0000H~FFFFH。
(XDATA区,对XDATA的读写操作需要至少两个处理周期)。
备注:ROM与RAM的区别ROM为只读存储器(Read Only Memory),是一种只能读出事先所存数据的固态半导体存储器。
其特性是一旦储存资料就无法再将之改变或删除。
RAM,随机存取存储器(Random Access Memory)。
存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。
这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序2.处理器状态:处理器的状态保存在状态寄存器PSW中,状态字中包括状态字中包括进位位、用于BCD 码处理的辅助进位位、奇偶标志位溢出标志位,还有前面提到的用于寄存器组选择RS0和RS1。
0组从地址00H开始,1组从地址08H开始2组从地址10H开始,3组从地址18H开始。
这些地址都可通过直接或间接方式进行寻址PSW。
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0CY AC F0 RS1 RS0 OV USR PCY 进位标志位AC 辅助进位标志位F0 通用标志位RS1 寄存器组选择位高位RS0 寄存器组选择位低位OV 溢出标志位USR 用户定义标志位P 奇偶标志位3.电源控制:电源控制寄存器PCON的相应位来进入节电方式,置位IDLE进入空闲模式,空闲模式将停止程序执行,RAM中数据仍然保存,晶振继续工作,但与CPU断开。
定时器和串口继续工作。
发生中断将退出中断模式。
执行完中断程序后,将从程序停止的地方继续指令的执行。
通过置位PDWN位来进入低功耗模式,低功耗模式中晶振将停止工作,因此定时器和串行口都将停止工作。
至少2V的电压加在芯片上,因此RAM中的数据仍将保存。
退出低功耗模式只有两种方式:上电或复位。
SMOD位可控制串行通信的波特率,将使由定时器1的溢出率和晶振频率产生的波特率翻倍。
置位SMOD可使工作与方式1,2,3定时器产生的波特率翻倍。
当使用定时器2产生波特率时,SMOD将不影响波特率。
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0SMOD ‐ ‐ ‐ GF1 GF0 PDWN IDLESMOD 串行口通信波特率控制位,置位使波特率翻倍‐ 保留GF1 通用标志位GF0 通用标志位PDWN 低功耗标志位,置位进入低功耗模式IDLE 空闲标志位,置位进入空闲模式4.中断系统STC89C51RC/RD+系列单片机提供了8个中断请求源,它们分别是:外部中断0(INT0)、 定时器0中断、外部中断1(INT1)、定时器1中断、串口(UART)中断、定时器2中断、外部中断 2(INT2)、外部中断3(INT3)(外部中断2与外部中断3在STC单片机所特有,之前的AT89C52单片机中没有引入)。
所有的中断都具有4个中断优先级。
用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位的方法来屏蔽所有的中断请求,也可以打开相应的中断允许位来使CPU响应相应的中断申请;每一个中断源可以用软件独立地控制为开中断或关中断状态;每一个中断的优先级别均可用软件设置。
高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。
当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
中断次序表:如果使用C语言编程,中断查询次序号就是中断号,如:void int0() interrupt 0;void timer0() interrupt 1;void int1() interrupt 2;void timer1() interrupt 3;void uart() interrupt 4;void timer2() interrupt 5;void int2() interrupt 6;void int3() interrupt 7;注意:函数可以自己命名,但是后面的中断号不能随便改,必须以interrupt x的格式。
4.1中断优先级寄存器每个中断源都可通过中断优先级寄存器IP来单独设置中断优先级。
如果每个中断源的相应位被置位,则该中断源的优先级为高。
如果相应的位被复位,则该中断源的优先级为低。
IP寄存器(可位寻址)BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0‐ ‐ PT2 PS PT1 PX1 PT0 PX0 ‐保留PT2 定时器2中断优先级PS 串行通信中断优先级PT1 定时器1中断优先级PX1 外部中断1优先级PT0 定时器0中断优先级PX0 外部中断0优先级STC单片机拓展中断优先级:扩展中断优先级寄存器(IPH),字节地址为B7H,不能位寻址。
IPH:中断优先级控制寄存器高BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0PX3H PX2H PT2H PSH PT1H PX1H PT0H PX0H4.2中断使能寄存器通过设置中断使能寄存器IE的EA位,使能所有中断。
每个中断源都有单独的使能位,可通过软件设置IE中相应的使能位在任何时候是你使能或禁能中断。
中断使能寄存器(IE)(可位寻址)BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0EA ‐ ET2 ES ET1 EX1 ET0 EX0EA 使能标志位,置位则所有中断使能,复位则禁止所有中断‐保留ET2 定时器2中断使能ES 串行通信中断使能ET1 定时器1中断使能EX1 外部中断1使能ET0 定时器0中断使能EX0 外部中断0使能在STC89C5x系列单片机中添加了XICON(辅助中断控制寄存器),地址C0H .XICON:辅助中断控制寄存器BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0PX3 EX3 IE3 IT3 PX2 EX2 IE2 IT2PX3 置位表明外部中断3的优先级为高,优先级最终由[PX3H, PX3]=[0,0];[0,1];[1,0];[1,1]来决定EX3 如被设置成1,允许外部中断3中断;清零则静止外部中断3中断。