单片机全册配套完整课件3_第1页
单片机全册配套完整课件3_第2页
单片机全册配套完整课件3_第3页
单片机全册配套完整课件3_第4页
单片机全册配套完整课件3_第5页
已阅读5页,还剩561页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机全册配套完整课件3单片机原理及应用参考书:

单片机语言C51程序设计C程序设计课程的特点:

以应用为目的,实践性强硬件与软件紧密结合学习方法:课前预习,课后复习理清概念,勤于实践广览书刊、网络,立足实际应用教材:

单片机原理及应用(第2版)单片机原理及应用(第1版)单片机语言

C51程序设计C程序设计参考书:

第1章绪论第2章80C51的结构和原理第3章80C51的指令系统第4章80C51的程序设计第5章80C51的中断系统及定时/计数器第6章80C51的串行接口第7章80C51的系统扩展第8章80C51的测控接口第9章80C51的C语言程序设计第10章80C51应用系统设计方法课程内容:第1章绪论

前言

数制与编码的简单回顾1.1

电子计算机概述1.2

单片机发展过程及产品近况1.3

单片机的特点及应用领域1.5

单片机应用系统开发方法本章内容:

前言

数制与编码的简单回顾前.1数制前.2编码前.3计算机中带符号数的表示数制:是计数的规则

(亦称计数制)前.1

数制

十进制:生活中最熟悉的进位计数制。

符号:0,1,…,9

规则:逢十进一

二进制:计算机中采用的计数制

符号:0,1

规则:逢二进一

特点:便于实现,不便记忆字节:8个位MSBLSB

D7D6D5D4D3D2D1D0位号:字节:

有28个值(0~255)

LSB:最低有效位,D0位

MSB:最高有效位,D7位字:2字节,16位

有216个值(0~65535)

MSB:D15位

十六进制:用于代码和数据的缩写

符号:0,1,…,9,A,B,…,F

规则:逢十六进一

特点:二进制4位→十六进制1位

为了区分数的不同进制,可在数的结尾以一个字母标示。

十进制:D(或不带字母)

二进制:B

十六进制:HC中使用十六进制以0X开头

字符的编码----ASCII码

采用美国标准信息交换码(即ASCII码)前.2编码例:字符“0”--30H

字符“A”--41H

字符“a”--61H

控制符CR-0DH

十进制数的编码----BCD码

用二进制表示十进制数的代码。

1个字节表示2位十进制数的代码,称为压缩的BCD码。例:25的压缩BCD码为25H

(注意:其十六进制值为19H)

非压缩BCD码:8位码表示1位十进制数(高4位填0)的编码2个BCD码的运算可能出现非法码,这时要对所得结果进行调整。

采用压缩的BCD码比采用非压缩的BCD码节省存储空间。非法码:4位代码在1010B~1111B范围时。前.3计算机中带符号数的表示

一、机器数及其真值

数在计算机内的表示形式称为机器数这个数本身称为真值例:正数

+1000101B(+45H)

1000101B0

(45H)机器数真值例:负数

-1010101B(-55H)

1010101B1

(D5H)机器数真值二、原码和反码

原码:最高位为符号位,数值为绝对值

反码:正数的反码与其原码相同负数的反码符号位为1,数值位为其原码数值位逐位取反

采用原码和反码表示时,符号位不能同数值一道参加运算。三、补码

正数的补码与其原码相同负数的补码为其反码末位加1计算机中,带符号数的运算均采用补码。例:正数

+1000101B(+45H)

1000101B0

反码

1000101B0

补码例:负数

-1010101B(-55H)

0101010B1

反码(AAH)

0101011B1

补码(ABH)由补码求其真值的方法求补得到原码(符号位+数值位)依原码求真值。如:补码为:10101011B求补得:11010101B真值为:-55H。补码的优点:将减法运算转换为加法,且数值连同符号位可一起参加运算例:45H-55H=-10H

[45H]补:01000101+[-55H]补:10101011

[-10H]补:11110000

求补得原码:10010000真值:-001

0000(-10H)反码:范围是:+127~-127;“0”有2种表示补码:范围是:+127~-128;

“0”有1种表示1.1电子计算机的发展概述1.1.1电子计算机的问世及其经典结构1946年2月15日,第一台电子数字计算机问世,标志着计算机时代的到来。ENIAC开创了计算机科学技术的新纪元,对人类的生产和生活方式产生了巨大的影响。冯·诺依曼提出“程序存储”和“二进制运算”的思想,构建了计算机经典结构:

电子计算机经历了五个时代:电子管计算机晶体管计算机集成电路计算机大规模集成电路计算机超大规模集成电路计算机结构仍然没有突破冯·诺依曼提出的计算机的经典结构框架1.1.2微型计算机的组成及其应用形态一、微型计算机的组成

1971年1月,INTEL公司的特德·霍夫在与日本商业通讯公司合作研制台式计算器时,将原始方案的十几个芯片压缩成三个集成电路芯片。其中的两个芯片分别用于存储程序和数据,另一芯片集成了运算器和控制器及一些寄存器,称为微处理器(即Intel4004)。4004微处理器

微处理器、存储器加上I/O接口电路组成微型计算机。二、微型计算机的应用形态可以分为2种:

桌面应用将CPU、存储器、I/O接口电路组装在主板上,通过接口电路与键盘、显示器链接,配上操作系统和应用软件构成PC。

