最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

北京蓝海微芯 LJD-SY-5100 学习实验开发板 说明书

IT圈 admin 108浏览 0评论

2024年8月31日发(作者:梁易蓉)

通过把RST输入驱动至高电平来启动所有的数据传送。RST输入

有两种功能。首先,RST接通控制逻辑,允许地址/命令序列送入移

位寄存器。其次,RST提供了中止单字节或多字节数据传送的手段。

数据输入时,在时钟的上升沿数据必须有效,而数据位在时钟的

下降沿输出。如果RST输入为低电平,那么所有的数据传送中止且

I/O引脚变为高阻抗状态。上电时,在VCC2 ≥2.5V之前,RST必须

为逻辑0。此外,当把RST驱动至逻辑1的状态时,SCLK必须为逻辑

0。

3) 数据输入与输出

跟随在输入写命令字节的八个SCLK周期之后,在下八个SCLK周

期的上升沿输入数据字节。如果有额外的SCLK周期,它们将被忽略。

数据从位0开始输入。

跟随在输入读命令字节的八个SCLK周期之后,在下八个SCLK周

期的下降沿输出数据字节。注意,被传送的第一个数据位发生在写命

令字节的最后一位之后的第一个下降沿。只要RST保持为高电平,如

果有额外的SCLK周期,它们将重新发送数据字节。这一操作使之具

99

有连续的多字节方式的读能力。另外,在SCLK的第一上升沿,I/O

引脚为三态。数据从位0开始输出。

4) 多字节方式

通过对地址31(十进制)寻址,可以把时钟/日历或RAM寄存器

规定为多字节方式,如前所述,位6规定时钟或RAM,而位0规定读

或写,在时钟/日历寄存器中的地址9至31或RAM寄存器中的地址

31不能存储数据。在多字节方式中,读或写从地址0的位0开始。

当以多字节方式写时钟寄存器时,必须按数据传送的次序写最先

八个寄存器。但是,当以多字节方式写RAM时,为了传送数据,不必

写所有31个字节。不管是否写了全部31个字节,所写的每一个字节

都将送至RAM。

5) DS1302内部寄存器

DS1302内部寄存器地址(命令)及数据寄存器分配情况如图。

100

时钟/日历与时钟暂停

时钟/日历包含在七个写/读寄存器中。包含在时钟/日历寄存器的数

据是二十进制(BCD)码。

秒寄存器的位7定义为时钟暂停位。当此位(CH)设置为逻辑1时,

时钟振荡器停止,DS1302被置入低功率的备份方式,其电源消耗小

101

于100nA;当把此位置逻辑0时,时钟将启动。

(1) AM-PM/12-24方式

小时寄存器的位7定义为12或24小时方式选择位。当它为高电平时,

选择12小时方式。在12小时方式下,位5是AM/PM位,此位为逻辑

高电平时表示PM。在24小时方式下,位5是第二个10小时位(20

-23时)。

(2) 写保护寄存器。

写保护寄存器的位7是写保护的。开始七位(位0-6)置为0,在读

操作时总是读出0。在对时钟或RAM进行写操作之前,位7必须为0。

当它为高电平时,写保护防止对任何其它寄存器进行写操作。

(3) 慢速充电寄存器

这个寄存器控制DS1302的慢速充电特征。图是简化的慢速充电基本

电路。

慢速充电选择(TCS)位(位4-位7)控制慢速充电器的选择。为了

102

防止偶然的因素使之工作,只有1010模式才能使慢速充电器工作,

所有其它模式将禁止慢速充电器。DS1302上电时,慢速充电器被禁

止。二极管选择(DS)位(位2、位3)选择是一个二极管还是两个

二级管连接在VCC1与VCC2之间。如果DS为01,那么选择一个二极

管;如果DS为10,则选择两个二极管。如果DS为00或11,那么充

电器被禁止,与TCS无关。RS位(位0、位1)选择连接在VCC1与

VCC2之间的电阻。

(4) 时钟/日历多字节方式

时钟/日历命令字节可规定多字节方式。在此方式下,最先八个时钟/

日历寄存器可以从地址0的第0位开始连接地读或写。

当指定写时钟/日历为多字节方式时,如果写保护位被设置为高电平,

那么没有数据会传送到八个时钟/日历寄存器(包括控制寄存器)的

任一个。在多字节方式下,慢速充电器是不可访问的。

(5) 单字节与多字节RAM方式。

静态RAM中RAM地址空间可按地址读/写的31×8字节。也可设置成

多字节工作方式。在此方式下,可以从地址0的第0位开始顺序读或

写31个字节的RAM寄存器。

(6) 晶振的选择

32 768HZ的晶振可通过引脚2和3(X1、X2)直接连接至DS1302。

所选用晶振规定的负载电容量(CL)应当为6pF。

然而,许多人在选用晶振时仅仅注意了晶振的额定频率值,而忽视了

晶振的负载电容大小,甚至连许多经销商也不能提供所销晶振的负载

103

电容。所以,即使在使用中选用了符合32 768HZ的晶振,但如果该

晶振的负载电容与DS1302提供的6pF不一致时,就会影响晶振的起

振或导致振荡频率的偏移。一般可通过下述方法解决:

①当所选的晶振负载电容不是6pF时,可以采用增加辅助电容的方法

提高或降低DS1302振荡器的电容负载,使之与晶体所需的电容值匹

配。

如果已知晶体的负载电容为C1,若C1<6pF,则可以增加一个并联电

容CS,以产生所需的总负载电容为C1,即C1=6pF+CS;若C1>6pF,

则可以在晶体的一端增加一个串联电容CS,以产生所需的负载电容

C1,即1/C1=1/6pF+1/CS,通过计算即可得出应增加的辅助电容大小。

②在使用前对晶体的负载电容并不知道其值的情况下,通过测定晶体

振荡频率的方法可以确定该晶体负载电容的值。

对于晶体振荡器来说,其振荡频率与负载电容之间的关系是确定的。

以DS1302使用的32 768HZ晶振为例:当它工作于所要求的负载电容

时,能较准确地产生32 768HZ的频率;当它的负载电容小于6pF时,

其振荡频率会正向偏移;当它的负载电容大于6pF时,其振荡频率就

会负向偏移。因此,对于未知负载电容的晶体,应首先采用实验的方

法,在其两端加入辅加电容使晶体起振,然后由频率计测出振荡频率。

若测得频率大于32 768HZ,说明负载电容偏小;若测得频率小于32

768HZ,说明负载电容偏大。对辅助电容逐步调整,最终使振荡频率

尽可能接近32 768HZ,则此时晶体端所接负载电容的总和就是适合

该晶体的负载电容。

104

(7) 电源控制

VCC1是为DS1302提供的备用电源,一般可接3V干电池或3.6V蓄电

池(以便充电)。

VCC2是为DS1302提供的主电源。在这种运用方式中,VCC2给芯片供

电,并通过内部为备用电源充电,以便在没有主电源的情况下能保存

时间信息及数据。

DS1302由VCC1或VCC2两者中较大者供电。当VCC2大于VCC1+0.2V

时,VCC2给DS1302供电;当VCC2小于VCC1时,DS1302由VCC1供

电。

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

;文件名:

;功能 :在LJD-SY2A实验板完成设置DS1302时间为08年8月8日

19点59分59秒,

;显示时、分、秒。

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

LOAD BIT P1.2

DIN BIT P1.0

DCLK BIT P1.1

DOUT BIT P3.2

BUZZER BIT P2.6

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

IO_DATA BIT P1.0

105

SCLK BIT P1.1

RST BIT P1.3

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

BitCnt DATA 30H ; 数据位计数器

ByteCnt DATA 31H ; 数据字节计数器

Command DATA 32H ; 命令字节地址

RcvDat DATA 40H ; 接收数据缓冲区

XmtDat DATA 50H ; 发送数据缓冲区

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

USERFLAG EQU 20H

BCD4A EQU 22H

BCD4B EQU 23H

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

ORG 0000H

JMP START

ORG 0030H

START: MOV P1,#60H

MOV SP,#7FH

; CLR BUZZER

106

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

CLR DIN ;初始化CH451

SETB DCLK

SETB DIN

SETB LOAD

SETB DOUT

NOP

MOV B,#04H ;设置CH451

MOV A,#03H ;关看门狗开显示键盘

LCALL WRITE

NOP

;*********************设置时钟****************************

Write_Enable:

MOV Command,#8Eh ;命令字节为8E

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat ;数据地址覆给R0

MOV XmtDat,#00h ;数据内容为0 写入允许

LCALL Send_Byte ;调用写入数据子程序

;*******************************当把秒寄存器的第7 位时钟停

止位设置为0 时起动时钟开始

MOV Command,#80h ; 命令字节为80

MOV ByteCnt,#1 ; 单字节传送模式

107

MOV R0,#XmtDat ;数据地址覆给R0

MOV XmtDat,#00h ;数据内容为0 振荡器

工作允许

LCALL Send_Byte ;调用写入数据子程序

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

