返回该小组首页 回复主题
xiaolong0739

xiaolong0739

小组等级:     E币:148  (E币换礼)

#1楼主:电子钟制作初步

文章发表于:2008-03-11 10:52

电子钟制作初步


下面是电子钟制作过程,写这个过程,只是想通过一些比较形象的文字图片资料,给广大爱好单片机电路制作的朋友,特别是初学者,很多朋友搞不懂如何入门,希望能够帮到这些朋友。

由于写作水平有限,如有错漏,敬请见谅。如果你是技术高手,欢迎提出批评意见。

制作电子钟其实就是单片机学习的实践之一,它需要一些软件和硬件的物质基础为保证,要学的快,纸上谈兵是不行的,需要进行实践。

一般硬件基础配备:

1、电脑一部

学习单片机,电脑是必备的,编译软件在电脑上运行,才能调试代码、生成编译文件等等,偶尔还能听说,不用电脑即可学单片机的声音,可以说是误导一大片朋友。若干年前,有些开发板是直接输机器码的,确实不需要电脑,即可使单片机运行,这种方式早已淘汰啦!!

图片就不上啦

2、编程器一部

编程器连接电脑,通过电脑上使用配套软件,将编译好的代码烧录文件写入单片机中。

现在市场上买的多是多功能编程器,可以适应很多规格的单片机型号。

同时,由于技术进步,现在很多单片机具有ISP(在线下载)功能,做一个简单的接口电路,即可实现烧录代码,如果你用的单片机型号不是很多,可以不用采购编程器。专业的单片机开发人员一般都会配置一台编程器。

xiaolong0739

   小组等级:    E币:148  (E币换礼)

#2

文章发表于:2008-03-11 10:53

功能简要说明:

制作这个电子钟电路是放在自己汽车上用的,所以编程时考虑了一些驾驶因素,操作以简单为主。

按键分为4个按键,分别是K0 、K1、K2、K3

K0: 短按 : 时间/计时 切换显示

长按:调整小时模式(小时闪烁)/调整分钟模式(分钟闪烁)/ 再按恢复显示时间

以上循环切换

K1: 调整小时或调整分钟模式时,按此键小时加或分钟加

其它显示模式时,按此键切换到温度(长显)显示模式

K2: 调整小时或调整分钟模式时,按此键小时减或分钟减:

其它显示模式时,按此键切换到时间/温度(轮流显时)显示模式

K3 : 计时显示模式,同时计时清零

数码管显示说明:

1、安装数码管时,建议使用插座,可以很方便的更换不同颜色的数码管

2、数码管规格:共阳 SM2105

3、从左向右排列:第3、5 数码管倒装,请注意,电路上还是按正装连接。

4、显示时间时:第1、2位=小时 第3、4位=分钟 第5、6位=秒

5、显示计时时:第1、2位=小时 第3、4位=分钟 第5、6位=秒

6、显示温度时:第1位=“-”零下符号、第2、3、4位=温度 第5位=C(摄氏度)单位 第6位=不显示


注意:

1、DS 1302在没有后备电源的情况下(指新购器件或拔离电路板),初次通电使用时间只显示00:00:00,同时

计时显示00: 00:00,时间是不走动的,请长按K0 ,至调时或调分状态,设置一个时间即可走时。

2、DS 1302如果不接电池,每次通电均需按步骤1设置

3、每次通电,默认为时间/温度(轮流显时)显示模式

xiaolong0739

   小组等级:    E币:148  (E币换礼)

#3

文章发表于:2008-03-11 10:56

ASM汇编代码详解

(完整源代码、烧录码、电路图在5楼下载)

准备好开发调试工具后,按电路图搭建电子钟,完成后,先不插51单片机及DS1302、DS18B20,检查没有明显短路、断路,错焊后,通电检查,稳压电路7805后应有+5v电压,如有故障,立即排除。

单片机要写入代码才能按我们的要求及想法运行, 单片机编制程序,特别对于初学者,往往一时找不到方向,很多单片机网友与我交流时都提到这个问题,我也一时说不清,我只能以这个电子钟为例,把我的设计思路尽量说清楚,希望与大家共勉。

该电子钟的代码编制应考虑 : 电子钟功能、操作方法、外围部件连接方式及特性、扫描显示方式等因素

1、电子钟功能

2、操作方法

3、外围部件连接方式及特性

4、扫描显示方式

综合如上因素,设计如下程序流程图:

主程序流程图

点击看大图

xiaolong0739

   小组等级:    E币:148  (E币换礼)

#4

文章发表于:2008-03-11 10:57

中断扫描程序流程图


图片点击可在新窗口打开查看此主题相关图片如下电子钟中断扫描流程图.jpg:
点击看大图

整个代码的核心其实就3个子程序:

1、DS1302读写子程序

2、DS18B20子程序

3、显示扫描子程序

要快速掌握它们,最简单的办法是移植代码,但要了解它的硬件编程特性。

1、DS1302是时钟电路,网上资料很多,对它的常用操作,只有读取时间、写入时间。

请复制并保存下面的代码(蓝色部分),该代码是网上搜索而得,出处不明,但非常好用,个人认为很标准。

它完全符合DS1302 通讯规则,很多朋友无法操作DS1302 一般都是这个问题。

有些朋友无法操作DS1302 ,认为是晶振频率不对,实质DS1302 对时序要求不严,只要按规则通讯即可,实践证明本代码在4-24M均可正确读取/写入DS1302。


图片点击可在新窗口打开查看此主题相关图片如下1302时序.jpg:
点击看大图
DS1302读写通讯时序

;读取时间代码=READ_TIME

;设置时间代码=Set1302

;**********************************************************
;子程序名:READ_TIME
;功 能:从DS1302 读时间
;调 用:RTInputByte,RTOutputByte
;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL
;影响资源:A B R0 R1 R4 R7
;**********************************************************
READ_TIME:
MOV R0, #Second;
MOV R7, #7
MOV R1, #81H ;秒地址
G13021:
SETB T_CLK
CLR T_RST
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR T_CLK
NOP
NOP
NOP
SETB T_RST
NOP
NOP
NOP
MOV B, R1 ;秒 分 时 日 月 星期 年 地址
LCALL RTInputByte
LCALL RTOutputByte
MOV @R0, A ;秒
INC R0
INC R1
INC R1
SETB T_CLK
NOP
NOP
NOP
CLR T_RST
NOP
NOP
DJNZ R7, G13021
RET

;**********************************************************
;子程序名:Set1302
;功 能:设置DS1302 初始时间,并启动计时。
;调 用:RTInputByte
;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.Year(地址连续)
;影响资源:A B R0 R1 R4 R7
;**********************************************************
Set1302:
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器
LCALL RTInputByte
MOV B, #00H ;写操作前WP=0
LCALL RTInputByte
SETB T_CLK
CLR T_RST

MOV R0, #Second;
MOV R7, #7 ;秒 分 时 日 月 星期 年
MOV R1, #80H ;秒写地址
S13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, R1 ;写秒 分 时 日 月 星期 年 地址
LCALL RTInputByte
MOV A, @R0 ;写秒数据
MOV B, A
LCALL RTInputByte
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7, S13021
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器
LCALL RTInputByte
MOV B, #80H ;控制,WP=1,写保护
LCALL RTInputByte
SETB T_CLK
CLR T_RST
RET

;**********************************************************
;功 能:写1302一字节 (内部子程序)
;**********************************************************
RTInputByte:
MOV R4, #8
Inbit1: MOV A, B
RRC A
MOV B, A
MOV T_IO, C
NOP
NOP
NOP





SETB T_CLK
NOP
NOP
NOP
CLR T_CLK





DJNZ R4, Inbit1
NOP
NOP
NOP
RET
;**********************************************************
;功 能:读1302一字节 (内部子程序)
;**********************************************************
RTOutputByte:
MOV R4, #8
Outbit1: MOV C, T_IO
RRC A
SETB T_CLK
NOP
NOP
NOP
CLR T_CLK
NOP
NOP
NOP
DJNZ R4, Outbit1
RET

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

以上代码读或写DS 1302时,按“秒 分 时 日 月 星期 年”顺序进行操作,非常方便有效。

在使用该代码时,首先需要按硬件连接情况作一些配置,

在本电子钟由于

DS1302 的管脚 5---------------------------------51管脚 3

DS1302 的管脚 6---------------------------------51管脚 2

DS1302 的管脚 7---------------------------------51管脚 1

同时为了方便我们将“秒 分 时 日 月 星期 年”的读写缓存设置在60H-66H

所以



;DS1302设置

T_CLK Bit P1.0 ;实时时钟时钟线引脚
T_IO Bit P1.1 ;实时时钟数据线引脚
T_RST Bit P1.2 ;实时时钟复位线引脚

