单片机编程实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
与标准C语言相比,C51包含的数据类型、变量 存储模式、输入输出处理、函数等方面有一定差异, 需根据单片机存储结构及内部资源来定义相应的数 据类型和变量,而其它语法规则、程序结构及设计 方法等与标准C语言相同。
二. 、C51语言程序结构
C语言程序由若干函数组成,其中有且仅有一 个主函数,每个函数都是完成某个特殊任务的子程 序段。
sfr特殊功能寄存器型 51系列单片机内的21个特殊功能寄存器(SFR),
分散在片内RAM区的高128字节,地址为80H~FFH。 为了能直接访问这些SFR,需要通过关键字“sfr”对 其进行定义,语法如下:
sfr sfr_name = 地址常数;
sfr_name是一个特殊功能寄存器名,“=”后面必须 是常数,其数值范围必须在特殊功能寄存器地址范围 内,即位于0x80-0xFF之间。 例如, sfr P1 = 0x90; //定义P1口地址90H
RAM,片外64KB RAM和片内外统一编址的64KB ROM。
51系列单片机逻辑存储空间示意图
C51的存储类型与存储空间对应关系表
注:一个变量除了与存储单元相对应外,还与它所在 的存储空间有关,即还需要指出其存储类型。
编译模式与存储类型 如果在定义变量时省略了存储类型标识符,C51
编译器会根据当前编译模式自动认定默认的存储类 型。编译模式共分为:小编译模式(SMALL)、紧 凑编译模式(COMPACT)和大编译模式(LARGE) 三种模式
(4)变量名
C51对变量名的规定与标准C类似,由字母、 数字和下划线三种字符组成,且第一个字符必须 为字母或下划线,变量名长度无统一规定,随编 译系统而定。
变量
自动变量:
自动变量作用范围在定义它的函数体或复合语句内 部,在定义它的函数体或复合语句被执行时,C51 才为该变量分配内存空间,当函数调用结束或复合 语句执行结束时,自动变量占用的内存空间被释放。
定义变量时若省略存储种类,则变量默认为自 动变量。通常将函数体内和复合语句中使用频繁的 变量放在片内RAM中,且定义为自动变量,可有效 利用片内RAM资源。
CALL DELAY ; 调用延时子程序 MOV P1,#0FFH ; P1口输出全1,熄灭二极管 CALL DELAY ; 调用延时子程序 DJNZ R0, LOOP ; R0减1,若不为0转LOOP处
JB P2.0, $ ; 测P2.0为高电平(无按键)则执行本行 JMP START ; 否则,有键按下,跳到START处重新开
C51增加的特殊数据类型
为了更有效地利用51单片机的内部结构, C51还 增加了一些特殊的数据类型,它们分别对应于bit、 sfr、sfr16和sbit四个关键字。
bit 位型
利用bit 位型,可定义一个位变量或位函数, 但不能定义位指针,也不能定义位数组。它的值 是一个二进制位,不是0 就是1。
第三章 单片机系统开发过程 51单片机指令系统简介
3.1 单片机系统开发过程
简单的例子:让一个发光二极管闪烁5次。
1、明确系统功能:让一个发光二极管闪烁5次。
系统启动后,一支发光二极管闪烁5次后熄灭, 当按下一个按钮开关后再闪烁5次后熄灭。 以后每次按下按钮开关,发光二极管都会闪烁5次。
2、硬件设计(单片机+外围器件)
注:C51编译器把51单片机常用特殊功能寄存器和特殊位进行
了统一定义,并存放在 “reg51.h”或“reg52.h” 头文件中,只须在 使用前用预处理命令#include <reg51.h>把这头文件包含到程序中, 就可使用殊功能寄存器名和特殊位名称。
(3)存储类型 51 系 列 单 片 机 有 三 个 逻 辑 存 储 空 间 : 片 内 低 128B
合结构化程序设计。
⑥可直接操作计算机硬件。
C语言具有直接访问机器物理地址的能力,C51 的编译器都可直接对单片机内部的SFR和I/O端口进 行操作,可以直接访问片内、片外存储器,还可以 进行各种为操作。
⑦生成的目标代码质量较高。
3.4.1 C51的程序结构
一、 C51语言概述
用C51语言编写单片机应用程序,不用具体组 织、分配存储器资源和处理端口数据,但对数据类 型与变量的定义,必须要与单片机的存储结构相关 联,否则编译器不能正确地映射定位。
C51是一种专门为51单片机设计的高级语言 C编译器,支持符合ANSI标准的C语言,同时针 对51单片机的特点做了一些特殊扩展。
C语言的主要特点:
① 语言简洁,使用方便灵活。它是程序设计语 言中规模最小的语言之一。
ANSI标准C语言只有32个关键字,9种流程控 制语句。
②程序可移植性好。
所设计的程序不依赖机器硬件。
(汇编程序:文件名.asm; C程序:文件名.c
4、为工程中添加源程序文件 在右边Project窗口单击 Source Group 1,在下拉菜单 中选 Add Files to Group‘Source Group 1’选项,
在弹出的框中选择你的源文件和文件类型,然后点击 ADD,再点击close。
生成.HEX文件后,可利 用专门的下载程序,将 此可执行程序下载到单 片机内的ROM中运行
3.3 STC-ISP V3.91 软件的使用
1、双击
, 打开在线烧录程序
2、在窗口的“MCU TYPE ”下拉菜单中选择(STC89C51RC)
3、在窗口中点
击
,
打开你系统
的.hex文件
4、在COM栏选下载端口(一般是COM1) 5、关电路板上的电源 6、点击Download,打开电路板上的电源,烧录程序,若 烧录出现问 题,点击stop。
外围器件:
一个发 光二极 管、三 个电阻、 三个电 容
一个按 钮开关
3、 搭建硬件平台
在面包板上插入器件,用导线完成电气连接。
4、 软件设计 ORG 00H ; 设置起始地址
START: MOV R0, #5 ; 循环闪烁5次,R0为计数器 LOOP: MOV P1,#00H ; P1口输出全0,点亮二极管
③表达能力强。
具有丰富的数据结构类型和多种运算符。用户 可灵活采用多种数据类型和使用各种运算符,实现 复杂运算。
④表达方式灵活。
利用 C语言的多种运算符可组成各种表达式, 还可采用多种方法来获得表达式的值,使程序设计 具有更大的灵活性。
⑤可进行结构化程序设计。 C语言以函数作为程序设计的基本单位,非常适
式中: func1
()…funcN()代 表用户定义的函数,
程序体指C51提供的 任何库函数调用语句、 控制流程语句或其它 函数调用语句。
3.4.2 C51的数据结构
1. C51的变量
变量的基本属性是变量名和变量值。在程序中定义 了变量,C51编译器就会给这个变量分配相应的存储单 元。此后变量名就与存储单元地址相对应,变量值就与 存储单元的内容相对应。
5、编译工程中的源程序,生成 .HEX(可执行)文件 在Project窗口中选 Target 1→Build Target F7, (点 击 )对源程序编译连接。(或点击 RBuild Target )
程序有语法错误时,会在输出窗口(Output Windows)中 显示错误信息和警告信息,修改编译成功后生成 HEX文件
在多文件或多模块处理中,外部静态变量只在 定义其的文件内部或模块内部有效。
寄存器变量:
通常将使用频率最高的那些变量定义为寄存器 变量,但目前已不推荐使用这种方式。
(2)数据类型 数据的不同格式叫做数据类型
有符号数据类型可以忽略signed标识符,如int 等 价于signed int , char 等价于signed char等。
ຫໍສະໝຸດ Baidu
②在弹出窗口中选所需CPU(如选ATMEL),双击该.CPU.
③选AT89S51, 并确定。
2、设置工程,使编译、连接后能生成可执行代码文件
右击
→Options for ‘Target 1’
在弹出的窗口选
→选择Create HEX
3、新建源文件 选File→New→输入源程序→保存 (存在工程文件夹)
7、打开电路 板上的电源 ,
程序即开始运 行。
注意: 5、6 两步骤的 顺序不能颠倒!即在点 击Download之前要先 关掉板上的电源。
3.4 单片机应用系统C语言程序设计
单片机应用系统的程序设计有两种方法:一种 是基于汇编语言的,另一种是基于C语言的。
汇编语言程序的机器代码生成效率高,但可 读性较差,而C语言程序的可读性和可移植性远超 过汇编语言。
组成程序的若干函数可保存在一个源程序文件 中,也可保存在几个源程序文件中,最后将它们连 接在一起。
函数之间可以互相调用,但主函数只能调用 其它函数而不能被其它函数调用。
主函数是程序的入口,主函数中的所有语句执行 完毕,则程序结束。
可实现一个LED闪烁控制功能的C51源程序
C51语言程序的基本结构:
外部变量:
外部变量是全局变量,在程序执行期间一直 占有固定的内存空间。当片内RAM资源紧张时, 不建议将外部变量放在片内RAM。
外部变量被定义后,即分配了固定的内存空间, 在程序的整个执行时间内都是有效的。
通常将多个函数或模块共享的变量定义为外 部变量。
在一个函数内,要使用已在本函数外或别的程序 模块文件中定义过的外部变量时,在本函数体内 要用extern说明该变量。
硬件电路是否有问
(5)根据运行结果
题.
检查功能实现情况,
若未达系统要求,则
在μVision中修改程
序,然后重复步骤
(2)~(5),直至达到系
统要求.
3.2 μVision Vision软件的使用
1、新建一个工程(项目),并为该项目选定合适的CPU然 后保存该工程。
具体步骤: ①选Project → New Project→保 存工程
在单片机应用中,经常要访问特殊功能寄存器 中的某些位,用关键字sbit定义可位寻址的特殊功 能寄存器的位寻址对象。定义方法有如下三种:
①sbit 位变量名 = 位地址 将位的绝对地址赋给位变量名,位地址必须位于
0x80H~0xFF之间。 例:sbit CY=0xD7; //将位的绝对地址赋给变量
②sbit 位变量名 = SFR名称 ^ 位位置 当可寻址位位于特殊功能寄存器中时,可采用这种
sfr PSW = 0xD0; //定义PSW地址D0H
对于16位SFR,要使用关键字“sfr16”,定义的地 址必须是16位SFR的低端地址。 sfr16 DPTR = 0x82;//定义DPTR,其DPL = 82H
DPH=83H
注意:不能用sfr16定义定时器/计数器0和1。
sbit可寻址位
定义一个变量的格式如下: [存储种类] 数据类型 [存储类型] 变量名
C51的变量概念示意图 图中引用变量a实现了对分配内存20H单元的数据操作
(1)存储种类
存储种类是指变量在程序执行过程中的作用范围。
变量的存储种类有四种: 自动(auto) 用存储种类说明符auto定义的变量 外部(extern) 用外部种类存储符extern定义的变量 静态(static) 用存储种类说明符static定义的变量 寄存器(register)用存储种类说明符register定义的
方法。其中SFR名称必须是已定义的SFR的名字,位位 置是一个0~7之间的常数。 例: sfr PSW = 0xD0;
sbit CY=PSW^7; //定义CY位为PSW.7,位地址为 0xD7
③sbit 位变量名 = 字节地址 ^ 位位置 这种方法是以一个字节地址作为基地址,该地址必
须在0x80H~0xFF之间。 例如,sbit CY = 0xD0^7; //将位的相对地址赋给变量
始执行
DELAY:
………… ; 延时子程序(500ms)
RET
; 返回主程序
END ; 汇编程序结束
5 、下载程序到单片机并调试
(1) 在μVision中把目标程序编辑好,
(2)编译、连接无错后生成单在片程机序可反执复行检的查代无码文件,
(3) 用下载线下载到单片机系逻统辑板错中误,时,应检查
(4)运行程序
静态变量:
静态变量又分为内部静态变量和外部静态变量。
在函数体内定义的静态变量为内部静态变量, 它在该函数体内有效,但在该函数体外不可见, 这使变量在定义它的函数体外被保护,实现了离 开函数时值不会被改变。
外部静态变量是在函数外部定义的静态变量。 它在程序中一直可见,但在定义的范围之外是不 可见的。
二. 、C51语言程序结构
C语言程序由若干函数组成,其中有且仅有一 个主函数,每个函数都是完成某个特殊任务的子程 序段。
sfr特殊功能寄存器型 51系列单片机内的21个特殊功能寄存器(SFR),
分散在片内RAM区的高128字节,地址为80H~FFH。 为了能直接访问这些SFR,需要通过关键字“sfr”对 其进行定义,语法如下:
sfr sfr_name = 地址常数;
sfr_name是一个特殊功能寄存器名,“=”后面必须 是常数,其数值范围必须在特殊功能寄存器地址范围 内,即位于0x80-0xFF之间。 例如, sfr P1 = 0x90; //定义P1口地址90H
RAM,片外64KB RAM和片内外统一编址的64KB ROM。
51系列单片机逻辑存储空间示意图
C51的存储类型与存储空间对应关系表
注:一个变量除了与存储单元相对应外,还与它所在 的存储空间有关,即还需要指出其存储类型。
编译模式与存储类型 如果在定义变量时省略了存储类型标识符,C51
编译器会根据当前编译模式自动认定默认的存储类 型。编译模式共分为:小编译模式(SMALL)、紧 凑编译模式(COMPACT)和大编译模式(LARGE) 三种模式
(4)变量名
C51对变量名的规定与标准C类似,由字母、 数字和下划线三种字符组成,且第一个字符必须 为字母或下划线,变量名长度无统一规定,随编 译系统而定。
变量
自动变量:
自动变量作用范围在定义它的函数体或复合语句内 部,在定义它的函数体或复合语句被执行时,C51 才为该变量分配内存空间,当函数调用结束或复合 语句执行结束时,自动变量占用的内存空间被释放。
定义变量时若省略存储种类,则变量默认为自 动变量。通常将函数体内和复合语句中使用频繁的 变量放在片内RAM中,且定义为自动变量,可有效 利用片内RAM资源。
CALL DELAY ; 调用延时子程序 MOV P1,#0FFH ; P1口输出全1,熄灭二极管 CALL DELAY ; 调用延时子程序 DJNZ R0, LOOP ; R0减1,若不为0转LOOP处
JB P2.0, $ ; 测P2.0为高电平(无按键)则执行本行 JMP START ; 否则,有键按下,跳到START处重新开
C51增加的特殊数据类型
为了更有效地利用51单片机的内部结构, C51还 增加了一些特殊的数据类型,它们分别对应于bit、 sfr、sfr16和sbit四个关键字。
bit 位型
利用bit 位型,可定义一个位变量或位函数, 但不能定义位指针,也不能定义位数组。它的值 是一个二进制位,不是0 就是1。
第三章 单片机系统开发过程 51单片机指令系统简介
3.1 单片机系统开发过程
简单的例子:让一个发光二极管闪烁5次。
1、明确系统功能:让一个发光二极管闪烁5次。
系统启动后,一支发光二极管闪烁5次后熄灭, 当按下一个按钮开关后再闪烁5次后熄灭。 以后每次按下按钮开关,发光二极管都会闪烁5次。
2、硬件设计(单片机+外围器件)
注:C51编译器把51单片机常用特殊功能寄存器和特殊位进行
了统一定义,并存放在 “reg51.h”或“reg52.h” 头文件中,只须在 使用前用预处理命令#include <reg51.h>把这头文件包含到程序中, 就可使用殊功能寄存器名和特殊位名称。
(3)存储类型 51 系 列 单 片 机 有 三 个 逻 辑 存 储 空 间 : 片 内 低 128B
合结构化程序设计。
⑥可直接操作计算机硬件。
C语言具有直接访问机器物理地址的能力,C51 的编译器都可直接对单片机内部的SFR和I/O端口进 行操作,可以直接访问片内、片外存储器,还可以 进行各种为操作。
⑦生成的目标代码质量较高。
3.4.1 C51的程序结构
一、 C51语言概述
用C51语言编写单片机应用程序,不用具体组 织、分配存储器资源和处理端口数据,但对数据类 型与变量的定义,必须要与单片机的存储结构相关 联,否则编译器不能正确地映射定位。
C51是一种专门为51单片机设计的高级语言 C编译器,支持符合ANSI标准的C语言,同时针 对51单片机的特点做了一些特殊扩展。
C语言的主要特点:
① 语言简洁,使用方便灵活。它是程序设计语 言中规模最小的语言之一。
ANSI标准C语言只有32个关键字,9种流程控 制语句。
②程序可移植性好。
所设计的程序不依赖机器硬件。
(汇编程序:文件名.asm; C程序:文件名.c
4、为工程中添加源程序文件 在右边Project窗口单击 Source Group 1,在下拉菜单 中选 Add Files to Group‘Source Group 1’选项,
在弹出的框中选择你的源文件和文件类型,然后点击 ADD,再点击close。
生成.HEX文件后,可利 用专门的下载程序,将 此可执行程序下载到单 片机内的ROM中运行
3.3 STC-ISP V3.91 软件的使用
1、双击
, 打开在线烧录程序
2、在窗口的“MCU TYPE ”下拉菜单中选择(STC89C51RC)
3、在窗口中点
击
,
打开你系统
的.hex文件
4、在COM栏选下载端口(一般是COM1) 5、关电路板上的电源 6、点击Download,打开电路板上的电源,烧录程序,若 烧录出现问 题,点击stop。
外围器件:
一个发 光二极 管、三 个电阻、 三个电 容
一个按 钮开关
3、 搭建硬件平台
在面包板上插入器件,用导线完成电气连接。
4、 软件设计 ORG 00H ; 设置起始地址
START: MOV R0, #5 ; 循环闪烁5次,R0为计数器 LOOP: MOV P1,#00H ; P1口输出全0,点亮二极管
③表达能力强。
具有丰富的数据结构类型和多种运算符。用户 可灵活采用多种数据类型和使用各种运算符,实现 复杂运算。
④表达方式灵活。
利用 C语言的多种运算符可组成各种表达式, 还可采用多种方法来获得表达式的值,使程序设计 具有更大的灵活性。
⑤可进行结构化程序设计。 C语言以函数作为程序设计的基本单位,非常适
式中: func1
()…funcN()代 表用户定义的函数,
程序体指C51提供的 任何库函数调用语句、 控制流程语句或其它 函数调用语句。
3.4.2 C51的数据结构
1. C51的变量
变量的基本属性是变量名和变量值。在程序中定义 了变量,C51编译器就会给这个变量分配相应的存储单 元。此后变量名就与存储单元地址相对应,变量值就与 存储单元的内容相对应。
5、编译工程中的源程序,生成 .HEX(可执行)文件 在Project窗口中选 Target 1→Build Target F7, (点 击 )对源程序编译连接。(或点击 RBuild Target )
程序有语法错误时,会在输出窗口(Output Windows)中 显示错误信息和警告信息,修改编译成功后生成 HEX文件
在多文件或多模块处理中,外部静态变量只在 定义其的文件内部或模块内部有效。
寄存器变量:
通常将使用频率最高的那些变量定义为寄存器 变量,但目前已不推荐使用这种方式。
(2)数据类型 数据的不同格式叫做数据类型
有符号数据类型可以忽略signed标识符,如int 等 价于signed int , char 等价于signed char等。
ຫໍສະໝຸດ Baidu
②在弹出窗口中选所需CPU(如选ATMEL),双击该.CPU.
③选AT89S51, 并确定。
2、设置工程,使编译、连接后能生成可执行代码文件
右击
→Options for ‘Target 1’
在弹出的窗口选
→选择Create HEX
3、新建源文件 选File→New→输入源程序→保存 (存在工程文件夹)
7、打开电路 板上的电源 ,
程序即开始运 行。
注意: 5、6 两步骤的 顺序不能颠倒!即在点 击Download之前要先 关掉板上的电源。
3.4 单片机应用系统C语言程序设计
单片机应用系统的程序设计有两种方法:一种 是基于汇编语言的,另一种是基于C语言的。
汇编语言程序的机器代码生成效率高,但可 读性较差,而C语言程序的可读性和可移植性远超 过汇编语言。
组成程序的若干函数可保存在一个源程序文件 中,也可保存在几个源程序文件中,最后将它们连 接在一起。
函数之间可以互相调用,但主函数只能调用 其它函数而不能被其它函数调用。
主函数是程序的入口,主函数中的所有语句执行 完毕,则程序结束。
可实现一个LED闪烁控制功能的C51源程序
C51语言程序的基本结构:
外部变量:
外部变量是全局变量,在程序执行期间一直 占有固定的内存空间。当片内RAM资源紧张时, 不建议将外部变量放在片内RAM。
外部变量被定义后,即分配了固定的内存空间, 在程序的整个执行时间内都是有效的。
通常将多个函数或模块共享的变量定义为外 部变量。
在一个函数内,要使用已在本函数外或别的程序 模块文件中定义过的外部变量时,在本函数体内 要用extern说明该变量。
硬件电路是否有问
(5)根据运行结果
题.
检查功能实现情况,
若未达系统要求,则
在μVision中修改程
序,然后重复步骤
(2)~(5),直至达到系
统要求.
3.2 μVision Vision软件的使用
1、新建一个工程(项目),并为该项目选定合适的CPU然 后保存该工程。
具体步骤: ①选Project → New Project→保 存工程
在单片机应用中,经常要访问特殊功能寄存器 中的某些位,用关键字sbit定义可位寻址的特殊功 能寄存器的位寻址对象。定义方法有如下三种:
①sbit 位变量名 = 位地址 将位的绝对地址赋给位变量名,位地址必须位于
0x80H~0xFF之间。 例:sbit CY=0xD7; //将位的绝对地址赋给变量
②sbit 位变量名 = SFR名称 ^ 位位置 当可寻址位位于特殊功能寄存器中时,可采用这种
sfr PSW = 0xD0; //定义PSW地址D0H
对于16位SFR,要使用关键字“sfr16”,定义的地 址必须是16位SFR的低端地址。 sfr16 DPTR = 0x82;//定义DPTR,其DPL = 82H
DPH=83H
注意:不能用sfr16定义定时器/计数器0和1。
sbit可寻址位
定义一个变量的格式如下: [存储种类] 数据类型 [存储类型] 变量名
C51的变量概念示意图 图中引用变量a实现了对分配内存20H单元的数据操作
(1)存储种类
存储种类是指变量在程序执行过程中的作用范围。
变量的存储种类有四种: 自动(auto) 用存储种类说明符auto定义的变量 外部(extern) 用外部种类存储符extern定义的变量 静态(static) 用存储种类说明符static定义的变量 寄存器(register)用存储种类说明符register定义的
方法。其中SFR名称必须是已定义的SFR的名字,位位 置是一个0~7之间的常数。 例: sfr PSW = 0xD0;
sbit CY=PSW^7; //定义CY位为PSW.7,位地址为 0xD7
③sbit 位变量名 = 字节地址 ^ 位位置 这种方法是以一个字节地址作为基地址,该地址必
须在0x80H~0xFF之间。 例如,sbit CY = 0xD0^7; //将位的相对地址赋给变量
始执行
DELAY:
………… ; 延时子程序(500ms)
RET
; 返回主程序
END ; 汇编程序结束
5 、下载程序到单片机并调试
(1) 在μVision中把目标程序编辑好,
(2)编译、连接无错后生成单在片程机序可反执复行检的查代无码文件,
(3) 用下载线下载到单片机系逻统辑板错中误,时,应检查
(4)运行程序
静态变量:
静态变量又分为内部静态变量和外部静态变量。
在函数体内定义的静态变量为内部静态变量, 它在该函数体内有效,但在该函数体外不可见, 这使变量在定义它的函数体外被保护,实现了离 开函数时值不会被改变。
外部静态变量是在函数外部定义的静态变量。 它在程序中一直可见,但在定义的范围之外是不 可见的。