嵌入式应用将CPU、存储器、I/O接口电路集成在一片集成电路芯片形成单芯片微型计算机。如:ARM、DSP和80C51应用形态的比较:单片机系统机

系统机(桌面应用)属于通用计算机,主要用于数据处理、办公自动化及辅助设计。

单片机(嵌入式应用)属于专用计算机,主要用于智能仪表及传感器、智能家电、智能办公设备、汽车及军事电子设备等系统。

单片机体积小、价格低、可靠性高,其非凡的嵌入式应用形态对于满足嵌入式应用需求具有独特的优势。1.2单片机的发展过程及产品近况1.2.1单片机的发展过程三个主要阶段:

单芯片微机形成阶段

1976年,Intel公司推出了MCS-48系列单片机。8位CPU、1K字节ROM、64字节RAM、27根I/O线和1个8位定时/计数器。

特点:存储器容量小,寻址范围小(不大于4K),无串行接口,指令系统功能不强。

特点是:结构体系完善,性能已大大提高,面向控制的特点进一步突出。现在,MCS-51已成为公认的单片机经典机种。

性能完善提高阶段

1980年,Intel公司推出了MCS-51系列单片机:8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。

微控制器化阶段

特点:片内面向测控系统电路增强,使之可以方便灵活地用于复杂的自动测控系统及设备。“微控制器”的称谓更能反应单片机的本质。

1982年,Intel推出MCS-96系列单片机。芯片内集成:16位CPU、8K字节ROM、232字节RAM、5个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K。片上还有8路10位ADC、1路PWM输出及高速I/O部件等。1.2.2单片机产品近况

ATMEL公司融入Flash存储器技术的AT89系列

Philips公司的80C51、80C552系列华邦公司的W78C51、W77C51高速低价系列

ADI公司的ADμC8xx高精度ADC系列

LG公司的GMS90/97低压高速系列

Maxim公司的DS89C420高速(50MIPS)系列

Cygnal公司的C8051F系列高速SOC单片机

80C51系列产品繁多,主流地位已形成,已推出的与80C51兼容的主要产品有:

非80C51结构单片机新品不断推出,给用户提供了更为广泛的选择空间,近年来推出的非80C51系列的主要产品有:Intel的MCS-96系列16位单片机

Microchip的PIC系列RISC单片机

TI的MSP430F系列16位低功耗单片机。1.3单片机的特点及应用领域1.3.1单片机的特点

控制性能和可靠性高可对I/O端口直接操作,位操作能力更是其它计算机无法比拟的。由于CPU、存储器及I/O接口集成在同一芯片内,数据在传送时受干扰的影响较小,且不易受环境条件的影响。体积小、价格低、易于产品化

应用系统的印制板减小、接插件减少、安装简单方便。1.3.2单片机的应用领域

智能仪器仪表

机电一体化产品实时工业控制分布式系统的前端模块家用电器1.4单片机应用系统开发简介1.4.1单片机应用系统的开发

单片机自身没有开发功能,必须借助开发机来完成如下任务:排除硬件故障和软件错误程序固化到程序存储器芯片中。

正确的硬件设计和良好的软件功能设计是一个实用的单片机应用系统的设计目标。完成该目标的过程称为单片机应用系统的开发。指令的表示形式指令是让单片机执行某种操作的命令。指令按一定的顺序以二进制码的形式存放于程序存储器中。如:04H:累加器A的内容加1,难记!INCA,记忆容易。称为符号指令。00000100B04H

汇编或编译将汇编语言源程序(符号指令)转换成目标码(机器码)的过程称为汇编。集成开发平台uVision平台汇编器A51.EXE实现现在常采用高级语言(如C51)进行单片机应用程序的设计。将C51语言源程序(符号指令)转换成目标码(机器码)的过程称为编译。集成开发平台uVision平台汇编器C51.EXE实现

连接与固化

1.汇编与编译形成浮动地址的目标码

*.OBJ文件(*.LST)2.由uVision平台连接器BL51.EXE连接生成绝对地址的目标码无扩展名文件(*.M51)

3.绝对地址目标文件由uVision平台转换器OH51.EXE转换成编程器能识别的*.HEX文件。

*.HEX文件可以

写入到ROM中

目标码生成工具:uVision平台实现编译、连接和.HEX转换1.4.2单片机应用系统开发工具

硬件仿真工具

软件仿真工具Proteus仿真电路设计软件ISIS实现应用系统简捷开发1.4.3应用系统开发流程

常规开发流程

1.Protel99SE系统原理图

PCB版图

制作电路板焊接相关元件

2.uVision平台开发程序

3.写入目标系统,调试1.4.3应用系统开发流程

简捷开发流程

1.Proteus绘制系统仿真原理图2.uVision平台开发程序

3.将目标程序写入仿真原理图的单片机属性配置;运行仿真功能观察执行结果并修改设计

SST公司推出的SST89C54和SST89C58芯片有SuperFLASH存储器,利用这种存储器可以进行高速读写的特点,能够实现:

在系统编程(ISP)在应用编程(IAP)。1.5单片机开发方式的发展应用程序的编辑、汇编(或编译)、模拟运行,然后实现目标程序的串行下载。ISP的实现,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于单片机来讲可以通过SPI或其它的串行接口接收上位机传来的数据并写入存储器中。所以即使我们将芯片焊接在电路板上,只要留出和上位机接口的这个串口,就可以实现芯片内部存储器的改写,而无须再取下芯片。通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在UserFlash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到4)