second equ 60h ;秒的缓冲区
minute equ 61h ;分的缓冲区
hour equ 62h ;小时的缓冲区
date equ 63h ;日期的缓冲区
month equ 64h ;月的缓冲区
WEEK equ 65h ;星期的缓冲区
year equ 66h ;年的缓冲区

举例:设置DS1302 时间=07年 星期=5 月=11 日=23 小时=20 分钟=50 秒=28 并立即走时的代码

MOV 66H,#07H
MOV 65H,#05H
MOV 64H,#11H
MOV 63H,#23H
MOV 62H,#20H
MOV 61H,#50H
MOV 60H,#28H

CALL SET1302 ;调用写1302子程序

你看非常简单,由于源代码开头位置已经作了地址定义,所以也可以写成

MOV year,#07H
MOV WEEK,#05H
MOV month,#11H
MOV date,#23H
MOV hour,#20H
MOV minute,#50H
MOV second,#28H

CALL SET1302 ;调用写1302子程序

效果相同,但可以方便的修改数据缓存地址,如要修改地址,只要在源代码开头位置修改即可。

举例:读DS1302 时间 星期 月 日 小时 分钟 秒 并将读到的数据存入定义好的缓存中66H-60H(RAM地址)

call read_time

简单吧!

DS1302每个字节(8位)分成高4位、低4位,除了个别“位”代表特定参数外,分别表示


图片点击可在新窗口打开查看此主题相关图片如下1302寄存器.jpg:
点击看大图

1302寄存器,左边是地址,右边是读出或写入值的位定义,详细请网上搜索数据手册

由于读出DS1302小时 分钟 秒的值是3个字节表示(在地址62H、61H、60H),而数码管显示是6位,显示时是一个一个数码管送显示数据的,第1、2位小时,第3、4位分钟,第5、6位秒钟,因此要进行字节拆分,才能正常显示。

举例:

读出3个字节数据:小时=23H 分钟=37H 秒=52H,

拆分成6个数码管对应显示值:小时十位=02H,小时个位=03H,分钟十位=03H,分钟个位=07H,秒钟十位=05H,秒钟个位=02H,

并且规定拆分后的数据作为显示缓存,地址对应

小时十位=45H,小时个位=44H,分钟十位=43H,分钟个位=42H,秒钟十位=41H,秒钟个位=40H,

代码如下:

;拆分字节Second,取低4位,写入秒钟个位显示缓存40H
GET_DISPBUFF:
MOV A,Second
ANL A,#00001111B
MOV 40H,A
;拆分字节Second,取高4位,写入秒钟十位显示缓存41H
CLR C
MOV A,Second
ANL A,#01110000B
RRC A
RRC A
RRC A
RRC A
MOV 41H,A
;拆分字节MINUTE,取低4位,写入分钟个位显示缓存42H
MOV A,MINUTE
ANL A,#00001111B
MOV 42H,A
;拆分字节MINUTE,取高4位,写入分钟十位显示缓存43H
CLR C
MOV A,MINUTE
ANL A,#01110000B
RRC A
RRC A
RRC A
RRC A
MOV 43H,A


;拆分字节HOUR,取低4位,写入小时个位显示缓存44H
MOV A,HOUR
ANL A,#00001111B
MOV 44H,A
;拆分字节HOUR,取高4位,写入小时十位显示缓存45H
CLR C
MOV A,HOUR
ANL A,#00110000B
RRC A
RRC A
RRC A
RRC A
MOV 45H,A
RET

无论设置或写入DS1302,最终都要通过LED数码管显示出来的,我们来看看数码管显示的基本代码:

kouxiangtang

   小组等级:    E币:529  (E币换礼)

#5

文章发表于:2008-05-04 20:46

真想好好学学!太菜了。

zhuruili

   小组等级:    E币:354  (E币换礼)

#6

文章发表于:2008-06-26 19:45

感谢楼主,写得很详细,要是能将源代码传上来就更好啦!!

liunianleon

   小组等级:    E币:296  (E币换礼)

#7

文章发表于:2008-08-29 14:17

我的博客里有自制的电子钟,希望各位指教~~~o(∩_∩)o...

http://blog.ednchina.com/liunianleon/

lxa0

   小组等级:    E币:-202  (E币换礼)

#8

文章发表于:2008-11-10 04:56

讲的很好~~

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章