Write_Multiplebyte:

MOV Command,#0BEh ;命令字节为BEh

MOV ByteCnt,#8 ;多字节写入模式此模

块为8 个

MOV R0,#XmtDat ;数据地址覆给R0

MOV XmtDat, #59h ;秒单元内容为59h

MOV XmtDat+1,#59h ;分单元内容为59h

MOV XmtDat+2,#19h ;时单元内容为13h

MOV XmtDat+3,#08h ;日期单元内容为21h

MOV XmtDat+4,#08h ;月单元内容为06h

MOV XmtDat+5,#05h ;星期单元内容为03h

MOV XmtDat+6,#08h ;年单元内容为00h

MOV XmtDat+7,#0 ;写保护单元内容为00h

LCALL Send_Byte ;调用写入数据子程序

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

Read_A1:

108

MOV B,#05H ;设置为译码

MOV A,#08AH

LCALL WRITE

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

TIME:

MOV Command,#85h ; 命令字节为85h

MOV ByteCnt,#1 ; 单字节传送模式

MOV R1,#RcvDat ;数据地址覆给R1

LCALL Receive_Byte ;调用读出数据子

程序

LCALL BCD8_1

MOV B,#0aH

MOV A,BCD4A

LCALL WRITE

ORL BCD4B,#80H

MOV B,#0bH

MOV A,BCD4B

LCALL WRITE

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

MOV Command,#83h

MOV ByteCnt,#1

MOV R1,#RcvDat

109

LCALL Receive_Byte

LCALL BCD8_1

MOV B,#0cH

MOV A,BCD4A

LCALL WRITE

ORL BCD4B,#80H

MOV B,#0dH

MOV A,BCD4B

LCALL WRITE

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

MOV Command,#81h

MOV ByteCnt,#1

MOV R1,#RcvDat

LCALL Receive_Byte

LCALL BCD8_1

MOV B,#0eH

MOV A,BCD4A

LCALL WRITE

MOV B,#0fH

MOV A,BCD4B

LCALL WRITE

NOP

110

LJMP TIME

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

;写CH451程序

;文件名:WRITE

;入参:B、ACC待写的12位数据,低8位在ACC中,高4位在B的

低四位中。

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

WRITE:

; PUSH DPH

; PUSH DPL

; PUSH ACC

CLR EX0

CLR LOAD

MOV R7,#08H

WRITE_1:

RRC A

CLR DCLK

MOV DIN,C

SETB DCLK

DJNZ R7,WRITE_1

MOV A,B

MOV R7,#004H

111

WRITE_2:

RRC A

CLR DCLK

MOV DIN,C

SETB DCLK

DJNZ R7,WRITE_2

SETB LOAD

SETB EX0

; POP ACC

; POP DPH

; POP DPL

RET

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

BCD8_1:

MOV R7,#04H

MOV A,RcvDat

RR1:

CLR C

RRC A

DJNZ R7,RR1

MOV BCD4A,A

NOP

112

MOV R7,#04H

MOV A,RcvDat

RL1:

CLR C

RLC A

DJNZ R7,RL1

SWAP A

MOV BCD4B,A

RET

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

Send_Byte:

CLR RST

NOP

CLR SCLK

NOP

SETB RST

NOP

MOV A,Command

MOV BitCnt,#08h

S_Byte0:

RRC A

MOV IO_DATA,C

113

NOP

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,S_Byte0

NOP

S_Byte1:

MOV A,@R0

MOV BitCnt,#08h

S_Byte2:

RRC A

MOV IO_DATA,C

NOP

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,S_Byte2

INC R0

DJNZ ByteCnt,S_Byte1

NOP

CLR RST

RET

114

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

*****************************

;接收数据程序;

;名称:Receive_Byte

;描述:从被控器DS1302 接收ByteCnt 个字节数据

;命令字节地址在Command 中

;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中

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

*************************

Receive_Byte:

CLR RST ;

NOP

CLR SCLK

NOP

SETB RST

MOV A,Command

MOV BitCnt,#08h

R_Byte0:

RRC A

MOV IO_DATA,C

NOP

115

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,R_Byte0

NOP

R_Byte1:

CLR A

CLR C

MOV BitCnt,#08h

R_Byte2:

NOP

MOV C,IO_DATA

RRC A

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,R_Byte2

MOV @R1,A

INC R1

DJNZ ByteCnt,R_Byte1

NOP

CLR RST

116

RET

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

END

3-9 用单线数字温度传感器DS18B20实现温度测量

来自控制现场的诸如温度、压力等连续变化的物理量经传感器和

变送单元转换后成为一定形式的模拟量。为了将这些量送入单片机,

必须进行A/D转换,将模拟量变成数字量。

1.1 DS18B20概述

DS18B20是Dallas公司推出的单线数字式测温芯片,它能在现

场采集温度数据,并将温度数据直接转换成数字量输出。

1. DS18B20的内部结构、引脚和工作说明

图14-6是DS18B20的内部结构图。

DS18B20只有3个引脚,说明如下:

DQ-数据输入输出。漏极开路1线接口。也在寄生电源模式时给

设备提供电源。

VDD-可选的电源电压脚。VDD在寄生电源模式时必须接地。

GND-地

DS18B20的64位ROM保存了设备的惟一序列码。高速闪存

(scratchpad)包含2字节的温度寄存器,保存了温度传感器的数字

输出。该闪存还提供了对上限(TH)和下限(TL)超标报警寄存器、

117

配置寄存器(各1字节)的访问。TH、TL和配置寄存器是非易失性

的(EEPROM),系统掉电时它们会保存数据。

DS18B20利用Dallas的单总线控制协议,实现了利用单线控制

信号在总线上进行通信。由于所有的设备通过漏极开路端(即DS18B20

的DQ脚)连在总线上,控制线需要一个上拉电阻(大约5K)。在这

一总线系统中,微控制器(主控设备)通过惟一的64位序列码识别

和访问总线上的器件。由于每一设备有惟一的编码,连在一条总线上

可被访问的器件数实际上是无限的。

DS18B20的另一个特点是在没有外部电源下操作的能力。电源由

总线为高电平时DQ脚上的上拉电阻提供(寄生供电模式),此时VDD

脚接地。

另外,DS18B20也可用传统方式供电,此时将外部电源连在VDD脚上

即可。

2. DS18B20的寄存器

DS18B20存储器组织如图14.7所示。字节0和字节1分别包含

温度寄存器的LSB和MSB,这些字节是只读的。字节2和3提供了对

TH(上限报警触发寄存器)和TL(下限报警触发寄存器)的访问。

字节4包含配置寄存器数据。字节5、6和7保留作器件内部使用,

不能被改写;当读时,这些字节返回全1值。字节8是只读的,含有

字节0到字节7的CRC校验。

高速闪存的第4个字节包含配置寄存器,其组织结构如图14-8

所示。用户可以用这一寄存器的R0和R1位设置DS18B20的转换分辨

118

率(见表14-1)。这些位上电后默认值是R0=1和R1=1(12位分辨率)。

第7位和0~4位保留作内部使用,不能更改;在读时这些位返回1。

3. DS18B20的读写

访问DS18B20的顺序如理

*初始化;

*ROM命令(接着是任何需要的数据交换);

*DS18B20函数命令(接着是任何需要的数据交换)。

每一次访问DS18B20时必须遵循这一顺序,如果其中的任何一步

缺少或打乱它们的顺序,DS18B20将不会响应。

(1)初始化时序

所有与DS18B20的通信首先必须初始化:控制器发出复位脉冲,

DS18B20以存在脉冲响应。在图14-9中给出了描述。当DS18B20发

出存在脉冲对复位响应时,它指示控制器该DS18B20已经在总线上并

准备好操作。

(2)读/写时序

控制器在写时序写数据到DS18B20,在读时序从DS18B20中读数

据。每一总线时序传送1位数据。

读/写时序图见图14-10。

(3)写流程时序

有两种类型的写时序:写1时序和写0时序。控制器用写“1”

时序写逻辑“1”到DS18B20,用写“0”时序写逻辑“0”到DS18B20。

所有写时序必须持续最少60μs,每个写时序之间必须有至少1μs

119

的恢复时间。两种类型的写时序都从控制器把总线拉低开始。

为产生写“1”时序,在将总线拉低后,总线控制器必须在15μ

s内释放总线。总线释放后,5K的上拉电阻将总线电平抬高。为产生

写“0”时序,在将总线拉低后,控制器在整个时序内必须持续控制

总线为低电平(至少60μs)。

DS18B20在控制器发出写时序后的15~60μs的时间窗口内采样

总线。如果在采样窗口期间总线为高,“1”就被写入DS18B20;如果

在采样窗口期间总线为低,“0”就被写入DS18B20。

(4)读时序

当控制器发出读时序时,DS18B20可以发送数据到控制器。

所有读时序必须持续最少60μs,每个读时序之间必须有至少1

μs的恢复时间。读时序从控制设备将总线拉低至少1μs后释放总

