当前位置:文档之家› 单片机程序设计编程规范

单片机程序设计编程规范

单片机程序设计编程规范
单片机程序设计编程规范

单片机程序设计编程规范

本规范适用于松翰科技 8-bit MCU部门汇编程序编写准则,同样适用于代理商及重要客户工程师编程规范参考。本规范的目的为统一编程风格,保证程序编写质量,提高程序的可移植性和维护性。

大部分的规范严格, 品质要求高的软件公司对员工编写代码的风格都有硬性规定, 例如缩排的使用,TAB 的长度,函数变量的命名方式。这些规定的明显好处是可以统一规范不同程序员所编制的代码,提升程序代码的可读性与可维护性,同时统一格式的编程风格也为code review提供方便。

目录

一、设计总则

二、排版风格

三、程序可读性及可维护性

四、注释

五、变量命名规则

六、常量命名规则

七、标号命名规则

八、文件命名规则及文件分割

九、标准程序模块

十、附录

一、设计总则

1.程序质量的评估

程序的优劣可以从两个方面进行评估,定量指标和定性指标。

定量指标包括:

1) 程序代码执行效率;

2) 程序占用资源多少。

定性指标包括:

1) 可调试性,即是否方便排除程序语法错误;

2) 可测试性,即是否方便验证程序功能的正确性;

3) 可维护性,即是否方便程序的修改和升级;

4) 可移植性;

5) 可读性。

2、程序架构

为了便于维护和移植,推荐使用层次化的软件设计方法。可把整个软件分为三层:应用层、界面层和底层驱动层。各层之间的关系如下图所示。

层次化设计说明:

1) 底层驱动层主要包含直接和硬件相关的驱动程序,如数码管显示、按键、峰鸣器、继电器和电机控制等。底层的各个模块间要保持各自的独立性,不产生直接的数据交互,底层也不直接访问应用层,如果有需要,都要通过界面层进行数据交互。

2) 界面层主要提供数据交互,为应用层和底层驱动之间以及底层驱动层各模块之间提供数据的交互。

3) 应用层主要完成具体功能的实现,它要通过界面层控制底层驱动层各模块来完成所需功能,而不能越过界面层直接访问底层驱动层。所有的用户接口要在应用层来实现。

4) 一个好的架构必须将底层硬件包装起来,为应用程序提供一组丰富的函数操作(buffer or parameter),例如在中断的处理中,应用程序不需要资料中断的堆栈如何保护不需要知道地址操作, 只需要读取中断产生的旗标动作。

5) 在即时性软件系统里面,对达到高效率的实时性与反应力, 所以程序使用大量的事件触发方式来设计任务。事件有可能来自外部的触发(key , rxdata , sensor detect, …)也可能是系统内部自行产生的(Timer, alarm, flag),与事件触发方式相对应的是定时查询方式(polling),一般来说polling 效率较差因为有多余的动作而且系统反应时间与查询polling时间间隔有关, 但是在小型的MCU系统里面用Polling方式反而简单许多。

3、设计基本原则

1) 尽量减少各个子程序功能模块间的耦合度(耦合度是指一个程序的执行对另一个程序的影响力),保证各自的独立性。一般情况下,建议子程序模块功能的划分要尽可能细化,功能尽量单一,减少子程序模块间的数据交互。

2) 在满足功能需求的情况下,可适当牺牲代码的执行速度,以保证程序的透明度。

3) 主要子程序模块间的交互,要通过特定的界面跟应用层进行沟通,可使用 FIFO(First in,First out)或是 Buffer 两种方式。每种子程序模块都可以有自己的FIFO。例如:就按键来说,一般有 Key buffer、Key FIFO 或直接进入AP FIFO三种设计方式。

Key buffer:一般用于保存数字按键信息。例如:在电话机的设计中,需要记录按键内容用于LCD 显示、最后数字确认、数字存储等,这时候需要把按键值的信息(0123456789*#)记录在 Key buffer 中。

Key FIFO:一些功能按键可以将相应信息列入到Key FIFO中,等待应用层的取用,这样可根据不同的工作模式进行不同的处理及动作。

这些类似的观念可以应用在许多周边中:

输入类:Key、RF Data input、UART data input、Switch input等。

输出类:LCD display、LED display、UART data output等。

APP FIFO(应用界面层):主要是将发生的事件储存在APP FIFO里面等待适当的时间依序处理,不然有可能造成系统在某一程序物件里面循环,从而降低系统的实时性(Real-Time)。

4)每个子程序模块只能有唯一一个程序入口地址在程序的首部,只能有唯一一个程序出口地址在程序的尾部。

例如:

以下的写法是不规范的(两个RET出口,存在调试时不易设立断点,程序可读性降低等问题):

lable:

b0bts0 fz

ret

clr y

ret

应该改为(只有一个出口位置,标号为 lable90,便于程序检查):

lable:

b0bts0 fz

jmp lable90

clr y

lable90:

ret

5) 上电复位时要对所有的RAM空间进行初始化(建议用户寄存器清零,系统寄存器进行必要设定),不要使用未经初始化的变量。RAM未经过完整的初始化,容易导致程序执行的不确定性,这一不良现象往往在批量生产中有所体现。(这点是工程师经常犯错的地方,须特别注意)

6) 系统中如果需要等待一些未知的应答信号,如通信或等待输入信号时,必须进行超时或异常处理,以防止程序进入“死等”状态。

例如在红外接收中,由于信号的突然消失或干扰从而无法得到一帧完整或正确的信息,这时需要复位接收程序的入口条件并退出接收程序,而不是一直等待信号的来临。不然无法进行下次接收甚至会影响到其它程序的执行。

7) 通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。这种方式是解决软件空间效率的根本办法。

8) 保证循环体内的工作量最小化。应仔细考虑循环体内的语句是否可以放

在循环体之外,使循环体内工作量最小,从而提高程序的执行效率。

9) 在多重循环中,应将最忙的循环放在最内层。

10) 中断处理程序应尽量短。有效的作法为:在中断中进行标记,在主程序中进行处理。但一些实时性要求较高的程序例外。此外,进入中断时应该保存涉及到的变量和寄存器。

11) 看门狗的正确使用。看门狗主要用于微控制器死机时的时间溢出复位,需要程序适时清除。正确的处理方式为:整个系统程序中尽量保证只有一处清看门狗位置,而且应处在主循环的主干位置。切记不可在定时中断中清狗,因为微控制器有时只是在主循环中死掉。(所有AC电源的应用程序都必须强迫加入看门狗选项尤其是条件式的看门狗有利于系统发生异常后的重启动)

二、排版风格

1、程序采用缩进风格编写,缩进为1个Tab 键,1个Tab键定义为8个空格位。

2、程序中的标号要从第一列开始书写。以“.”开头的预编译命令也要从第一列开始书写,其他预编译命令采用缩进风格编写。

例如:

1) 以“.”开头的预编译命令要从第一列开始书写,其他预编译命令采用缩进风格书写。

.LIST ;从第一列开始书写

INCLUDESTD macro1.h

.CONST

NUMBER EQU 55h

.DATA

wk00 DS 1

.CODE

ORG 0h

2) 标号要从第一列开始书写。

main: ;从第一列开始

jmp main ;缩进8个空格位

3)变量或常量的定义采用缩进风格。

例如:

.DATA

keybuf DS 1

.CONST

NUMBER EQU 8

4)定义变量或常量时,变量名或常量名与命令符之间使用2个Tab键(相当于16个空格位)分开,命令符与后面的操作数用1个Tab键(相当于8个空格位)分开。

例如:

keybuf DS 1

NUMBER EQU 55h

5)操作码与操作数之间用1个Tab键(相当于8个空格位)分开。

例如:

ORG 80h

mov a,NUMBER

table:

DW 1234h

6.)程序中两个操作数之间用一个“,”作为分隔符,“#”号与立即数之间不需要分隔符。

例如:

Mov a,#55h

7)标号要单独占一行。

8)相对独立的程序块之间必须加空行。

例如:

ORG 10h

INCLUDE sys.asm

INCLUDE int.asm

INCLUDE key.asm

9)程序语句后面若有注释,所有的注释要遵守上下对齐的原则。

例如:

b0mov l,#7fh ;use dp0x(hl) pointer

mov a,#00 ;set pointer = 007fh

应该书写为:

b0mov l,#7fh ;use dp0x(hl) pointer

mov a,#00 ;set pointer = 007fh

三、程序可读性与可维护性

1.程序中的语句、标号、变量使用小写英文字母,常量与预编译命令使用大写英文字母,以便和一般的语句进行区分。

例如:

NUMBER EQU 55h

.DATA

accbuf DS 1

.CODE

mov a,#NUMBER

2.表示不同进制的立即数,要在立即数后面加上不同的进制符号。

例如:

mov a,#00100011b

mov a,#23h

不建议使用:

mov a,#0x23

3.一般情况下,变量和常量要分开定义,不要混在一起。变量在“.DATA ”段中定义,采用命令符“DS” ,常量在”.CONST ”段中定义,采用命令符“EQU”。例如:

.CONST

NUMBER EQU 10

.DATA

Accbuf DS 1

4.程序中不使用未定义或意义不明确的常量。

例如:

下面的赋值方法要避免使用:

mov a,#3 ;不要直接使用意义不明确的数字

在常量中做定义

mov r,a

建议采用如下赋值方法:

.CONST

NUMBER EQU 3 ;循环次数

.CODE

mov a,#NUMBER

mov r,a

5.整个程序的结尾要以“ENDP”语句结束。

6.当一段代码在程序中有多个地方使用时,建议采用子程序调用或宏命令的方式来替代。如此,对该代码段的修改就可在一处完成,增强代码的可维护性。

7.程序中关系较为密切的子程序代码尽可能相邻。

8.避免程序中的垃圾代码,预留代码应以注释的方式出现。程序中的垃圾代码不仅占用额外的空间,而且还可能影响到程序的功能与性能,很可能给程序的测试、维护等造成不必要的麻烦。

四、注释

1.程序应该包括两个部分注释,说明部分和语句注释。一般情况下,源程序有效注释量必须在30%以上。

2.说明部分:

1) 源文件说明部分位于每个源文件的最前面,主要描述:文件名、作者、

生成日期、联络方式、功能描述、版本号、软硬件平台、版权说明、修改记录等的简要说明,以英文书写。

例如:

/**********************************

File name: ;文件名Author: ;作者

Date: ;日期

Email: ;邮箱地址

Description: ;功能描述

Version: ; 版本号

Hardware&IDE ;软硬件平台

Copyright (C), SONIX TECHNOLOGY Co., Ltd.

History: ;修改记录

**********************************/

2)子程序说明部分位于每个子程序的最前面,主要描述:子程序名称、功能、设计原理、所用变量、入口条件、出口信息、调用模块、堆栈层数、影响资源、算法简述、使用说明和修改记录等。

例如:

/*****************************

Subroutine: ;子程序名称

Description: ;子程序功能的描述

Principium: ;程序设计原理

Calls: ;被本子程序调用的子程序清单Variables: ;本子程序中所用到的临时变量Input: ;子程序调用所需要基本参数的说明Output: ;子程序调用后运算结果的说明Stack: ;占用的堆栈层数

History: ;修改记录

******************************/

3.边写代码边注释,修改代码的同时修改相应注释,以保证注释与代码的一致性。不再有用的注释要删除。

4.要避免在注释中使用缩写,特别是非常用缩写。

5.程序在必要的地方必须有注释,注释要准确、易懂、简洁。注释要有意义,如果有需要,还要详细描述相关含义。

例如:

以下是无意义的注释

mov a,#5 ;把5 赋给 acc

mov wk00,a ;把 acc 赋给 wk00

应该如下注释:

mov a,#5 ;设置循环次数为5 次

mov wk00,a

6.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)的相邻位置,不可放在下方,如放于上方则需与其上面的代码用空行隔开。

例如:

clr wk00

; Check Read index = FiFo Limit

cmprs a,r ;Is Read index = Limit

Jmp @f

7.注释格式尽量统一,对多行注释建议使用“/* …… */”,对单行的注释建议使用“;”。

8.注释应考虑程序易读及外观排版因素,语言尽量统一。对不能进行准确英文表达的建议使用中文。

9.对有含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。

五、变量命名规则

1.变量的名称要采用有意义的英文单词小写缩写。可以采用以下几种方式进行缩写命名:

1)去掉所有不在词头的元音字母。如 screen可以简写为scrn。

2)使用每个单词的头几个字母。如 channelactivation 可以简写为chanactiv。

3)使用变量名中具有典型意义的单词。如 numberofcycle 可以简写为cyclenumber。

4)去掉无用的单词后缀 ing、ed 等。如 pagingrequest 可以简写为pagreq。

5 )尽量使用标准或惯用的缩写形式,缩写应该保持一致性。如 serial peripheralinterface 可以简写为 spi。

6)部门已经完成函式的变量名称, 如果没有特别原因, 发展人员延续使用以增加可读性

2.在定义部分要加入注释来说明变量的含义。

3.变量的定义要在“.DATA”段中。

4.变量标识符的长度不超过16 个字符。

5.序会用到起码三种变量

1)全局变量名称前面不加任何修饰。

2)局部变量利用 wk00 , wk01 ….wk0n 来表示, 每个独立程序里面用到的Local var.可有效节省RAM。

3)中断局部变量中断里面用的 Interrupt local var.利用 Iwk00, Iwk01 以作为区隔(注意中断使用的变量必定要小心的跟主程序区隔开,不然影响系统稳定性相当大)。

例如:

.DATA

accbuf ds 1 ;全局变量

l_number ds 5 ;局部变量

6.位定义。程序多处会经常对寄存器的某一位进行操作,可以在变量定义时对需要用到的位进行定义,建议名称以”f_”开头。

7.临时工作寄存器的定义。程序中经常需要用到一些临时存储数据的寄存器,我

们称之为临时工作寄存器,这些临时工作寄存器的命名方法为“wk”加上一个二位数字组成,这个数字可以从“00”开始随着需要定义的临时工作寄存器的数量的增加而增加。需要特别说明的是,临时工作寄存器的使用可以大量节省 RAM 空间,但是要注意相应的生命周期,必须在子程序退出之前,将空间释放以便其它子程序使用。

8.在中断处理程序中用到的寄存器,为了和一般的临时工作寄存器作以区分,可以在寄存器前面加英文字母“i”来命名。在使用时需要加以注意,不要和主程序中的变量复用。

例如:

.DATA

wk00 ds 1

wk01 ds 1

wk02 ds 1

iwk00 ds 1 ;中断中要用到的临时工作寄存器iwk01 ds 1 ;中断中要用到的临时工作寄存器…

.CODE

Mov a,r

Mov wk00,a

mov a,wk01

mov r,a

六、常量命名规则

1.常量的名称要采用有意义的英文单词大写缩写。

2.常量要定义在“.CONST”段中。

3.在定义部分要加入注释来说明常量含义。

4.量标识符的长度不超过16个字符。

5.系统寄存器中常用到的某些位可以再额外进行定义,但要有意义:

P_key1 EQU P1.0 ;P_ 打头表示为 Port 定义

Pm_key1 EQU P1m.0 ;Pm_ 打头表示为 Port 方向定义

七、标号命名规则

1.标号的名称要采用有意义的英文单词小写缩写。

2.子程序标号定义。在同一个子程序中,所有的标号应该有规律可寻。建议第一个标号为子程序名,下面所用到的标号用子程序名添加数字表示,从而便于今后程序的添加和修改。数字尽量使用两位数,在子程序的退出位置,数字一般为”90”。

例如:

在一段按键扫描程序中,如下的标号是不可取的。

Label:

LabelOK

LabelFail

LabelQuit

Labelfun:

LabelEnd:

Ret

(设计师要花许多精神命名label, 同时不容易看出子程序的结构关西,所以建

议在子程序里面别在花精神命名,都用号码表示)(详细的动作都用注解来说明)应该改为:

;***************************************************

;Sub-routine , Name : label

;***************************************************

Label:

If the condition fail then go to Label90

;program begin here

Label10:

;注解都写在这里

Label20:

;最后结尾结束的label都用90当做结尾

:有助于程序的阅读

Label90:

Ret

3.为了使程序的结构更加清晰,子程序的命名要尽量能显示出相互间的调用关系。由 main 主循环中直接调用的程序,要以“mn_”作为标号的开头,下面仅列出一些常用的子程序名称,其它类似情况可同样处理。

mn_app ;系统应用程序

mn_intgnd ;中断与主程序之间的界面子程序

mn_key ;按键扫描子程序

mn_lcd ;LCD 显示子程序

mn_led ;LED 显示子程序

mn_tone ;声音处理子程序

mn_epp ;EEPROM 读写操作

mn_bio ;基本输入/输出控制

mn_adc ;ADC 输入及处理

mn_debug ;debug 处理程序

4.程序的几个常用入口地址命名如下:

复位入口: reset

中断入口: isr

主程序入口: main

例如:

org 0

jmp reset

org 8

jmp sr ;ISR(Interrupt Service Routine)

org 10

;有效程序开始地址

reset:

;进入主程序前的一些准备工作(预处理)

premain:

;主程序循环圈

main:

Jmp main

八、文件名的命名规则及文件分割

1.在一个项目中要包括两种文件:源文件和头文件。源文件是程序体,扩展名为“ .asm ”,头文件包括了变量、常量、宏命令的定义,扩展名为”.inc”。

2.头文件的命名

头文件用三个不同的文件来分别定义常量、变量、宏命令,其命名方法如下:常量定义文件: xxx_equ.inc

变量定义文件: xxx_ram.inc

宏命令定义文件: xxx_macro.inc

其中,xxx 表示项目的名称。

例如:

作一个电话机的完整程序,头文件可如下定义:

常量定义文件: phone_equ.inc

变量定义文件: phone_ram.inc

宏命令定义文件: phone_macro.inc

3.源文件分为主文件、子文件。主文件包括了项目的主程序,它描述了芯片信息、CODEOPTION 信息及项目包含的其它子文件模块。子文件是由各个子程序模块组成,功能相近的子程序要放在一个文件中,文件名可以用“项目名+模块功能的缩写+扩展名”表示。下面列举一些常用的文件名:

主程序文件: xxx_main.asm

常用的子文件定义:

中断服务程序模块: xxx_int.asm

进程处理模块: xxx_pro.asm

系统处理程序: xxx_sys.asm

按键处理模块: xxx_key.asm

LCD显示模块: xxx_lcd.asm

其中,xxx 表示项目的名称。

九、标准程序模块

常用功能模块尽量采用附件提供的标准程序,如果无法使用标准的程序模块,那么所编写的程序一定要符合规范要求。所提供的标准程序如下,详细的源代码在附录中。

1. mn_key ;单键扫描子程序

2. mn_mulkey ;多键处理子程序

3. mn_tone ;声音处理子程序

4. mn_lcd ;LCD 显示子程序

5. mn_i2c ;I2C 操作子程序

6. mn_sio ;SIO 操作子程序

7. mn_1wire ;单总线操作子程序

8. mn_uart ;UART 子程序

9. wr_fifo ;写 FIFO

10. rd_fifo ;读 FIFO

11. ram2ram ;RAM 到 RAM 的数据传递

12. rom2ram ;ROM 到 RAM 的数据传递

13. math ;基本运算程序

实例说明

1.初始化

1)当程序上电复位时,一个完整的用户寄存器初始化或清零动作是非常重要的,否则容易造成程序执行的不确定性。

例如:

pre_clrRAM:

b0mov y,#0 ;清 RAM bank0

b0mov z,#48

@@:

Clr @yz

decms z

jmp @b

clr @yz

ret

2) 系统寄存器必须进行初始化,比如说 I/O 口方向和输出电平等。需要特别说明的是输出口的初始化必须按照下列顺序来处理:

(1) 设定相应 I/O 口输出高低电平

(2) 将相应 I/O 口为输出口如此可确保 MCU 的 I/O 口从输入模式转为输出模式时不会有脉冲的存在。而在 I/O 口控制频繁变化(如通信)时更要引起注意。

例如:

(3) mov a,# 11111111b

;如果 p1.0 和 p1.1 原来为输入高电平,当直接切换为输出方式时会有高电平脉冲的输出,而这不是所希望的。

b0mov p2m,a

mov a,# 11111100b

b0mov p2,a

(4) mov a,#00001100b

b0mov p2,a

;这样处理 p1.0 和 p1.1 就避免了高电平脉冲的输出

mov a,#11111111b ;

b0mov p2m,a

开机时后IO toggle的作法:

利用暂时没有用到的IO 做 toggle 可有效观察以下几点

1) 系统是否正常开机

2) 是否发生 reset or watchdog reset 现象

3) 程序是否重头运行

观察IO toggle pulse width 可以了解 Internal RC频率的准确性或是协助调整外部RC数值

以上方法可以有效协助量产生产问题

开机时后 Test Mode 的作法:

Test Mode 必须在开机时后按下某些组合按键同时通过de-bounce 才可进入test mode

2.按键处理

1)一般来说key的处理是所有程序的基础教科书里面所教导的key处理观念大多以delay 循环与多次检查来处理弹跳事件,但是此种方法由于导入delay 循环大大降低系统实时性,而大多使用者都没有警觉此问题依然延续此观念设计 key scan and de-bounce 技巧,此份文件详细叙述key处理观念。

2)家电产品中经常用到抗干扰的测试EFT ,会从电源端打入噪声测试系统抗噪声能力, 如果 key 处理不好会有key误动作产生,一般使用者会在key scan 地方加入电容以减低此问题的产生,但是此方法还是无法完全避免此问题同时还增加硬件成本,这里提出的de-bounce 观念可以完全解决此问题。

3)按键处理很多程序员都会将系统的程序设计与key程序结合没有分开结构,这造成很多程序就以key程序变成程序主体来运行,这里提出将 key 动作得出的 keycode 到 fifo(first in first out)中,使得AP系统得以在有空闲的时候才处理 key code 动作 ,程序架构自然形成。

4)一般来说 key 处理都只侦测key down ,但是在某些系统确有key down and keyup 的要求,这方面可以透过 key in buffer 的储存new/old buffer XOR 比对得到key event,更深一层的技巧侦测多按键处理更是需要利用 new/old buffer XOR 来处理合理的按键处理一般包括按键扫描、按键弹跳处理、按键输出转换等环节。

例如:

mn_key:

call keyin ;读取按键输入将资料储存在 keyinbuf 里面

Call keychk ;按键弹跳处理

Call keycvt ;弹跳处理后,将按键扫描码转换储存到 FIFO里面!

ret

①keyin――按键扫描,其主要负责将外部按键信息读入到内部 buffer中。常用的按键一般包括:直接按键、M*N 矩阵式扫描按键、三角形按键、扩充按键、按键与其它周边共享I/O 脚位等,部分场合还要考虑睡眠和按键的唤醒功能。下面进行分别说明:

1)直接按键

最简单的按键方式, 通常作法利用 MCU 里面的 pull-up 电阻上拉,外面按键落地,平时没有按键的时候, MCU input 端口读到 Hi , 按键按下时候读到Low, 如下图所示:

2) M*N 矩阵式扫描按键

最典型的按键扫描方式, 有分 Single key , multi-key 扫描。

单按键扫描 : 一个时间只允许一个按键动作同时也只读取一个按键。