3)执行更新操作

4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新

Microchip公司推出的PIC16F87X中内置有在线调试器ICD功能还配置了具有ICSP功能的简单仿真器和烧写器。通过PC机串行电缆就可以完成对目标系统的仿真调试。1.第一台计算机的问世有何意义?

2.计算机由哪几部分组成?

3.微型计算机由哪几部分构成?

4.微处理器与微型计算机有何区别?

5.什么叫单片机?其主要特点有哪些?

6.微型计算机有哪些应用形式?各适于什么场合?

7.当前单片机的主要产品有哪些?各有何特点?

8.简述单片机的开发过程。

9.常用的单片机应用系统开发方法有哪些?思考题与习题2.480C51的并行口结构与操作本章内容:2.180C51的内部结构与引脚功能2.280C51单片机的CPU2.580C51单片机最小系统2.380C51的存储器组织第2章80C51的结构和原理80C51系列概述

MCS-51是Intel公司生产的一个单片机系列名称。这一系列的单片机有多种,如:

8051/8751/80318052/8752/803280C51/87C51/80C3180C52/87C52/80C32等

生产工艺有两种:在产品型号中凡带有字母“C”的即为CHMOS芯片,CHMOS芯片的电平既与TTL电平兼容,又与CMOS电平兼容。一是HMOS工艺(高密度短沟道MOS工艺)。二是CHMOS工艺(互补金属氧化物的HMOS工艺)。80C51系列

Intel:80C31、80C51、87C51,80C32、80C52、87C52等;

ATMEL:89C51、89C52、89C2051等;

Philips、华邦、Dallas、Siemens(Infineon)等公司的许多产品。

80C51是MCS-51系列中CHMOS工艺的一个典型品种;其它厂商以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。常用的80C51系列产品有:2.180C51的内部结构与引脚功能2.1.180C51的内部结构

功能上,该系列单片机有基本型和增强型两大类:

增强型:ROM、RAM、计数器、中断源的差异8052/8752/803280C52/87C52/80C32

基本型:8051/8751/803180C51/87C51/80C312.1.280C51典型产品的资源配置80C51典型产品资源配置由表可见:增强型与基本型的几点不同:

片内ROM:从4K增加到8K

片内RAM:从128增加到256

定时/计数器:从2个增加到3个中断源:从5个增加到6个。

无ROM型,要在片外扩展程序存储器;掩膜ROM型,程序由芯片生产厂写入;E(E)PROM型,程序通过写入装置写入;FlashROM型,程序可电写入(常用)。

片内ROM的配置形式:还有OTPROM型,具有较高的可靠性。在片内程序存储器的配置上,该系列单片机有三种形式,即掩膜ROM、EPROM和ROMLess。如:80C51有4K字节的掩膜ROM87C51有4K字节的EPROM

80C31在芯片内无程序存储器。AT89C51FLASH80C51的应用模式总线型应用的“三总线”模式

非总线型应用的“多I/O”模式

总线型单片机应用模式

非总线型单片机应用模式

引脚数减少、体积减小。对于不需进行并行外围扩展,装置的体积要求苛刻且程序量不大的系统极其适合。

典型产品,如:

AT89C2051/AT89C4051。2.1.380C51的引脚封装总线型非总线型80C51的内部结构详解RAM128BRAM地址寄存器P3口P1口P2口P0口锁存器锁存器锁存器锁存器中断定时/计数器串行口SPBACC暂存器1暂存器2PSW指令寄存器IR指令译码器IDDPL缓冲器程序计数器PCPC增量器地址寄存器AR定时与控制4KROMALUDPH运算器控制器存储器I/O接口RSTEAALEPSENXTAL2XTAL1

80C51的内部结构详解一、80C51的CPU

运算器累加器ACC

寄存器BPSW

控制器程序计数器PC

指令寄存器IR

定时与控制逻辑一、与运算器相关的寄存器(3个)

累加器ACC,8位。提供操作数,存结果;

寄存器B,8位。主要用于乘、除法运算。

程序状态字寄存器PSW,8位。各位含义为:

CY:进位、借位标志。有进位、借位时CY=1,否则CY=0;

AC:辅助进位、借位标志;

F0F1:用户标志位,由用户自己定义;

RS1、RS0:当前工作寄存器组选择位;

OV:溢出标志位。有溢出时OV=1,否则OV=0;

P:奇偶标志位。ACC中结果有奇数个1时P=1,否则P=0。二、指针类寄存器(3个)

堆栈指针SP,8位。总是指向栈顶。遵循“后进先出”的原则

入栈时,SP先加1,数据再压入SP指向的单元。出栈操作时先将SP指向的单元的数据弹出,然后,SP再减1,这时SP指向的单元是新的栈顶。80C51单片机的堆栈区是向地址增大的方向生成的。三、与口相关的寄存器(7个)

并行I/O口P0、P1、P2、P3,均为8位;

串行口数据缓冲器SBUF;串行口控制寄存器SCON;串行通讯波特率倍增寄存器PCON,(又称为电源控制寄存器)。

数据指针DPTR。用来存放16位的地址。它由两个8位的寄存器DPH和DPL组成。四、片内存储器

程序存储器和数据存储器2个独立的空间(称为哈佛结构):

ROM:4K

范围是:000H~0FFFH

RAM:128字节

