1、单片机原理及应用,前言:,1.为什么开这门课? 2.学好这门课需要的基础知识? 3.怎样掌握这门课? 4.课程内容。 5.要求。,1.为什么开这门课?,(1)专业的需要电气工程及其自动化、电子技术不需要人的干预自动工作、仪表的智能化(2)工作的需要自动化产品、仪器仪表,2.需要的基础知识?,单片机硬件基础、C语言基础3.怎样掌握这门课? 程序设计=算法+语言 (1)重点:算法-框图 (2)兴趣,4.课程内容,(1)概述 (2)软件工具 (3)C语言基础 (4)中断、定时器/计数器、串行口的C语言编程基础 (5)键盘/显示、模拟量的C语言编程基础,5.要求,自觉学习 快乐学习 认真学习,第1章单
2、片机及C51概述,本章内容,Single Chip Microcomputer,什么是单片机?,单片机主要生产厂家及机型,单片机的应用及发展趋势,单片机的历史及发展概况,单片机C语言的概述,1. 什么是单片机,1、微型计算机硬件结构 常见的微机外形,微型计算机硬件结构 微机硬件组成,显示器,主机,键盘,鼠标,微型计算机硬件结构 ,内部结构,微型计算机系统,硬件系统构成微机的实体和装置,软件系统与硬件系统共同构成实用的微机系统,两者是相辅相成、缺一不可的。,软件系统微机系统所使用的各种程序的总称,这种计算机系统通常由多块印刷电路板制成:,2、单片微型计算机,CPU,输 入 出 设 备,输 入 出
3、 设 备,软件系统,+,单片微型计算机系统,硬件系统,单片微型计算机是指集成在一个芯片上的微型计算机,简称单片机 单片机实质上就是一个芯片,单片机内部结构示意图,单片机应用系统,单片机应用系统由硬件和软件组成,硬件是应用系统的基础,软件是在硬件的基础上对其资源进行合理调配和使用,从而完成应用系统所要求的任务,二者相互依赖,缺一不可,2. 单片机的发展概况,1971年Intel公司制造出第一片微型机芯片4004之后,开始了微型机时代。将微处理器、存储器和外围设备集成到一块芯片上,这就是单片微型计算机(Single Chip Microcomputer),简称单片机。 单片机是应工业测控而诞生的,
4、它的结构与指令功能都是按照工业控制要求设计的,故也叫单片微控制器(SCM Single Chip Microcontroller), 它在控制领域大显身手,装入到各种智能化产品之中,所以又称为嵌入式微控制器(Embedded Microcontroller),也有文献中称为微控制器单元( MCU Microcontroller Unit )。,Intel4004和采用4004的计算器,一种8位嵌入式微控制器,C8051F020实验设备,2.1 单片机的发展历史(1),第一阶段(1974年-1976年):初级阶段因受工艺技术水平的限制,单片机结构和功能都很简单。例如仙童公司生产的F8单片机,内部
5、仅有8位CPU,64字节RAM和2个并行口,还需一些其他芯片才能组合成一台完整的微型机。 第二阶段(1976年-1978年):低性能阶段以美国INTEL公司的MCS-48为代表。该系列单片机内集成有8位CPU、并行I/O接口、一个8位的定时/计数器、片内64或128字节RAM,程序存储空间最大4KB,但无串行通信口,不宜多机使用。,2.1 单片机的发展历史(2),第三阶段(1978年-1983年):高性能阶段仍采用8位CPU,但有多级中断功能、串行通信接口、16位的定时/计数器,片内ROM、RAM容量加大,寻址空间范围可达64KB,有的片内还带有A/D转换器接口。生产厂家众多,产品系列也特别多
6、,主要有INTEL公司的MCS-51,MOTOROLA公司的6801和ZILOG公司的Z8等。具有优异的性价比,获得了广泛应用。尤其是MCS-51系列,特别适合于控制应用,在我国教育和经济建设等各个领域大显身手,经久不衰,是我国单片机应用的主流系列。,2.1单片机的发展历史(3),第四阶段(1983年):新一代阶段单片机的含义已发生了根本改变。目前仍然保留单片机这一习惯叫法,但实际是指“Single-chip Microcontroller”。新一代单片机有如下几方面特点: 1CPU仍以8位为主流,并不断完善。另一方面发展了16位、32位的单片机。早期多使用CISC(Complex Instr
7、uction Set Computer)系统结构,近来RISC(Reduced Instruction Set Computer)单片机已大力发展。RISC单片机中,除指令集精简外,一般都用单字长指令和流水线操作方法,大大加快了指令的运行速度。,2.1单片机的发展历史(4),2按片内程序存储器的类型不同分为:ROM型、EPROM型、无ROM(Romless)型和低成本的OTP(One Time Programmable ROM)型、E2PROM型。近年来,Flash ROM已获得了普遍发展。由于Flash ROM可在线多次写入,有些公司称之为MTP(M-Time Programmable RO
8、M)型。Flash ROM的普遍使用,也导致了ISP(In-System Progammable)技术的迅速发展。可扩展容量有的已突破64KB,达到2MB以上。片内RAM已有2KB以上的产品,可扩展容量也可达到2MB以上。,2.1单片机的发展历史(5),3产品日趋复杂化、多样化、专用化。在原来微型机结构的基础上,集成嵌入了一些外设与一些外设驱动单元,如通用接口、看门狗(Watchdog)、A/D和D/A、LCD驱动单元、遥控键盘、语音接口、串行总线I2C,甚至通用串行总线USB(Universal Serial Bus)、控制器局域网CAN(Controller Area Network)等。
9、某些公司把数字信号处理器DSP(Digital Signal Processor)也嵌入了单片机内。,2.1单片机的发展历史(6),4. 多采用CMOS工艺,出现双时钟、低电压单片机,大大降低了系统功耗。时钟速度大幅提高,有的已达100MHz以上。引脚数过去多为40PIN,现在已向两个方向发展多引脚(100PIN以上)和少引脚(20PIN以下)。封装形式多样化,有DIP、SH-DIP、OFP、SQFP、HQFP、TQFP、PGA、BGA、PLCC等。,3.1 综述,自单片机诞生以来的近30年中,单片机已有70多个系列的近500个机种。国际上较有名、影响较大的公司及他们的产品如下所述:Intel
10、公司的MCS48、MCS51、MCS96系列;Motorola公司的6801、6802、6803、6805、68HCll系列产品;Zilog公司的Z8、Super8系列产品;仙童(Fairchild)公司和Mostek公司的F8、3870系列产品;NEC公司的COM87系列产品;Rockwell公司的6500、6501系列产品;Atmel、PHILIPS 、LG等公司的51兼容机。,3. 单片机主要生产厂家及机型,根据近年来国外实地考察,Intel公司的单片机在市场上占有量为67,其中MCS51系列产品又占54。在我们国内虽然上述各公司的产品均有引进,但由于各种原因,至今在我国所应用的单片机仍
11、然是以MCS48、MCS51、MCS96为主流系列。随着这一系列的深入开发,其主流系列的地位会不断巩固下去。因而我们在此主要介绍Intel公司的单片机系列。,3.2 MCS-51系列和AT89系列单片机,MCS-51是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8951,8032,8052,8752,8952等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS-51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031
12、的名称。,(1) MCS-51系列,MCS-51系列单片机分类,INTEL公司将MCS-51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生产的。AT89C51- 低功耗(CMOS工艺),内含4KB闪存,可在线编程或使用编程器重复编程,与MCS-51指令和引脚完全兼容,且价格较低。,(2)AT89系列,3.3 典型的8位单片机产品(1),1Intel 公司的单片机 其产品有MCS-48、MCS-51和MCS-96三大系列几十个型号的单片机。 M
13、CS-51系列单既包括三个基本型号8031(无ROM型)、8051(ROM型)、8751(EPROM型) 8051是世界上产量排名第二的著名单片机CPU。 2ATMEL公司的单片机 ATMAL公司在1994年以E2PROM技术和Intel公司的80C31单片机核心技术进行交换,从而取得80C31核的使用权。先进的Flash技术和80C31核相结合,生产出具有8051结构的Flash型和EEPROM型单片机(尤其是89C51和89C52),3.3 典型的8位单片机产品(2),3Silicon Laboratories公司的单片机 C8051F系列是一种典型的高性能单片机 ,完全集成混合信号系统级
14、芯片(SOC System of Chip),完全兼容MCS-51。采用流水线(pipe line)技术,不再区分时钟周期和机器周期,提高了指令执行效率。具备控制系统所需的模拟和数字外设,包括看门狗、ADC、DAC、电压比较器、电压基准输出、定时器、PWM、定时器捕捉和方波输出等,并具备多种总线接口,包括UART、SPI、SMBUS(与I2C兼容)总线以及CAN总线。C8051F系列单片机采用Flash ROM技术,集成JTAG,支持在线编程。,3.3 典型的8位单片机产品(3),4. Motorola公司的单片机 8位机有68HC05、68HC08和68HC11几种。68HC05是Motor
15、ola公司推出的一种采用HCMOS技术的8位单片机,是世界上产量排名第一的著名单片机CPU。 5. TOSHIBA公司的单片机 具有功能强、可靠性高、价格低等特点,特别适合于空调、电冰箱等家电产品。 Philips公司的单片机 Philips公司生产8051结构的80C51系列8位单片机、采用8051结构的16位单片机、以68000为核的16位单片机。,3.3 典型的8位单片机产品(4),除此以外,著名的单片机厂商还有HITACHI、SIEMENS、NS、三菱、Microchip、Zilog等公司,产品型号众多,并不断有新产品问世。可用于各种不同应用场合和不同的应用需求。如今,凡是读者能想到的
16、行业和领域都能看到单片机的应用例子,科技的发展和社会的需求促使计算机的嵌入式应用在近年来得到迅速发展,并且这种发展的势态将越来越迅猛。,4. 单片机的应用及发展趋势,4.1 单片机的特点,体积小,重量轻,电源单一,功耗低,功能强,价格低,运行速度快,抗干扰能力强,可靠性高,可以嵌入到电子产品中嵌入式应用系统,4.1 单片机的应用(1),1在智能仪表中的应用广泛地应用于电力系统、交通运输工具、计量等各种仪器仪表之中,使仪器仪表智能化。 2在机电一体化中的应用机电一体化产品是指集机械技术、微电子技术、自动化技术和计算机技术于体,具有智能化特征的机电产品。 3在实时控制中的应用 如对工业上各种窑炉的
17、温度、酸度、化学成分的测量和控制。汽车电子中微型控制器的使用越来越多。,4.1 单片机的应用 (2),4单片机在分布式多机系统中应用 分布式多机系统具有功能强、可靠性高的特点。在比较复杂的系统中,都采用分布式多机系统。 5单片机在家用电器等消费类领域中的应用 目前家用电器几乎都是单片机控制的电脑产品例如:空调、冰箱、洗衣机、微波炉、彩电、音响、家庭报警器、电子宠物、手机、MP3等。,4.2 单片机的发展趋势 (1),低成本高度集成的单片机片上系统(SOC)重要发展趋势,是寻求应用系统在芯片上的最大化解决方案。因此,专用单片机的发展自然形成了SoC化趋势。 8位单片机的市场份额依然领先“让事情尽
18、可能简单”的原则有助于更快地完成系统设计、验证并投入生产,同时减少潜在问题。 处器理的多核结构 在数字通信和网络中的应用, 对处理器提出了更高的要求。为适应这种情况,现在已出现多核结构的处理器。,4.2 单片机的发展趋势 (2),功耗更低 新推出的单片机的功耗越来越小,很多单片机都有多种工作方式,包括等待、暂停、休眠、空闲、节电等工作方式。 电压范围更宽 扩大电源电压范围以及在较低电压下仍然能工作是现在新推出的单片机的一个特点。 6工艺更先进和封装更小 现在单片机的封装水平已大大提高, 有越来越多的单片机采用了各种贴片封装形式,以满足便携式手持设备的需要。,4.2 单片机的发展趋势 (3),7
19、开发形式、手段和工具 目前借助于JTAG接口构成JTAG调试器,直接从CPU 获取调试信息而使得产品的设计简化,从而使得开发工具的价格反而要低于ICE。 用高级语言代替汇编语言也渐成趋势,典型的单片机都推出了自己的C 编译器。其中Keil C51 的编译效率已达到很高水平 。RTOS 的引入解决了嵌入式软件开发标准化的难题,促进嵌入式开发软件的模块化和可移植化,为软件工程化管理打下基础。,2. 单片机应用,工业方面,民用方面,数据处理方面,仪表方面,汽车方面,电讯方面,单片机技术的应用遍布国民经济与人民生活的各个领域,5.单片机的C语言概述,51 C语言与单片机编程 52 C51程序 53 C
20、51编程举例,5.1 C语言与单片机编程 一、单片机的C语言的特点,无需了解机器硬件及其指令系统,只需了解51的存储器结构; C51能方便管理寄存器存储器和数据类型等细节问题,但对硬件控制有限,而汇编可以完全控制硬件资源; C51在小应用程序中产生的代码量大,执行速度慢,但在较大的程序代码中效率高; C51程序由若干模块组成,具有良好的模块化结构,便于改进和扩充; C51具有良好的可读性和可维护性,而汇编在大程序开发中开发难度增加,可读性差; C51有丰富的库函数,大大的减少用户的编程量,缩短编程与调试时间,提高软件的开发效率; 汇编程序当机型改变时,无法直接移植使用,而C能在不同类型的机器上
21、运行,可移植性好,标准C语言也称ANSI C语言。单片机的C与标准C之间有许多相同的地方,也有其自身的一些特点。不同的嵌入式C语言编译系统之所以与ANSI C语言有不同的地方,这样是由于它们所针对的硬件系统不同,对单片机就称为C51语言,二者不同主要体现在一些几个方面。,库函数:标准C的库函数是按照通用计算机来定义的,而C51的库函数是按照单片机的应用情况来定义的; 数据类型:在C51中增加了几种针对单片机的特有数据类型。如单片机包含位操作空间和丰富的位操作指令; 变量的存储模式:C51变量的存储模式与51的存储器紧密相关。从数据类型上51有片内、片外程序存储器,片内、片外数据存储器。在片内程
22、序存储器中,又有直接寻址区和间接寻址区,分别为:CODEDATAXDATAIDATA,及根据51单片机特点而设定的PDATA类型。使用不同存储器将会影响程序执行的效率,不同的模式对应不同的硬件系统和不同的编译结果。但标准C对存储模式要求不高。 输入/输出:C51的输入/输出是通过51的串口来完成的,输入输出指令执行前必须对串口进行初始化。 函数使用:C51中有专门的中断函数,二、单片机的C语言与标准C语言的比较,三、单片机的C语言与汇编语言的比较,在国内,汇编语言在单片机开发过程中是比较流行的开发工具。长期以来对编译效率的偏见及不少程序员对使用汇编开发硬件的习惯性,使得C在很多地方遭到冷落。优
23、秀的程序员写出的汇编程序的确有执行效率高的优点,但汇编的可移植性和可读性差,使得使用其开发出来的产品在维护和功能升级时的确有极大的困难,从而导致整个系统的可靠性和可维护性比较差。而使用C语言进行嵌入式系统的开发,有着汇编不可比拟的优势。,编程调试灵活方便; 生成的代码编译效率高; 模块化开发; 可移植性好; 便于项目的维护,【例1-1】将外部数据存储器的000BH和000CH单元的内容相互交换,用汇编语言编写源程序如下: ORG 0000H MOV DPTR, #000BH MOVX A, DPTR ;将000BH的内容送入A MOV R7, A ;暂存000BH的内容 INC DPTR MO
24、VX A, DPTR ;将000CH的内容读入A MOV DPTR, #000BH MOVX DPTR, A INC DPTR MOV A, R7 MOVX DPTR, A SJMP $ END,C语言编程:,#include /程序采用绝对地址访问的方法 void main(void) char c;c=XBYTE11;XBYTE11=XBYTE12;XBYTE12=c;while(1); ,上述的C语言反汇编:,0x0000 020013 LJMP STARTUP1(C:0013) ;跳转 0x0003 90000B MOV DPTR, #0x000B 0x0006 E0 MOVX A,
25、DPTR 0x0007 FF MOV R7, A 0x0008 A3 INC DPTR 0x0009 E0 MOVX A, DPTR 0x000A 90000B MOV DPTR, #0x000B 0x000D F0 MOVX DPTR, A 0x000E A3 INC DPTR 0x000F EF MOV A, R7 0x0010 F0 MOVX DPTR, A 0x0011 80FE SJMP C:0011 0x0013 787F MOV R0, #0x7F ;以下是清零部分 0x0015 E4 CLR A 0x0016 F6 MOV R0,A 0x0017 D8FD DJNZ R0,ID
26、ATALOOP(C:0016) 0x0019 758107 MOV SP(0x81),#0x07 0x001C 020003 LJMP main(C:0003),【例1-2】二进制数转换成十进制数(BCD码),将累加器A中给定的二进制数,转换成3个十进制数(BCD码),并存入Result开始的3个单元。,汇编语言源程序如下:,Result EQU 20HORG 0000HLJMP START START: MOV SP, #60H ;主程序MOV A, #123LCALL BINTOBCDSJMP $ BINTOBCD: MOV B, #100 ;设置转换子程序DIV ABMOV Result
27、,A ;除以100得百位数MOV A, BMOV B, #10DIV ABMOV Result+1, A ;余数除以10得十位数MOV Result+2, B ;余数为个位数RETEND 调试结果:片内RAM20H,21H,22H中的数值分别为01H,02H,03H,C51源程序如下:,void main(void) unsigned char Result3;unsigned char Number;Number=123;Result0=Number/100; /除以100得百位Result1=(Number%100)/10;/余数除以10得十位Result2=Number%10;/余数为个
28、位while(1); /等待暂停 ,【例1-3】二进制数转换成ASCII码程序。,将累加器A中的内容分为两个ASCII码,并存入Result开始的两个单元。,汇编语言源程序如下:,Result EQU 20HORG 0000HLJMP START START: MOV SP, #40HMOV A, #00011010BLCALL BINTOHEXSJMP $ BINTOHEX: MOV DPTR, #ASCIITABMOV B, A SWAP AANL A, #0FH ;取A的高4位MOVC A, A+DPTRMOV Result, AMOV A, BANL A, #0FH ;取A的低4位MO
29、VC A, A+DPTRMOV Result+1, ARET ASCIITAB: DB 0123456789ABCDEFEND 调试结果:片内RAM 07H中的数据为7BH; 而08H,09H,0AH中的数据分别为01H,02H,03H,C51源程序如下:,code unsigned char ASCIITAB16=“0123456789ABCDEF“; void main(void) unsigned char Result2;unsigned char Number;Number=0x1a;Result0=ASCIITABNumber/16; /高4位Result1=ASCIITABNum
30、ber 调试结果: 片内RAM 07H中的数据为1AH; 08H,09H中的数据分别为31H,41H,5.2 C51程序,本节主要介绍C51程序的结构、规范、注意事项、标识符、关键字等。一、C51的程序结构 二、C51编程规范及注意事项 三、C51的标识符与关键字,一、C51的程序结构,#include /预处理命令,reg52.h是一个库文件 #include /预处理命令,stdio.h是一个库文件 void Function1(void); /自定义函数声明 unsigned int ch; void main(void) /主函数 SCON=0x50; /scon:模式1,8bit异步
31、串口通信 TMOD=0x20; /tmod:t1为模式2,8bit自动装入 TH1=221; /th1:1200bit/s的装入值,16MHzTR1=1; /TR1:T1运行TI=1; /TI:设置为1,以发送第一个字节/以上5条语句是串口调试需要设置的 while(ch=5) Function1( ); /调用自定义函数 printf(“char=%dn”,ch); /程序语句 while(1); void Function1(void) /自定义函数 unsigned char ps; /自定义函数内部变量的声明 ps=1; ch=ch+ps; ,从上面的例子可以看出:,一个典型的C51源
32、程序包含预处理命令、自定义函数声明、main主函数和自定义函数。这几部分完全类似于C语言的程序结构。 预处理命令部分常用#include命令来包含一些程序中用到的头文件。这些头文件中包含了一些库函数以及其他函数的声明及定义。 自定义函数声明部分用来声明源程序中自定义的函数。 main()主函数是整个C51程序的入口。不论main()函数位于程序代码中的哪个位置,C51程序总是从main()函数开始执行的。 自定义函数部分是C51源程序中用到的自定义函数的函数体。 除了扩展名为“.c”的源程序文件,C51程序还支持扩展名为“.h”的头文件以及扩展名为“.lib”的库文件等。,在一般的编译系统中,
33、通常以项目(工程)结构来管理复杂的C51程序文件。例如Keil Vision2编译环境中,整个项目结构如图1-1所示。在这里整个项目由项目文件管理、项目文件扩展名为“.Uv2”。整个工程项目中可以包含如下几类文件。 头文件用来包含一些库函数,系统变量声明以及将不同的C文件连接起来。C源文件是C51程序的主要部分,用来实现特定的功能。C源文件可以有一个,也可以按照不同的功能分成多个,但所有这些C源文件中有且仅有一个可以包含一个main( )主函数。库文件是实现特定功能的函数库,供C源文件调用。编译中间文件是源程序在编译链接过程中生成的中间文件,其中包含了文件编译调试的信息。可烧录文件是编译系统生
34、成的可以烧录到单片机内部供执行的文件,类似于“.exe”可执行文件。在C51语言中,一般扩展名为“.hex”或者“.bin”等。,二、C51编程规范及注意事项,1注释:注释语句只对代码起到功能描述的作用,在实际的编程链接过程中不起作用。在C51语言中可以通过两种方式不是表示注释内容。 (1)用“/”开头来注释一行:如“/变量声明”。 (2)用“/*”符号开头,并以“*/”符号结束如用“/*声明整型变量ch*/”。本方法灵活多变,可以注释多行。如:printf(“ch=%dn”,/*整型变量ch*/ch);一个好的C51源程序应该添加必要的注释内容。,2命名,在进行程序设计时,经常需要自定义一些
35、函数或变量。一般来说,重要符合C51命名规范即可通过编译。但是,为了便于源程序的理解和交流,在进行命名时应注意以下几点:自定义函数或者变量的名称最好能反映该函数或变量的功能用途。因此,需要选用有意义的单词或者字母组合来表示。例如MAX表示最大值、MIN表示最小值等。变量名通常加上表示数据类型的前缀,例如“ucSendData”的前缀“uc”表示unsigned char。在命名时不要和系统保留的标识符以及关键字产生冲突或者歧义。,3格式,为了程序阅读方便,在进行C51程序设计时,在程序结构以及语句书写格式方面应注意以下几点:虽然C51语言对main( )函数放置位置没有限定,但为了程序阅读的方
36、便,最好把它放置在所有自定义函数的前面,即依次为头文件声明、自定义函数以及全局变量声明、main( )函数、自定义函数。C51语句可以写在一行上也可以写在多行上。为了程序理解的方便,最好将每个语句单独写在一行,并加以注释。有时某几个相连的语句或者共同执行某个功能则可以放置在一行。对于源程序文件不同结构部分之间要留有空行。例如,头文件声明、自定义函数声明、main( )函数以及自定义函数之间均要空一行,来明显区分不同结构。对于if、while等块结构语句中的“”和“”要配对对齐,以便于程序阅读时能够理解该结构的起始和结束。源代码安排时可以通过适当的空格以及Tab键来实现代码对齐。,三、C51的标
37、识符与关键字,1标识符 标识符常用来声明某个对象的名称,如变量和常量的声明、数组和结构的声明、自定义函数的声明以及数据类型的声明等。示例如下。 int count;void Function1( );在上面的例子中,count为整型变量的标识符,Function1为自定义函数的标识符。在C51语言中,标识符可以由字母、数字(09)或者下划线“_”组成,最多可支持32个字符。 C51标识符的第一个字符必须或者下划线“_”,例如“unt”、“ch_1”等都是正确的,而“5count”则是错误的标识符。 另外,C51的标识符区分大小写,例如“count”和“COUNT”代表两个不同的标识符,,使用标
38、识符时应注意以下几点:,在命名C51标识符时,需要能够清楚地表达其功能含义,这样有助于阅读和理解源程序。C51的标识符原则上可以使用下画线开头,但有些编译系统的专用标识符或者预定义项是以下划线开头的。为了程序的兼容性和可移植性,所以建议一般不使用下划线开头来命名标识符。尽量不要使用过长的标识符,以便于使用和程序理解方便。自定义的C51标识符不能使用C51语言保留的关键字,也不能和用户已使用的函数名或C51库函数透明。例如“char”是关键字,所以不能作为标识符使用。,5.3 C51编程举例,通过51内部功能部件的简单应用的例子,加深对51程序结构及单片机的C51语言编程的理解。 【例1-5】P
39、ROTEUS仿真电路如图所示:8个发光二极管D1D8经限流电阻分别接至P1口8个引脚,阳极共同接高电平。编程实现发光二极管的流水点亮,即按照D1D2D8的顺序,每次点亮一个发光二极管,一段时间后熄灭该发光二极管,然后点亮下一个发光二极管,重复循环。,C51源程序如下:,#include #include /移位库函数包含于此头文件中 void delay(unsigned int d) /定义延时子函数 while(-d0); void main( ) unsigned char i,sel; while(1) sel=0xfe; for(i=0;i8;i+) P1=sel; /显示变量赋给P
40、1口delay(50000); /延时sel=_crol_(sel,1); /改变显示变量 ,也可以这样编程:,#include void delay(unsigned int d) while(-d0); void main( ) unsigned char i,sel,a; while(1) sel=0xfe; for(i=0;i8;i+) P1=sel; delay(50000); a=sel1;sel=sel|0x01; ,【例1-6】单片机的P1口接8个发光二极管,P0口接8个开关,编程实现当开关动作时,对应的发光二极管亮或灭。,汇编语言源程序如下:ORG 0000HMOV P0,#
41、0FFH LOOP: MOV A,P0MOV P1,ASJMP LOOP C51语言源程序如下: #include void main(void) unsigned char i;P0=0xff;for(;) i=P0;P1=i; ,【例1-7】单片机外接12MHz晶振,用P1.7输出1kHz和500Hz的音频信号驱动扬声器,作为报警信号,要求1kHz信号与500Hz信号交替进行,P1.0接一开关S进行控制,当开关合上响报警信号,当开关断开报警信号停止,C51源程序如下:,#include #include /空操作库函数包含于此头文件 sbit S=P10; /定义位变量 sbit BUZ=
42、P17; /定义位变量 unsigned char k; /定义循环变量 void delay(void) /定义延时子函数 unsigned char i; for(i=250;i0;i-) _nop_( ); /空操作 void main(void) while(1) BUZ=0; /关闭声音 S=1;if(P1_0=0) /判断开关是否闭合 BUZ=0; delay( );BUZ=0; delay( );BUZ=1; delay( ); delay( ); BUZ=0; delay( ); delay( ); ,【例1-8】使用定时器/计数器以工作方式2产生100s 定时,在P1.0口输
43、出周期为200s 的连续方波,已知晶振频率为6MHz。,机器周期频率:fcy=0.5MHz,Tcy=12/6Mz=2s 定时器预置值(初值)N:28-N =T/Tcy=T*fcy=50N=206=0CEH 定时器/计数器0工作于方式2,定时方式,其方式控制字:TMOD=02H。 在程序中,头文件reg51.h中定义了8051的I/O端口、特殊功能寄存器和特殊功能位等符号,在程序中直接使用。主程序完成T0的初始化,CPU开中断,然后进入无限循环,等待P1.0引脚上的方波输出。 方波输出由中断服务函数timer0()产生。Interrupt 1将timer0()声明为T0的中断服务函数,而usin
44、g 3使中断发生时切换到寄存器组3,这样可以减少中断现场保护的时间,提高中断服务的实时性。,C51源程序清单如下:,/*200s 周期方波发生程序*/#define T0_VALUE 0xCE #define TMOD_VALUE 0x02 /*定时器/计数器0方式控制字*/ #includevoid main( ) TMOD=TMOD_VALUE; /*T0按定时方式2*/TH0=T0_VALUE; /*置定时器重装初值寄存器*/TL0=T0_VALUE; /*装计数初值到定时器的8位加法计数器*/EA=1; ET0=1; TR0=1; /*开中断、启动T0 */while(1); /*等待P1.0引脚上输出方波信号*/ void timer0(void) interrupt 1 using 3 P1=P10x01; /*将P1.0取反后输出*/ ,本章小结,(1)单片机C语言的特点。 (2)C51的程序结构。 (3)C51的编程规范及注意事项。 建立: (1)和硬件结合 (2)有规范 (3)结构,