多按键扫描: 一个时间允许一个以上的 key 按下, 但是只读取最新按下的按键。

扫描注意事项 : 一般来说扫描的作法有 Output port and input port 配合

Output port 1110

1101

1011

0111

依序送出0信号让 input port 读取, 但此时可能发生两件冲突事件需要注意

如果用 output 0 and output 1 的组合来送出 scan pattern ,当客户同时按下同一排两组按键的时候,会有短路现象, 传统作法是加入二极管 diode 来保护, 现在单片机的作法则是利用 output à input pull-up R 的方式来达成。见图面说明

但是当使用 Input pull-up R 时候又有另外一件事情要注意就是当1110 à 1101 时候 , bit0 =output 0 à input pull-up 1 ,必须是 bit 0 = output 0 à output 1 à input pull-up 中间必须经过output 1的动作,这动作要协助output 0的信号直接快速拉至Hi准位,然后再切换入 inputmode,如果直接output 0 à input mode,此时会有一个较长的上升时间,导致 key scan错误

3) 三角形按键效的增加扫描按键数目,见图面说明

4) 扩充按键可以加上 diode 增加 key scan 数目见图面说明

5) 按键与其它周边共享 I/O 脚位

6) ADC 与 RF 接收机杂音避免的方式

②keychk――按键弹跳处理,其主要负责滤除按键输入口灌入的杂讯或按键弹跳杂波。

1)一般建议弹跳时间处理约在70mS ~100mS , EFT 特性如果要好可以更加长到使用者可接受到最常时间 200mS。

2)弹跳时间的处理并非用 delay loop 延迟, 这会降低系统的实时性与反应力必须检查的动作放在主程序循环里面配合 keychat time 的递减来完成。

3)如果主循环绕圈时间 1mS 那按键稳定检查连续次数可高达100次左右这对于Key 处理来说是非常稳定的。

4)弹跳的检查是连续检查 key 变化后维持相同状态100mS , 比如说 key 按下后Hi 变成 Low 这时候程序侦测到输入有异动便开启检查时间机制 ,当程序连续检查100mS都发现 Low 没有改变的时候便发出 key event , 此时才有按键发生。

5)关于 de-bounce 的程序验证可透过修改弹跳时间测试, 比如说故意将弹跳时间改1sec. 观察在一秒内的按键动作是否都不成立, 只有按键持续达一秒以上才有动作产生, 确认后再将弹跳时间改回。

③keycvt――按键输出转换,其主要负责将确认的按键信息进行转换和存储。

1) KeyCVT 主要工作将经过de-bounce 的 keybuffer 跟之前所得到的 key 相比对,

看看新的 key event为何,转换出来后存储到 keybuffer or keyfifo 甚

单片机 查表程序设计实验

2.4 查表程序设计实验 2.4.1 实验目的 学习查表程序的设计方法,熟悉 51 的指令系统。 2.4.2 实验设备 PC 机一台,TD-NMC+教学实验系统、或“TD-PIT++教学实验系统+TD-51 系统平台”、或 “TD-PITE 教学实验系统+TD-51 系统平台” 2.4.3实验内容 1. 通过查表的方法将 16 进制数转换为 ASCII码; 2 2. 通过查表的方法实现y=x ,其中x为 0~9 的十进制数,以BCD码表示,结果仍以BCD 码形式输出。 2.4.4 实验步骤 1. 采用查表的方法将 16 进制数转换为 ASCII 码 根据 ASCII码表可知,0~9 的 ASCII码为 30H~39H,A~F的 ASCII码为 41H~46H,算 法为(假定待转换的数存放在 R7 中): 当 R7≤9 时,相应的 ASCII码为:R7+30H; 当 R7>9 时,相应的 ASCII码为:R7+30H+07H。 实验程序清单:(Asm4-1.asm) ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV DPTR, #ASCTAB ;表格首地址送DPTR MOV A, R7 ;R7中为待转换的数 ANL A, #0FH ;取低4位 MOVC A, @A+DPTR ;查表 MOV R5, A ;低4位转换结果送R1 MOV A, R7 ANL A, #0F0H ;取待转换数的高4位 SWAP A ;高4位与低4位交换 MOVC A, @A+DPTR ;查表 MOV R6, A ;高4位转换结果送R2 SJMP MAIN ;设置断点观察结果 ;ASCII码表 ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H, 46H END 实验步骤: (1)编写实验程序,编译、链接无误后联机调试; (2)将待转换的数存放在 R7 中,如令 R7 中的值为 0x86;

C程序设计题库