范围是:00H~7FH2.380C51的存储器组织80C51存储器可以分成两大类:

RAM,CPU在运行时能随时进行数据的写入和读出,但在关闭电源时,其所存储的信息将丢失。它用来存放暂时性的输入输出数据、运算的中间结果或用作堆栈。

ROM,写入信息后不易改写的存储器。断电后,其中的信息保留不变。用来存放固定的程序或数据,如系统监控程序、常数表格等。

2.3.180C51的程序存储器配置PC:16位计数器,能寻址64KB的ROM。

2.3.280C51的数据存储器配置一、工作寄存器区

低端32个字节分成4个工作寄存器组,每组8个单元。当前工作寄存器组的机制便于快速现场保护。

PSW的RS1、RS0决定当前工作寄存器组号寄存器0组:地址00H~07H;寄存器1组:地址08H~0FH;寄存器2组:地址10H~17H;寄存器3组:地址18H~1FH。二、位寻址区三、通用RAM区30H至7FH共80个字节作为数据缓冲器

操作指令丰富,数据处理方便灵活堆栈区:通常在30H~7FH范围栈顶:SP寄存器指示复位时SP的初值为07H三、I/O口及功能单元

并口:P0~P3,双向口。每口8条I/O线

串行口:P3.0、P3.1,全双工

定时/计数器:2个,16位

中断系统:5个中断源,2个优先级

2.3.3特殊功能寄存器(SFR)

21个SFR,地址80H~FFH。只占用了80H~FFH中的21个字节单元,且这些单元是离散分布的。增强型单片机的SFR有26个字节单元,所增加的5个单元均与定时/计数器2相关。与中断相关的寄存器(2个)

中断允许控制寄存器IE;中断优先级控制寄存器IP。

与定时器/计数器相关的寄存器(6个)T0的两个8位计数初值寄存器TH0、TL0T1的两个8位计数初值寄存器TH1、TL1

工作方式寄存器TMOD;控制寄存器TCON。

80C51的特殊功能寄存器(SFR)2.2.280C51的时钟与时序一、时钟产生方式

内部时钟外部时钟二、时钟信号1个机器周期:12个晶荡周期(或6个时钟周期)

指令的执行时间称作指令周期(单、双、四周期)三、80C51的典型时序指令微操作在时间上的次序,即时序。

单字节指令双字节指令1、单周期指令时序2个机器周期中ALE有效4次,后3次读操作无效。2、双周期指令时序

在第二机器周期无读操作码的操作,而是进行外部数据存储器的寻址和数据选通

。ALE信号会出现非周期现象。

访问外部RAM的双周期指令时序

2.2.380C51单片机的复位一、复位电路复位可使单片机或系统部件处于确定的初始状态。

上电复位电路按键与上电复位

二、单片机复位后的状态

PC=0000H

RAM:随机值(运行中复位不改变RAM内容)

SFR状态

P0~P3=FFH

SP=07H

IP、IE和PCON:有效位为0

PSW=00H2.480C51的并行口结构与操作2.4.1P0口、P2口的结构

一、

P0口的结构1、P0用作通用I/O口

系统不扩展(片外ROM、片外RAM)时,P0用作通用I/O口。MUX接锁存器反相端T1截止,漏极开路此时,C=0

输出时,执行口输出指令,数据在“写锁存器”信号作用下,经锁存器反向端送至T2,反相后送至P0.X。

输入时,数据可读自锁存器,也可读自引脚。由指令是“读锁存器”指令还是“读引脚”指令来决定。

“读—修改—写”类指令(如:ANLP0,A)产生“读锁存器”操作信号;

读锁存器可避免因外部电路原因使原口引脚的状态发生变化造成的误读。“MOV”类指令(如:MOVA,P0)内部产生的是“读引脚”信号。此时要先向锁存器写入“1”,使T2截止,让引脚处于悬浮状态,使口处于高阻抗输入态。

否则,在作为输入方式之前曾向锁存器输出过“0”,则T2导通会使引脚箝位在“0”电平,使输入高电平“1”无法读入。因此,P0口作为通用I/O时,属于准双向口。2、P0用作地址/数据总线

系统进行扩展(片外ROM、片外RAM)时,P0用作地址/数据总线。MUX接反相器T1截止与导通由地址/数据线的状态决定此时,C=1

执行输出指令时,低8位地址信息和数据信息分时地出现在地址/数据总线上。

执行输入指令时,首先低8位地址信息出现在地址/数据总线上。然后,CPU自动地使MUX拨向锁存器,并向P0口写入FFH,同时“读引脚”信号有效。

P0口作为地址/数据总线使用时是一个真正的双向口。二、

P2口的结构P2用作通用I/O口

不扩展ROM,或只扩展256B的片外RAM时,仅用到了地址线低8位,P2仍可作为通用I/O口。

输出时,数据由D端进入锁存器,经反相器送至T,经T反相送引脚。

输入时,数据可读自锁存器,也可读自引脚。要根据输入采用的是“读锁存器”还是“读引脚”指令决定。“读—修改—写”类指令,锁存器Q端数据进入内部数据总线,与A逻辑运算后,结果又送回P2的锁存器并出现在引脚。“MOV”类指令,操作信号是“读引脚”。应先要把锁存器写入“1”,使引脚高阻状态。

通用I/O口时,属于准双向口。且P2的输出驱动有上拉电阻。P2用作地址总线