线开始。控制器启动读时序后,DS18B20开始在总线上传送“1”或

“0”时,DS18B20通过保持总线为高发送“1”,将总线拉低发送“0”

发送“0”时,DS18B20在时序结束时释放总线,总线被上拉电阻拉

回到高电平空闲状态。 从DS18B20输出的数据在启动读时序的

下降沿后15μs内有效。因此,控制器必须在时序开始的15µs内释

放总线然后采样总线状态。

通过读写时序,控制器可以发出控制命令,对DS18B20进行读写

操作。

4. DS18B20常用命令

(1) SKIP ROM [CCH]

120

控制器可以用这一命令同时访问总线上的所有设备而不需要送

出ROM序列码信息。例如:发出Skip ROM命令后接着送出Convert T

[44H] 命令,控制器可以使总线上的所有DS18B20同时进行温度转

换。请注意,仅当总线上只有一个从属设备时,Skip ROM命令后才

可跟着Read Scratchpad [BEH] 命令。如果总线上有多于一个的从

属设备,由于多设备企图同时送出数据,将引起数据冲突。

(2) SEARCH ROM [F0H]

当系统开始上电时,控制器必须识别总线上所有从机的ROM序列

码,以确定从机的数目和它们的类别。控制器需要执行Search ROM

循环(如Search ROM命令后接着数据交换)足够多次以识别所有的

从属设备。如果只有一个从属设备在总线上,可使用简单的Read ROM

命令取代Search ROM。每一个Search ROM命令之后必须返回到事务

序列的步骤1(初始化)。

(3) READ ROM [33H]

这一命令在总线上只有一个从属设备时使用。它使得控制器可以

不用Search ROM命令就可读出从机的64位ROM序列码。当多于一个

从属设备在总线上时,如果使用该命令,由于所有设备都企图响应该

命令将产生数据冲突。

(4) CONVERT T [44H]

这一命令开始一次温度转换。变换结束后,数据保存在暂存器的

2字节温度寄存器中,DS18B20回到低功耗空闲状态。如果设备工作

在寄生电源模式,则这一命令发出后10µs之内,在整个变换期间

121

(tconv)控制器必须在总线上能够有强的上拉。如果DS18B20由外

部电源供电,那么Convert T命令之后控制器可以发出读时序。如果

温度变换正在进行,那么DS18B20返回“0”;如果已经完毕,则返回

“1”。在寄生供电模式下,不能使用这一技术,因为在变换期间总线

被抬高。

(5) WRITE SCRATCHPAD [4EH]

这一命令使得控制器可以写3字节数据到DS18B20的暂存器中。

第一字节数据写到TH寄存器(暂存器的字节2),第2字节写到TL

寄存器(字节3),第3字节写到配置寄存器(字节4)。数据以最低

有效位先发送。所有3字节必须在控制器发出复位或数据可能丢失之

前写完。

(6) READ SCRTCHPAD [BEH]

这一命令使控制器可以读暂存器的内容。数据传送开始于字节0

的最低位,直到暂存器的第9字节(字节8CRC)被读取。任何时候,

如果只需部分暂存器数据,控制器可以使用复位结束读操作。

温度传感器ds1820 的汇编程序

TEMPER_L EQU 36H

TEMPER_H EQU 35H

TEMPER_NUM EQU 60H

FLAG1 BIT 00H

DQ BIT P3.3

AAA: MOV SP,#70H

122

LCALL GET_TEMPER

LCALL TEMPER_COV

LJMP AAA

NOP

;------------------读出转换后的温度值

GET_TEMPER:

SETB DQ ; 定时入口

BCD: LCALL INIT_1820

JB FLAG1,S22

LJMP BCD ; 若DS18B20不存在则返回

S22: LCALL DELAY1

MOV A,#0CCH ; 跳过ROM匹配------0CC

LCALL WRITE_1820

MOV A,#44H ; 发出温度转换命令

LCALL WRITE_1820

NOP

LCALL DELAY

LCALL DELAY

CBA: LCALL INIT_1820

JB FLAG1,ABC

LJMP CBA

ABC: LCALL DELAY1

123

MOV A,#0CCH ; 跳过ROM匹配

LCALL WRITE_1820

MOV A,#0BEH ; 发出读温度命令

LCALL WRITE_1820

LCALL READ_18200 ;READ_1820

RET

;读DS18B20的程序,从DS18B20中读出一个字节的数据

READ_1820:

MOV R2,#8

RE1:

CLR C

SETB DQ

NOP

NOP

CLR DQ

NOP

NOP

NOP

SETB DQ

MOV R3,#7

DJNZ R3,$

MOV C,DQ

124

MOV R3,#23

DJNZ R3,$

RRC A

DJNZ R2,RE1

RET

;-------------------写DS18B20的程序

WRITE_1820:

MOV R2,#8

CLR C

WR1:

CLR DQ

MOV R3,#6

DJNZ R3,$

RRC A

MOV DQ,C

MOV R3,#23

DJNZ R3,$

SETB DQ

NOP

DJNZ R2,WR1

SETB DQ

RET

125

;-------------------读DS18B20的程序,从DS18B20中读出

两个字节的温度数据

READ_18200:

MOV R4,#2 ; 将温度高位和低位从DS18B20

中读出

MOV R1,#36H ; 低位存入

入35H(TEMPER_H)

RE00:

MOV R2,#8

RE01:

CLR C

SETB DQ

NOP

NOP

CLR DQ

NOP

NOP

NOP

SETB DQ

MOV R3,#7

DJNZ R3,$

MOV C,DQ

126

36H(TEMPER_L),高位存

MOV R3,#23

DJNZ R3,$

RRC A

DJNZ R2,RE01

MOV @R1,A

DEC R1

DJNZ R4,RE00

RET

;-------------------将从DS18B20中读出的温度数据进行

转换

TEMPER_COV:

MOV A,#0F0H

ANL A,TEMPER_L ; 舍去温度低位中小数点后的

四位温度数值

SWAP A

MOV TEMPER_NUM,A

MOV A,TEMPER_L

JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值

INC TEMPER_NUM

TEMPER_COV1:

MOV A,TEMPER_H

ANL A,#07H

127

SWAP A

ORL A,TEMPER_NUM

MOV TEMPER_NUM,A ; 保存变换后的温度数据

LCALL BIN_BCD

RET

;-------------------将16进制的温度数据转换成压缩BCD码

BIN_BCD:

MOV DPTR,#TEMP_TAB

MOV A,TEMPER_NUM

MOVC A,@A+DPTR

MOV TEMPER_NUM,A

RET

TEMP_TAB:

DB 00H,01H,02H,03H,04H,05H,06H,07H

DB 08H,09H,10H,11H,12H,13H,14H,15H

DB 16H,17H,18H,19H,20H,21H,22H,23H

DB 24H,25H,26H,27H,28H,29H,30H,31H

DB 32H,33H,34H,35H,36H,37H,38H,39H

DB 40H,41H,42H,43H,44H,45H,46H,47H

DB 48H,49H,50H,51H,52H,53H,54H,55H

DB 56H,57H,58H,59H,60H,61H,62H,63H

DB 64H,65H,66H,67H,68H,69H,70H,71H

128

DB 72H,73H,74H,75H,76H,77H,78H,79H

DB 80H,81H,82H,83H,84H,85H,86H,87H

DB 88H,89H,90H,91H,92H,93H,94H,95H

DB 96H,97H,98H,99H

;-------------------DS18B20初始化程序

INIT_1820:

SETB DQ

NOP

CLR DQ

MOV R0,#80H

TSR1:

DJNZ R0,TSR1 ; 延时

SETB DQ

MOV R0,#25H ;96US-25H

TSR2:

DJNZ R0,TSR2

JNB DQ,TSR3

LJMP TSR4 ; 延时

TSR3:

SETB FLAG1 ; 置标志位,表示DS1820存在

LJMP TSR5

TSR4:

129

CLR FLAG1 ; 清标志位,表示DS1820不存在

LJMP TSR7

TSR5:

MOV R0,#06BH ;200US

TSR6:

DJNZ R0,TSR6 ; 延时

TSR7:

SETB DQ

RET

;------------------重新写DS18B20暂存存储器设定值

RE_CONFIG:

JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转

RE_CONFIG1

RET

RE_CONFIG1:

MOV A,#0CCH ; 发SKIP ROM命令

LCALL WRITE_1820

MOV A,#4EH ; 发写暂存存储器命令

LCALL WRITE_1820

MOV A,#00H ; TH(报警上限)中写入00H

LCALL WRITE_1820

MOV A,#00H ; TL(报警下限)中写入00H

130

LCALL WRITE_1820

MOV A,#7FH ; 选择12位温度分辨率

LCALL WRITE_1820

RET

;------------------延时子程序

DELAY: MOV R7,#00H

MIN: DJNZ R7,YS500

RET

YS500: LCALL YS500US

LJMP MIN

YS500US:MOV R6,#00H

DJNZ R6,$

RET

