实实实实 一、 • 实实实实实实 实实 传 AD590 实实实实实实实实实实实实实; • 实实实实实实实实实实实 实 实实实实 、 • 实实 实实实实实实实实 实实实实实 一 ,: 统 • 实实实实实实 40~90℃ 实实实实实 , 1℃ 实实实实≤ , 1℃ 。 • 实实实实实实实实实实实实实实。 • 实实实实实实实 实实实实实实实实实≤ , 1℃ 。 实 10 实 实实实实 实实 实实实实实 实实 一 统
Jan 28, 2016
一、实训目的• 熟悉常用温度传感器 AD590 的特性及接口电路的设计方
法;• 学会模块化程序设计方法二、课题要求• 制作一个水温自动控制系统,要求如下:• 温度设定范围 40~90℃ ,最小区分度 1℃ ,标定误差≤ 1
℃ 。• 用十进制数码显示水的实际温度。• 环境温度降低时,温度控制的静态误差≤ 1℃ 。
第 10 章 综合实训课题一 水温控制系统设计
三、背景知识1 、 AD590 温度传感器简介 AD590 是美国 AD 公司生产的单片集成两端感温电流源。它的测温范围为 -55℃ ~ +150℃ ,工作电压范围为 4V ~ 3
0V ,可以承受 44V 正向电压和 20V 反向电压,输出电阻为710M 。它产生的电流与绝对温度成正比,非线性误差为 ±
0.3℃ 。图 10—1 为 AD590 的引脚图,表 10—1 为 AD590
温度与电流的关系表。
( a )引脚 ( b )封装 ( c )图形符号 图 10—1 AD590 引脚、封装及图形符号
表 10—1 各温度与电流、电压参考关系表
温度值 AD590电流
经 10kΩ电压 V
放大器输出 V0
( ADC0809的VIN)
ADC0809的输出
0ºC 273.2μA 2.732V 0V 00H
10ºC 283..2μA 2.832V 0.49V 19H
20ºC 293.2μA 2.932 V 0.98V 32H
30ºC 303.2μA 3.032 V 1.47 V 4BH
40ºC 313.2μA 3.132 V 1.96 V 64H
50ºC 323.2μA 3.232 V 2.45 V 7DH
60ºC 333.2μA 3.332 V 2.94 V 96H
70ºC 343.2μA 3.432 V 3.43 V AFH
80ºC 353.2μA 3.532 V 3.92 V C8H
90ºC 363.2μA 3.632 V 4.41 V E1H
100ºC 373.2μA 3.732 V 4.90 V FAH
AD590 是电流输出型器件,必须利用接口电路将 AD590
输出的电流信号转换成电压信号,再经 A/D 转换器转换成数字信号,提供给单片机处理。在
2 、 AD590 接口电路
表 10—1 中,列出了在不同温度值下的 AD590 的输出电流,通过图 10—2 的放大电路可将输出电流转换成 0~5V 的模拟电压。
图 10—2 温度采集电路
四、硬件电路 硬件电路由单片机、温度检测模块、加热控制模块、
键盘设定模块及数据显示模块构成。
1 、单片机选择 由于系统对控制精度的要求不高,所以选用内部具有程序存储器芯片的 AT89C51 就可以满足要求了。 2 、温度检测模块 温度检测模块由温度传感器、信号放大器及 A/D 转换器组成。由 AD590 将温度转换成电流信号再经信号放大器得到对应的模拟电压,再经 ADC0809 转换后接入单片机。如图 10—3 所示。
3 、加热控制模块
加热控制信号经反相器反相后,驱动固态继电器( SS
R )工作,从而接通或断开加热丝两端电源,实现对水的加热控制。加热控制电路如图 10—3 所示。 为了使加热控制更加精确,系统采用了三组加热电炉丝组合实现,当温差小于 5ºC 时,仅 A 组加热丝工作;当温差在5ºC~10ºC 之间时,采用 A 、 B 两组加热控制;当温差大于10ºC 时,采用 A 、 B 、 C 三组加热控制。
4 、键盘设定及数据显示模块
键盘扫描由 11 个按键及 3 位 LED 共阳极显示器组成。通过 P1 、 P2 口直接驱动键盘,为了简化显示接口,这里采用了串行口扩展 LED 显示器。如图 10—3 所示。
图 10—3 水温控制系统硬件原理图
五、软件设计1 、程序结构设计( 1 )主程序 用于进行初始化处理,包括各端口的初始化,定时 / 计数
器的设定、中断允许的设定等。同时进行键盘的扫描输入。图 10—4 为主程序流程图。
( 2 )定时中断服务程序 通过单片机内部的定时器 T0 进行 50ms 定时,再通过寄
存器 R6 进行计数,以实现 1s 定时中断的要求。进入中断服务程序后,可进行当前温度的检测及显示,根据所测值与设定值比较进行温度控制等。图 10—5 为中断服务程序流程图。
图 10—4 主程序流程图 图 10—5 定时中断服务程序流程图
开始
关电炉、开显示
串行口初始化
定时器初始化
中断初始化
调用键盘扫描子程序
等待定时中断
定时中断程序开始
1s定时时间到?
调用标度转换子程序
关定时、关中断
调用温度检测子程序
显示实测温度
调用温度控制子程序
中断返回
Y
开定时、开中断
N
( 3 )温度检测程序 温度检测采用每 1s 定时采样的方式,为了实现温度的准确
检测,采用了平均值滤波法抗干扰。即连续 4次启动 ADC080
9 进行 A/D 转换,求取转换结果的平均值,存入指定单元,以得到检测温度值。图 10—6 为温度检测程序流程图。
( 4 )温度控制程序 通过比较键盘设定值与温度检测值的差别,按照一定的控制规律,控制输出口线的状态,实现三组加热丝的控制。图 10—
7 为温度控制程序流程图。( 5 )温度显示程序 在每次温度检测后,进行一次温度显示刷新;在进行温度设
定时,显示设定温度值。
2 、主要程序模块清单主程序:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0INT
ORG 0030H
MAIN : MOV SP , #60H
MOV P1 , #0FFH ;关电炉,开显示 MOV SCON , #00H ;设置串行口工作
; 方式 0 ,发送 MOV TMOD , #01H ;定时器初始化
MOV TH0 , #3CH ; 50ms 定时初值
MOV TL0 , #0B0H
MOV R6 , #14H ; 1s 定时用( 50ms20次) MOV 5DH , #00H ;显示缓冲区清零 MOV 5EH , #00H
MOV 5FH , #00H
ACALL DISP
SETB ET0
SETB EA
SETB TR0
LM0 : ACALL KEYSCAN ;调用键盘扫描子程序(略), ; 用于设定温度值
AJMP LM0
图 10—6 温度检测程序流程图
图 10—7 温度控制程序流程图
温度检测开始
转换结束否?
将结果单元清0
转换次数送R7
启动A/D转换
累加转换结果
存结果
4次转换结束否?
返回
Y
N
Y
N
求平均值
定时中断服务程序:T0INT : MOV TH0 , #3CH
MOV TL0 , #0B0HDJNZ R6 , T0END ; 1s未到,中断返回CLR TR0CLR EA
MOV R6 , #14H ;恢复 R6 初值ACALL TADC ;调用温度检测子程序ACALL XSCL ;调用标度转换子程序ACALL DISP ;调用显示子程序ACALL TCONT ;调用温度控制子程序SETB TR0SETB EA
T0END : RETI
温度检测子程序:TADC : MOV 50H , #00H ;清存检测值单元
MOV B , #00H
MOV R7 , #04H ;设置转换次数MOV DPTR , #7FFFH ;送 ADC0809地
址TT0 : MOVX @DPTR , A ;启动 A/D 转换
JB P3.2 , $ ;等待转换结束MOVX A , @DPTR ;读 A/D 转换数据ADD A , 50H
MOV 50H , A
JNC TT1 ;是否超出 8 位二进制范围INC B
TT1 : DJNZ R7 , TT0 ; 4次转换是否完成
CLR C ;求 4次 A/D 转换的平均值
XCH A , B
RRC A
XCH A , B
RRC A
CLR C
XCH A , B
RRC A
XCH A , B
RRC A
MOV 50H , A ;平均值存 50H
RET
温度控制子程序:
TCONT : MOV A , 51H
CLR C
SUBB A , 50H ;设定值—实测值MOV R0 , A
JNC CCPR ;小于设定温度,接通相应加热器MOV P1 , #0FFH ;否则,关闭加热器AJMP CONEND
CCPR : MOV A , R0
SUBB A , #19H
JC CCPR1
MOV P1 , #0F8H ;开三组加热器AJMP CONEND
CCPR1 : MOV A , R0
SUBB A , #0CH
JC CCPR2
MOV P1 , #0FCH ;开两组加热器AJMP CONEND
CCPR2 : MOV P1 , #0FEH ;开一组加热器CONEND : RET
显示子程序:DISP : MOV R2 , #03H ;显示数据的个数
MOV R1 , #5DH ;显示缓冲区首址SETB P1.3
DL0 : MOV A , @R1 ;取要显示的数MOV DPTR , #TABMOVC A , @A+DPTR ;查字型码MOV SBUF , A ;送出数据
DL1 : JNB TI , DL1 ;是否输完一个字节CLR TI ;清发送完标志INC R1DJNZ R2 , DL0 ;三个数是否都显示完?RET
TAB : DB 0C0H , 0F9H , 0A4H , 0B0H , 99H ; 0~9 字型码
DB 92H , 82H , 0F8H , 80H , 90H
六、总结与提高 设计、调试大型程序时,应该:
先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何
为中断服务程序,相互间如何调用;接着根据各模块性质和功能将各模块细化,设计出程
序流程图;最后根据各模块流程图编制具体程序。
调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。
在这个课题中,采用了软件滤波方式提高检测环节的准确,并且采用了三组加热控制提高了温度变化的精度。在此基础上,还可以增加液面检测、缺水报警电路及打印电路等其它辅助电路的设计,使这个控制系统更完善。
课题二 用 8×8点阵显示器制作电子显示屏一、实训目的熟悉 8×8点阵显示器与单片机的接口电路及其设计方法;学会模块化程序设计方法。二、课题要求 制作一个 8×8点阵显示器。要求如下: 1. 显示“电子设计”四个文字; 2. 显示方式可由 K1 、 K2 和 K3 三个键选择: K1 为逐字显示, K2 为向上滚动显示, K3 为向左滚动显示。
三、硬件电路
显示器采用 AT89C51 单片机作控制器,时钟频率为 12MHz , 8×8点阵显示器采用共阳极结构,其电路如图 10—8 所示。 P0 作为字符数据输出口, P2 为字符显示扫描输出口, P1.0~P1.2 口分别接开关 K1 、 K2 、 K3 ,
通过改变电阻( 270Ω )的大小可改变显示字符的亮度,驱动用 9012 三极管。
EA/VP31
X119
X218
RESET9
RD17
WR16
INT012INT113
T014T1
15
12345678
89C51
+5V
+5V
P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
30pF
30pF 12 M
Hz
1k 22μF
K1
K2
K3
39
3837
3635
34
33
32
28
2726
2524
23
22
21
+5V
270Ω
图 10—8 硬件电路图
四、软件设计
1 、程序结构设计( 1 )主程序 主程序用于对系统进行初始化,扫描按
键开关状态,由按键标志位值( 00H 、 01H 、 02H )决定显示的方式。主程序流程图如图 10—9 所示。
图 10—9 主程序流程图
开始
调用按键扫描子程序
20H.0=1?
20H.1=1?
20H.2=1?
转逐字显示程序
转向上滚动显示程序
转向左滚动显示程序
Y
Y
Y
N
N
N
初始化子程序
( 2 )初始化子程序
用于对端口进行复位操作,将显示用的字符数据从字符表中装入内存单元 50H~6FH 中。字符表中的每个文字占用 8
个地址单元。
( 3 )显示子程序
显示子程序由显示功能选择程序和显示控制程序组成。 显示功能选择程序 :
负责每次显示时的显示地址首址(在 B 寄存器中)、每个字的显示时间(由 30H 中的数据决定)和下一个显示地址的间隔( 31H 中的数据决定)的处理。
显示子程序 :
负责对指定 8 个地址单元的数据进行输出显示。 显示一个完整文字的时间约为 8ms 。 在显示子程序中, 1ms延时程序是用调用键扫描子程序的方法实现的。图 10—10 为逐字显示及向上滚动显示方式时的显示控制程序流程图。( 4 )按键扫描程序 用于将按键的状态扫描至 20H 单元的低三位( 20H.0 、20H.1 、 20H.2 )中。同时在程序中利用按键扫描程序代替显示程序中的 1ms延时程序,既可以提高按键的快速响应,又可以提高动态显示的扫描频率,减少文字显示时的闪烁现象。
逐字或上移显示开始
设定1帧显示时间及换帧步距
置显示数据首址
调用显示控制子程序
1帧显示时间到否?
1次显示结束否?
修改显示数据首地址
转按键扫描子程序
Y
Y
N
N
图 10—10 逐字显示及上移显示程序流程图
2 、主要程序模块清单主程序:
START : MOV 20H , #00H ; 20H 内存单元清 0
SETB 00H ; 20H.0 位置 1
START1 : LCALL CLEARMEN ;调用上电初始化子 ; 程序 JB 00H , FUN0; 20H.0 位为 1 ,执行 FUN
0
JB 01H , FUN1; 20H.1 位为 1 ,执行 FUN
1
JB 02H , FUN2; 20H.2 位为 1 ,执行 FUN
2
AJMP START1
初始化程序:CLEARMEN : MOV A , #0FFH ;四端口置 1 MOV P1 , A MOV P2 , A MOV P3 , A MOV P0 , A MOV DPTR , #TAB ;取“电子设计”字 ; 符表首址 CLR A MOV 21H , A ; 21H-24H 内存单元清0 MOV 22H , A MOV 23H , A MOV 24H , A MOV R3 , A ; R3 寄存器清 0
MOV R1 , #50H ;设字符表移入内存 ; 单元首址 MOV R2 , #20H ;设查表次数( 32次)CLLOOP : MOVC A , @A+DPTR ;查表字符数据移入 ; 内存单元 MOV @R1 , A MOV A , R3 INC A MOV R3 , A INC R1 DJNZ R2 , CLLOOP ;是否已查表 32 ;次,未完转 CLLOOP RET
TAB : DB 0EFH , 83H , 0ABH , 83H , 0ABH , 83H , 0EEH , 0E0H ; 电 DB 0FFH , 0C7H , 0EFH , 83H , 0EFH , 0EFH , 0CFH , 0EFH ; 子 DB 0B1H , 0B5H , 04H , 0BFH , 0B1H , 0B5H , 9BH , 0A4H ; 设 DB 0BBH , 0BBH , 1BH , 0A0H , 0BBH , 0BBH , 9BH , 0BBH ;计
键扫描子程序:
KEYWORK : MOV P1 , #0FFH ;置输入状态 JNB P1.0 , KEY1 ; P1.0 为 0 (键按下)转 KEY1 JNB P1.1 , KEY2 ; P1.1 为 0 (键按下)转 KEY2 JNB P1.2 , KEY3 ; P1.2 为 0 (键按下)转 KEY3KEYRET : RET KEY1 : LCALL DL10MS ;按键 1功能处理,延 ; 时 10ms削抖动 JB P1.0 , KEYRET ;是干扰转 KEYRET 结束 SETB 00H ;置逐字显示方式标志 ; ( 20H.0=1 ) CLR 01H CLR 02H RET ;子程序返回
KEY2 : LCALL DL10MS ;按键 2功能处理 JB P1.1 , KEYRET SETB 01H ;置上移显示方式标志 ; ( 20H.1=1 ) CLR 00H CLR 02H RETKEY3 : LCALL DL10MS ; 按键 3功能处理 JB P1.2 , KEYRET SETB 02H ;置左移显示方式标志 ; ( 20H.2=1 ) CLR 01H CLR 00H RET
显示功能选择程序:
FUN0 : MOV 30H , #80H ;逐字显示, 1帧显示时间 ; (约 1s ) MOV 31H , #08H ;换帧跳转步距为 8 LJMP DISP1 ;转显示子程序 DISP1FUN1 : MOV 30H , #0AH ;上移显示, 1帧显示时间 ; (约 80ms ) MOV 31H , #01H ;换帧跳转步距为 1 LJMP DISP1 ;转显示子程序 DISP1FUN2 : LJMP DISP2 ;左移显示
显示控制程序:DISP1 : MOV B , #50H ;显示数据首址 MOV R4 , 30H ;放入 1帧显示时间控制数据MOV R5 , 31H ;放入跳转步距控制数据LOOP : LCALL DISPLAY ;调用显示子程序一次 DJNZ R4 , LOOP ; 1帧显示时间未到再转 ;LOOP循环 MOV R4 , 30H ; 1帧显示时间到,重装初值 MOV A , B CJNE A , #68H , CONT ;不是末地址转 CONT AJMP START1 ;是末地址,一次显示结束 ;跳回 START1CONT : ADD A , R5 ;次帧扫描首址调整 MOV B , A AJMP LOOP ;转 LOOP 进行次帧扫描
显示子程序:DISPLAY : MOV A , #0FFH MOV P0 , A ;关显示数据 MOV P2 , A ;关扫描 MOV R6 , #0FEH ;赋扫描字 MOV R0 , B ;赋显示数据首地址 MOV R7 , #08H ;一次扫描 8 行DISLOOP : MOV A , @R0 ;取显示数据 MOV P0 , A ;放入 P0 口 MOV P2 , R6 ;扫描输出(显示 ;某一行) LCALL DL1MS ;亮 1毫秒 INC R0 ;指向下一行数据地址 MOV A , R6 ;扫描字移入 A
RL A ;循环左移一位 MOV R6 , A ;放回 R6 DJNZ R7 , DISLOOP ; 8 行扫描未完转 DISLOOP ; 继续 RET ; 8 行扫描结束
1毫秒延时子程序:
DL1MS : MOV R3 , #64H ; 100× ( 10+2 ) μsLOOPK : LCALL KEYWORK DJNZ R3 , LOOPK RET
五、总结与提高
该课程设计中,可以看出 LED点阵显示的控制是在七段 LED 数码管显示控制的基础上扩展实现的,二者都是采用动态扫描方式进行设计,从原理上是完全相同的。在这个课题的基础上,还可扩展多个 LED点阵显示以实现更加复杂的分批显示模式及中文字幕的显示。
课题三 电子万年历的设计与制作
一、实训目的
熟悉 DS12887 时钟日历芯片的特性及设置方法,DS12887 芯片与单片机的接口电路及其设计方法;学会模块化程序设计方法。
二、课题要求
制作一个可调万年历。要求如下:内定时间为 2000年 1月 1日 12点 00 分 00秒,提供给新产品或换电池时使用。时间调整:开机时,光标停在“年”,移动光标依次修改年、月、日、时、分、秒。每按 P1.0 一次,光标依年、月、日、时、分、秒顺序移动。每按 P1.1 一次,光标所在位置的值加 1 。每按 P1.2 一次,光标所在位置的值减 1 。采用 LCD液晶显示器显示。
三、背景资料
时钟日历芯片 DS12887 :
能够自动产生年、月、日、时、分、秒等时间信息,芯片内部带有锂电池,外部掉电时,其内部时间信息能够保持 10年之久;有 12 小时制和 24 小时制两种工作模式;时间的表示方法有两种:二进制数表示和 BCD 码表示。用户可对 DS12887 进行编程以实现多种方波输出,用户可对其内部的三路中断通过软件进行屏蔽。
1 、引脚说明 Vcc :直流电源 +5V 输入
DS12887
1
2
3
4
5
6
7
8
9
10
11
12 13
14
15
16
17
18
19
20
21
22
23
24 Vcc
SQW
NC
NC
NC
IRQ
RESET
DS/
NC
R/W
AS
CS
MOT
NC
NC
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
GND
RD
当 Vcc 的输入小于 +4.25V
时,禁止用户对内部 RAM 进行读、写操作,此时用户不能正确获取芯片内的时间信息;当 Vcc 的输入小于 +3V 时,DS12887 会自动将电源切换到内部自带的锂电池上,以保证内部的电路能够正常工作。 图 10—11 DS12887 引脚图
当 Vcc 输入为 +5V 时,用户可以访问 DS12887 内 RA
M 中的数据,并可对其进行读、写操作;
GND :地MOT :总线模式选择 当 MOT 接 Vcc 时选用 Motorola总线模式,当 MOT 接 G
ND 时选用 Intel总线模式。SQW :方波输出 当供电电压 Vcc 大于 4.25V 时, SQW 脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到 13种方波信号的输出。AD0~AD7 :双向地址 / 数据总线。AS :地址有效输入。DS/ :数据选通 /读允许 当 MOT 接 Vcc 时作为数据选通;当 MOT 接 GND 时,作为读允许输入。
RD
R/ :读 /写允许输入。
若MOT 接 Vcc ,该引脚为高电平时读操作,为低电平时写操作;若MOT 接 GND ,该引脚作为写允许输入。 :片选输入。低电平有效。 :中断请求输出。低电平有效。 :复位端。低电平有效,复位操作不影响时钟日历工作。NC :空引脚。
W
CS
IRQ
RESET
2 、存储器分配与设置 DS12887 片内 RAM 与寄存器地址分配见图 10—12 。 DS12887带有 128 字节片内 RAM :
10 字节的时标寄存器:用来存储时间信息,地址 00H~09
H
CPU 可以通过读取时标寄存器获得时间与日历值,也可以编程设置其初值,时标寄存器的值可以用二进制或 BCD
码表示。4 字节的控制寄存器:用来存储控制信息,地址 0AH~0DH
用户可通过对控制寄存器编程实现从 SQW 引脚输出多种不同频率的方波,并可对其内部的三路中断通过软件进行屏蔽。114 字节作为通用 RAM 供用户使用,地址为 0EH~7FH 。
秒
秒报警
分
分报警
时
时报警
星期
日
月
年
寄存器A
寄存器B
寄存器C
寄存器D
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14字节
114字节RAM
00H
0DH
0EH
7FH
可用二进制数或BCD码表示
10—12 片内 RAM 与寄存器地址分配
时标寄存器的数据格式 ,见下表所示。
地址单元 功能 十进制
范围
范 围
十六进制码 BCD码
0 秒 0~59 00~3B 00~59
1 秒闹钟 0~59 00~3B 00~59
2 分 0~59 00~3B 00~59
3 分闹钟 0~59 00~3B 00~59
4时( 12小时方式) 1~12
01~0C AM, 81~8C PM
01~12 AM, 81~92 PM
时( 24小时方式) 0~23 00~17 00~23
5
时闹钟( 12小时方式) 1~12
01~0C AM, 81~8C PM
01~12 AM, 81~92 PM
时闹钟( 24小时方式) 0~23 00~17 00~23
6 星期(星期天 =1) 1~7 01~07 01~07
7 日 1~31 01~1F 01~31
8 月 1~12 01~0C 01~12
9 年 0~99 00~63 00~99
控制寄存器的格式
①寄存器 A 用于选择时钟频率、中断周期和 SQW 输出频率,格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
UIP :更新周期标志。 当 UIP=1 时,表示芯片正处于或即将开始更新周期,在此期间不允许读写时标寄存器;
当 UIP=0 时,表示没有更新周期,此时可读时标寄存器。
DV2~DV0 :芯片内部振荡器 RTC 控制位。 当芯片复位后 500ms 开始第一个更新周期。将这 3 位设置
成 010 ,可使芯片以内置的 32.768kHz 的振荡频率工作。
RS3~RS0 :周期中断可编程方波输出速率选择位。 这 4 位不同的组合可以产生不同的方波输出,程序可以通
过设置寄存器 B 的 SQWE 和 PIE 位控制是否允许周期中断方波输出。 RS3~RS0 与中断周期及 SQW 输出频率的对应关系如表 10—3 所示。
表 10—3 时钟频率选择寄存器 A选择位 32.768kHz时钟频率
RS3 RS2 RS1 RS0 中断周期 SQW输出频率0 0 0 0 — —
0 0 0 1 3.09625ms 256Hz
0 0 1 0 7.8125 ms 128 Hz
0 0 1 1 122.070 μs 8.192 kHz
0 1 0 0 244.141μs 4.096 kHz
0 1 0 1 488.281μs 2.048 kHz
0 1 1 0 976.5625μs 1.024 kHz
0 1 1 1 1.953125 ms 512 Hz
1 0 0 0 3.90625 ms 256 Hz
1 0 0 1 7.8125 ms 128 Hz
1 0 1 0 15.625 ms 64 Hz
1 0 1 1 31.25 ms 32 Hz
1 1 0 0 62.5 ms 16 Hz
1 1 0 1 125 ms 8 Hz
1 1 1 0 250 ms 4 Hz
1 1 1 1 500 ms 2 Hz
②寄存器 B 主要用于设置芯片的工作状态,格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
SET PIE AIE UIE SQWE DM 24/12 DSE
SET :允许更新周期位。可读 /写,不受信号的影响。 当 SET=0 时,芯片处于正常更新状态; 当 SET=1 时,芯片正常更新被禁止。PIE 、 AIE 、 UIE :分别为周期中断、闹钟中断、更新周期结束中断允许位。 各位分别为“ 1” 时允许发出相应的中断,由端输出。其中, UIE 位在复位或设置 SET 为 1 时清零。
SQWE :方波输出允许位。 当 SQWE=1 ,按寄存器 A 输出速率选择位所确定的频率输出方波;
当 SQWE=0 , SQW 脚保持低电平。DM :时标寄存器格式选择位。
DM=0 ,为 BCD 码; DM=1 ,为二进制码。
24/12 : 24 小时或 12 小时模式设置位。 24/12=1 ,选择 24 小时工作模式; 24/12=0 ,选择 12 小时工作模式。
DSE :夏令时允许标志位。
③寄存器 C 为中断标志位寄存器。 特点:程序读寄存器 C 或复位后,该寄存器的内容将自动清零。格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
IRQF PF AF UF 0 0 0 0
IRQF :中断申请标志位。 该位逻辑表达式为: IRQF = PF · PIE+AF · AIE+UF · UIE 。当 IRQF=1 时, IRQ 引脚将输出低电平。
当 DSE=1 时,夏时制设置有效。在四月的第一个星期日的 1:59:59 AM ,调到 3:00:00 AM ;在十月的最后一个星期日的 1:59:59 AM ,调到 1:00:00 AM 。当 DSE=0无效。
④寄存器 D 为状态标志寄存器,只有一个标志位 VRT
( D7 ),其余各位均为 0 。格式如下:D7 D6 D5 D4 D3 D2 D1 D0
VRT 0 0 0 0 0 0 0
VRT :芯片内部 RAM 与寄存器内容有效标志位。 该位为“ 1” 时,表示芯片内部 RAM 和寄存器内容有效。读该寄存器后,该位将自动置“ 1” 。
PF 、 AF 、 UF :这三位分别为周期中断、闹钟中断、更新周期结束中断标志位。 只要满足各中断的条件,相应的中断标志位将置“ 1” 。
寄存器 C 的 D3~D0 位为 0 ,不使用。
四、硬件设计
硬件电路见图 10—13 。采用 AT89C51 单片机作控制器,时钟频率为 12MHz 。显示器可采用LED 显示,但由于 LED 数码显示所需的数码管较多,这里选用 LCD 显示器实现。 P1.0~P1.2 口分别接开关 K1 、 K2 、 K3 ,分别用于光标的移动及整定时间时的数字调整。
EA/VP31
X119
X218
RESET9
RD17
WR16
T014T1
15
12345678
89C51
+5V
+5V
P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
30pF
30pF 12 M
Hz
1k 22μF
K1
K2
K3
39
3837
36
35
34
33
32
28
2726
25
24
23
22
21
INT0
ALE
12
30
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
4
56
7
8
9
10
11
AS14
DS
1288
7
CS13
IRQ
19 17
DS/RD
15
R/W
RESET1 18
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
C/D
LCD液晶控制器
CS
RD WR
图 10—13 万年历硬件原理图
五、软件设计
1 、内部控制寄存器命令字设置( 1 ) DS12887 初始化:给寄存器 A 、 B 、 C 、 D送控制字(片选有效) ①( 0AH ) =20H
设置 DS12887 时钟频率为 32.768kHz , DV2~DV0=010 ; ②( 0BH ) =82H
设置 DS12887 更新周期停止,可进行时钟设定,时间和日期采用 BCD 码,时间单元为 24 小时计时方式。( 2 ) DS12887 开始计时:设置( 0BH ) =12H 由 UIE=
1激活,实现时钟输出显示更新。( 3 ) LCD液晶显示控制器设置(略)
2 、程序结构设计 ( 1 )主程序 用于实现初始化操作,包括中断设置、 DS12887 时钟芯片及 LCD液晶显示控制器的初始化设置等。流程图见 10
—14 所示。( 2 )外部中断 0 服务程序 用于实现 DS12887 时钟芯片更新值的输出及显示操作。流程图见 10—15 所示。( 3 )按键扫描子程序 用于将三个按键的输入状态扫描至 89C51 相应的寄存器中,进行光标移动、加 1 或减 1 的处理。
( 4 )显示子程序 用于将显示缓冲区数据依次输出到 LCD 显示器上。( 5 )加 1 处理子程序 将加 1 按键的输入状态转换为对相应存储单元的加 1操作,并将 BCD 码转换成 ASCII 码送显示缓冲区。( 6 )减 1 处理子程序 将减 1 按键的输入状态转换为对相应存储单元的减 1操作,并将 BCD 码转换成 ASCII 码送显示缓冲区。( 7 )内定时间写入子程序 用于将内定时间 00年 1月 1日 12点 00 分 00秒输入 D
S12887 相应的时标寄存器中。
开始
清屏
LCD初始化
DS12887初始化
中断设置
是否写入内定时间?
调用显示输出子程序
内定时间写入子程序
DS12887开始计时
调用键盘扫描子程序
等待中断
N
Y
开始
现场保护
清中断标志
光标停在“ 年” 位置
读取DS12887时标寄存器中的相应数据
转换ASCII码
调用显示子程序
是否全部显示完?
修改光标位置
光标复位
中断返回
N
Y
图 10—14 主程序流程图图 10—15 中断服务程序流程图
3 、主要程序模块清单主程序:
ORG 0000H
AJMP MAIN
ORG 0003
AJMP EX0INT
MAIN : MOV SP , #60H ;设置堆栈指针 ACALL BUSY ;调用检测 LCD 是否忙
;的子程序 MOV A , #01H ; LCD清屏 MOV DPTR , #8100H ;送 LCD指令寄存地址 MOVX @DPTR , A
ACALL LCDFIRST ;调用 LCD 初始化程序
MOV IE , #81H ;外部中断 0 允许 MOV A , #20H ;对 DS12887 的寄存
;器 A赋初值 MOV DPTR , #020AH ;送 DS12887 的寄 ;存器 A 的地址
MOVX @DPTR , A MOV A , #82H ;对 DS12887 的寄存器
B ;赋初值
MOV DPTR , #020BH ;送 DS12887 的寄 ;存器 B 的地址
MOVX @DPTR , A MOV DPTR , #020EH ;读 DS12887 寄存器
0E ;的内容
MOVX A , @DPTR
CJNE A , #01H , LOOP ;为 0则未设内定 ;时间
SJMP LOOP1
LOOP : ACALL RAMSTART ;调用内定时间写入子 ;程序LOOP1 : ACALL DISP ;调用成组字符显示子程序
MOV A,#12H ;启动 DS12887 开始计时 MOV DPTR , #020BH
MOVX @DPTR , A
LOOP2 : ACALL KEYSCAN ;调用键盘扫描子程序 SJMP LOOP2
中断服务子程序:EX0INT : PUSH ACC ;现场保护
PUSH PSWMOV DPTR , #020CH ;读 C 寄存器,
;清除中断标志位 IRQFMOVX A , @DPTRMOV R2 , #00H ;光标位置偏移值
EX01 : MOV DPTR , #CUR ; LCD光标位置表首地址MOV A , R2MOVC A , @A+DPTR ;读取光标地址值ACALL BUSY ;检测 LCD 是否忙?
MOV DPTR , #8100H ;送 LCD指令寄存器地址
MOVX@DPTR , AMOV DPTR , #TIM ; DS12887 内部时标寄存
器 ;表首地址
MOV A , R2 MOVC A , @A+DPTR ;读时标寄存器的地址 MOV DPTR , #0200H ;送时标寄存器首址 MOV DPL , A ;指向相应时标寄存器地址 MOVX A , @DPTR ;读相应时标寄存器的内
容 ACALL BCDACSII ;调用 BCD 码转换 ACSII 码子程
序 ACALL DISP1;调用单字符显示子程序 INC R2 ;指向下一时间单元的处理 CJNZ R2 , #06H , EX01
ACALL CURRET ;调用光标复位子程序 POP PSW ;恢复现场 POP ACC RETI
CUR : DB 82H , 85H , 88H , 8BH , 8EH , 91H;
; LCD“年月日时分秒”光标地址表 TIM : DB 09H , 08H , 07H , 04H , 02H , 00H
;时 ;标寄存器“年月日时分秒”地址
内定时间写入子程序:
RAMSTART : MOV A , #00H ;写入 00秒 MOV DPTR , #0200H
MOVX @DPTR , A
INC DPTR
INC DPTR
MOVX @DPTR , A;写入 00 分 MOV A , #12H
MOV DPTR , #0204H
MOVX @DPTR , A;写入 12 时 MOV A , #01H
MOV DPTR , #0207H
MOVX @DPTR , A;写入 1日 INC DPTR
MOVX @DPTR , A;写入 1月 INC DPTR
MOV A , #00H ;写入 00年 MOVX @DPTR , A
MOV DPTR , #020EH ;设定已设置内定时 ;间标志 MOV A , #01H
MOVX @DPTR , A
RET
六.总结与提高
该课程设计中,为了正确地访问时间和日期信息,使用了更新结束中断( UIE=1 )的方式实现时间和日期的读取。 DS12887 的使用非常灵活,读者也可用查询 UIP 位的方式或设定周期中断速率的方式来实现时间与日期的读取。为了使万年历的程序设计更加完善,还可在此基础上,增加闹钟定时程序等相关内容。