填空题 20*2 ■对于51系列单片机,现有4种语言支持程序设计,它们是(汇编语言)、PL/M、(C语言)、BASIC。 ■单片机程序设计时需要在主程序中设计死循环来防止程序跑飞。在C语言中采用(while(1))或for(;;)语句实现死循环。 ■单片机程序设计中经常用到中断,在C语言程序设计中外部中断1的中断入口序号(2),而汇编语言程序设计中外部中断1的入口地址是(0013H)。 ■编写串口中断程序时要在函数说明部分后写interrupt 4 。 ■编写定时器0中断程序时要在函数说明部分后写interrupt 1 。 ■C语言程序设计中有一个无符号形字符变量temp和一个位变量Flag,现在分别对它们取反。相应的语句为temp=__~___temp; Flag=_!___Flag;。 ■I2C总线在传送数据过程中共有三种类型控制信号,它们分别是:_(起始信号)____、应答信号、_(停止信号)_____。 ■I2C的地址由(协议规定)与(硬件设置)两部分组成。 ■I2C器件的两条信号线分别为串行时钟线SCL 与串行数据线 SDA 。 ■MCS-51单片机操作I2C器件时,单片机必须做为主机,I\O编程。 ■在Cx51所有的数据类型中,只有bit 与unsigned char 直接支持机器指令。 ■编译器性能比较有如下几个方面:算数支持、生产代码大小、开打速度、支持浮点和long 。 ■在KEIL开发套件中,BL51链接器/定位器用于创建一个绝对目标横快。 ■Cx51中函数分为两大类:标准库函数和用户自定义函数。 ■在函数名前如果不指定函数类型,则该函数的类型为整型。 ■具有一定格式的数字或数值叫做数据,数据的不同格式叫做数据类型, 数据按一定的数据类型进行的排列、组合及架构称为数据结构。 ■数据类型的转换有自动转换与强制转换两种。 ■直接出现在程序中的数值(如TMOD=0x21)称为常数。在程序运行的过程中,其值不能改变且被定义为符号的(如#define CONST 60)称为常量。 ■软件对常量与变量的命名规范是:常量名用大写字母,变量名用小写字母。 ■MCS-51单片机串口用于中断通讯时,在进行初始化时必须设置的特殊功能寄存器有:

单片机原理与应用及C51程序设计实验报告

《单片机原理与应用及C51程序设计》 实验报告

一.软件仿真 1.实验要求 基本要求:用串口输出“hello word”语句。增加的要求:延时或定时输出语句,采用查询/中断的方式控制启动/停止。 2.源程序: (1).采用延时函数,延迟输出语句,p0_0控制启动/停止。 #include #include sbit p0_0=P0^0; void Delay(unsigned int Delaytime); void main(void) { SCON = 0x50; //串口方式1,允许接收 TMOD = 0x20; //定时器1 定时方式2 TCON = 0x40; //设定时器1 开始计数 TH1 = 0xE8; //11.0592MHz 1200 波特率 TL1 = 0xE8; TI = 1; TR1 = 1; //启动定时器 while(1) { if(p0_0==0) {Delay(10000); printf ("Hello World!\n"); //显示Hello World } } } void Delay(unsigned int Delaytime) {unsigned int j=0; for(;Delaytime>0;Delaytime--) for(j=0;j<100;j++); } (2).采用定时器定时,延迟输出语句。P0_0控制启动/停止。 #include

#include sbit p0_0=P0^0; #define uchar unsigned char #define uint unsigned int uchar count; void main() { SCON = 0x50; //串口方式1,允许接收 TMOD = 0x21; TCON = 0x40; //设定时器1 开始计数 TH1 = 0xE8; //11.0592MHz 1200 波特率 TL1 = 0xE8; TH0=0X3C; TL0=0XB0; EA=1; ET0=1; TI = 1; TR1 = 1; //启动定时器 while(1) { if(p0_0==0) { TR0=1; if(count==200) { count=0; printf("hello world!\n"); } } } } void timer0()interrupt 1 { TH0=0X3C; TL0=0XB0; count++; } 3.实验心得: 第一次实验不需要硬件实现,只需要用软件仿真,串口输出“hello word”语句就ok,所以此次实验比较简单,不需要费太多时间就能把实验完成。 二.键控流水灯 1.实验要求: 8051单片机的P1口的P1.0—P1.7分别接有LED(D1—D8),当某一端口输出,为“0”

单片机c语言设计试题答案

单片机C语言程序设计师试题 一、填空题 1、设X=5AH,Y=36H,则X与Y“或”运算为_________,X与Y的“异或”运算为________。 2、若机器的字长为8位,X=17,Y=35,则X+Y=_______,X-Y=_______(要求结果写出二进制形式)。 3、单片机的复位操作是__________(高电平/低电平),单片机复位后,堆栈指针SP的值是________。 4、单片机中,常用作地址锁存器的芯片是______________,常用作地址译码器芯片是_________________。 5、若选择内部程序存储器,应该设置为____________(高电平/低电平),那么,PSEN信号的处理方式为__________________。 6、单片机程序的入口地址是______________,外部中断1的入口地址是_______________。 7、若采用6MHz的晶体振荡器,则MCS-51单片机的振荡周期为_________,机器周期为_______________。 8、外围扩展芯片的选择方法有两种,它们分别是__________________和_______________。 9、单片机的内部RAM区中,可以位寻址的地址范围是__________________,特殊功能寄存器中,可位寻址的地址是____________________。 10、子程序返回指令是________,中断子程序返回指令是_______。 11、8051单片机的存储器的最大特点是____________________与____________________分开编址。 12、8051最多可以有_______个并行输入输出口,最少也可以有_______个并行口。 13、_______是C语言的基本单位。 14、串行口方式2接收到的第9位数据送_______寄存器的_______位中保存。 15、MCS-51内部提供_______个可编程的_______位定时/计数器,定时器有_______种工作方式。 16、一个函数由两部分组成,即______________和______________。 17、串行口方式3发送的第9位数据要事先写入___________寄存器的___________位。 18、利用8155H可以扩展___________个并行口,___________个RAM单元。 19、C语言中输入和输出操作是由库函数___________和___________等函数来完成。二、选择题 1、C语言中最简单的数据类型包括()。 A、整型、实型、逻辑型 B、整型、实型、字符型 C、整型、字符型、逻辑型 D、整型、实型、逻辑型、字符型 2、当MCS-51单片机接有外部存储器,P2口可作为 ( )。 A、数据输入口 B、数据的输出口 C、准双向输入/输出口 D、输出高8位地址 3、下列描述中正确的是()。 A、程序就是软件 B、软件开发不受计算机系统的限制 C、软件既是逻辑实体,又是物理实体 D、软件是程序、数据与相关文档的集合 4、下列计算机语言中,CPU能直接识别的是()。 A、自然语言 B、高级语言 C、汇编语言 D、机器语言 5、MCS-5l单片机的堆栈区是设置在( )中。 A、片内ROM区 B、片外ROM区 C、片内RAM区 D、片外RAM区 6、以下叙述中正确的是()。 A、用C语言实现的算法必须要有输入和输出操作 B、用C语言实现的算法可以没有输出但必须要有输入 C、用C程序实现的算法可以没有输入但必须要有输出 D、用C程序实现的算

单片机-实验二-分支程序设计实验

实验二实验报告 ·

将00-99的十进制数据转换成二进制进行开关量的输入,L0灯亮 将100的十进制转换为01100010的二进制开关量进行输入,L1灯亮

将101-127的十进制转换为二进制进行开关量的输入,L2灯亮 完整的接线图

实验操作 1、正确连接实验板子和电脑,将点源接入,数据线连接到电脑的USB接口,在电脑端运行 软件,取消勾选模拟器,按照实验装置的名称正确的选择响应的系统。 2、在软件内部按照输入分支程序结构。 3、打开点源开关。 4、调整输入的各个断口的开关量,着重关注在二进制数01100010附近的变化. 5、整理实验器材。 思考题1 写出分支程序设计的要点 分支结构也成为选择结构。在程序中每个分支均为一个程序段。为分支需要,程序设计时不要忘记给程序段的起始地址赋予一个地址标号,以供选择分支使用。 这次实验使用的是一个多分支程序结构,可以通过一系列的JC\JNC\JB\JNB的判断,进行逐级分支。并且可以使用CJNE进行实现。 80C51中没有专门的多分支转移指令,可以使用的变址转移指令“JMP @A+DPTR”,但是这样的指令需要数据表格配合。 思考题2 8051单片机有几个并行口,写出各并行口的特点 8051单片机有4个并行I/O口,分别为P0\P1\P2\P3,以实现数据的并行输入与输出。 这4个并行口均是8为双向口线,各占8个引脚,在P3口线上有着引脚复用,均有第二功能信号,这些第二功能信号都是重要的控制信号,在实际使用中总是先按需要优先选用第二功能,剩下的不用的再当作口线使用。 并行可以有效的提高单片机的工作效率。 思考题3 实验中遇到的苦难 在这个实验中和实验一显著不同的是我们需要重新认识硬件与软件的配合,一些数据线的链接,点源的通断都是我们学习的要点,我们也第一次接触到了输入口和输出口相互之间的区别。 这个实验我们一定要将十进制的思维转换过来转换为二进制的思维,在机器语言中只有开关量的通断,而这个题目也是很好的应用了开关量的通断完成了这个实验。 学会了分支判断方式的编程

5 STC15F2K60S2单片机的程序设计 例题

第5章STC15F2K60S2单片机的程序设计 例题 例5.1 分析ORG在下面程序段中的控制作用 ORG 1000H START: MOV R0,#60H MOV R1,#61H …… ORG 1200H NEXT: MOV DPTR,#1000H MOV R2,#70H …… 解:以START开始的程序汇编后机器码从1000H单元开始连续存放,不能超过1200H 单元;以NEXT开始程序汇编后机器码从1200H单元开始连续存放。 例5.2 分析END在下面程序段中的控制作用。 START: MOV A,#30H …… END START NEXT: …… RET 解:汇编程序对该程序进行汇编时,只将END伪指令前面的程序转换为对应的机器代码程序,而以NEXT标号为起始地址的程序将予以忽略。因此,若NEXT标号为起始地址的子程序是本程序的有效子程序的话,应将整个子程序段放到END伪指令的前面。

例5.3 分析下列程序中EQU指令的作用 AA EQU R1 ;给AA赋值R1 DA TA1 EQU 10H ;给DA TA1赋值10H DELAY EQU 2200H ;给DELAY赋值2200H ORG 2000H MOV R0,DATA1 ;R0←(10H) MOV A,AA ;A←(R1) LCALL DELAY ;调用起始地址为2200H的子程序 END 解:经EQU定义后,AA等效于R1,DATA1等效于10H,DELAY等效于2200H,该程序在汇编时,自动将程序中AA换成R1、DATA1换成10H、DELAY换成2200H,再汇编为机器代码程序。 使用赋值伪指令EQU的好处在于程序占用的资源数据符号或寄存器符号用占用源的英文或英文缩写字符名称来定义,后续编程中凡是出现该数据符号或寄存器符号就用该字符名称代替,这样,采用有意义的字符名称进行编程,更容易记忆和不容易混淆,也便于阅读。

51单片机课程设计

课程设计说明书
课程设计名称






学生姓名
指导教师
单片机原理及应用课程设计 电子信息工程 140405 20141329 李延琦 胡黄水
2016 年 12 月 26 日

课程设计任务书
课程设计 题目
酒精测试仪
起止日期
2016 年 12 月 26 日— 2017 年 1 月 6 日
设计地点
计算机科学与工程学 院单片机实验室 3409
设计任务及日程安排: 设计任务:分两部分: (一)、设计实现类:进行软、硬件设计,并上机编程、联线、调试、 实现; 1.电子钟的设计 2.交通灯的设计 3.温度计的设计 4.点阵显示 5.电机调速 6.电子音乐发声(自己选曲) 7.键盘液晶显示系统 (二)、应用系统设计类:不须上机,查资料完成软、硬件设计画图。 查资料选定题目。 说明:第 1--7 题任选其二即可。(二)里题目自拟。 日程安排: 本次设计共二周时间,日程安排如下: 第 1 天:查阅资料,确定题目。 第 2--4 天:进实验室做实验,连接硬件并编写程序作相关的模块实验。 第 5--7 天:编写程序,并调试通过。观察及总结硬件实验现象和结果。 第 8--9 天:整理资料,撰写课程设计报告,准备答辩。 第 10 天:上交课程设计报告,答辩。 设计报告要求:
1. 设计报告里有两个内容,自选题目内容+附录(实验内容),每 位同学独立完成。 2. 自选题目不须上机实现,要求能正确完成硬件电路和软件程序 设计。内容包括: 1) 设计题目、任务与要求 2)硬件框图与电路图 3) 软件及流程图 (a)主要模块流程图 (b)源程序清单与注释 4) 总结 5) 参考资料 6)附录 实验上机调试内容
注:此任务书由指导教师在课程设计前填写,发给学生做为本门课程设计 的依据。