DELAY1: MOV R7,#20H

DJNZ R7,$

RET

3-10 串行通讯

可以通过串行通信电缆与计算机进行通讯,实现数据信息的交换。其

引脚说明如下:

131

串口接收程序如下:

;----------------------------------------------------------

ORG 0000H

JMP START

START: MOV SP,#60H ; 设定堆栈区

MOV SCON,#01010000B ; 设定串列方式 MODE1,接收

时 REN=1

MOV TMOD,#20H ; 设定计时器1 为 模式2

ORL PCON,#10000000B ; SMOD=1

MOV TH1,#0F4H ; 设定波特率为 4800

SETB TR1 ; 计时器1 ,开始计时

MOV R0,#30H

MOV R7,#05H

AGAIN:

JNB RI,$

CLR RI

MOV A,SBUF

MOV @R0,A

INC R0

132

DJNZ R7,AGAIN

RET

END

;----------------------------------------------------------

串口发送程序如下:

;----------------------------------------------------------

ORG 0000H

JMP START

START: MOV SP,#60H ; 设定堆栈区

MOV SCON,#01010000B ; 设定串列方式 MODE1,接收

时 REN=1

MOV TMOD,#20H ; 设定计时器1 为 模式2

ORL PCON,#10000000B ; SMOD=1

MOV TH1,#0F4H ; 设定波特率为 4800

SETB TR1 ; 计时器1 ,开始计时

MOV A,#30H ; 0...9 的ASCII码为

39H

AGAIN:

MOV SBUF,A ; 送发送缓冲区

; 等待发送完成 JNB TI,$

CLR TI

INC A ; 发送下一个

133

CJNE A,#3AH, AGAIN

RET

END

;----------------------------------------------------------

3-11 音乐的应用

硬件设计与基本概念

要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此

周期除以2,即为半周期的时间。利用定时器计时这个半周期时间,

每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间

再对I/O反相,就可在I/O脚上得到此频率的脉冲。利用单片机内部

定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产

生不同频率的方法。

134

电路如图所示,蜂鸣器的动作由P3.7控制。当输出低电平时蜂

鸣器发出响声,输出高电平时不响,我们只要控制蜂鸣器输出高低电

平的时间和变化频率就可以让蜂鸣器发出悦耳的音乐。

实例程序如下:

*************************************

*************************************

ORG 0000H

JMP START

ORG 000BH

JMP TIM0

START:MOV TMOD,#01H

MOV IE,#82H

START0:MOV 30H,#00H

NEXT: MOV A,30H

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV R2,A

JZ END0

ANL A,#0FH

MOV R5,A

MOV A,R2

135

SWAP A

ANL A,#0FH

JNZ SING

CLR TR0

JMP D1

SING: DEC A

MOV 22H,A

RL A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV TH0,A

MOV 21H,A

MOV A,22H

RL A

INC A

MOVC A,@A+DPTR

MOV TL0,A

MOV 20H,A

SETB TR0

D1: CALL DELAY

INC 30H

JMP NEXT

136

END0: CLR TR0

JMP START0

TIM0: PUSH ACC

PUSH PSW

MOV TH0,21H

MOV TL0,20H

CPL P3.7

POP PSW

POP ACC

RETI

MOV R7,#02 DELAY:

D2:

D3:

MOV R4,#187

MOV R3,#248

DJNZ R3,$

DJNZ R4,D3

DJNZ R7,D2

DJNZ R5,DELAY

RET

TABLE1:

DW 64260,64400,64524,64580

DW 64684,64777,64820,64898

DW 64968,65030,65058,65110

137

DW 65157,65178,65217

TABLE:

DB 82H,01H,81H,94H,84H

DB 0B4H,0A4H,04H

DB 82H,01H,81H,94H,84H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,0F4H,0D4H

DB 0B4H,0A4H,94H

DB 0E2H,01H,0E1H,0D4H,0B4H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,94H,84H

DB 0B4H,0A4H,04H

DB 82H,01H,81H,94H,84H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,0F4H,0D4H

DB 0B4H,0A4H,94H

DB 0E2H,01H,0E1H,0D4H,0B4H

DB 0C4H,0B4H,04H

DB 00H

END

138

3-12 继电器

硬件设计与基本概念

继电器广泛用于生产控制的电力系统中,其作用是利用它的常闭

和常开触点进行电路切换。由于继电器是利用改变金属触点位置,使

动触点和定触点闭合或分开,所以具有接触电阻小,流过电流大和耐

压高等优点,特别适用于大电流高电压的使用场合。小型继电器也常

用作精密测量电路的转换开关。

MAIN: CLR p3.6 ;继电器吸合

setb p3.7 ;蜂鸣器停叫

LCALL DELAY

SETB P3.6 ;继电器断开

139

LCALL DELAY

NOP

NOP

CLR p3.7 ;蜂鸣器鸣叫

LCALL DELAY

JMP MAIN

DELAY: MOV R5,#06H

HH0: MOV R6,#0FFH

HH1 : MOV R7,#0ffH

HH2: DJNZ R7,HH2

DJNZ R6,HH1

DJNZ R5,HH0

RET

END

第四章 下载调试的使用

本实验板自带一片调试监控芯片,使该监控的调试直接借助Keil

C51软件进行,使开发更加方便快捷。

注意:

此调试监控只是为了方便没有仿真器的用户做简单的调试之用,

由于版权关系,在用户使用此监控软件过程中出现的调试问题,均不

属于本公司以及本产品的责任范围,

140

请依照下面步骤进行连接即可:

把开发板上的用户CPU (STC89C52RC) 取下, 换上调试监控, 用标准

RS232连接线把实验板的串口和计算机的RS232口连接好。

步骤一:生成Project和编辑用户程序。选择一个SST MCU

(SST89E54D2、SST89E58RD和SST89E/V564RD等)做目标器件。

步骤二:配置

从Keil用户界面选择“Option for ‘Targe1t’”,

141

在“Option for ‘Targe1t’”窗口Debug栏中,选择“Use Keil Monitor

-51 Driver”,注意当每次RESET目标板时用户的代码区会被擦除,

如果用户程序需要在开始时下载到目标板,要勾上“Load

Application at Startup”。

点击Setting项,弹出Target Setup窗口进行配置,选择目标板与

PC通讯的串行接口(COM1-COM4)和波特率,如果需要显示存储器的

实时窗口,不要选择Cache Option。注意如果选择了Serial

142

Interrupt去Stop Porgram Execution,SoftICE将修改在位置c:

0023h的中断向量3个BYTE,请确保用户程序没有占用这些地址。

以上的设定可以在程序调试过程再次修改。

步骤3:开始调试

从Debug菜单点击Start/Stop Debug Session开始调试过程。

143

在连接过程中,偶尔会出现连接重试的情况,此时只要按一下复

位按钮即可连接成功,建议每次连接之前进行复位。连接成功之

后就可直接单步、断点、全速运行。

特别提示:

不要对监控芯片进行烧写!

连接不成功的几种情况:

1.

波特率设置不对;

2.

端口号设置不对;

3.

端口被其它应用程序占用;

4.

片内监控已被意外操作冲掉;

第五章 在系统可编程的使用

STC89系列单片机大部分具有在系统可编程(ISP)的特性,ISP

的好处是省去购买通用编程器,单片机在用户系统上即可下载/烧录

用户程序。大部分STC89系列单片机在销售给用户之前已经在单片机

内部固化有ISP系统引导程序,配合PC端的控制程序即可将用户的

程序代码下载进单片机内部,故无须编程器(速度比通用编程器快)。

不要用通用编程器编程,否则有可能将单片机内部已固化的ISP系统

引导程序擦除,造成无法使用STC提供的ISP软件下载用户的程序代

码。

操作步骤:解压、安装、运行STC-ISP软件

144

步骤1:选择你所使用的单片机型号,STC89C52RC

步骤2:打开文件,要烧录用户程序,必须调入用户的程序代码

(*.bin,*.hex),可直接调光盘里可下载烧写的目标代码文件夹下的

hex代码,进行测试

步骤3:选择串口号,你所用的电脑串口是COM1还是COM2

步骤4:设置是否双倍速,双倍速选中Double Speed即可,STC89C52RC

系列出厂时为单倍速,用户可指定设为双倍速,如想从双倍速恢复成

单倍速,则需用通用编程器擦除整个晶片方可,这会将单片机内部已

烧录的ISP引导程序擦除。一般使用缺省设置即可,无须设置。

OSCDN:单片机时钟振荡器增益

选1/2 gain为降一半,降低EMI;选full gain(全增益)为正

常状态

145

步骤5:选择“Download/下载”按钮下载用户的程序进单片机内部,

可重复执行步骤5,也可选择“ Re-Download/重复下载”按钮。

下载时注意看提示,主要看是否要给单片机上电或复位,下载速

度比一般通用编程器快。一般先选择“Download/下载”按钮,然后

再给单片机上电复位(先彻底断电),而不要先上电。

下载编程成功如图所示:

这样即可上电运行用户的程序了。

146

2024年8月31日发(作者:梁易蓉)

通过把RST输入驱动至高电平来启动所有的数据传送。RST输入

有两种功能。首先,RST接通控制逻辑,允许地址/命令序列送入移

位寄存器。其次,RST提供了中止单字节或多字节数据传送的手段。

数据输入时,在时钟的上升沿数据必须有效,而数据位在时钟的

下降沿输出。如果RST输入为低电平,那么所有的数据传送中止且

I/O引脚变为高阻抗状态。上电时,在VCC2 ≥2.5V之前,RST必须

为逻辑0。此外,当把RST驱动至逻辑1的状态时,SCLK必须为逻辑

0。

3) 数据输入与输出

跟随在输入写命令字节的八个SCLK周期之后,在下八个SCLK周

期的上升沿输入数据字节。如果有额外的SCLK周期,它们将被忽略。

数据从位0开始输入。

跟随在输入读命令字节的八个SCLK周期之后,在下八个SCLK周

期的下降沿输出数据字节。注意,被传送的第一个数据位发生在写命

令字节的最后一位之后的第一个下降沿。只要RST保持为高电平,如

果有额外的SCLK周期,它们将重新发送数据字节。这一操作使之具

99

有连续的多字节方式的读能力。另外,在SCLK的第一上升沿,I/O

引脚为三态。数据从位0开始输出。

4) 多字节方式

通过对地址31(十进制)寻址,可以把时钟/日历或RAM寄存器

规定为多字节方式,如前所述,位6规定时钟或RAM,而位0规定读

或写,在时钟/日历寄存器中的地址9至31或RAM寄存器中的地址

31不能存储数据。在多字节方式中,读或写从地址0的位0开始。

当以多字节方式写时钟寄存器时,必须按数据传送的次序写最先

八个寄存器。但是,当以多字节方式写RAM时,为了传送数据,不必

写所有31个字节。不管是否写了全部31个字节,所写的每一个字节

都将送至RAM。

5) DS1302内部寄存器

DS1302内部寄存器地址(命令)及数据寄存器分配情况如图。

100

时钟/日历与时钟暂停

时钟/日历包含在七个写/读寄存器中。包含在时钟/日历寄存器的数

据是二十进制(BCD)码。

秒寄存器的位7定义为时钟暂停位。当此位(CH)设置为逻辑1时,

时钟振荡器停止,DS1302被置入低功率的备份方式,其电源消耗小

101

于100nA;当把此位置逻辑0时,时钟将启动。

(1) AM-PM/12-24方式

小时寄存器的位7定义为12或24小时方式选择位。当它为高电平时,

选择12小时方式。在12小时方式下,位5是AM/PM位,此位为逻辑

高电平时表示PM。在24小时方式下,位5是第二个10小时位(20

-23时)。

(2) 写保护寄存器。

写保护寄存器的位7是写保护的。开始七位(位0-6)置为0,在读

操作时总是读出0。在对时钟或RAM进行写操作之前,位7必须为0。

当它为高电平时,写保护防止对任何其它寄存器进行写操作。

(3) 慢速充电寄存器

这个寄存器控制DS1302的慢速充电特征。图是简化的慢速充电基本

电路。

慢速充电选择(TCS)位(位4-位7)控制慢速充电器的选择。为了

102

防止偶然的因素使之工作,只有1010模式才能使慢速充电器工作,

所有其它模式将禁止慢速充电器。DS1302上电时,慢速充电器被禁

止。二极管选择(DS)位(位2、位3)选择是一个二极管还是两个

二级管连接在VCC1与VCC2之间。如果DS为01,那么选择一个二极

管;如果DS为10,则选择两个二极管。如果DS为00或11,那么充

电器被禁止,与TCS无关。RS位(位0、位1)选择连接在VCC1与

VCC2之间的电阻。

(4) 时钟/日历多字节方式

时钟/日历命令字节可规定多字节方式。在此方式下,最先八个时钟/

日历寄存器可以从地址0的第0位开始连接地读或写。

当指定写时钟/日历为多字节方式时,如果写保护位被设置为高电平,

那么没有数据会传送到八个时钟/日历寄存器(包括控制寄存器)的

任一个。在多字节方式下,慢速充电器是不可访问的。

(5) 单字节与多字节RAM方式。

静态RAM中RAM地址空间可按地址读/写的31×8字节。也可设置成

多字节工作方式。在此方式下,可以从地址0的第0位开始顺序读或

写31个字节的RAM寄存器。

(6) 晶振的选择

32 768HZ的晶振可通过引脚2和3(X1、X2)直接连接至DS1302。

所选用晶振规定的负载电容量(CL)应当为6pF。

然而,许多人在选用晶振时仅仅注意了晶振的额定频率值,而忽视了

晶振的负载电容大小,甚至连许多经销商也不能提供所销晶振的负载

103

电容。所以,即使在使用中选用了符合32 768HZ的晶振,但如果该

晶振的负载电容与DS1302提供的6pF不一致时,就会影响晶振的起

振或导致振荡频率的偏移。一般可通过下述方法解决:

①当所选的晶振负载电容不是6pF时,可以采用增加辅助电容的方法

提高或降低DS1302振荡器的电容负载,使之与晶体所需的电容值匹

配。

如果已知晶体的负载电容为C1,若C1<6pF,则可以增加一个并联电

容CS,以产生所需的总负载电容为C1,即C1=6pF+CS;若C1>6pF,

则可以在晶体的一端增加一个串联电容CS,以产生所需的负载电容

C1,即1/C1=1/6pF+1/CS,通过计算即可得出应增加的辅助电容大小。

②在使用前对晶体的负载电容并不知道其值的情况下,通过测定晶体

振荡频率的方法可以确定该晶体负载电容的值。

对于晶体振荡器来说,其振荡频率与负载电容之间的关系是确定的。

以DS1302使用的32 768HZ晶振为例:当它工作于所要求的负载电容

时,能较准确地产生32 768HZ的频率;当它的负载电容小于6pF时,

其振荡频率会正向偏移;当它的负载电容大于6pF时,其振荡频率就

会负向偏移。因此,对于未知负载电容的晶体,应首先采用实验的方

法,在其两端加入辅加电容使晶体起振,然后由频率计测出振荡频率。

若测得频率大于32 768HZ,说明负载电容偏小;若测得频率小于32

768HZ,说明负载电容偏大。对辅助电容逐步调整,最终使振荡频率

尽可能接近32 768HZ,则此时晶体端所接负载电容的总和就是适合

该晶体的负载电容。

104

(7) 电源控制

VCC1是为DS1302提供的备用电源,一般可接3V干电池或3.6V蓄电

池(以便充电)。

VCC2是为DS1302提供的主电源。在这种运用方式中,VCC2给芯片供

电,并通过内部为备用电源充电,以便在没有主电源的情况下能保存

时间信息及数据。

DS1302由VCC1或VCC2两者中较大者供电。当VCC2大于VCC1+0.2V

时,VCC2给DS1302供电;当VCC2小于VCC1时,DS1302由VCC1供

电。

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

;文件名:

;功能 :在LJD-SY2A实验板完成设置DS1302时间为08年8月8日

19点59分59秒,

;显示时、分、秒。

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

LOAD BIT P1.2

DIN BIT P1.0

DCLK BIT P1.1

DOUT BIT P3.2

BUZZER BIT P2.6

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

IO_DATA BIT P1.0

105

SCLK BIT P1.1

RST BIT P1.3

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

BitCnt DATA 30H ; 数据位计数器

ByteCnt DATA 31H ; 数据字节计数器

Command DATA 32H ; 命令字节地址

RcvDat DATA 40H ; 接收数据缓冲区

XmtDat DATA 50H ; 发送数据缓冲区

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

USERFLAG EQU 20H

BCD4A EQU 22H

BCD4B EQU 23H

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

ORG 0000H

JMP START

ORG 0030H

START: MOV P1,#60H

MOV SP,#7FH

; CLR BUZZER

106

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

CLR DIN ;初始化CH451

SETB DCLK

SETB DIN

SETB LOAD

SETB DOUT

NOP

MOV B,#04H ;设置CH451

MOV A,#03H ;关看门狗开显示键盘

LCALL WRITE

NOP

;*********************设置时钟****************************

Write_Enable:

MOV Command,#8Eh ;命令字节为8E

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat ;数据地址覆给R0

MOV XmtDat,#00h ;数据内容为0 写入允许

LCALL Send_Byte ;调用写入数据子程序

;*******************************当把秒寄存器的第7 位时钟停

止位设置为0 时起动时钟开始

MOV Command,#80h ; 命令字节为80

MOV ByteCnt,#1 ; 单字节传送模式

107

MOV R0,#XmtDat ;数据地址覆给R0

MOV XmtDat,#00h ;数据内容为0 振荡器

工作允许

LCALL Send_Byte ;调用写入数据子程序

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

Write_Multiplebyte:

MOV Command,#0BEh ;命令字节为BEh