当片外扩展ROM或扩展的RAM容量超过256字节时,硬件使C=1,MUX开关接向地址线,这时P2.X的状态与地址线的信息相同。2.6.2P1口、P3口的结构

P1口的结构P1口由一个输出锁存器、两个三态输入缓冲器和输出驱动电路组成。输出驱动电路与P2口相同,内部设有上拉电阻。P1口是通用的准双向I/O口。输出高电平时,能向外提供拉电流负载,不必再接上拉电阻。当口用作输入时,须向口锁存器写入1。

P3口的结构

P3用作第一功能(通用I/O)

对P3字节或位寻址时,硬件自动将W置1。口线为通用I/O口方式。

输出时,锁存器Q端与引脚状态相同;输入时,先向锁存器写1,使引脚为高阻状态。数据在“读引脚”信号作用下,进入内部数据总线。通用I/O口时,属于准双向口。

P3用作第二功能使用

当不对P3口寻址时,口锁存器的Q端自动置1。这时P3口作为第二功能使用

P3.0:RXDP3.1:TXDP3.2:INT0P3.3:INT1

P3.4:T0P3.5:T1P3.6:WRP3.7:RD2.6.3并行口的负载能力

P0、P1、P2、P3口的电平与CMOS和TTL电平兼容。

P0每一口线可驱动8个LSTTL负载

通用I/O时,输出驱动电路是开漏方式,OC门或漏极开路电路驱动时需外接上拉电阻;

地址/数据总线时,输出不是开漏的,无须外接上拉电阻。

P1、P2、P3口的每一位能驱动4个LSTTL负载。可方便地由OC门或漏极开路电路驱动,而无须外接上拉电阻。

口线仅能提供几毫安的电流,当作为输出驱动一般的晶体管的基极时,应在口与晶体管的基极之间串接限流电阻。

1、在功能、工艺、程序存储器的配置上有哪些种类?2、80C51的存储器组织采用何种结构?存储器地址空间如何划分?各地址空间的地址范围和容量如何?在使用上有何特点?3、P0~P3口在结构上有何不同?在使用上有何特点?4、晶振为12MHz,时钟周期、机器周期为多少?5、80C51复位后的状态如何?复位方法有几种?思考题与习题6、80C51的片内、片外存储器如何选择?7、PSW寄存器各位标志的意义如何?8、80C51的当前工作寄存器组如何选择?9、80C51的控制总线信号有哪些?各信号的作用如何?10、80C51的程序存储器低端的几个特殊单元的用途如何?3.1C51对标准C的扩展本章内容:3.2C51的指针3.3C51的函数第3章80C51的C51语言程序设计3.1C51对标准C的扩展扩展主要针对单片机存储器性质和分区特征、特殊的位寻址方式等3.1.1C51的数据类型

数据:常量和变量数据类型是数据的格式,决定数据的1.值域范围2.占用存储单元个数3.能参与哪种运算C51常用数据类型数据类型长度(位)取值范围字符型signedchar8-128~127unsignedchar80~255整形singedint16-32768~32767unsignedint160~65535长整型signedlong32unsignedlong32浮点型float32SFR型sfr80~255sfr16160~65535位型bit10,1sbit10,11.整型默认有符号,以补码进行存储2.浮点型只有十进制3.字符型默认有符号,可用‘’进行常量的赋值,字符串用“”。;某些字符有特殊含义。#include<stdio.h>voidmain(){longx,y;(有符号的长整型)inta,b,c,d;(有符号的整型)x=5;y=6;a=7;b=8;c=x+a;d=y+b;printf(“c=x+a=%d,d=y+b=%d\n”,c,d);}注:不同进制之间可以进行混合计算,但要注意兼容性!字符型默认有符号,可用‘’进行常量的赋值,字符串用“”。;某些字符有特殊含义。注:也可作为8位整型来使用!字符以ASCII码方式表示,长度为1个字节但操作时按整型数进行处理。对于处理大于0x80的的ASCII码字符,要定义成unsignedchar

否则直接转为整型变量#include<stdio.h>voidmain(){chara,b;a=‘x’;b=‘y’;a=a-32;b=b-32;printf(“%c,%c\n”,%d,%d\n”a,b,a,b);}3.1.2C51数据的存储分区

对单片机来说,访问片内RAM比访问片外RAM速度快得多,常使用的变量应置于片内RAM,用bdata、data、idata来定义;

片外RAM,用pdata、xdata定义

默认编译模式下可省略分区定义。

存储分区对应的存储器及寻址方式bdata片内RAM位寻址区,共128位(也可按字节寻址)data直接寻址,共128Bidata间接寻址,共256Bpdata片外RAM分页间址,共256Bxdata间接寻址,共64KBcodeROM间接寻址,共64KBbitdataflags;//位变量flags定位在片内RAM位存储区chardatavar;//字符变量var定位在片内RAM区floatidatax,y;//字型变量x,y定位在片内间址RAM区unsignedcharpdataz;//无符号字符变量z定位在片外分页间址RAM区变量与常量变量的3要素:

数据类型对象名内存存放地址自动分配或给定绝对地址int(data)lower,upper,step;//整型数据charc,name[16];//字符型数据,数组常量

算数常量:整型、浮点型

字符常量枚举常量变量的作用域块结构

以“{}”括起来的符合语句属于块结构。

块内定义的变量作用域仅限于块内。

