Download presentation
Presentation is loading. Please wait.
Published byKaarina Oksanen Modified 5年之前
1
第10章 综合实训 课题一 水温控制系统设计 一、实训目的 二、课题要求 熟悉常用温度传感器AD590的特性及接口电路的设计方法;
第10章 综合实训 课题一 水温控制系统设计 一、实训目的 熟悉常用温度传感器AD590的特性及接口电路的设计方法; 学会模块化程序设计方法 二、课题要求 制作一个水温自动控制系统,要求如下: 温度设定范围40~90℃,最小区分度1℃,标定误差≤1℃。 用十进制数码显示水的实际温度。 环境温度降低时,温度控制的静态误差≤1℃。
2
三、背景知识 1、AD590温度传感器简介 AD590是美国AD公司生产的单片集成两端感温电流源。它的测温范围为-55℃~+150℃,工作电压范围为4V~30V,可以承受44V正向电压和20V反向电压,输出电阻为710M。它产生的电流与绝对温度成正比,非线性误差为±0.3℃。图10—1为AD590的引脚图,表10—1为AD590温度与电流的关系表。 (a)引脚 (b)封装 (c)图形符号 图10—1 AD590引脚、封装及图形符号
3
表10—1 各温度与电流、电压参考关系表 温度值 AD590电流 经10kΩ电压V 放大器输出V0 (ADC0809的VIN)
表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
4
AD590是电流输出型器件,必须利用接口电路将AD590输出的电流信号转换成电压信号,再经A/D转换器转换成数字信号,提供给单片机处理。在
表10—1中,列出了在不同温度值下的AD590的输出电流,通过图10—2的放大电路可将输出电流转换成0~5V的模拟电压。 图10—2 温度采集电路
5
由于系统对控制精度的要求不高,所以选用内部具有程序存储器芯片的AT89C51就可以满足要求了。
四、硬件电路 硬件电路由单片机、温度检测模块、加热控制模块、键盘设定模块及数据显示模块构成。 1、单片机选择 由于系统对控制精度的要求不高,所以选用内部具有程序存储器芯片的AT89C51就可以满足要求了。 2、温度检测模块 温度检测模块由温度传感器、信号放大器及A/D转换器组成。由AD590将温度转换成电流信号再经信号放大器得到对应的模拟电压,再经ADC0809转换后接入单片机。如图10—3所示。
6
3、加热控制模块 加热控制信号经反相器反相后,驱动固态继电器(SSR)工作,从而接通或断开加热丝两端电源,实现对水的加热控制。加热控制电路如图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所示。
7
图10—3 水温控制系统硬件原理图
8
五、软件设计 1、程序结构设计 (1)主程序 用于进行初始化处理,包括各端口的初始化,定时/计数器的设定、中断允许的设定等。同时进行键盘的扫描输入。图10—4为主程序流程图。 (2)定时中断服务程序 通过单片机内部的定时器T0进行50ms定时,再通过寄存器R6进行计数,以实现1s定时中断的要求。进入中断服务程序后,可进行当前温度的检测及显示,根据所测值与设定值比较进行温度控制等。图10—5为中断服务程序流程图。
9
图10—4 主程序流程图 图10—5 定时中断服务程序流程图
10
通过比较键盘设定值与温度检测值的差别,按照一定的控制规律,控制输出口线的状态,实现三组加热丝的控制。图10—7为温度控制程序流程图。
(3)温度检测程序 温度检测采用每1s定时采样的方式,为了实现温度的准确检测,采用了平均值滤波法抗干扰。即连续4次启动ADC0809进行A/D转换,求取转换结果的平均值,存入指定单元,以得到检测温度值。图10—6为温度检测程序流程图。 (4)温度控制程序 通过比较键盘设定值与温度检测值的差别,按照一定的控制规律,控制输出口线的状态,实现三组加热丝的控制。图10—7为温度控制程序流程图。 (5)温度显示程序 在每次温度检测后,进行一次温度显示刷新;在进行温度设定时,显示设定温度值。
11
2、主要程序模块清单 主程序: ORG H AJMP MAIN ORG BH AJMP T0INT ORG H MAIN: MOV SP,#60H MOV P1,#0FFH;关电炉,开显示 MOV SCON,#00H ;设置串行口工作 ;方式0,发送 MOV TMOD,#01H ;定时器初始化 MOV TH0,#3CH ;50ms定时初值
12
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
13
图10—7 温度控制程序流程图 图10—6 温度检测程序流程图
14
定时中断服务程序: T0INT: MOV TH0,#3CH MOV TL0,#0B0H DJNZ R6,T0END;1s未到,中断返回 CLR TR0 CLR EA MOV R6,#14H ;恢复R6初值 ACALL TADC ;调用温度检测子程序 ACALL XSCL ;调用标度转换子程序 ACALL DISP ;调用显示子程序 ACALL TCONT;调用温度控制子程序 SETB TR0 SETB EA T0END: RETI
15
温度检测子程序: TADC: MOV 50H,#00H ;清存检测值单元 MOV B,#00H MOV R7,#04H ;设置转换次数 MOV DPTR,#7FFFH;送ADC0809地址 TT0: MOVX @DPTR,A;启动A/D转换 JB P3.2,$ ;等待转换结束 MOVX ADD A,50H MOV 50H,A JNC TT1;是否超出8位二进制范围 INC B
16
TT1: DJNZ R7,TT0 ;4次转换是否完成 CLR C ;求4次A/D转换的平均值 XCH A,B RRC A CLR C MOV 50H,A ;平均值存50H RET
17
温度控制子程序: 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
18
CCPR2: MOV P1,#0FEH ;开一组加热器 CONEND: RET
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
19
显示子程序: DISP: MOV R2,#03H ;显示数据的个数 MOV R1,#5DH ;显示缓冲区首址 SETB P1.3 DL0: MOV ;取要显示的数 MOV DPTR,#TAB MOVC ;查字型码 MOV SBUF,A ;送出数据 DL1: JNB TI,DL1 ;是否输完一个字节 CLR TI ;清发送完标志 INC R1 DJNZ R2,DL0 ;三个数是否都显示完? RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;0~9字型码 DB 92H,82H,0F8H,80H,90H
20
六、总结与提高 设计、调试大型程序时,应该: 先根据要求划分模块,优化结构;
再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用; 接着根据各模块性质和功能将各模块细化,设计出程序流程图; 最后根据各模块流程图编制具体程序。 调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。
21
在这个课题中,采用了软件滤波方式提高检测环节的准确,并且采用了三组加热控制提高了温度变化的精度。在此基础上,还可以增加液面检测、缺水报警电路及打印电路等其它辅助电路的设计,使这个控制系统更完善。
22
课题二 用8×8点阵显示器制作电子显示屏 一、实训目的 二、课题要求 熟悉8×8点阵显示器与单片机的接口电路及其设计方法;
课题二 用8×8点阵显示器制作电子显示屏 一、实训目的 熟悉8×8点阵显示器与单片机的接口电路及其设计方法; 学会模块化程序设计方法。 二、课题要求 制作一个8×8点阵显示器。要求如下: 1. 显示“电子设计”四个文字; 2. 显示方式可由K1、K2和K3三个键选择: K1为逐字显示,K2为向上滚动显示,K3为向左滚动显示。
23
三、硬件电路 显示器采用AT89C51单片机作控制器,时钟频率为12MHz,8×8点阵显示器采用共阳极结构,其电路如图10—8所示。 P0作为字符数据输出口, P2为字符显示扫描输出口, P1.0~P1.2口分别接开关K1、K2、K3, 通过改变电阻(270Ω)的大小可改变显示字符的亮度,驱动用9012三极管。
24
图10—8 硬件电路图
25
主程序用于对系统进行初始化,扫描按键开关状态,由按键标志位值(00H、01H、02H)决定显示的方式。主程序流程图如图10—9所示。
四、软件设计 1、程序结构设计 (1)主程序 主程序用于对系统进行初始化,扫描按键开关状态,由按键标志位值(00H、01H、02H)决定显示的方式。主程序流程图如图10—9所示。
26
图10—9 主程序流程图
27
(2)初始化子程序 (3)显示子程序 显示子程序由显示功能选择程序和显示控制程序组成。 显示功能选择程序:
用于对端口进行复位操作,将显示用的字符数据从字符表中装入内存单元50H~6FH中。字符表中的每个文字占用8个地址单元。 (3)显示子程序 显示子程序由显示功能选择程序和显示控制程序组成。 显示功能选择程序: 负责每次显示时的显示地址首址(在B寄存器中)、每个字的显示时间(由30H中的数据决定)和下一个显示地址的间隔(31H中的数据决定)的处理。
28
显示子程序: 负责对指定8个地址单元的数据进行输出显示。 显示一个完整文字的时间约为8ms。 在显示子程序中,1ms延时程序是用调用键扫描子程序的方法实现的。图10—10为逐字显示及向上滚动显示方式时的显示控制程序流程图。 (4)按键扫描程序 用于将按键的状态扫描至20H单元的低三位(20H.0、20H.1、20H.2)中。同时在程序中利用按键扫描程序代替显示程序中的1ms延时程序,既可以提高按键的快速响应,又可以提高动态显示的扫描频率,减少文字显示时的闪烁现象。
29
图10—10 逐字显示及上移显示程序流程图
30
2、主要程序模块清单 主程序: START: MOV 20H,#00H ;20H内存单元清0 SETB 00H ;20H.0位置1
START1: LCALL CLEARMEN ;调用上电初始化子 ; 程序 JB 00H,FUN0 ;20H.0位为1,执行FUN0 JB 01H,FUN1 ;20H.1位为1,执行FUN1 JB 02H,FUN2 ;20H.2位为1,执行FUN2 AJMP START1
31
初始化程序: 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 H,A MOV H,A MOV H,A MOV R3,A ;R3寄存器清0
32
MOV R1,#50H ;设字符表移入内存 ;单元首址 MOV R2,#20H;设查表次数(32次) CLLOOP: MOVC ;内存单元 MOV @R1,A MOV A,R3 INC A MOV R3,A INC R1 DJNZ R2,CLLOOP;是否已查表32 ;次,未完转CLLOOP RET
33
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 ;计
34
KEYWORK:MOV P1,#0FFH;置输入状态 JNB P1.0,KEY1 ;P1.0为0(键按下)转KEY1
键扫描子程序: 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(键按下)转KEY3 KEYRET: RET KEY1: LCALL DL10MS ;按键1功能处理,延 ;时10ms削抖动 JB P1.0,KEYRET ;是干扰转KEYRET结束 SETB H ;置逐字显示方式标志 ;(20H.0=1) CLR H CLR H RET ;子程序返回
35
KEY2: LCALL DL10MS;按键2功能处理
JB P1.1,KEYRET SETB H ;置上移显示方式标志 ;(20H.1=1) CLR H CLR H RET KEY3: LCALL DL10MS ; 按键3功能处理 JB P1.2,KEYRET SETB 02H ;置左移显示方式标志 ;(20H.2=1) CLR H
36
显示功能选择程序: FUN0:MOV H,#80H;逐字显示,1帧显示时间 ;(约1s) MOV H,#08H ;换帧跳转步距为8 LJMP DISP1 ;转显示子程序DISP1 FUN1:MOV H,#0AH ;上移显示,1帧显示时间 ;(约80ms) MOV H,#01H ;换帧跳转步距为1 LJMP DISP1 ;转显示子程序DISP1 FUN2:LJMP DISP ;左移显示
37
显示控制程序: 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 ;是末地址,一次显示结束 ;跳回START1 CONT:ADD A,R5 ;次帧扫描首址调整 MOV B,A AJMP LOOP ;转LOOP进行次帧扫描
38
DISLOOP: MOV A,@R0 ;取显示数据 MOV P0,A ;放入P0口 MOV P2,R6 ;扫描输出(显示 ;某一行)
显示子程序: DISPLAY: MOV A,#0FFH MOV P0,A ;关显示数据 MOV P2,A ;关扫描 MOV R6,#0FEH ;赋扫描字 MOV R0,B;赋显示数据首地址 MOV R7,#08H ;一次扫描8行 DISLOOP: MOV ;取显示数据 MOV P0,A ;放入P0口 MOV P2,R6 ;扫描输出(显示 ;某一行) LCALL DL1MS ;亮1毫秒 INC R0 ;指向下一行数据地址 MOV A,R6 ;扫描字移入A
39
RL A ;循环左移一位 MOV R6,A ;放回R6 DJNZ R7,DISLOOP ;8行扫描未完转 DISLOOP ;继续 RET ;8行扫描结束 1毫秒延时子程序: DL1MS: MOV R3,#64H ;100×(10+2)μs LOOPK: LCALL KEYWORK DJNZ R3,LOOPK RET
40
五、总结与提高 该课程设计中,可以看出LED点阵显示的控制是在七段LED数码管显示控制的基础上扩展实现的,二者都是采用动态扫描方式进行设计,从原理上是完全相同的。在这个课题的基础上,还可扩展多个LED点阵显示以实现更加复杂的分批显示模式及中文字幕的显示。
41
课题三 电子万年历的设计与制作 一、实训目的
课题三 电子万年历的设计与制作 一、实训目的 熟悉DS12887时钟日历芯片的特性及设置方法,DS12887芯片与单片机的接口电路及其设计方法; 学会模块化程序设计方法。
42
二、课题要求 制作一个可调万年历。要求如下: 内定时间为2000年1月1日12点00分00秒,提供给新产品或换电池时使用。 时间调整:开机时,光标停在“年”,移动光标依次修改年、月、日、时、分、秒。 每按P1.0一次,光标依年、月、日、时、分、秒顺序移动。 每按P1.1一次,光标所在位置的值加1。 每按P1.2一次,光标所在位置的值减1。 采用LCD液晶显示器显示。
43
三、背景资料 时钟日历芯片DS12887: 能够自动产生年、月、日、时、分、秒等时间信息,
芯片内部带有锂电池,外部掉电时,其内部时间信息能够保持10年之久; 有12小时制和24小时制两种工作模式; 时间的表示方法有两种:二进制数表示和BCD码表示。 用户可对DS12887进行编程以实现多种方波输出, 用户可对其内部的三路中断通过软件进行屏蔽。
44
1、引脚说明 Vcc:直流电源+5V输入 当Vcc输入为+5V时,用户可以访问DS12887内RAM中的数据,并可对其进行读、写操作;
当Vcc的输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息; 当Vcc的输入小于+3V时,DS12887会自动将电源切换到内部自带的锂电池上,以保证内部的电路能够正常工作。 图10—11 DS12887引脚图
45
GND:地 MOT:总线模式选择 当MOT接Vcc时选用Motorola总线模式,当MOT接GND时选用Intel总线模式。 SQW:方波输出 当供电电压Vcc大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。 AD0~AD7:双向地址/数据总线。 AS:地址有效输入。 DS/ :数据选通/读允许 当MOT接Vcc时作为数据选通;当MOT接GND时,作为读允许输入。
46
若MOT接Vcc,该引脚为高电平时读操作,为低电平时写操作;若MOT接GND,该引脚作为写允许输入。
R/ :读/写允许输入。 若MOT接Vcc,该引脚为高电平时读操作,为低电平时写操作;若MOT接GND,该引脚作为写允许输入。 :片选输入。低电平有效。 :中断请求输出。低电平有效。 :复位端。低电平有效,复位操作不影响时钟日历工作。 NC:空引脚。
47
2、存储器分配与设置 DS12887片内RAM与寄存器地址分配见图10—12。 DS12887带有128字节片内RAM:
10字节的时标寄存器:用来存储时间信息,地址00H~09H CPU可以通过读取时标寄存器获得时间与日历值,也可以编程设置其初值,时标寄存器的值可以用二进制或BCD码表示。 4字节的控制寄存器:用来存储控制信息,地址0AH~0DH 用户可通过对控制寄存器编程实现从SQW引脚输出多种不同频率的方波,并可对其内部的三路中断通过软件进行屏蔽。 114字节作为通用RAM供用户使用,地址为0EH~7FH。
48
10—12 片内RAM与寄存器地址分配
49
时标寄存器的数据格式,见下表所示。 地址 单元 功能 十进制范围 范 围 十六进制码 BCD码 秒 0~59 00~3B 00~59 1
范 围 十六进制码 BCD码 秒 0~59 00~3B 00~59 1 秒闹钟 2 分 3 分闹钟 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小时方式) 时闹钟(24小时方式) 6 星期(星期天=1) 1~7 01~07 7 日 1~31 01~1F 01~31 8 月 01~0C 01~12 9 年 0~99 00~63 00~99
50
控制寄存器的格式 ①寄存器A 用于选择时钟频率、中断周期和SQW输出频率,格式如下: D7 D6 D5 D4 D3 D2 D1 D0 UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
51
UIP:更新周期标志。 当UIP=1时,表示芯片正处于或即将开始更新周期,在此期间不允许读写时标寄存器; 当UIP=0时,表示没有更新周期,此时可读时标寄存器。 DV2~DV0:芯片内部振荡器RTC控制位。 当芯片复位后500ms开始第一个更新周期。将这3位设置成010,可使芯片以内置的32.768kHz的振荡频率工作。 RS3~RS0:周期中断可编程方波输出速率选择位。 这4位不同的组合可以产生不同的方波输出,程序可以通过设置寄存器B的SQWE和PIE位控制是否允许周期中断方波输出。RS3~RS0与中断周期及SQW输出频率的对应关系如表10—3所示。
52
表10—3 时钟频率选择 寄存器A选择位 32.768kHz时钟频率 RS3 RS2 RS1 RS0 中断周期 SQW输出频率 — 1
表10—3 时钟频率选择 寄存器A选择位 32.768kHz时钟频率 RS3 RS2 RS1 RS0 中断周期 SQW输出频率 — 1 ms 256Hz ms 128 Hz μs 8.192 kHz μs 4.096 kHz μs 2.048 kHz μs 1.024 kHz ms 512 Hz ms 256 Hz ms 64 Hz 31.25 ms 32 Hz 62.5 ms 16 Hz 125 ms 8 Hz 250 ms 4 Hz 500 ms 2 Hz
53
②寄存器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时清零。
54
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:夏令时允许标志位。
55
特点:程序读寄存器C或复位后,该寄存器的内容将自动清零。格式如下:
当DSE=1时,夏时制设置有效。在四月的第一个星期日的1:59:59 AM,调到3:00:00 AM;在十月的最后一个星期日的1:59:59 AM,调到1:00:00 AM。 当DSE=0无效。 ③寄存器C 为中断标志位寄存器。 特点:程序读寄存器C或复位后,该寄存器的内容将自动清零。格式如下: D7 D6 D5 D4 D3 D2 D1 D0 IRQF PF AF UF IRQF:中断申请标志位。 该位逻辑表达式为:IRQF = PF · PIE+AF · AIE+UF · UIE。当IRQF=1时,IRQ引脚将输出低电平。
56
PF、AF、UF:这三位分别为周期中断、闹钟中断、更新周期结束中断标志位。 只要满足各中断的条件,相应的中断标志位将置“1”。
寄存器C的D3~D0位为0,不使用。 ④寄存器D 为状态标志寄存器,只有一个标志位VRT(D7),其余各位均为0。格式如下: D7 D6 D5 D4 D3 D2 D1 D0 VRT VRT:芯片内部RAM与寄存器内容有效标志位。 该位为“1”时,表示芯片内部RAM和寄存器内容有效。读该寄存器后,该位将自动置“1”。
57
四、硬件设计 硬件电路见图10—13。采用AT89C51单片机作控制器,时钟频率为12MHz。显示器可采用LED显示,但由于LED数码显示所需的数码管较多,这里选用LCD显示器实现。 P1.0~P1.2口分别接开关K1、K2、K3,分别用于光标的移动及整定时间时的数字调整。
58
图10—13 万年历硬件原理图
59
(1)DS12887初始化:给寄存器A、B、C、D送控制字(片选有效)
五、软件设计 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液晶显示控制器设置(略)
60
2、程序结构设计 (1)主程序 用于实现初始化操作,包括中断设置、DS12887时钟芯片及LCD液晶显示控制器的初始化设置等。流程图见10—14所示。 (2)外部中断0服务程序 用于实现DS12887时钟芯片更新值的输出及显示操作。流程图见10—15所示。 (3)按键扫描子程序 用于将三个按键的输入状态扫描至89C51相应的寄存器中,进行光标移动、加1或减1的处理。
61
(4)显示子程序 用于将显示缓冲区数据依次输出到LCD显示器上。 (5)加1处理子程序 将加1按键的输入状态转换为对相应存储单元的加1操作,并将BCD码转换成ASCII码送显示缓冲区。 (6)减1处理子程序 将减1按键的输入状态转换为对相应存储单元的减1操作,并将BCD码转换成ASCII码送显示缓冲区。 (7)内定时间写入子程序 用于将内定时间00年1月1日12点00分00秒输入DS12887相应的时标寄存器中。
62
图10—14 主程序流程图图 —15 中断服务程序流程图
63
3、主要程序模块清单 主程序: ORG 0000H AJMP MAIN ORG 0003 AJMP EX0INT MAIN: MOV SP,#60H ;设置堆栈指针 ACALL BUSY ;调用检测LCD是否忙 ;的子程序 MOV A,#01H ;LCD清屏 MOV DPTR, #8100H ;送LCD指令寄存地址 ACALL LCDFIRST ;调用LCD初始化程序
64
MOV IE,#81H ;外部中断0允许 MOV A,#20H ;对DS12887的寄存 ;器A赋初值 MOV DPTR,#020AH;送DS12887的寄 ;存器A的地址 MOV A,#82H;对DS12887的寄存器B ;赋初值 MOV DPTR,#020BH;送DS12887的寄 ;存器B的地址 MOV DPTR,#020EH;读DS12887寄存器0E ;的内容 MOVX
65
CJNE A,#01H,LOOP;为0则未设内定
;时间 SJMP LOOP1 LOOP: ACALL RAMSTART ;调用内定时间写入子 ;程序 LOOP1:ACALL DISP ;调用成组字符显示子程序 MOV A,#12H;启动DS12887开始计时 MOV DPTR,#020BH LOOP2:ACALL KEYSCAN;调用键盘扫描子程序 SJMP LOOP2
66
中断服务子程序: EX0INT: PUSH ACC ;现场保护 PUSH PSW MOV DPTR,#020CH ;读C寄存器, ;清除中断标志位IRQF MOVX MOV R2,#00H ;光标位置偏移值 EX01: MOV DPTR,#CUR;LCD光标位置表首地址 MOV A,R2 MOVC ACALL BUSY ;检测LCD是否忙? MOV DPTR,#8100H;送LCD指令寄存器地址 MOV DPTR,#TIM;DS12887内部时标寄存器 ;表首地址
67
MOV A,R2 MOVC MOV DPTR,#0200H;送时标寄存器首址 MOV DPL,A;指向相应时标寄存器地址 MOVX ;读相应时标寄存器的内容 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 ;时 ;标寄存器“年月日时分秒”地址
68
内定时间写入子程序: RAMSTART:MOV A,#00H ;写入00秒 MOV DPTR,#0200H INC DPTR ;写入00分 MOV A,#12H MOV DPTR,#0204H ;写入12时 MOV A,#01H MOV DPTR,#0207H
69
;写入1日 INC DPTR ;写入1月 MOV A,#00H;写入00年 MOV DPTR,#020EH ;设定已设置内定时 ;间标志 MOV A,#01H RET
70
六.总结与提高 该课程设计中,为了正确地访问时间和日期信息,使用了更新结束中断(UIE=1)的方式实现时间和日期的读取。DS12887的使用非常灵活,读者也可用查询UIP位的方式或设定周期中断速率的方式来实现时间与日期的读取。为了使万年历的程序设计更加完善,还可在此基础上,增加闹钟定时程序等相关内容。
Similar presentations