MOV ByteCnt,#8 ;多字节写入模式此模

块为8 个

MOV R0,#XmtDat ;数据地址覆给R0

MOV XmtDat, #59h ;秒单元内容为59h

MOV XmtDat+1,#59h ;分单元内容为59h

MOV XmtDat+2,#19h ;时单元内容为13h

MOV XmtDat+3,#08h ;日期单元内容为21h

MOV XmtDat+4,#08h ;月单元内容为06h

MOV XmtDat+5,#05h ;星期单元内容为03h

MOV XmtDat+6,#08h ;年单元内容为00h

MOV XmtDat+7,#0 ;写保护单元内容为00h

LCALL Send_Byte ;调用写入数据子程序

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

Read_A1:

108

MOV B,#05H ;设置为译码

MOV A,#08AH

LCALL WRITE

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

TIME:

MOV Command,#85h ; 命令字节为85h

MOV ByteCnt,#1 ; 单字节传送模式

MOV R1,#RcvDat ;数据地址覆给R1

LCALL Receive_Byte ;调用读出数据子

程序

LCALL BCD8_1

MOV B,#0aH

MOV A,BCD4A

LCALL WRITE

ORL BCD4B,#80H

MOV B,#0bH

MOV A,BCD4B

LCALL WRITE

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

MOV Command,#83h

MOV ByteCnt,#1

MOV R1,#RcvDat

109

LCALL Receive_Byte

LCALL BCD8_1

MOV B,#0cH

MOV A,BCD4A

LCALL WRITE

ORL BCD4B,#80H

MOV B,#0dH

MOV A,BCD4B

LCALL WRITE

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

MOV Command,#81h

MOV ByteCnt,#1

MOV R1,#RcvDat

LCALL Receive_Byte

LCALL BCD8_1

MOV B,#0eH

MOV A,BCD4A

LCALL WRITE

MOV B,#0fH

MOV A,BCD4B

LCALL WRITE

NOP

110

LJMP TIME

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

;写CH451程序

;文件名:WRITE

;入参:B、ACC待写的12位数据,低8位在ACC中,高4位在B的

低四位中。

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

WRITE:

; PUSH DPH

; PUSH DPL

; PUSH ACC

CLR EX0

CLR LOAD

MOV R7,#08H

WRITE_1:

RRC A

CLR DCLK

MOV DIN,C

SETB DCLK

DJNZ R7,WRITE_1

MOV A,B

MOV R7,#004H

111

WRITE_2:

RRC A

CLR DCLK

MOV DIN,C

SETB DCLK

DJNZ R7,WRITE_2

SETB LOAD

SETB EX0

; POP ACC

; POP DPH

; POP DPL

RET

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

BCD8_1:

MOV R7,#04H

MOV A,RcvDat

RR1:

CLR C

RRC A

DJNZ R7,RR1

MOV BCD4A,A

NOP

112

MOV R7,#04H

MOV A,RcvDat

RL1:

CLR C

RLC A

DJNZ R7,RL1

SWAP A

MOV BCD4B,A

RET

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

Send_Byte:

CLR RST

NOP

CLR SCLK

NOP

SETB RST

NOP

MOV A,Command

MOV BitCnt,#08h

S_Byte0:

RRC A

MOV IO_DATA,C

113

NOP

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,S_Byte0

NOP

S_Byte1:

MOV A,@R0

MOV BitCnt,#08h

S_Byte2:

RRC A

MOV IO_DATA,C

NOP

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,S_Byte2

INC R0

DJNZ ByteCnt,S_Byte1

NOP

CLR RST

RET

114

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

*****************************

;接收数据程序;

;名称:Receive_Byte

;描述:从被控器DS1302 接收ByteCnt 个字节数据

;命令字节地址在Command 中

;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中

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

*************************

Receive_Byte:

CLR RST ;

NOP

CLR SCLK

NOP

SETB RST

MOV A,Command

MOV BitCnt,#08h

R_Byte0:

RRC A

MOV IO_DATA,C

NOP

115

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,R_Byte0

NOP

R_Byte1:

CLR A

CLR C

MOV BitCnt,#08h

R_Byte2:

NOP

MOV C,IO_DATA

RRC A

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,R_Byte2

MOV @R1,A

INC R1

DJNZ ByteCnt,R_Byte1

NOP

CLR RST

116

RET

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

END

3-9 用单线数字温度传感器DS18B20实现温度测量

来自控制现场的诸如温度、压力等连续变化的物理量经传感器和

变送单元转换后成为一定形式的模拟量。为了将这些量送入单片机,

必须进行A/D转换,将模拟量变成数字量。

1.1 DS18B20概述

DS18B20是Dallas公司推出的单线数字式测温芯片,它能在现

场采集温度数据,并将温度数据直接转换成数字量输出。

1. DS18B20的内部结构、引脚和工作说明

图14-6是DS18B20的内部结构图。

DS18B20只有3个引脚,说明如下:

DQ-数据输入输出。漏极开路1线接口。也在寄生电源模式时给

设备提供电源。

VDD-可选的电源电压脚。VDD在寄生电源模式时必须接地。

GND-地

DS18B20的64位ROM保存了设备的惟一序列码。高速闪存

(scratchpad)包含2字节的温度寄存器,保存了温度传感器的数字

输出。该闪存还提供了对上限(TH)和下限(TL)超标报警寄存器、

117

配置寄存器(各1字节)的访问。TH、TL和配置寄存器是非易失性

的(EEPROM),系统掉电时它们会保存数据。

DS18B20利用Dallas的单总线控制协议,实现了利用单线控制

信号在总线上进行通信。由于所有的设备通过漏极开路端(即DS18B20

的DQ脚)连在总线上,控制线需要一个上拉电阻(大约5K)。在这

一总线系统中,微控制器(主控设备)通过惟一的64位序列码识别

和访问总线上的器件。由于每一设备有惟一的编码,连在一条总线上

可被访问的器件数实际上是无限的。

DS18B20的另一个特点是在没有外部电源下操作的能力。电源由

总线为高电平时DQ脚上的上拉电阻提供(寄生供电模式),此时VDD

脚接地。

另外,DS18B20也可用传统方式供电,此时将外部电源连在VDD脚上

即可。

2. DS18B20的寄存器

DS18B20存储器组织如图14.7所示。字节0和字节1分别包含

温度寄存器的LSB和MSB,这些字节是只读的。字节2和3提供了对

TH(上限报警触发寄存器)和TL(下限报警触发寄存器)的访问。

字节4包含配置寄存器数据。字节5、6和7保留作器件内部使用,

不能被改写;当读时,这些字节返回全1值。字节8是只读的,含有

字节0到字节7的CRC校验。

高速闪存的第4个字节包含配置寄存器,其组织结构如图14-8

所示。用户可以用这一寄存器的R0和R1位设置DS18B20的转换分辨

118

率(见表14-1)。这些位上电后默认值是R0=1和R1=1(12位分辨率)。

第7位和0~4位保留作内部使用,不能更改;在读时这些位返回1。

3. DS18B20的读写

访问DS18B20的顺序如理

*初始化;

*ROM命令(接着是任何需要的数据交换);

*DS18B20函数命令(接着是任何需要的数据交换)。

每一次访问DS18B20时必须遵循这一顺序,如果其中的任何一步

缺少或打乱它们的顺序,DS18B20将不会响应。

(1)初始化时序

所有与DS18B20的通信首先必须初始化:控制器发出复位脉冲,

DS18B20以存在脉冲响应。在图14-9中给出了描述。当DS18B20发

出存在脉冲对复位响应时,它指示控制器该DS18B20已经在总线上并

准备好操作。

(2)读/写时序

控制器在写时序写数据到DS18B20,在读时序从DS18B20中读数

据。每一总线时序传送1位数据。

读/写时序图见图14-10。

(3)写流程时序

有两种类型的写时序:写1时序和写0时序。控制器用写“1”

时序写逻辑“1”到DS18B20,用写“0”时序写逻辑“0”到DS18B20。

所有写时序必须持续最少60μs,每个写时序之间必须有至少1μs

119

的恢复时间。两种类型的写时序都从控制器把总线拉低开始。

为产生写“1”时序,在将总线拉低后,总线控制器必须在15μ

s内释放总线。总线释放后,5K的上拉电阻将总线电平抬高。为产生

写“0”时序,在将总线拉低后,控制器在整个时序内必须持续控制

总线为低电平(至少60μs)。

DS18B20在控制器发出写时序后的15~60μs的时间窗口内采样

总线。如果在采样窗口期间总线为高,“1”就被写入DS18B20;如果

在采样窗口期间总线为低,“0”就被写入DS18B20。

(4)读时序

当控制器发出读时序时,DS18B20可以发送数据到控制器。

所有读时序必须持续最少60μs,每个读时序之间必须有至少1

μs的恢复时间。读时序从控制设备将总线拉低至少1μs后释放总

线开始。控制器启动读时序后,DS18B20开始在总线上传送“1”或

