嵌入式系统综合设计实习报告
实习内容 :单片机电子时钟
学 院 : 信科院
专 业 : 计本 08-2 班
姓 名 : 罗运涧
同 组 人 :陈宥达
学 号 : 3081817230
指导教师 : 金 红
1
目录
一、实习课题………………………………………………………3
二、设计方案………………………………………………………3
三、设计内容………………………………………………………3
四、系统软计程序设计 … …………………………………3
4.1 主程序……………………………………………………3
4.2 数码管显示模块…………………………………………3
4.3 定时器/计数器 T0 中断服务程序………………………3
4.4 按键处理模块……………………………………………5
4.5 汇编语言程序……………………………………………5
五、系统硬件电路的设计…………………………………14
六、实习总结………………………………………………15
七、参考资料………………………………………………16
2
一、实习课题:电子钟设计
二、设计方案:
1、通过单片机内部的计数/定时器,采用软件编程来实
现时钟计数,一般称为软时钟,这种方法的硬件线路简单,
系统的功能一般与软件设计相关,通常用在对时间精度要求
不高的场合。
2、采用时钟芯片,它的功能强大,功能部件集成在芯
片内部,具有自动产生时钟等相关功能,硬件成本相对较高;
软件编程简单,通常用在对时钟精度要求较高的场合。
三、设计内容:
这里采用应用广泛的 AT89C52 作为时钟控制芯片,利用
单片机内部的定时/计数器 T0 实现软时钟的目的。首先将
T0 设定工作于定时方式,对机器周期计数形成基准时间
(50ms),然后用另一个定时/计数器 T1 对基准时间计数形
成秒,妙计 60 次形成分,分计 60 形成小时,小时计到 12。
最后通过数码管把它们的内容在相应的位置显示出来,达到
时、分、秒计时的功能。
此外还要实现对时间的调整功能,89C52 的 P3.2、P3.3、
P3.4 外接三个独立按键,当按下 P3.2 按键时,系统进入调时
间的状态;当按下 P3.3 按键时,对显示的数码管进行加一的
功能;当按下 P3.4 按键时,对显
3
示的数码管进行减一的功能,当按下 P3.5 时确定显示时间,
达到调整时间的目的。
四、系统软件程序设计
4.1、主程序
先对显示单元和定时器/计数器初始化,然后重复调用数
码管显示模块和按键处理模块,当有按键按下时,则转入相
应的功能程序。
4.2 数码管显示模块
本实验有 8 个数码管,从右到左为妙、横线、分、横线、
时。在本系统中数码管显示采用软件译码动态显示。在存储
器中首先建立一张显示信息的字段码表,显示时,先从显示
缓冲区中取出显示的信息,然后通过查表程序在字段
表中查出所显示的信息的断码,从 P0 端口输出,同时
在 P2 端口进行数码管显示。
4.3、定时器/计数器 T0 中断服务程序
T0 用于计时,选中方式一,重复定时,定时时间设为
50ms,定时时间到则中断,在中断服务程序中用一个计数器
对 50ms 计数,计 20 次则对秒单元加一。秒单元加到 60 则
对分单元加一,同时秒单元清 0;分单元加到 60 则对时单元
加一,同时分单元清 0;时单元加到 24 则对时单元清 0,标
志一天时间计满。在对各单元计数的同时,把他们的值放到
4
存储器单元的指定位置。流程图如下:
开始
现场保护,重置初值,启动下一个 50ms
50ms 计数器加一
50ms 计数器=20?
秒单元加一,50ms 计数器清 0
秒单元=60?
分单元加一,秒单元清 0
分单元=60?
时单元加一,分单元清 0
时单元=24?
时单元清 0
NO
NO
NO
NO
开始
显示单元清
T0、T1 设为 16 位计数模式
允许 T0 中断
调用显示子程序
是
按下键否
进入功能程序
4.4、按键处理模块
按键设置为:如果没有按键吗,则时钟正常走时。当按
中断返回
主程序流程图
T0 中断服务程序
下 K0 键时,进入调分状态,时钟停止走动;按 K1 和 K2 按
键可以进行加一和减一操作;继续按 K0 键可以分别进行分
和小时的调整;最后按 K0 键启动计时。
4.5、汇编语言程序
;======1602 液晶时钟显示程序==========
;四键控制,P3.2 为调时选择键,按第 1 次为秒钟调整,按第 2 次为分钟调整,
5
;将 LCD 使能端与 P2.5 针脚连接
;将 LCD 的 RS 端与 P2.6 针脚连接
;将 LCD 的 RW 端与 P3.6 针脚连接
;设置时显示缓冲区的首地址
;设置时数据暂存的地址
;设置分数据暂存的地址
;设置秒数据暂存的首地址
;LCD 数据显示输入端口与 P0 端口连接(采用
按第 3 次为时钟调整
;P3.3 为加 1 键 '
;P3.4 为减 1 键
;P3.5 为确认键
LCD EQU P0
并行输入)
E BIT P2.5
RS BIT P2.6
RW BIT P3.6
H_BIT EQU 20H
M_BIT EQU 21H
S_BIT EQU 22H
EQU 23H
HH
MM
EQU 24H
SS
EQU 25H
HH_BIT EQU 26H
MM_BIT EQU 27H
SS_BIT EQU 28H
;================
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME0
ORG 0030H
;========主程序===========
MAIN:
MOV SP,#60H
MOV P1,#00H
MOV R5,#00H
MOV H_BIT,#00H
MOV M_BIT,#00H
MOV S_BIT,#00H
MOV HH_BIT,#00H
MOV MM_BIT,#00H
MOV SS_BIT,#00H
MOV HH,#0CH
MOV MM,#00H
MOV SS,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
;将 P1 端口置为 0
;将 R5 寄存器值为 0
;将时数据保存地址置为 0
;将时数据保存地址置为 0
;时初值设置
;分初值设置
;秒初值设置
;设置定时计数器方式为 T1 门控制
;设置计数器高字节
;设置计数器低字节
;总中断允许
;定时器 0 中断允许
6
;调用 BCD 码转换子程序
;调用 LCD 设置子程序
;将 TAB1 的首地址存入到 DPTR 上
;将时十位显示缓冲里的数据转移到 A 寄
;调用数据显示传送子程序
;将时个位显示缓冲里的数据转移至 A 寄
;将 LCD 设置为等待写状态
;向 P0 口输出 00000001
;调用 LCDWC 程序
;显示':'
MOV LCD,#01H
LCALL LCDWC
;=====================================
LOOP:
LCALL EY
LCALL KEY
LCALL EYY
LJMP LOOP
;=========显示子程序=================
EY:
LCALL LOOP1
LCALL LCDSET
MOV DPTR,#TAB1
MOV A,H_BIT
存器里
LCALL DISP
MOV A,HH_BIT
存器里
LCALL DISP
MOV A,#58
MOV LCD,A
LCALL WRR
MOV A,M_BIT
LCALL DISP
MOV A,MM_BIT
LCALL DISP
MOV A,#58
MOV LCD,A
LCALL WRR
MOV A,S_BIT
LCALL DISP
MOV A,SS_BIT
LCALL DISP
RET
;=======BCD 码转换子程序===============
LOOP1:
MOV A,SS
MOV B,#10
DIV AB
MOV S_BIT,A
显示缓冲上
MOV SS_BIT,B
示缓冲上
MOV A,MM
;转换为 BCD 将原数除以 10,
;得到十位为商,保存在 A 里,转移到十位
;个位为余数,保存在 B 里,转移到个位显
7
MOV B,#10
DIV AB
MOV M_BIT,A
MOV MM_BIT,B
MOV A,HH
MOV B,#10
DIV AB
MOV H_BIT,A
MOV HH_BIT,B
RET
;==========中断子程序=================
TIME0:
PUSH ACC
PUSH PSW
MOV TH0,#3CH
MOV TL0,#0B0H
INC R5
CJNE R5,#20,LOOP2
MOV R5,#00H
INC SS
MOV A,SS
CJNE A,#60,LOOP2
MOV SS,#00H
INC MM
MOV A,MM
CJNE A,#60,LOOP2
MOV MM,#00H
INC HH
MOV A,HH
CJNE A,#24,LOOP2
MOV HH,#00H
LOOP2:
POP PSW
POP ACC
RETI
;分重新计数
;时加 1
;将累加器内容推入堆栈寄存器保存
;将状态寄存器内容推入堆栈寄存器保存
;将 T0 计数器高字节置为 3CH
;将 T0 计数器低字节置为 B0H
;R5 自增加 1
;当 R5 等于 20,调用 LOOP2 子程序
;将 R5 重置为 0,重新计数 n
;秒加 1
;
;每六十秒,调用 LOOP2 子程序一次
;将秒置为 0,重新计数
;分加 1
;每六十分钟调用一次 LOOP2
;每 24 小时,调用一次 LOOP2
;时重新计数
;=====按键检测子程序====================
KEY:
CLR EA
;中断不允许,即屏蔽中断
;当 A 键按下,进入时间调整,并调
JNB P3.2,HH_KEY
用时调整子程序
KEY1:
SETB EA
RET
;中断允许
;=======时钟调整子程序==============
8