块内定义与块外或外部定义具有相同的变量名,则它们没有关系

inta=3;main(){inta=5;printf(“a=\n”,a);}自动型变量

在函数内部定义的变量称为自动型变量(以auto标识,常省略),作用域定义在函数内部。不同函数里出现相同名字的变量,毫不相干。

编译程序将自动为自动型变量分配存储空间,退出则消失。注:自动型变量与外部变量具有相同名字,函数(块)内自动变量起作用;退出该函数(块)后,外部变量起作用。外部型变量

在函数外部定义的变量,可被程序中所有函数所引用。即全局变量作用域是整个程序。如有同名变量,则只有内部变量起作用#include<stdio.h>intx=4,y=5;voidmain(){{intx=1;{intx=2;{intx=3;//:%u无符号十进制整数printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}x=3,&x=1245044y=5,&y=4338028x=2,&x=1245048y=5,&y=4338028x=1,&x=1245052y=5,&y=4338028x=4,&x=4338024y=5,&y=4338028C51的分隔符“[]”;对数组说明如:charmm[]=“ok”;“()”隔离函数名与形参s=area(r);“,”隔离变量或表达式intx,y,z;“{}”隔离复合语句for(){;;}“;”语句间隔离“:”分隔标识符或特殊语句中使用“*”指针指向数据“&”数据所存地址“#”预处理伪指令“^”标识特殊寄存器的位sbitP10=P1^0“…”说明函数的参数表中可能出现参数intAB(int,char…)操作符作用操作符作用+加,一目取正%取模-减,一目取负--减1*乘++加1/除操作符作用操作符作用&&逻辑与!逻辑非||逻辑或算术运算符逻辑运算符操作符作用操作符作用>大于<=小于等于>=大于等于==等于<小于!=不等于操作符作用操作符作用&按位逻辑与~按位逻辑反|按位逻辑或>>算术右移^按位逻辑异或<<算术左移关系运算符按位运算符逻辑运算符与关系运算符是真(true)假(false)的概念。true可以是非0的任何值,false为0.#include<stdio.h>unsignedmoveright(unsignedvalue,intn);unsignedmoveright(unsignedvalue,intn);voidmain(){unsigneda;intn;printf(“请输入一个八进制:”);scanf(“%o”,&a);printf(“请输入要移位的位数:”);scanf(“%d”,&n);if(n>0){printf(“循环右移的结果为:%o\n”,moveright(a,n));}else{n=-n;printf(“循环左移的结果为:%o\n”,moveleft(a,n));}}循环移位程序给出待移位16位整型数据a,移位数n

unsignedmoveright(unsignedvalue,intn){unsignedz;z=(value>>n)|(value<<(16-n));returnz;}unsignedmoveleft(unsignedvalue,intn){unsignedz;z=(value<<n)|(value>>(16-n));returnz;}C51的特殊运算符(1)“?”运算符<表达式1>?<表达式2>:<表达式3>;#include<stdio.h>main(){intx,y;x=50;y=x>70?100:0;}(2)“&”,”*”运算符“&”返回操作数地址“*”返回位于这个地址的变量值#include<stdio.h>main(){inti,j,*m;i=10;m=&i;j=*m;}(3)”,”运算符“,”将多个表达式串在一起,“,”左边不返回,右边才是整个表达式的值#include<stdio.h>main(){intx,y;x=50;y=(x=x-5,x/5);}(4)sizeof运算符返回变量或类型的字节长度sizeof(double)为8sizeof(int)为2floatf;inti;i=sizeof(f);(5)联合操作<变量>=<变量><操作数><表达式>相当于<变量><操作数>=<表达式>a=a+b可写成a+=ba=a/(b-c)可写成a/=b-c3.1.3C51的编译模式编译模式与变量默认存储分区

例charvar;//在SMALL模式,var定位于data存储区//在COMPACT模式,var定位于pdata存储区//在LARGE模式,var定位于xdata存储区编译模式默认存储分区特点SMALLdata变量在片内RAM,空间小,速度快COMPACTpdata变量在片外RAM的一页LARGExdata变量在片外RAM的64KB范围uVision中,存储模式在OptionforTarget1TargetMemoryModel中设定3.1.4用_at_定义变量绝对地址为全局变量存放首地址进行定位idatainty_at_0x30;//idata中全局变量y首地址0x30y=0xaa;//整型变量y赋值0xaaxdatacharstring[20]_at_0x3000;//xdata中字符型数组string的首地址0x3000

对外设接口地址的定义要用volatile进行说明,以每次重读原始内存地址内容,而不适用保存在寄存器里的备份。目的是避免编译器优化出现不正确结果。3.2C51的指针对于变量a,可用&a表示a的地址。p=&a;//p为指针变量,其值为变量a的地址,即p指向a利用指针运算符“*”,可获得指针所指变量的内容。char*p;//指针p指向字符型数据p=0x30;//指针赋值地址0x30指针也是一种变量,同样要存储在某一存储器中,定义时可显式进行声明。char*datap;//指针p指向字符型数据,指针本身存储在data区char*p;intdatap已定义称为数据存储分区的指针称为基于存储器的指针,在定义时就已制定了所指向的数据的存储分区。3.2.1已定义数据存储分区的指针charidata*datap;//指针p指向idata区的字符型数据,指针本身//存储在data区chardata*datastr;//单字节指针指向data空间的char型数据intxdata*datanum;//双字节指针指向xdata空间的int型数据

