单片机课程设计报告
题 目 时钟芯片应用 班 级 07通信3班 姓 名 赵汀(07512336) 组 员 赵汀 杨剑
2010 年 07 月 30 日
目 录
1设计任务 ................................................................... 2
1.1实时时钟芯片应用 ................................................................. 2 1.2设计要求 ......................................................................... 2
2整体设计方案及框图 ......................................................... 3 3硬件设计 ................................................................... 3
3.1主要工具及元器件 ................................................................. 3 3.2 DS1302时钟芯片简介 .............................................................. 4 3.3 DS1302的内部结构 ................................................................ 4 3.4各引脚的功能 ..................................................................... 5 3.5读写时序说明 ..................................................................... 6 3.6电路原理图 ....................................................................... 7 3.7 DS1302的工作原理 ................................................................ 8 3.8 DS1302的寄存器和控制命令 ........................................................ 8 3.9单片机最小系统显示电路 .......................................................... 10
3.9.1最小系统原理 ............................................................. 10 3.9.2显示电路原理 ............................................................. 11 3.9.3 P0口及P1口说明 ......................................................... 11 3.9.4 LED数码管结构 ........................................................... 12 3.9.5 SST89E516RD介绍 ......................................................... 13 3.9.6 MAX232介绍 .............................................................. 14 3.9.7 RS232引脚定义 ........................................................... 15
4软件设计 .................................................................. 16
4.1时钟芯片程序流程 ................................................................ 16 4.2 控制时钟显示主要代码 ........................................................... 17
5实现过程中遇到的问题及解决方法 ............................................ 24
5.1硬件实现问题 .................................................................... 24 5.2软件实现问题 .................................................................... 25
6效果图 .................................................................... 25 7总结及建议 ................................................................ 27 8参考文献 .................................................................. 27
1
1设计任务
1.1实时时钟芯片应用
通过对DS1302芯片工作原理的了解和学习,设计出电路图,依照电路
进行电路板的设计和制作,最后按照设计要求编写程序代码实现时钟显示以及闹钟设定等功能。
1.2设计要求
1.可以显示时间,日期及闹钟并可通过按键进行调整。 2.可同时设置多个闹钟时间(不少于3个)。
2
2整体设计方案及框图
根据时钟芯片功能选择相应的芯片及其原件 查找相关芯片原件及其原件的功能原理 根据时钟芯片电路原理图进行初步设计确定VCC以及地线 根据单片机最小系统原理图进行焊接 焊接完成后对最小系统进行测试(复位键工作正常)可以正常下载程根据显示电路原理图进行LED数码显示管的焊接 使用Display程序 对数码显示管进行测试(数码管显示正常) 根据时钟电路原理图进行时钟电路的焊接 对时钟电路进行测试使其可以正常显示时间 根据原理图进行蜂鸣器、调整按键、切换按键(温控电路)焊接 程序调试对调整按键、切换按键、蜂鸣器进行测试
图1 时钟芯片的硬件设计以及软件设计
3硬件设计
3.1主要工具及元器件
电烙铁、松香、焊锡、海绵、导线若干、电路板(一个)、B型USB接口(一
个)、9针串口(一个)、按钮(5个)、LED灯(一个)、LED数码管(两个)、晶振(两个)、电容(47μf、0.1μf、30μf)、电阻(10KΩ、500Ω、4.7KΩ)、三极管(一个)、蜂鸣器、排阻。芯片:SST89E516RD、74HC573、74LS138、DS1302、MAX232(各一个)
3
3.2 DS1302时钟芯片简介
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。 3.3 DS1302的内部结构
图2 DS1302的外部引脚分配
图3 DS1302的内部结构
4
3.4各引脚的功能为:
Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。 SCLK:串行时钟,输入,控制数据的输入与输出; I/O:三线接口时的双向数据线;
CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束
单字节或多字节数据传输的方法。
DS1302有下列几组寄存器:DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器。
图4 DS1302有关日历、时间的寄存器
小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。
秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。
控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。
DS1302中附加31字节静态RAM的地址如下图所示。
5
图5 DS1302的工作模式寄存器
所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如下图所示。
此外,DS1302还有充电寄存器等。
3.5读写时序说明
DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如图6。
图6 控制字(即地址及命令字节)
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据; 位5至位1(A4~A0):指示操作单元的地址;
位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图7 。
6
图7 数据读写时序
3.6电路原理图
电路原理图如图8,DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。
图8 时钟芯片电路原理
7
图9 DS1302的内部结构图
DS1302含充电电路,可以对作为后备电源的可充电电池充电,并可选
择充电使能和串入的二极管数目,以调节电池充电电压。 3.7 DS1302的工作原理
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)
置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
3.8 DS1302的寄存器和控制命令
对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个
寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。日历、时间寄存器及控制字如表1所示:
7 寄存器名称 1 6 RAM/CK 5 A4 4 A3 3 A2 2 A1 1 A0 0 RD/W 8
秒寄存器 分寄存器 小时寄存器 日寄存器 月寄存器 星期寄存器 年寄存器 写保护寄存器 慢充电寄存器 时钟突发寄存器 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 表1:日历、时钟寄存器与控制字对照表
最后一位RD/W为“0”时表示进行写操作,为“1”时表示读操作。 DS1302内部寄存器列表如表2所示:
寄存器名称 秒寄存器 分寄存器 命令字 写 读 00-59 00-59 80H 81H 82H 83H 取值范围 7 CH 0 0 0 0 各位内容 6 5 4 3 2 1 0 SEC MIN HR DATE MONTH 0 DAY YEAR 10SEC 10MIN HR 0 10DATE 0 0 10M 0 0 10YEAR 0 小时寄存器 84H 85H 月份寄存器 88H 89H 周寄存器 8AH 8BH 年份寄存器 8CH 8DH 01-12或00-23 12/24 0 A 01-12 01-07 00-99 日期寄存器 86H 87H 01-28,29,30,31 表2:DS14302内部主要寄存器分布表
DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为
一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通
过外部接口来访问这些资源。单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表1所示,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在
9
DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。 物理上,DS1302的通讯接口由3个口线组成,即RST,SCLK,I/O。其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。具体的读写时序,但是请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。
图10 DS1302的命令字结构
3.9单片机最小系统显示电路
3.9.1最小系统原理
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统,最小系统一般应该包括:单片机、晶振电路、复位电路、按键输入、显示输出等。
1、最小系统的电路是由一个12MHZ的晶振、复位电路、发光LED灯、MAX232芯片、9针的串口以及按键电路构成的。 2、单片机SST89E516RD工作在12MHZ的频率下。
3、可以通过复位电路与单片机上的复位端口进行通信,使电路复位。 4、通过1.6和1.7端口来控制LED灯的状态。
5、串口通信是通过9针的串口与MAX232芯片相连然后利用单片机上的RXD(串行数据接收)和TXD(串行数据发送)端口来控制串行口的通信。
10
6、按键电路是通过单片机上的P2端口来控制按键信号输入的。
图11 单片机最小系统原理图
3.9.2显示电路原理
1、用74HC573和单片机的P0[0:7]口相连,通过P0口来控制LED数码管的位选码段。
2、用74LS138和单片机的P1[2:0]口相连,同过P1口来控制LED数码管的字段码。
3.9.3 P0口及P1口说明:
P0是一个漏极开路的8位双向I/O口。作为输出口,每位能驱动多个LS型TTL负载。P0浮空,锁存器为“1”,可作为高阻抗输入。在访问外部存储器时,P0口作为低8位地址和数据总线分时复用。在这种应用中,当转为高电平时,它用了强大的内部上拉。在外部主模式编程状态下,P0接收代码字节,在外部主模式校
11
验过程中输出代码字节。在程序校验过程中需要外部上拉。
P1是一个带内部上拉电阻的8位准双向I/O口。每位能驱动LS 型TTL负载。当P1口作为输入口用时,向内部锁存器写入“1”,P1 引脚被内部上拉电阻拉为高电平。由于内部上拉电阻,被拉为低的 P1引脚能向外提供电流。P1[5,6,7]有16毫安的高电流驱动能力。当外部主模式在编程和测试时,P1也接收低8位地址。
3.9.4 LED数码管结构:
图12 四位共阴数码管内部逻辑图
1AF23BEDDPCG4
图13 四位共阴数码管实物引脚图
12
图14 显示电路原理图
3.9.5 SST89E516RD介绍:
·兼容80C51系列,内置超级FLASH存储器的单片机,工作电压 VDD=4.5~5.5V,5伏工作电压时0~40MHz的频率范围,工作电压 VDD=2.7~3.6V,在3伏工作电压下,原厂保证0~25MHz的工作频,实际最高可达40MHz,与现行的80C52列单片机硬件PIN-TO-PIN完全兼容,软件、开发工具也完全兼容。 ·1K*8的内部RAM(256Bytes+768Bytes,可使用C语言编程)两块超级FLASH EEPROM,即SST89E516RD/SST89V516RD:64K*8的基本存储块和8K*8的二级存储块(扇区大小为 128 字节)和SST89E58RD/SST89V58RD:32K*8的基本存储块和
13
8K*8的二级存储块(扇区大小为128字节),(二级存储块可用于存放掉电后要保存的数据,放在内部具有极强的抗干扰性)。
·独立的块加密,IAP 下的并行操作,块地址重映射。最大片外程序/数据地址空间为64K*8(当然也可以通过I/O口进行块切换,实现超64K扩展)。 ·三个高电流驱动引脚(每个16mA,可直接驱动LED)和三个16位定时器/计数器。
·全双工增强型UART:帧错误检测、自动地址识别。 ·9个中断源,四个中断优先级。
·看门狗定时器 (Watchdog Timer, 缺省情况下不打开, 用户不需要时可不使用)。
·可编程计数阵列(PCA),标准为每个机器周期12个时钟,器件可选择在每个机器周期6个时钟基础上加倍。
·掉电检测(Brow-out缺省为产生复位,也可设置为产生中断) ·降低EMI模式(通过AUXR SFR 不允许ALE 输出时钟) ·四个8位 I/O口(32 根输入输出线) 3.9.6 MAX232介绍:
MAX232是一种把电脑的串行口RS232信号转换为单片机所用到的TTL信号电平的芯片。
14
3.9.7 RS232引脚定义:
1-9针作用分别是载波检测(DCD)、接收数据(RDX)、发送数据(TXD)、数据终端准备好(DTR)、地信号(SG)、数据准备好(DSR)、请求发送(RTS)、清除发送(CTS)、振铃提示(RI)。
15
4软件设计
4.1时钟芯片程序流程:
开始DS1302初始化设置时间向DS1302写入时间数据读取DS1302内的时间数据在LED数码管上显示具体时间复位 图15 程序流程图
16
4.2 控制时钟显示主要代码:
/**************************************************************** * 名称: OneByteToDS1302 * 功能: 往DS1302写入1Byte数据 * 输入: dsDa 写入的数据 * 返回值: 无
****************************************************************/ void OneByteToDS1302(uchar dsDa) //向DS1302中写一位 { uchar i; ACC= dsDa; for(i=8; i>0; i--) {
Time_IO = ACC0; Time_SCLK = 1; Time_SCLK = 0;
ACC =ACC>> 1; //向右移动一位数据 } }
/******************************************************************** * 名称: uchar OneByteFromDS1302() * 功能: 从DS1302读取1Byte数据 * 返回值: ACC
写数据是脉冲上升沿有效
17
***********************************************************************/ uchar OneByteFromDS1302(void) //从DS1302中读一位 {
uchar i; for(i=8; i>0; i--)
{
ACC = ACC>>1; ACC7 = Time_IO; Time_SCLK = 1; Time_SCLK = 0; } return(ACC); }
/******************************************************************** * 名称: void v_W1302(uchar dsAddr uchar dsDa) * 说明: 先写地址,后写命令/数据 * 功能: 往DS1302写入数据 * 调用: OneByteToDS1302()
* 输入: dsAddr: DS1302地址, dsDa: 要写的数据 * 返回值: 无
***********************************************************************/ void v_W1302(uchar dsAddr, uchar dsDa) {
Time_RSET = 0;
18
Time_SCLK = 0;
Time_RSET = 1;
OneByteToDS1302(dsAddr); //写地址命令
OneByteToDS1302(dsDa); //写1Byte数据 }
/******************************************************************** *
* 名称: ds_R1302
* 说明: 先写地址,后读命令/数据 * 功能: 读取DS1302某地址的数据
* 调用: OneByteToDS1302() , OneByteFromDS1302() * 输入: ucAddr: DS1302地址 * 返回值: ucDa :读取的数据
***********************************************************************/ uchar ds_R1302(uchar dsAddr) {
uchar dsDa;
Time_RSET = 0; /*停止工作 需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器*/
Time_SCLK = 0; //其中RST从低电平变成高电平启动一次数据传输过程 Time_RSET = 1;
OneByteToDS1302(dsAddr); // 开始写地址命令
Time_SCLK = 1; Time_RSET =0;
19
}
dsDa = OneByteFromDS1302(); // 开始读1Byte数据 Time_SCLK = 1;
Time_RSET =0; //RST从 1到0停止工作 即停止读写数据传输过程 return(dsDa);
//设置时钟时间初值 void resetTime(void) {
v_W1302(0x8e,0x00); //8e:写寄存器BIT7=WP 控制命令,WP=0,写操作 Time_RSET = 0; Time_SCLK = 0; Time_RSET = 1;
OneByteToDS1302(0xbe); // 0xbe:时钟突发模式:写寄存器 时钟多字节写命令 OneByteToDS1302(second); OneByteToDS1302(minute); OneByteToDS1302(hour); OneByteToDS1302(date); OneByteToDS1302(month); OneByteToDS1302(day); OneByteToDS1302(year); OneByteToDS1302(0); Time_SCLK = 1; Time_RSET =0; }
20
//显示时间函数 void Disp_Time(void) {
uchar sec,min,hou,dat,mon,wek,yea,i,j=0; Time_RSET = 0; Time_SCLK = 0; Time_RSET = 1;
OneByteToDS1302(0xbf); /*0xbf:时钟突发模式寄存器:读寄存器时钟多字节读命令*/
sec = OneByteFromDS1302(); min = OneByteFromDS1302();
hou = OneByteFromDS1302(); dat = OneByteFromDS1302(); mon = OneByteFromDS1302(); wek = OneByteFromDS1302(); yea = OneByteFromDS1302(); Time_SCLK = 1; Time_RSET =0;
Timebuff[0] = sec%16;//取出低位
Timebuff[1] = sec/16;//取出高位 Timebuff[2] = 0xa; Timebuff[3] = min%16;/ Timebuff[4] = min/16; Timebuff[5] = 0xa;
21
Timebuff[6] = hou%16; Timebuff[7] = hou/16; for(i=0; i<8; i++)
{
P1 = j;
P0 = Led[Timebuff[i]]; Delay_time(60); j ++;
Delay_time(60);
}
}
void Disp_Date(void) {
uchar sec,min,hou,dat,mon,wek,yea,i,j=0; Time_RSET = 0; Time_SCLK = 0; Time_RSET = 1;
OneByteToDS1302(0xbf); //* 0xbf:时钟多字节读命令 sec = OneByteFromDS1302(); min = OneByteFromDS1302(); hou = OneByteFromDS1302();
dat = OneByteFromDS1302(); mon = OneByteFromDS1302(); wek = OneByteFromDS1302();
22
yea = OneByteFromDS1302(); Time_SCLK = 1; Time_RSET =0;
Timebuff[0] = dat%16; Timebuff[1] = dat/16; Timebuff[2] = 0xa; Timebuff[3] = mon%16; Timebuff[4] = mon/16; Timebuff[5] = 0xa; Timebuff[6] = yea%16; Timebuff[7] = yea/16; for(i=0; i<8; i++) }
void iniClock()
{ v_W1302(0x8e,0x00); /*控制写入WP=0 写保护寄存器 写保护位防止对任一寄存器的写操作,第一个参数表示地址,第二个参数表示数据,先写地址,再写数据*/
v_W1302(0x90,0xa5);
{ }
P1 = j;
P0 = Led[Timebuff[i]]; Delay_time(60); j ++;
Delay_time(60);
23
v_W1302(0x80,second); //秒 v_W1302(0x82,minute); //分 v_W1302(0x84,hour); //时 v_W1302(0x86,date); //日 v_W1302(0x88,month); //月 v_W1302(0x8a,day); //星期 v_W1302(0x8c,year); //年 v_W1302(0x8e,0x80); }
5实现过程中遇到的问题及解决方法
5.1硬件实现问题
问题1:在实现最小系统时,程序不能正确下载进入芯片。
解决方案:利用万用表对照电路图测试电路焊口是否有短接或虚接,USB端口电压是否为5v,线路连接是否正确等等,通过这一系列的测试,发现部分焊口有虚接,经过正确焊接后,实现了最小系统的运行。
问题2:控制时钟显示部分的系统完成后,测试时间显示时,LED数码管显示出现了显示错误和显示残缺。
解决方案:检查与LED数码管引脚连接的线路,发现部分线路连接错误,通过对线路的修改后,再次测试,能正确显示所设计的时间。
问题3:在测试电路板调整时间的开关按键部分时,蜂鸣器不工作。 解决方案:通过利用万用表对照电路图测试蜂鸣器以及切换按键的连线问题,排除连线问题,切换按键与蜂鸣器同时接SST89E516RD芯片2.7端口时蜂鸣器的工作电压不稳定。使蜂鸣器一端接VCC,调整后蜂鸣器以及切换按键工作正常。
24
5.2软件实现问题
问题1:向DS1302写入数据和从DS1302中读出数据的代码实现出现困难。 解决方案:通过继续阅读向DS1302写入数据和读取数据的工作原理及时序工作流程,编写出相关代码并能正确实现所需功能。
问题2:在编写设计实现时间显示和设置时间功能间切换代码时不能实现切换。
解决方案:通过复习C语言知识以及向同学请教正确编写了各个功能程序之间的切换代码并实现按下开关切换功能显示。
问题3:编写日期显示函数时,没有思考到闰年的相关日期显示问题,导致所有年份中的日期中只有30号或者31号。
解决方案:编写判断闰年函数实现了闰年日期的正确显示。
6效果图
实物照片
1、电路板正面图片:
25
2、电路板背面图片:
26
7总结及建议
1.学会了最基本的单片机使用方法和电路板焊接方法。
2.了解并掌握了SST89E516RD、74HC573、74LS138、DS1302、MAX232芯片的基本原理和构造。
3.通过学习DS1302的构造和工作原理,学会了利用DS1302和单片机制作一个时钟,并且会对其进行程序控制。
4.本次实践后,让我学到了更多的关于单片机原理的知识,提高了动手能力和团队合作能力。
8参考文献
[1] 《SST89系列单片机中文手册》 [2] 《DS1302数据手册》
[3] 《MAX232中文资料规格书》
[4] 《USB 2.0板载设计及布线指南》 [5] 《USB接口针脚定义,插口针脚识别》 [6] 《74系列芯片资料_(中文)》
27
因篇幅问题不能全部显示,请点此查看更多更全内容