“0”时,DS18B20通过保持总线为高发送“1”,将总线拉低发送“0”

发送“0”时,DS18B20在时序结束时释放总线,总线被上拉电阻拉

回到高电平空闲状态。 从DS18B20输出的数据在启动读时序的

下降沿后15μs内有效。因此,控制器必须在时序开始的15µs内释

放总线然后采样总线状态。

通过读写时序,控制器可以发出控制命令,对DS18B20进行读写

操作。

4. DS18B20常用命令

(1) SKIP ROM [CCH]

120

控制器可以用这一命令同时访问总线上的所有设备而不需要送

出ROM序列码信息。例如:发出Skip ROM命令后接着送出Convert T

[44H] 命令,控制器可以使总线上的所有DS18B20同时进行温度转

换。请注意,仅当总线上只有一个从属设备时,Skip ROM命令后才

可跟着Read Scratchpad [BEH] 命令。如果总线上有多于一个的从

属设备,由于多设备企图同时送出数据,将引起数据冲突。

(2) SEARCH ROM [F0H]

当系统开始上电时,控制器必须识别总线上所有从机的ROM序列

码,以确定从机的数目和它们的类别。控制器需要执行Search ROM

循环(如Search ROM命令后接着数据交换)足够多次以识别所有的

从属设备。如果只有一个从属设备在总线上,可使用简单的Read ROM

命令取代Search ROM。每一个Search ROM命令之后必须返回到事务

序列的步骤1(初始化)。

(3) READ ROM [33H]

这一命令在总线上只有一个从属设备时使用。它使得控制器可以

不用Search ROM命令就可读出从机的64位ROM序列码。当多于一个

从属设备在总线上时,如果使用该命令,由于所有设备都企图响应该

命令将产生数据冲突。

(4) CONVERT T [44H]

这一命令开始一次温度转换。变换结束后,数据保存在暂存器的

2字节温度寄存器中,DS18B20回到低功耗空闲状态。如果设备工作

在寄生电源模式,则这一命令发出后10µs之内,在整个变换期间

121

(tconv)控制器必须在总线上能够有强的上拉。如果DS18B20由外

部电源供电,那么Convert T命令之后控制器可以发出读时序。如果

温度变换正在进行,那么DS18B20返回“0”;如果已经完毕,则返回

“1”。在寄生供电模式下,不能使用这一技术,因为在变换期间总线

被抬高。

(5) WRITE SCRATCHPAD [4EH]

这一命令使得控制器可以写3字节数据到DS18B20的暂存器中。

第一字节数据写到TH寄存器(暂存器的字节2),第2字节写到TL

寄存器(字节3),第3字节写到配置寄存器(字节4)。数据以最低

有效位先发送。所有3字节必须在控制器发出复位或数据可能丢失之

前写完。

(6) READ SCRTCHPAD [BEH]

这一命令使控制器可以读暂存器的内容。数据传送开始于字节0

的最低位,直到暂存器的第9字节(字节8CRC)被读取。任何时候,

如果只需部分暂存器数据,控制器可以使用复位结束读操作。

温度传感器ds1820 的汇编程序

TEMPER_L EQU 36H

TEMPER_H EQU 35H

TEMPER_NUM EQU 60H

FLAG1 BIT 00H

DQ BIT P3.3

AAA: MOV SP,#70H

122

LCALL GET_TEMPER

LCALL TEMPER_COV

LJMP AAA

NOP

;------------------读出转换后的温度值

GET_TEMPER:

SETB DQ ; 定时入口

BCD: LCALL INIT_1820

JB FLAG1,S22

LJMP BCD ; 若DS18B20不存在则返回

S22: LCALL DELAY1

MOV A,#0CCH ; 跳过ROM匹配------0CC

LCALL WRITE_1820

MOV A,#44H ; 发出温度转换命令

LCALL WRITE_1820

NOP

LCALL DELAY

LCALL DELAY

CBA: LCALL INIT_1820

JB FLAG1,ABC

LJMP CBA

ABC: LCALL DELAY1

123

MOV A,#0CCH ; 跳过ROM匹配

LCALL WRITE_1820

MOV A,#0BEH ; 发出读温度命令

LCALL WRITE_1820

LCALL READ_18200 ;READ_1820

RET

;读DS18B20的程序,从DS18B20中读出一个字节的数据

READ_1820:

MOV R2,#8

RE1:

CLR C

SETB DQ

NOP

NOP

CLR DQ

NOP

NOP

NOP

SETB DQ

MOV R3,#7

DJNZ R3,$

MOV C,DQ

124

MOV R3,#23

DJNZ R3,$

RRC A

DJNZ R2,RE1

RET

;-------------------写DS18B20的程序

WRITE_1820:

MOV R2,#8

CLR C

WR1:

CLR DQ

MOV R3,#6

DJNZ R3,$

RRC A

MOV DQ,C

MOV R3,#23

DJNZ R3,$

SETB DQ

NOP

DJNZ R2,WR1

SETB DQ

RET

125

;-------------------读DS18B20的程序,从DS18B20中读出

两个字节的温度数据

READ_18200:

MOV R4,#2 ; 将温度高位和低位从DS18B20

中读出

MOV R1,#36H ; 低位存入

入35H(TEMPER_H)

RE00:

MOV R2,#8

RE01:

CLR C

SETB DQ

NOP

NOP

CLR DQ

NOP

NOP

NOP

SETB DQ

MOV R3,#7

DJNZ R3,$

MOV C,DQ

126

36H(TEMPER_L),高位存

MOV R3,#23

DJNZ R3,$

RRC A

DJNZ R2,RE01

MOV @R1,A

DEC R1

DJNZ R4,RE00

RET

;-------------------将从DS18B20中读出的温度数据进行

转换

TEMPER_COV:

MOV A,#0F0H

ANL A,TEMPER_L ; 舍去温度低位中小数点后的

四位温度数值

SWAP A

MOV TEMPER_NUM,A

MOV A,TEMPER_L

JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值

INC TEMPER_NUM

TEMPER_COV1:

MOV A,TEMPER_H

ANL A,#07H

127

SWAP A

ORL A,TEMPER_NUM

MOV TEMPER_NUM,A ; 保存变换后的温度数据

LCALL BIN_BCD

RET

;-------------------将16进制的温度数据转换成压缩BCD码

BIN_BCD:

MOV DPTR,#TEMP_TAB

MOV A,TEMPER_NUM

MOVC A,@A+DPTR

MOV TEMPER_NUM,A

RET

TEMP_TAB:

DB 00H,01H,02H,03H,04H,05H,06H,07H

DB 08H,09H,10H,11H,12H,13H,14H,15H

DB 16H,17H,18H,19H,20H,21H,22H,23H

DB 24H,25H,26H,27H,28H,29H,30H,31H

DB 32H,33H,34H,35H,36H,37H,38H,39H

DB 40H,41H,42H,43H,44H,45H,46H,47H

DB 48H,49H,50H,51H,52H,53H,54H,55H

DB 56H,57H,58H,59H,60H,61H,62H,63H

DB 64H,65H,66H,67H,68H,69H,70H,71H

128

DB 72H,73H,74H,75H,76H,77H,78H,79H

DB 80H,81H,82H,83H,84H,85H,86H,87H

DB 88H,89H,90H,91H,92H,93H,94H,95H

DB 96H,97H,98H,99H

;-------------------DS18B20初始化程序

INIT_1820:

SETB DQ

NOP

CLR DQ

MOV R0,#80H

TSR1:

DJNZ R0,TSR1 ; 延时

SETB DQ

MOV R0,#25H ;96US-25H

TSR2:

DJNZ R0,TSR2

JNB DQ,TSR3

LJMP TSR4 ; 延时

TSR3:

SETB FLAG1 ; 置标志位,表示DS1820存在

LJMP TSR5

TSR4:

129

CLR FLAG1 ; 清标志位,表示DS1820不存在

LJMP TSR7

TSR5:

MOV R0,#06BH ;200US

TSR6:

DJNZ R0,TSR6 ; 延时

TSR7:

SETB DQ

RET

;------------------重新写DS18B20暂存存储器设定值

RE_CONFIG:

JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转

RE_CONFIG1

RET

RE_CONFIG1:

MOV A,#0CCH ; 发SKIP ROM命令

LCALL WRITE_1820

MOV A,#4EH ; 发写暂存存储器命令

LCALL WRITE_1820

MOV A,#00H ; TH(报警上限)中写入00H

LCALL WRITE_1820

MOV A,#00H ; TL(报警下限)中写入00H

130

LCALL WRITE_1820

MOV A,#7FH ; 选择12位温度分辨率

LCALL WRITE_1820

RET

;------------------延时子程序

DELAY: MOV R7,#00H

MIN: DJNZ R7,YS500

RET

YS500: LCALL YS500US

LJMP MIN

YS500US:MOV R6,#00H

DJNZ R6,$

RET

DELAY1: MOV R7,#20H

DJNZ R7,$

RET

3-10 串行通讯