51单片机电子时钟课程设计实验报告

《单片机原理与应用》课程设计 总结报告 题目:单片机电子时钟(带秒表)的设计 设计人员:张保江江润洲 学号:2012197213 2012118029 班级:自动化1211 指导老师:阮海容

目录 1.题目与主要功能要求 (2) 2.整体设计框图及整机概述 (3) 3.各硬件单元电路的设计、参数分析及原理说明 (3) 4.软件流程图和流程说明 (4) 5.总结设计及调试的体会 (10) 附录 1.图一:系统电路原理图 (11) 2.图二:系统电路PCB (12) 3.表一:元器件清单 (13) 4.时钟程序源码 (14)

题目:单片机电子时钟的设计与实现 课程设计的目的和意义 课程设计的目的与意义在于让我们将理论与实践相结合。培养我们综合运用电子课程中的理论知识解决实际性问题的能力。让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。 课程设计的基本任务 利用89C51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入等知识,设计一款单片机和简单外设控制的电子时钟。 主要功能要求 最基本要求 1)使用MCS-51单片机设计一个时钟。要求具有6位LED显示、3个按键输入。 2)完成硬件实物制作或使用Pruteus仿真(注意位驱动应能提供足够的电流)。3)6位LED数码管从左到右分别显示时、分、秒(各占用2位),采用24小时标准计时制。开始计时时为000000,到235959后又变成000000。 4)使用3个键分别作为小时、分、秒的调校键。每按一次键,对应的显示值便加1。分、秒加到59后再按键即变为00;小时加到23后再按键即变为00。在调校时均不向上一单位进位(例如分加到59后变为00,但小时不发生改变)。 5) 软件设计必须使用MCS-51片内定时器,采用定时中断结构,不得使用软件延时法,也不得使用其他时钟芯片。 6)设计八段数码管显示电路并编写驱动程序,输入并调试拆字程序和数码显示程序。 7)掌握硬件和软件联合调试的方法。 8)完成系统硬件电路的设计和制作。 9)完成系统程序的设计。 10)完成整个系统的设计、调试和制作。 11)完成课程设计报告。 基本要求 1)实现最基本要求的1~10部分。 2)键盘输入可以控制电子时钟的走时/调试。 3)设计键盘输入电路和程序并调试。 4)掌握键盘和显示配合使用的方法和技巧。 提高发挥部分

MCS-51系列单片机程序的设计论文一

MCS-51系列单片机程序的设计论文 程序设计是单片机开发最重要的工作,程序设计就是利用单片机的指令系统,根据应用系统(即目标产品)的要求编写单片机的应用程序,其实我们前面已经开始这样做过了,这一课我们不是讲如何来设计具体的程序,而是教您设计单片机程序的基本方法。不过在讲解程序设计是单片机开发最重要的工作,程序设计就是利用单片机的指令系统,根据应用系统(即 目标产品)的要求编写单片机的应用程序,其实我们前面已经开始这样做过了,这一课我们不是讲如何 来设计具体的程序,而是教您设计单片机程序的基本方法。不过在讲解之前还是有必要先了解一下单片 机的程序设计语言。 一.程序设计语言 这里的语言与我们通常理解的语言是有区别的,它指的是为开发单片机而设计的程序语言,如果 您没有学过程序设计可能不太明白,我给大家简单解释一下,您知道微软的VB,VC 吗?VB,VC 就是为 某些工程应用而设计的计算机程序语言,通俗地讲,它是一种设计工具,只不过这种工具是用来设计计 算机程序的。要想设计单片机的程序当然也要有这样一种工具(说设计语言更确切些),单片机的设计 语言基本上有三类: 1.完全面向机器的机器语言 机器语言就是能被单片机直接识别和执行的语言,计算机能识别什么?以前我们讲过--是数字“0” 或“1”,所以机器语言就是用一连串的“0”或“1”来表示的数字。比如:MOV A,40H;用机器语言 来表示就是11100101 0100000,很显然,用机器语言来编写单片机的程序不太方便,也不好记忆,我 们必须想办法用更好的语言来编写单片机的程序,于是就有了专门为单片机开发而设计的语言: 2.汇编语言 汇编语言也叫符号化语言,它使用助记符来代替二进制的“0”和“1”,比如:刚才的MOV A, 40H 就是汇编语言指令,显然用汇编语言写成的程序比机器语言好学也好记,所以单片机的指令普遍采 用汇编指令来编写,用汇编语言写成的程序我们就叫它源程序或源代码。可是计算机不能识别和执行用 汇编语言写成的程序啊?怎么办?当然有办法,我们可以通过“翻译”把源代码译成机器语言,这个过 程就叫做汇编,汇编工作现在都是由计算机借助汇编程序自动完成的,不过在以前,都是靠手工来做的。 值得注意的是,汇编语言也是面向机器的,它仍是一种低级语言。每一类计算机

PIC系列单片机程序设计基础

1、PIC单片机程序的基本格式 先介绍二条伪指令: EQU ——标号赋值伪指令 ORG ——地址定义伪指令 PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为: PIC16C54/55:1FFH PIC16C56:3FFH PIC16C57/58:7FFH 一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。 TITLE This is …… ;程序标题 ;-------------------------------------- ;名称定义和变量定义 ;-------------------------------------- F0 EQU 0 RTCC EQU 1 PC EQU 2 STATUS EQU 3 FSR EQU 4 RA EQU 5 RB EQU 6 RC EQU 7 ┋ PIC16C54 EQU 1FFH ;芯片复位地址 PIC16C56 EQU 3FFH PIC16C57 EQU 7FFH ;----------------------------------------- ORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序 ORG 0 ;在0000H开始存放程序

;----------------------------------------- ;子程序区 ;----------------------------------------- DELAY MOVLW 255 ┋ RETLW 0 ;------------------------------------------ ;主程序区 ;------------------------------------------ MAIN MOVLW B‘00000000’ TRIS RB ;RB已由伪指令定义为6,即B口 ┋ LOOP BSF RB,7 CALL DELAY BCF RB,7 CALL DELAY ┋ GOTO LOOP ;------------------------------------------- END ;程序结束 注:MAIN标号一定要处在0页面内。 2、PIC单片机程序设计基础 1) 设置 I/O 口的输入/输出方向 PIC16C5X单片机的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O控制寄存器TRIS f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。 MOVLW 0FH ;0000 1111(0FH) 输入输出 TRIS 6 ;将W中的0FH写入B口控制器,

