1、第一节单片机的用途 单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力( 如算术运算,逻辑运算、数据传送、中断处理)的微处理器(CPU),随机存取数据存储器(RAM), 只读程序存储器 (ROM),输入输出电路(I/O 口 ),可能还包括定时计数器 ,串行通信口(SCI),显示驱动电路(LCD 或 LED 驱动电路),脉宽调制电路(PWM), 模拟多路转换器及 A/D 转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统.这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务.单片机也被称为微控制器(Microcontroler) ,是因为它最早被用在工
2、业控制领域。单片机由芯片内仅有 CPU 的专用处理器发展而来。最早的设计理念是通过将大量外围设备和 CPU 集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控制设备当中。INTEL 的 Z80 是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。 早期的单片机都是 8 位或 4 位的。其中最成功的是 INTEL的 8031,因为简单可靠而性能不错获得了很大的好评。此后在8031 上发展出了 MCS51 系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了 16 位单片机,但因为性价比不理想并未得
3、到很广泛的应用。90 年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。随着 INTEL i960 系列特别是后来的 ARM系列的广泛应用,32 位单片机迅速取代 16 位单片机的高端地位,并且进入主流市场。而传统的 8 位单片机的性能也得到了飞速提高,处理能力比起 80 年代提高了数百倍。目前,高端的32 位单片机主频已经超过 300MHz,性能直追 90 年代中期的专用处理器,而普通的型号出厂价格跌落至 1 美元,最高端的型号也只有 10 美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端
4、单片机甚至可以直接使用专用的 Windows 和 Linux 操作系统。单片机由于其不断完善的性能和其低廉的价格,收到了大家的拥戴,使其在仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域都发挥着不可替代的作用:1.在智能仪器仪表上的应用单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量.采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大.例如精密的测量设备(功率计,示
5、波器,各种分析仪).2.在工业控制中的应用用单片机可以构成形式多样的控制系统、数据采集系统.例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等.3.在家用电器中的应用可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在.4.在计算机网络和通信领域中的应用现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统
6、、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等.5.单片机在医用设备领域中的应用单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等.此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途.。接下来就让我们从 C 语言编程开始,一步一步学习单片机,相信有一天,大家能利用单片机做出自己独具特色的作品来。第二节 C 语言基本知识位运算是对二进制数据以位为单位(bit)进行的运算。C语言提供了六种位运算符。参加运算的操作数可以是 char 类型、int 类型和 long 类型的变量或常量。实型是不
7、能进行位运算的。一、基本运算符位运算符及其功能优先级如表一:表一:运算符 名称 优先级 按位取反 1(高) 右移 2ba;ab )来实现) ,大家可以自己查资料学习,这里就不给大家多作介绍了。三、二进制与十六进制的转换十六进制与二进制基本相同,二进制用“0 和 1”来表示,十六进制的表示形式为 0Xmn:其中 X 可小写,在具体表示时,mn 用“09”以及“AF”来替换。将一个二进制数转换为十六进制数的具体步骤如下:1、取四合一,向左每四位二进制取成一位,如果向左取四位后,取到最高位时候,如果无法凑足四位,可以在最左边,即整数的最高位添 0,凑足四位。 2、接着将这四位二进制按权相加,相加后结
8、果如果是“1015”就依次用“AF”表示,如果相加结果是 “09”,就用原数表示。3、按顺序进行排列,得到的数字就是我们所求的十六进制数。例:将二进制 110101 转换为十六进制的过程如下:110113用 D(d)表示;110不足四位,添零01106 ;最终结果:0x6d (0X6D 或 0X6d 或 0x6D)由于在用 C 语言编写 C 语言程序时不涉及到小数,所以这里不多作介绍,大家有兴趣可以自己查资料学习。第三节 STC12C5410 性能介绍STC12C5410 系列单片机是由宏晶科技生产的单时钟/ 机器周期(1T)的兼容 8051 内核单片机,是高速/低功耗的新一代 8051 单片
9、机,全新的流水线/精简指令集结构,内部集成 MAX810 专用复位电路。其主要性能特点如下:1增强型 1T 流水线/精简指令集结构 8051CPU。2工作电压:5.5V3.4V(5V 单片机)/3.8V 2.0V(3V 单片机) 。3工作频率范围:035MHz,相当于普通 8051 的 0420MHz 。4用户应用程序空间 12K/10K/8K/6K/4K/2K 字节。5片上集成 512 字节 RAM。6通过 I/O 口(27/23 个) ,复位后为:准双向口 /弱上拉(普通8051 传统 I/O 口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏。7ISP(在系统可编
10、程)/ASP(在应用可编程) ,无需专用编程器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片。8EPROM 功能。9看门狗。10内部集成 MAX810 专用复位电路(外部晶振 20M 以下时,可省外部复位电路) 。11时钟源:外部高精度晶体/时钟,内部 R/C 振荡器用户在下载用户程序时,可选择是使用内部 R/C 振荡器还是外部晶体/时钟常温下内部 R/C 振荡器频率为:5.65MHz5.95MHz 精度不高时,可选择使用内部时钟,但因为有温漂,应认为是5MHz6.5MHz。12共 2 个 16 位定时器/计数器。13PWM(4 位)/PCA(可编程计数器阵列) ,也可用来
11、在实现 4 个定时器。14ADC,10 位精度 ADC,共 8 路。15通用异步串行口(UART) 。16SPI 同步通信口,主模式/从模式。17工作温度范围:075/-40+85。18封装:PDIP28,SOP28,PDIP20,SOP20,TSSOP 20,PLCC32STC12C5410AD 单片机中包含中央处理器、程序存储器(Flash) 、数据存储器(RAM) 、EEPROM、定时/计数器、I/O 接口、UART 接口和中断系统、SPI 接口、高速A/D 转换模块、PWM(或捕捉/比较单元)以及硬件看门狗、电源监控、片内 RC 振荡器等模块。可以说STC12C5410AD 单片机几乎
12、包含了数据采集和控制中所需的所有单元模块,可称得上一个片上系统(SOC) ,可以很容易地构成典型的测 控系统。STC12C5410 引脚图 第四节 Keil 软件的使用方法Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编语言和 C 语言的程序设计,界面友好,易学易用。以下介绍的是 Keil uVision2,如果你使用的是 Keil uVision3,你需要根据单片机的型号,在相关设置上稍作改动(相关的地方后面有说明)!下面介绍 Keil C51 软件的使用方法: 进入 Keil C51 后,屏幕如下图所示。几秒钟后出现编辑界面: 进入 Keil
13、C51 后的编辑界面(1) 新建工程单击 Project 菜单,在弹出的下拉菜单中选中 New Project 选项然后选择你要保存的路径,输入工程文件的名字,比如保存到 D 盘的 CMJ51 文件夹里,工程文件的名字为 CMJ1如下图所示,然后点击保存.这时会弹出一个对话框,要求你选择单片机的型号,可以根据用户使用的单片机来选择,实验板上使用的是 STC12C5410AD,我们在对话框中找不到这一款单片机。它是新一代的 51 单片机,因为 51 内核单片机具有通用性,所以这里我们可以选一块 89C51 就行。如下图所示,选择 89C51 之后,右边栏是对这个单片机的基本的说明,然后点击确定.
14、用 Keil uVision3 的话,根据实验板上单片机的型号,我们应做如下选择:(以后的操作 Keil uVision3 和 Keil uVision2 都一样)完成上一步骤后,屏幕如下图所示到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。(2)新建文件在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项新建文件后屏幕如下图所示此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了。键入程序后界面如下:单击 file 菜单下的 save,出现一个对话框,键入文件名,后缀名为. c(用 C 语言编程时用)或 asm(用汇编语言编程时用)或.h(自己建立库文件时用)
15、 ,进行保存到 D 盘 CMJ51 文件夹下,界面如下:点击保存即可,出现如下界面。(3) 添加文件回到编辑界面后,单击“Target 1”前面的“”号,然后在“Source Group 1”上单击右键,弹出如下菜单然后单击“Add File to Group Source Group 1” 屏幕如下图所示选中 cmj1.asm,然后单击“Add ”屏幕好下图所示:(如果用 C 语言编程,选中“.c”文件即可。(4)汇编连接(C 语言编程也一样)单击如下图所示的图标(rebuilt all target files)出现如下界面:(5)运行看结果单击如下图的图标(start/stop debu
16、g session) ,进入运行状态出现如下界面:单击一次下图的图标(step into),程序就能运行一条,一直到程序的结束(ret) 。运行结束后,直接可以在如下界面中看结果。特殊功能寄存器中的内容可以在界面中直接看到,存储单元的内容在 memory #1 中输入如上图所示的地址,即可看到该单元的内容为 66H。下面进行工程配置。点击 Project 菜单下的 Options for Target Target 1。在弹出对话框的 Target 项里输入晶振为 12M,然后勾上 Use On-chip ROM。在 Output 项里勾上 Create HEX File。这就是产生要烧写的.
17、hex 文件。然后点击 Project 菜单里的 build target 或 Rebuild all target files 以编译要烧写的.hex 文件。编译完成后,会在下面 Output Window 里显示编译成功与否的信息和错误提示。Keil 软件的使用就介绍到这里,大家可以通过下一节流水灯的实验来熟悉对该软件的使用。第五节流水灯的控制1、怎样点亮一个发光二极管点亮放光二极管的程序如下:#include/52 系列单片机头文件sbit led=P10;/声明单片机 P1 口的第一位void main()/主函数led=0;/点亮第一个发光二极管从上面的程序大家可以看到:点亮第一个发
18、光二极管,就是通过控制单片机的 P1.0 口,让其输出低电平,这样就在单片机的 P1.0口、发光二极管、电源之间形成回路,从而点亮发光二极管。由于是对单片机的 P1 口的第一位进行操作,为了书写和理解的方便,我们将 P1 口的第一位定义为 led,实际上也可省掉这一步,直接用程序进行位操作,如:#include/52 系列单片机头文件void main()/主函数P10=0;/让单片机在 P1.0 口输出低电平,/从而点亮第一个发光二极管2、流水灯的控制相必大家对单片机的位操作已经有了一定的了解,接下来就让我们一起来学习对多个发光二极管的控制,制作出一串串闪亮的流水灯。首先向大家介绍一下 51
19、 单片机里常用的函数循环左移与循环右移函数:大家可以打开 Keil 软件安装文件夹,定位到KeilC51HLP 文件夹,打开此文件夹下的 C51lib,这是 C51 自带库函数帮助文件。在索引栏找到_crol_函数,双击打开它介绍,如下:_crol_#include unsigned char _crol_ (unsigned char c, /* character to rotate left */unsigned char b); /* bit positions to rotate */Description:The _crol_ routine rotates the bit pat
20、tern for the character c left b bits. This routine is implemented as an intrinsic function. The code required is included in-line rather than being called.Return Value:The _crol_ routine returns the rotated value of c.Attributes:reentrant, intrinsicSee Also:_cror_, _irol_, _iror_, _lrol_, _lror_Exam
21、ple#include void tst_crol (void) char a;char b;a = 0xA5;b = _crol_(a,3); /* b now is 0x2D */它是一个循环左移函数,使用格式如:_crol_ (a,b),其中 a 是被循环左移的数,b 是循环左移的位数。例如:#include /使用_crol_时需包含的头文件#include /52 系列单片机头文件void main()unsigned int a=01101111;_crol_(a,3);执行完程序后,a=01111011。_cror_表示循环右移,其用法和_crol_类似,这里就不多作介绍了。接下
22、来我们通过一段程序的演示来学习:/*函数功能:1、依次让第一个至第八个发光二极管点亮,每个发光二极管亮一秒;2、轮流亮完后,所有发光二极管都亮一秒,然后所有发光二极管都灭一秒;3、依次让第八个至第一个发光二极管点亮,每个发光二极管亮一秒;4、轮流亮完后,所有发光二极管都亮一秒,然后所有发光二极管都灭一秒;5、依次循环下去*/#include/52 系列单片机头文件#include/使用_crol_、_cror_时需包含的头文件void delay_ms(unsigned unsigned int xms)/软件延时函数,其中 xms /为参数,表示延时 x msunsigned int i;
23、for(i=110;i0;i-)for(i=xms;i0;i-);unsigned int b;/定义变量 b,用来控制第几个发光二极管亮void main()P1=0X00;while(1)P0=0xfe;/11111110,第一个灯亮/因为进入循环后有延时,所以这里不需要延时for(b=0;b 第一次循环/P0=11111101 第二个灯亮 delay_ms(1000) ;/延时 1000ms=1s,让最后一个灯灯亮1sP0=0x00;/让所有发光二极管都亮delay_ms(1000) ;/延时 1000ms=1s,让所有灯亮 1sP0=0xff; /让所有发光二极管都灭delay_ms(
24、1000) ;/延时 1000ms=1s,让所有灯灭 1sP0=0x7f;/01111111,最后一个灯亮for(b=0;b 第一次循环/P0=10111111,倒数第二个灯亮delay_ms(1000) ;/延时 1000ms=1s,让第一个灯亮 1sP0=0x00;/让所有发光二极管都亮delay_ms(1000) ;/延时 1000ms=1s,让所有灯亮 1sP0=0xff; /让所有发光二极管都灭delay_ms(1000) ;/延时 1000ms=1s,让所有灯灭 1s除这种方法实现流水灯外,利用左移、右移指令与逻辑运算也能实现循环移动,大家只要多动动手,就能够随心所欲地控制发光二极
25、管的闪烁。第六节 数码管的静态显示一、数码管的介绍:数码管是电路中常见的显示原件,按段数的多少可分为七段数码管和八段数码管七段数码管多一个发光二极管单元(多一个小数点显示);按照显示“8“的个数,可分为 1 位、2 位、4 位等数码管,如下图所示:按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,如下图所示:共阳数码管在应用时应将公共极接到+5V 或 +3.3V,当某一字段 发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高
26、电平时,相应字段就不亮。共阴数码管在应用时应将公共极COM接到地线 GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。二、数码管的显示:任何一个 7 段码管都有 128 种显示模式,而其中的数字 0-9 是最为有用也是最常见的。通过控制共阳极(共阴极)数码管的阴极(阳极),可以让数码管显示不同的字符,下表是共阴数码管的码段:符号 编码 符号 编码0 0x3f 8 0x7f1 0x06 9 0x6f2 0x5b A 0x773 0x4f B 0x7c4 0x66 C 0x395 0x6d D 0x5e6 0x7d E 0x797 0x0
27、7 F 0x71对于多位数码管而言,实际中为了简化电路,将所有共阴极数码管的阳极接到一起,所有共阳极数码管的阴极接到一起,用多个独立的位选 和 7 个(或 8 个)公共段选控制所有的数码管。 由于所有数码管共用段选,为了独立显示每位数码管,只能用位选来区分不同的数码管。 具体来说就是每次只将某一位数码管的位选置为有效,其它数码管的位选都无效。此时的段选决定了该位数码的显示。然后在下一个时刻,置下一位数码管的位选有效,其它数码管的位选都无效。依次类推,循环往复。下面用共阴的4位数码管为例来说明:当位选1为低,其它位选都为高时,第一位数码管被选中,此时的共用段选用于第一位数码管的显示;位选 2 为
28、低时(其它位选都为高),第二位数码管被选中,此时的共用段选用于第二位数码管的显示,三、四位数码管的显示依次类推。在一个刷新周期T内,每位数码管都有 1/4T 周期的时间被刷新。为了保证所有 4 位数码管的显示不闪烁,一般刷新频率要大于 45Hz。在一个周期中,虽然每位数码管会有 3/4T 的时间不被点亮,但位选刷新的速度较快,同时由于数码管自身的余辉特性,每位数码管在变暗之前就又会被重新刷新,因此人眼无法感觉到数码管变暗。如果刷新的频率小于一定值(如 45Hz),则人眼就会感觉到数码管的闪烁。一般刷新频率在 60Hz 到 1KHz 之间时,多位数码管显示得比较理想。 在实际的电路中,我们可以分别利用单片机的IO口分别控制多位数码管的位选和段选,但是我们不这么做,因为那样不但浪费了IO口资源,而且还浪费了宝贵的MCU时间, 我们通常是利用锁存器来对多位数码管进行控制。三、锁存器:锁存器(Latch) 是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把当前的状态