可以通过串行通信电缆与计算机进行通讯,实现数据信息的交换。其

引脚说明如下:

131

串口接收程序如下:

;----------------------------------------------------------

ORG 0000H

JMP START

START: MOV SP,#60H ; 设定堆栈区

MOV SCON,#01010000B ; 设定串列方式 MODE1,接收

时 REN=1

MOV TMOD,#20H ; 设定计时器1 为 模式2

ORL PCON,#10000000B ; SMOD=1

MOV TH1,#0F4H ; 设定波特率为 4800

SETB TR1 ; 计时器1 ,开始计时

MOV R0,#30H

MOV R7,#05H

AGAIN:

JNB RI,$

CLR RI

MOV A,SBUF

MOV @R0,A

INC R0

132

DJNZ R7,AGAIN

RET

END

;----------------------------------------------------------

串口发送程序如下:

;----------------------------------------------------------

ORG 0000H

JMP START

START: MOV SP,#60H ; 设定堆栈区

MOV SCON,#01010000B ; 设定串列方式 MODE1,接收

时 REN=1

MOV TMOD,#20H ; 设定计时器1 为 模式2

ORL PCON,#10000000B ; SMOD=1

MOV TH1,#0F4H ; 设定波特率为 4800

SETB TR1 ; 计时器1 ,开始计时

MOV A,#30H ; 0...9 的ASCII码为

39H

AGAIN:

MOV SBUF,A ; 送发送缓冲区

; 等待发送完成 JNB TI,$

CLR TI

INC A ; 发送下一个

133

CJNE A,#3AH, AGAIN

RET

END

;----------------------------------------------------------

3-11 音乐的应用

硬件设计与基本概念

要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此

周期除以2,即为半周期的时间。利用定时器计时这个半周期时间,

每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间

再对I/O反相,就可在I/O脚上得到此频率的脉冲。利用单片机内部

定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产

生不同频率的方法。

134

电路如图所示,蜂鸣器的动作由P3.7控制。当输出低电平时蜂

鸣器发出响声,输出高电平时不响,我们只要控制蜂鸣器输出高低电

平的时间和变化频率就可以让蜂鸣器发出悦耳的音乐。

实例程序如下:

*************************************

*************************************

ORG 0000H

JMP START

ORG 000BH

JMP TIM0

START:MOV TMOD,#01H

MOV IE,#82H

START0:MOV 30H,#00H

NEXT: MOV A,30H

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV R2,A

JZ END0

ANL A,#0FH

MOV R5,A

MOV A,R2

135

SWAP A

ANL A,#0FH

JNZ SING

CLR TR0

JMP D1

SING: DEC A

MOV 22H,A

RL A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV TH0,A

MOV 21H,A

MOV A,22H

RL A

INC A

MOVC A,@A+DPTR

MOV TL0,A

MOV 20H,A

SETB TR0

D1: CALL DELAY

INC 30H

JMP NEXT

136

END0: CLR TR0

JMP START0

TIM0: PUSH ACC

PUSH PSW

MOV TH0,21H

MOV TL0,20H

CPL P3.7

POP PSW

POP ACC

RETI

MOV R7,#02 DELAY:

D2:

D3:

MOV R4,#187

MOV R3,#248

DJNZ R3,$

DJNZ R4,D3

DJNZ R7,D2

DJNZ R5,DELAY

RET

TABLE1:

DW 64260,64400,64524,64580

DW 64684,64777,64820,64898

DW 64968,65030,65058,65110

137

DW 65157,65178,65217

TABLE:

DB 82H,01H,81H,94H,84H

DB 0B4H,0A4H,04H

DB 82H,01H,81H,94H,84H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,0F4H,0D4H

DB 0B4H,0A4H,94H

DB 0E2H,01H,0E1H,0D4H,0B4H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,94H,84H

DB 0B4H,0A4H,04H

DB 82H,01H,81H,94H,84H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,0F4H,0D4H

DB 0B4H,0A4H,94H

DB 0E2H,01H,0E1H,0D4H,0B4H

DB 0C4H,0B4H,04H

DB 00H

END

138

3-12 继电器

硬件设计与基本概念

继电器广泛用于生产控制的电力系统中,其作用是利用它的常闭

和常开触点进行电路切换。由于继电器是利用改变金属触点位置,使

动触点和定触点闭合或分开,所以具有接触电阻小,流过电流大和耐

压高等优点,特别适用于大电流高电压的使用场合。小型继电器也常

用作精密测量电路的转换开关。

MAIN: CLR p3.6 ;继电器吸合

setb p3.7 ;蜂鸣器停叫

LCALL DELAY

SETB P3.6 ;继电器断开

139

LCALL DELAY

NOP

NOP

CLR p3.7 ;蜂鸣器鸣叫

LCALL DELAY

JMP MAIN

DELAY: MOV R5,#06H

HH0: MOV R6,#0FFH

HH1 : MOV R7,#0ffH

HH2: DJNZ R7,HH2

DJNZ R6,HH1

DJNZ R5,HH0

RET

END

第四章 下载调试的使用

本实验板自带一片调试监控芯片,使该监控的调试直接借助Keil

C51软件进行,使开发更加方便快捷。

注意:

此调试监控只是为了方便没有仿真器的用户做简单的调试之用,

由于版权关系,在用户使用此监控软件过程中出现的调试问题,均不

属于本公司以及本产品的责任范围,

140

请依照下面步骤进行连接即可:

把开发板上的用户CPU (STC89C52RC) 取下, 换上调试监控, 用标准

RS232连接线把实验板的串口和计算机的RS232口连接好。

步骤一:生成Project和编辑用户程序。选择一个SST MCU

(SST89E54D2、SST89E58RD和SST89E/V564RD等)做目标器件。

步骤二:配置

从Keil用户界面选择“Option for ‘Targe1t’”,

141

在“Option for ‘Targe1t’”窗口Debug栏中,选择“Use Keil Monitor

-51 Driver”,注意当每次RESET目标板时用户的代码区会被擦除,

如果用户程序需要在开始时下载到目标板,要勾上“Load

Application at Startup”。

点击Setting项,弹出Target Setup窗口进行配置,选择目标板与

PC通讯的串行接口(COM1-COM4)和波特率,如果需要显示存储器的

实时窗口,不要选择Cache Option。注意如果选择了Serial

142

Interrupt去Stop Porgram Execution,SoftICE将修改在位置c:

0023h的中断向量3个BYTE,请确保用户程序没有占用这些地址。

以上的设定可以在程序调试过程再次修改。

步骤3:开始调试

从Debug菜单点击Start/Stop Debug Session开始调试过程。

143

在连接过程中,偶尔会出现连接重试的情况,此时只要按一下复

位按钮即可连接成功,建议每次连接之前进行复位。连接成功之

后就可直接单步、断点、全速运行。

特别提示:

不要对监控芯片进行烧写!

连接不成功的几种情况:

1.

波特率设置不对;

2.

端口号设置不对;

3.

端口被其它应用程序占用;

4.

片内监控已被意外操作冲掉;

第五章 在系统可编程的使用

STC89系列单片机大部分具有在系统可编程(ISP)的特性,ISP

的好处是省去购买通用编程器,单片机在用户系统上即可下载/烧录

用户程序。大部分STC89系列单片机在销售给用户之前已经在单片机

内部固化有ISP系统引导程序,配合PC端的控制程序即可将用户的

程序代码下载进单片机内部,故无须编程器(速度比通用编程器快)。

不要用通用编程器编程,否则有可能将单片机内部已固化的ISP系统

引导程序擦除,造成无法使用STC提供的ISP软件下载用户的程序代

码。

操作步骤:解压、安装、运行STC-ISP软件

144

步骤1:选择你所使用的单片机型号,STC89C52RC

步骤2:打开文件,要烧录用户程序,必须调入用户的程序代码

(*.bin,*.hex),可直接调光盘里可下载烧写的目标代码文件夹下的

hex代码,进行测试

步骤3:选择串口号,你所用的电脑串口是COM1还是COM2

步骤4:设置是否双倍速,双倍速选中Double Speed即可,STC89C52RC

系列出厂时为单倍速,用户可指定设为双倍速,如想从双倍速恢复成

单倍速,则需用通用编程器擦除整个晶片方可,这会将单片机内部已

烧录的ISP引导程序擦除。一般使用缺省设置即可,无须设置。

OSCDN:单片机时钟振荡器增益

选1/2 gain为降一半,降低EMI;选full gain(全增益)为正

常状态

145

步骤5:选择“Download/下载”按钮下载用户的程序进单片机内部,

可重复执行步骤5,也可选择“ Re-Download/重复下载”按钮。

下载时注意看提示,主要看是否要给单片机上电或复位,下载速

度比一般通用编程器快。一般先选择“Download/下载”按钮,然后

再给单片机上电复位(先彻底断电),而不要先上电。

下载编程成功如图所示:

这样即可上电运行用户的程序了。

146

发布评论

评论列表 (0)

  1. 暂无评论