单片机原理与C51语言程序设计与基础教程 课后习题答案

单片机原理与C51语言程序设计与基础教 程课后习题答案 习题 填空题 1.一般而言,微型计算机包括、、、四个基本组成部分。 2.单片机是一块芯片上的微型计算机。以为核心的硬件电路称为单片机系统,它属于地应用范畴。 3.Atmel 公司生产的CMOS型51系列单片机,具有内核,用 代替ROM作为程序存储器, 4.单片机根据工作温度可分为、和三种。民用级的温度范围是0℃一70℃,工业级是-40℃~85℃,军用级是-55℃-125℃(不同厂家的划分标推可能不同。 5.在单片机领域内,ICE的含义是。 选择题 1.单片机的工作电压一般为V? A 5V B 3V C 1V D 4V 2.单片机作为微机的一种,它具有如下特点: A 具有优异的性能价格比 B 集成度高、体积小、可靠性高 C 控制功能强,开发应用方便 D 低电压、低功耗。 3.民用级单片机的温度范围是: A -40℃~85℃ B 0℃一70℃ C -55℃-125℃ D 0℃一50℃ 4.MCS-51系列单片机最多有个中端源。 A 3 B 4 C 5 D 6 5.下列简写名称中不是单片机或单片机系统的是 A MCU B SCM C ICE D CPU 问答题 1.单片机常用的应用领域有哪些? 2.我们如何学习单片机这么技术? 3.单片机从用途上可分成哪几类?分别由什么用处? 答案

填空题 1.运算器、控制器、存储器、输入输出接口 2.单片机嵌入式系统 3.MCS-51 Flash ROM 4.民用级(商业级) 工业级军用级 5.在线仿真器 选择题 1.A 2.ABCD 3.B 4.C 5.D 问答题 1.单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: (1)在智能仪器仪表上的应用 单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。 (2)在工业控制中的应用 用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。 (3)在家用电器中的应用 可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。 (4)在计算机网络和通信领域中的应用 现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。 (5)单片机在医用设备领域中的应用 单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。 此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。 2.首先,大概了解单片机的机构,例如本书的第2章则是主要讲了单片机的内部结构以及资源。对单片机的内部结构有了初步了解之后,读者就可以进行简单的实例练习,从而加深对单片机的认识。 其次,要有大量的实例练习。其实,对于单片机,主要是软件设计,也就是编程。目前最流行的用于51系列单片机地编程软件是Keil。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。掌握这一软件的使用对于使用51系列单片机的爱好

51单片机控制LED灯程序设计

51单片机:LED灯亮灯灭程序设计 1.功能说明:控制单片机P1端口输出,使P1.0位所接的LED点亮,其他7只灯熄灭。 程序: 01: MOV A , #11111110B ; 存入欲显示灯的位置数据 02: MOV P1,A ; 点亮第一只灯 03: JMP $ ; 保持当前的输出状态 04: END ; 程序结束 2.功能说明:单片机P1端口接8只LED,点亮第1、3、4、6、7、8只灯。 程序:

01:START: MOV A , #00010010B ; 存入欲显示灯的位置数据 02:MOV P1,A ; 点亮灯 03:JMP START ; 重新设定显示值 04:END ; 程序结束 3.功能说明:单片机P1端口接8只LED,每次点亮一只,向左移动点亮,重复循环。 程序: 01:START: MOV R0, #8 ;设左移8次 02:MOV A, #11111110B ;存入开始点亮灯位置

03:LOOP: MOV P1, A ;传送到P1并输出 04:RL A ;左移一位 05:DJNZ R0, LOOP ;判断移动次数 06:JMP START ;重新设定显示值 07:END ;程序结束 4.功能说明:单片机P1端口接8只LED,每次点亮一只,向右移动点亮,重复循环。 程序: 01:START: MOV R0, #8 ;设右移8次

02:MOV A, #01111111B ;存入开始点亮灯位置03: LOOP: MOV P1, A ;传送到P1并输出 04: ACALL DELAY ;调延时子程序05: RR A ;右移一位 06: DJNZ R0, LOOP ;判断移动次数07: JMP START ;重新设定显示值08: DELAY: MOV R5,#50 ; 09:DLY1: MOV R6,#100 ; 10: DLY2: MOV R7,#100 ;

51单片机DIY做PLC编程精编版

51单片机DIY做PLC编程 有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢? 上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档PLC编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱PLC工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的,懒得研究各个按钮的使用,由于是单片机的硬件,对于程序的编制和转换有很多限制条件,否则是转换不成功的,嫌麻烦,放弃! 某宝倒是有百元PLC板出售,但是为了这么个简单的东西专门买个全功能板子有点浪费,而且其编程软件仍然是三菱的盗版软件,算了,再想办法把。 由于工作中经常接触PLC程序,对其工作原理也略知一二,网上也有相关的说明介绍,其实就是三个主要步骤,第一步扫描IO输入,第二步执行逻辑,第三步输出逻辑到IO,很简单的,最早PLC也是用单片机实现的,我为何不用汇编在51上搭建一个架构,简单的逻辑编制进去就能运转呢? 其中逻辑执行步骤还是有点意思的,需要把PLC逻辑翻译成单片机的汇编语言执行,这块开始也没有把握,后来搜索到一篇百度文章,介绍了一下三菱PLC逻辑是如何翻译成汇编的,我看了下估计其实是利用反汇编工具把HEX反编译成的ASM代码,并不清晰明了,而且还带着反汇编时候的行号,仅供参考了。 搜索结果中也有几篇论文,涉及到在51单片机上实现PLC逻辑的内容,但是那些论文都是充数的,仅仅几个IO逻辑,没有什么定时器,计数器功能的体现,哎!仅供参考! 看来这个PLC系统还是需要自己写了!OK!既然决定自己重写,那就开工吧!利用春节休假时间,编制了如下ASM51汇编PLC代码: 代码主要架构如下: 1、IO定义部分:根据所使用的单片机IO口数量,任意指定多少个I多少个O,那几个脚是I,哪几个是O都可以任意指定,在这个51系统里面设计了最大32个I,32个O,占用64个位寻址区域,其实用不到那么多,也可以分配给其它需要的标志位用,因为51系统总可位寻址地址只有128位,需要仔细分配.

《单片机的C语言程序设计与运用(第2版)》期末复习题及答案2

第四章 中断类 例4-1 P104 假设外部中断0和外部中断1均为下降沿触发,当外部 中断0发生时,P0端口的电平反向,当外部中断1发生 时,P1端口的电平反向。 #include void IS0(void) interrupt 0 { P0=~P0;} //P0端口反向 void IS1(void) interrupt 2 { P1=~P1;} //P1端口反向 void main( )

{ P0=0x00; P1=0xFF; IT0=1; IT1=1; EX0=1; EX1=1; EA=1; while(1); } 【例4-9】外部中断示例 在本实例中,首先通过P1.7口点亮发光二极管D1,然后外部输入一脉冲串,则发光二极管D1亮、暗交替。 #include sbit P1_7=P1^7; void interrupt0( ) interrupt 0 using 2 //外部中断0 { P1_7=!P1_7;} void main( )

{ EA=1; //开中断 IT0=1; //外部中断0脉冲触发 EX0=1; //外部中断0 P1_7=0; do{ }while(1); } 如果有3个脉冲,则灯亮、暗交替一次,可如下面编程:#include Sbit P17=P1^7; unsigned char i=3; void main( ) { EA=1; IT0=1; EX0=1; P17=0; do{ }while(1); } void interrupt0( ) interrupt 0 { i=i-1; if(i==0) { P17=!P17; i=3; } } 【例4-10】如图4-18所示,8只LED阴极接至单片机P0口,两开关

实验一_单片机数据区传送排序程序设计复习课程

实验一_单片机数据区传送排序程序设计

实验一单片机数据区传送/排序程序设计 一、单片机数据区传送/排序程序设计 一、实验目的 1.进一步掌握汇编语言程序设计和调试方法。 2.了解单片机RAM中的数据操作 二、实验说明 要求:编写程序把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的地址的RAM区。 三、实验仪器 计算机 伟福软件( lab2000P ) 四、实验内容 在R0、R1中输入源地址(例如:3000H),R2、R3中输入目的地址(例如4000H),R6、R7中输入字节数(例如:1FFFH)。 查看RAM 区3000~30FFH和4000~40FFH内容,也可自己重新赋值。 运行程序,首先单步,然后用执行到指定位置,最后用连续运行方式。 记录下运行结果,检查3000~30FFH中内容是否和4000~40FFH内容完全一致。 五、思考题 1、改变源地址,例如00FFH; 2、改变目的地址,例如2000H; 3、改变传输的个数,小于256个和大于256个的情况。

4、把程序改为对某一数据存储区RAM赋都相同一个数值。 六、源程序及其修改原理 org 0000H Block equ 2000h mov dptr, #Block ; 起始地址 mov r0,#12h mov a,#20h ;修改2000h开始的地址所存放的内容为20h Loop: mov r1,#14h ;增加r1计数,用循环方式实现大于256的数据传输(思考题3) Loop1: movx @dptr,a inc dptr ; 指向下一个地址 djnz r1,Loop1 djnz r0, Loop ; 双循环实现r0,r1计数相乘 (以上程序实现对某一数据存储区2000h~2168hRAM赋都相同一个数值20h,思考题4) mov r0, #20h ;改变源地址为2000h(思考题1) mov r1, #00h mov r2, #50h;改变目的地址为5000h(思考题2) mov r3, #00h mov r7, #0 Loop: mov dph, r0 mov dpl, r1 movx a, @dptr mov dph, r2 mov dpl, r3 movx @dptr, a

单片机C语言程序设计师试题及答案

单片机C语言程序设计师试题 一、填空题 1、设X=5AH,Y=36H,则X与Y“或”运算为_________,X与Y的“异或”运算为________。 2、若机器的字长为8位,X=17,Y=35,则X+Y=_______,X-Y=_______(要求结果写出二进制形式)。 3、单片机的复位操作是__________(高电平/低电平),单片机复位后,堆栈指针SP的值是________。 4、单片机中,常用作地址锁存器的芯片是______________,常用作地址译码器芯片是_________________。 5、若选择内部程序存储器,应该设置为____________(高电平/低电平),那么,PSEN信号的处理方式为__________________。 6、单片机程序的入口地址是______________,外部中断1的入口地址是_______________。 7、若采用6MHz的晶体振荡器,则MCS-51单片机的振荡周期为_________,机器周期为_______________。 8、外围扩展芯片的选择方法有两种,它们分别是__________________和_______________。 9、单片机的内部RAM区中,可以位寻址的地址范围是__________________,特殊功能寄存器中,可位寻址的地址是____________________。 10、子程序返回指令是________,中断子程序返回指令是_______。 11、8051单片机的存储器的最大特点是____________________与____________________分开编址。 12、8051最多可以有_______个并行输入输出口,最少也可以有_______个并行口。 13、_______是C语言的基本单位。 14、串行口方式2接收到的第9位数据送_______寄存器的_______位中保存。 15、MCS-51内部提供_______个可编程的_______位定时/计数器,定时器有_______种工作方式。 16、一个函数由两部分组成,即______________和______________。 17、串行口方式3发送的第9位数据要事先写入___________寄存器的___________位。 18、利用8155H可以扩展___________个并行口,___________个RAM单元。 19、C语言中输入和输出操作是由库函数___________和___________等函数来完成。 二、选择题 1、C语言中最简单的数据类型包括(b )。 A、整型、实型、逻辑型 B、整型、实型、字符型 C、整型、字符型、逻辑型 D、整型、实型、逻辑型、字符型 2、当MCS-51单片机接有外部存储器,P2口可作为( c )。 A、数据输入口 B、数据的输出口 C、准双向输入/输出口 D、输出高8位地址 3、下列描述中正确的是( d )。 A、程序就是软件 B、软件开发不受计算机系统的限制 C、软件既是逻辑实体,又是物理实体 D、软件是程序、数据与相关文档的集合 4、下列计算机语言中,CPU能直接识别的是( d )。 A、自然语言 B、高级语言 C、汇编语言 D、机器语言 5、MCS-5l单片机的堆栈区是设置在( c )中。

51单片机C语言程序设计复习资料

2013-2014学年上期51单片机C语言程序设计重修复习提纲考试方式:闭卷考试。 考试题型: 填空题(每空1分,共18分);单项选择题(每空2分,共18分);问答及计算题(每题4分,共16分);编程及程序阅读题(5小题,共48分)。 考试分数: 卷面成绩70%+平时成绩15%+实验成绩15%,未缺席、无课堂违纪、作业全交且认真完成的同学平时成绩可获得满分,缺席一次平时成绩扣30分,实验好评次数3次以上且实验报告全优的同学实验成绩可得满分,实验缺席一次扣30分。缺席实验和旷课共3次以上者,无考试资格。 考试时间: 18周周一(12月30日)下午14:00:16:00,考试地点:具体考室另行通知希望大家认真复习,认真听讲,不懂就问,考试成绩不及格允许查卷,如查卷卷面批阅无误成绩不做更改。 编程题为实验或实验类似的题目有3题,其余2题也取自课堂讲授例题,请务必认真复习。第一章单片机概述及单片机知识回顾 掌握什么是单片机、单片机的应用、常见单片机类型、十进制、十六进制、二进制数制转换知识。掌握单片机的硬件组成、CPU的结构、程序计数器PC的功能、存储器结构、机器周期的计算、会画出单片机的最小系统电路图及回答单片机最小系统的组成。 第二章C51语言程序设计基础(本章填空题和选择题比重较大请务必认真复习)掌握C51语言进行软件开发与汇编语言相比的优点、掌握C51的数据类型、特殊功能位的定义、C51的基本运算(位运算重点复习)、数组的定义、C51的结构及函数。 第三章AT89S51片内并行端口及编程(本章有编程题) 掌握P0-P3并行端口的特点,会开关量检测及流水灯程序的编程。 第四章AT89S51单片机的中断系统(本章有编程题) 掌握中断系统的结构、中断请求响应被满足的条件、外部中断的触发选择方式、外部中断的使用与编程。 第五章AT89S51单片机的定时器/计数器(本章有编程器) 掌握定时器的结构,TOMD及TCON的使用,定时器方式0和方式1的特点、会计算定时器初值,会用定时器中断产生PWM波形,会用定时器对外部事件进行计数。 第六章AT89S51单片机的串行口(本章有计算题) 掌握串行通信的基础知识(课本没有的内容请参照课堂讲授笔记或PPT)、串行口的四种工作方式的特点、会计算奇偶校验码、会根据波特率计算T1的初值。 第七章AT89S51单片机与输入/输出外设接口(本章有编程题) 掌握数码管动态显示的原理、掌握矩阵式键盘的原理与编程(矩阵键盘编程必考,但不会考4X4键盘)。 第八章AT89S51单片机与D/A与A/D转换器的接口(本章有编程题) 掌握AD与DA转换的接口、ADC和DAC的技术指标、常用AD和DA转换器。掌握ADC0809和TLC2543的使用与编程(2器件其中之一有编程题)。 第九章AT89S51单片机应用系统与调试(本章有编程题) 掌握单片机应用系统的软件抗干扰方法。

相关主题
文本预览
相关文档 最新文档