基于存储器的指针长度为单字节或双字节,可以节省存储器资源。。定义指针变量时,未定义它所指向的数据存储分区的指针称为通用指针(或一般指针),存放通用指针要占用3个字节。3.2.2未定义数据存储分区的指针第一字节为指针所指向的数据存储分区编码第二字节为指针所指向的数据的高字节地址第三字节为指针所指向的数据的低字节地址存储器分区bdata/data/idataxdatapdatacode编码0x000x010xfe0xff通用指针用于存取变量而不必考虑变量在单片机内存储空间3.2.3利用指针实现绝对地址访问unsignedchardata*p;//单字节指针p指向内部RAM数据p=0x40;//指针p赋值,指向内部RAM的0x40单元*p=0x55;//数据0x55送入内部RAM的0x40单元C51提供一组宏指令定义以实现对80C51单片机绝对地址访问宏定义原型放在absacc.h文件中#defineCBYTE((unsignedcharvolatilecode*)0);#defineDBYTE((unsignedcharvolatiledata*)0);(unsignedcharvolatilecode*)对地址进行强制类型转换,形成指针,指向后面给出地址。例:将30H至3FH共16个RAM单元初始化为55H#include<reg52.h>#include<absacc.h>voidmain(void){unsignedchari;for(i=0;i<=15;i++){DBYTE[0x30+i]=0x55;}while(1);}3.2.4C51程序编写示例C:0x0000020011LJMPC:0011C:0x0003E4CLRAC:0x0004FFMOVR7,AC:0x00057430MOVA,#0x30C:0x00072FADDA,R7C:0x0008F8MOVR0,AC:0x00097655MOV@R0,#0x55C:0x000B0FINCR7C:0x000CBF10F6CJNER7,#0x10,C:0005C:0x000F80FESJMPC:000FC:0x0011787FMOVR0,#0x7FC:0x0013E4CLRAC:0x0014F6MOV@R0,AC:0x0015D8FDDJNZR0,C:0014C:0x0017758107MOVSP,#0x07C:0x001A020003LJMPC:0003复合语句用{}将一些说明和语句组合在一起,使他们在语法上等价于一个简单语句,称其位复合语句。条件语句if(表达式1)

语句1else(表达式2)

语句2#include<stdio.h>voidmain(){inta,b,x;a=3;b=5;if(a>b)x=a;elsex=b;printf(“x=%d\n”,x);}注意:1.条件执行语句中“else语句2;”部分是选择项,可以缺省if(表达式)语句1;2.如果语句1或语句2有多于一条语句要执行时,必须使用“{}”把这些括在其中if(表达式){语句体1;}else{语句体2;}if(x>20||x<-10)if(y<=100&&y>x)printf(“good”);elseprintf(“bad”)3.条件语句可以嵌套,但注意if对应哪个else,需要注意else与最近一个if匹配if(x>20||x<-10){if(y<=100&&y>x)printf(“good”);}elseprintf(“bad”)if(表达式1)语句1;elseif(表达式2)

语句2;elseif(表达式3)

语句3;...else

语句n#include<stdio.h>voidmain(){intscore;chargrade;scanf(“%d”,&score);if(score>94)grade=‘5’;elseif(score>79)grade=‘4’;elseif(score>59)grade=‘3’;elsegrade=‘2’;printf(“%d\n”,grade);}开关语句switch(变量){

case常量1:

语句1或空;case常量2:

语句2或空;...case常量n:

语句n或空;default:

语句n+1或空;}注意:

判断case后面的表达式和switch后面的表达式是否相匹配,一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break。#include<reg52.h>#include<stdio.h>voidmain(void){intmonth;intday;printf(“pleaseinputthemonthnumber:”);scanf(“%d”,&month);switch(month){

case1:case3:case5:case7:case8:case10:case12:day=31;break;case4:case6:case9:

case11:day=30;break;case2:day=28;break;default:day=-1;}if(day==-1)printf(“Invalidmonthinput!\n”);elseprintf(“2015.%dhas%ddays\n”,month,day);while(1){}}跳转语句1.break语句

常用在循环语句和开关语句中。当用在switch中,可使程序跳出switch而执行switch以后的语句,否则将成为死循环而无法退出。

当用于do-while、for、while循环语句中,可使程序终止循环而执行循环后的语句。常与if语句连在一起,即满足条件则跳出循环。#include<stdio.h>voidmain(void){inti=0;charc;while(1){c=‘\0’;while(c!=13&&c!=27){c=getchar();printf(“%c\n”,c);}if(c==27)break;i++;printf(“TheNo.is%d\n”,i);}printf(“Theend”);}

输入一字符并显示,回车后显示出输入的字符数;当按ESC时结束字符输入同时输出Theendgetchar()getchar时,程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从键盘缓冲区中每次读入一个字符.getchar函数的返回值是用户输入的字符的ASCII码2.continue语句

continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环

continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用加速循环voidmain(void){charc;while(c!=0X0D){c=getchar();if(c==0X1B)continue;printf(“%c\n”,c);}}

输入一字符并输出该字符,按Enter则结束输入,如按ESC则重新输入不显示。3.goto语句

goto语句是一种无条件转移语句

用法:goto标号;

常与if条件语句连用,当满足某一条件,程序调到标号处运行。

标号必须与goto同处于一个函数中,但可不在一个循环层中。#include<stdio.h>voidmain(void){inti=0;charc;while(1){c=‘\0’;while(c!=13){c=getchar();if(c==27)gotoquit;printf(“%c\n”,c);}i++;printf(“TheNo.is%d\n”,i);}quit:printf(“Theend”)}

循环语句for(<初始化>;<条件表达式>;<增量>)1.for语句2.while语句while(条件)

语句;3.do-while语句do

语句;while(条件)#include<stdio.h>voidmain(void){inti,j,k;printf(“ijk\n”);for(i=0;i<2;i++)for(j=0;j<2;j++)for(k=0;k<2;k++)printf(“%d%d%d\n”,i,j,k);}

ijk000001010011100101110111C51程序由主函数(唯一和程序的开始)和若干子函数构成。3.3C51的函数C51函数函数的说明库函数自定义函数系统提供若干头文件分类实现系统提供的库函数用户自定义的函数主函数中声明被调用子函数子函数开头声明注:中断处理子程序在主程序中无需声明C51语言中,函数的定义形式为:3.3.1C51函数定义

当函数没有返回值时,要用关键字void明确说明。形式参数的类型要明确说明,对无形参的函数,括号也要保留返回值类型函数名(形参列表)[编译模式][reentrant][interruptn][usingn]{

函数体}例:延时毫秒函数示例(晶振11.0592MHz)voidDelayMs(unsignedintn)//延时函数{unsignedcharj;while(n--){for(j=0;j<113;j++);}}

编译模式:指定函数中局部变量和参数的存储空间3.3.2C51函数定义的选项reentrant(定义重入函数)SMALL模式:默认变量在片内RAMCOMPACT模式:默认变量在片外RAM的页内LARGE模式:默认变量在片外RAM的64KB范围如果函数是可重入的,当该函数正在被执行时,可以再次被调用(递归使用)C51函数默认是不可重入的interruptn(定义中断函数)

中断函数使用中要注意:中断函数不能带有参数,也没有返回值被中断函数调用的函数的工作寄存器组应与中断函数工作寄存器组相同中断源外中断0定时器0外中断1定时器1串行口定时器2中断号012345usingn(确定中断服务函数所使用的工作寄存器组)

n为工作寄存器组号,取值为0~3.指定后所有被中断调用的函数都必须使用同一寄存器组。不设定时,编译系统会将当前工作寄存器组8个寄存器入栈例:中断函数定义示例#include<reg51.h>sbitP10=P1^0voidmain(void){P10=0;EX0=1EA=1;}voidEx0_Isr(void)interrupt0//延时函数{P10=!P10;//对P1^0位取反}3.3.3C51的库函数

数学运算库函数的参数和返回值类型为float字符属性判断类库函数返回值类型由int调整为bit一些函数的参数和返回值类型由有符号定点数调整为无符号定点数见附录C.2

main函数

主函数是一个特殊函数,每个C51程序都必须有main函数,程序从这里开始执行。两种正式原型+非正式形式intmain(void)intmain(intargc,char*argv[])//argc表示被调用程序所带命令行参数的数目,argv指针数组,元素指向包含命令行参数的字符串

返回值作用是向系统返回一状态码对于单一程序采用非标准形式voidmain(void)intmain(intargc,char*argv[])函数的调用和返回

函数的简单调用。C51调用函数时直接使用函数名和实参的方法。#include<stdio.h>intmaxmum(intx,inty,intz);intmain(){inti,j,k;printf(“i,j,k=?\n”);scanf(“%4d%4d%4d”,&i,&j,&k);max=maxmum(i,j,k);printf(“Themaxmumvalueofthe3datais%d\n”,max);getchar();return0}}intmaxmum(intx,inty,intz);{intmax;max=x>y?x:y;max=max>z?max:z;returnmaxC51用全程变量实现参数互传#include<stdio.h>voiddisp(void);intm[10];intmain(){inti;printf(“Inmainbeforecalling\n”);for(i=0;i<10;i++){m[i]=i;printf(“%3d”,m[i]);}disp();printf(“Inmainaftercalling\n”);for(i=0;i<10;i++)printf(“%3d,m[i]”);getchar()return0}voiddisp(void);{intj;printf(insubfuncaftercalling\n)for(j=0;j<10;j++){m[j]=m[j]*10;printf(“%3d”,m[j]);}}80C51人机接口技术并行接口I/O4.1LED、数码管接口技术单片机基本应用系统常使用发光二极管LED或数码管显示系统的运行信息使用键盘或按键输入控制信息系统的设计需考虑口的驱动能力

决定与单片机系统元件的参数设计输出电流与灌电流4.1.1LED接口LED是单片机常用输出设备

结压降1.75V,结电流10mA单个LEDLED阵列多个Led驱动,常以共阴极或共阳极形式工作#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineDataPortP0sbit

P21=P2^1;ucharcodeScanCode[]=//LED灯位扫描码{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};voidDelayMs(uintn){

ucharj;wile(n--)//延时子程序{for(j=0;j<113;j++);}}voidmain(){

uchar

i;P21=1;while(1){for(i=0;i<8;i++){

DataPort=ScanCode[i];

DelayMs(500);}for(i=0;i<8;i++){

DataPort=ScanCode[7-i];

DelayMs(500);}}}多左右循环移动流水灯功能的实现间隔0.5S4.1.2七段数码管

接口#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeSegCode[]={0xc0,0xf9,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论