多功能电子钟创新设计说明书 精品Word文件下载.docx
《多功能电子钟创新设计说明书 精品Word文件下载.docx》由会员分享,可在线阅读,更多相关《多功能电子钟创新设计说明书 精品Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。
●学会使用IAR软件;
●独立完成电路设计,程序设计、连接电路和调试;
●参加答辩并书写任务书。
划
第5章了解单片机的基本知识,学习使用软件,下发任务书,开始电路设计;
第6章学习使用相关软件,继续电路设计;
第7章完成电路设计;
第8章编程下载、连接电路、调试和验收;
第9章答辩并书写任务书。
考
资
料
1强锡富.传感器.机械工业出版社,2001年
2李科杰.新编传感器技术手册.国防工业出版社,2002年
3贾伯年.传感器技术.东南大学出版社,1992
指导教师签字
基层教学单位主任签字
说明:
此表一式四份,学生、指导教师、基层教学单位、系部各一份。
年月日
目录
一、设计目的、设计题目
二、设计任务、功能描述
三、硬件原理分析
四、软件设计
五、程序清单
六、心得体会
摘要
本设计从日常生活中常见的事物入手,通过对电子时钟的设计,让我们认识到单片机已经深入到我们生活的每个领域,该设计不仅可以锻炼我们的动手能力,而且可以加深我们对单片机的认识和激发我们对未知科学领域的探索。
本文利用单片机实现数字时钟计时功能的主要内容。
它体积小,成本低、功能强、使用方便、可靠性高等一系列优点,广泛应用于智能产业和工业自动化上。
本次设计采用独立式按键进行时间调整,其中STM8S是核心元件,同时采用数码管LED动态显示“时”,“分”,“秒”的现代计时装置。
与传统机械表相比,它具有走时精确,显示直观等特点。
它的计时周期为24小时,显满刻度为“23时59分59秒”,另外利用DS1302具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点。
该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点。
关键词:
STM8S;
LED数码管;
DS1302芯片;
一、设计目的、设计题目
本设计的目的是设计一个实用的电子时钟,该时钟能够实现日常的时钟显示,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,同时具有时钟调整、闹钟等功能。
整体设计任务:
本电子时钟设计首要的工作是结合以往所学的单片机程序编写理论和编写规则来编写电子时钟的软件部分,编写时要结合所配的STM8S105芯片的管脚功能和其他硬件电路,如DS1302时钟芯片和LCD1602液晶显示屏,该部分运用STVD单片机软件来完成。
在编写完软件并检测完正确后用仿真硬件检测运行检测程序是否正确,并调试。
待这一切工作做好后再利用系统板硬件电路来实践实现软件功能与硬件的结合。
电路设计分析
电路原理设计是基于小系统包括电源电路、复位电路、按键电路、时钟电路、LCD液晶显示驱动电路、输出控制电路。
电源部分是用直流电源经变压来提供的5V,晶体振荡器采用的是16MHz的石英晶体振荡器。
部分硬件设计:
(1)本设计采用DS1302实时时钟芯片来进行计时,并将1302的数据输入单片机进行处理,送入LCD1602液晶显示屏进行显示。
(2)用四个电位按键来实现对电子时钟的调试工作,当按第一下总控键时进入中断程序,即时钟的调整状态,有两个电位按键分别来调整时钟的加和减;
第四个按键用来调整时分秒日月年,按一下调整秒,连按两下调整分,按三下调整时,四下调整日,五下调整月,六下调整年,七下退出时间设置。
(3)用一个按键和其他部件组成的复位电路与芯片连接来实现整个程序及硬件的重新复位功能。
部分电路图如下:
1.1复位电路
本次设计采用按键电平复位,按键电平复位相当于按复位键后,复位端通过电阻与VDD电源接通,如下图:
1.2振荡器和时钟电路设计
本次设计采用常用的内部时钟方式接法:
通过在引脚OSCIN和OSCOUT两端跨接晶体或陶瓷谐振器,再利用芯片内部的振荡电路,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路,如图所示,外接晶振时,C1
和C2的值通常选择为20-30pf。
C1、C2对频率有微调作用,影响振荡的稳定性和起振速度。
所采用的晶体或陶瓷谐振器得频率选择0-24MHz。
为了减小寄生电容,更好的保证振荡器稳定、可靠的工作,谐振器和电容赢尽可能与单片机芯片靠近安装。
1.3电源
因为该电路所需电压为5v,可直接用电池供应或也可以用直流电源供应,但需经过变压才行。
STM8S105S芯片略图
1.4DS1302实时时钟芯片
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×
8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
DS1302的引脚排列中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK始终是输入端。
电路图如下:
1.4LCD1602液晶屏显示电路
1602是一种字符型液晶显示模块,专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
下面以某公司的1602字符型液晶显示器为例,介绍其用法。
一般1602字符型液晶显示器实物如图
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极
1.5输出控制电路
将PB口用于单片机和LCD显示器的数据传输通道,如下图所示,通过控制LCD的读写控制端将1302的数据显示出来。
1.6整体布局图
四、软件设计分析
1、地址空间及端口分配
_Boolrs@PC_ODR:
1;
//PC作为LCD的控制端,设置为输入
_Boolrw@PC_ODR:
2;
_Boolen@PC_ODR:
3;
_Boolsclk@PA_ODR:
4;
//串行时钟,输入输出控制
_Booldio@PA_ODR:
5;
//三线接口时的数据线
_Boolid@PA_IDR:
_Boolce@PA_ODR:
6;
//作为复位端口
_BoolID1@PG_IDR:
0;
//将PD6引脚设置为外部中断的输入引脚
2、总体架构说明
该时钟程序设计思路如下:
(1)、在程序头将设计中的一些IO口进行分配并注释。
(2)、初始化程序,对单片机的IO口设置为输入输出等,对1302,1602的参数进行设置,如设定时钟运行为24小时制;
将一些未到时钟设计功能的功能端口关闭等。
(3)开始主程序进行程序扫描,先扫初始化字子程序初始化DS1302和LCD1602,启动时钟芯片进行计时,初始化1602的显示方式,将分配好的时分秒等数字调入到显示子程序中。
——>
显示子程序通过分配的空间对应口将DS1302时钟芯片的数据显示相应的时分秒,年月日等。
进入按键扫描,判断按键是否有变动,若有就根据设计程序对相应的按键按
入次数而进行实现相应的功能。
如进入时间调整,中断进入、退出等。
最后返回主程序头重新依次扫描。
显示过程设有消隐,按键通过软件去斗。
(4)、子程序部分。
在主程序的调用下依据不同的子程序工能而编写子程序,有多级嵌套。
这些子程序包括显示子程序、延时子程序、时间计数子程序、按键处理子程序、调时间子程序等。
3、各子程序功能
显示子程序:
将时钟芯片1302内的时钟数据送入单片机进行处理再送入LCD1602内进行显示,显示格式为:
年/月/日/时/分/秒/星期。
延时子程序:
该子程序是为了实现1302及1602在读写过程中的上升下降沿让芯片有足够的读写时间,以及字符有足够的显示时间,同时作为按键开关扫描去抖的延迟时间。
时间计数子程序:
该程序功能是调动DS1302的初始化程序、读写程序,并将其内部数据送入单片机内进行处理。
DS1302选择24小时工作方式,秒计数,走到59后进位分,后变00从新开始计时,分走到59后进位时,分从新开始00计时,时走到23,分走到59,秒走到59后进入从新日期周期计时。
按键处理子程序:
该程序进行按键处理的功能判断分别对时分秒、年月日等进行调整已经中断的进入与退出等。
4、程序
#include"
stm8s.h"
voiddelay(intn);
voidWrite_ds1302(charaddr,chardat);
intRead_ds1302(charaddr);
voidwrite_sfm(charadd,chardat);
voidlcd_wcom(charcom);
voidwrite_sfm1(charadd,chardat);
voidjia_key(charrd,charwd,charfd,charfen);
voidhjia_key(charrd,charwd,charfd,charshi);
voidrjia_key(charrd,charwd,charfd,charday);
voidyjia_key(charrd,charwd,charfd,charyue);
voidnjia_key(charrd,charwd,charfd,charnian);
charn1,n2,n3;
charu0,u1,u2,u3;
chartable[]={"
20--"
};
chartable1[]={"
:
"
chartable2[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
chartable3[]={"
MonTueWedThuFriSatSun"
chartable4[]={"
Happybirthday"
//16个字符
chartable5[]={"
<
toyou>
>
"
#defineuintunsignedint
#defineucharunsignedchar
#definePBPB_ODR
#defineWrite_second0X80//秒写寄存器地址
#defineWrite_minute0X82//分写寄存器地址
#defineWrite_hour0X84//时写寄存器地址
#defineWrite_day0X86//日写寄存器地址
#defineWrite_month0X88//月写寄存器地址
#defineWrite_week0X8A//周写寄存器地址
#defineWrite_year0X8C//年写寄存器地址
#defineWrite_protect0X8E//写保护字节写寄存器地址
#defineWrite_chongdian0x90//慢充电寄存器地址
#defineRead_second0X81//秒读寄存器地址
#defineRead_minute0X83//分读寄存器地址
#defineRead_hour0X85//时读寄存器地址
#defineRead_day0X87//日读寄存器地址
#defineRead_month0X89//月读寄存器地址
#defineRead_week0X8B//周读寄存器地址
#defineRead_year0X8D//年读寄存器地址
_BoolrsPC_ODR:
//pc作为lcd的控制端,设置为输入
_BoolrwPC_ODR:
_BoolenPC_ODR:
_BoolsclkPA_ODR:
_BooldioPA_ODR:
_BoolidPA_IDR:
_BoolcePA_ODR:
//复位
_Boolda_odPA_DDR:
_Boolda_CR1PA_CR1:
_Boolda_CR2PA_CR2:
_BoolID1PG_IDR:
//将Pd6引脚设置我外部中断的输入引脚
_BoolID2PD_IDR:
_BoolID3PG_IDR:
_BoolID4PD_IDR:
//键盘的输入//
intshfm_key(void)
{ucharlshi;
ucharan=0,n=0;
do
{
if(!
ID1)
delay(6);
while(!
ID1);
lshi=1;
an++;
if(an==1)
Write_ds1302(Write_second,0x80);
//先暂停时钟秒
u2=Read_ds1302(Read_second);
u2=((u2&
0x70)>
4)*10+(u2&
0x0F);
write_sfm(6,u2);
lcd_wcom(0x80+0x40+7);
lcd_wcom(0x38);
lcd_wcom(0x0f);
//显示功能开,有光标
}
if(an==2)
u1=Read_ds1302(Read_minute);
u1=((u1&
4)*10+(u1&
write_sfm(3,u1);
lcd_wcom(0x80+0x40+4);
//显示分
if(an==3)
u0=Read_ds1302(Read_hour);
u0=((u0&
4)*10+(u0&
write_sfm(0,u0);
lcd_wcom(0x80+0x40+1);
//显示时
if(an==4)
n3=Read_ds1302(Read_day);
n3=((n3&
4)*10+(n3&
write_sfm1(8,n3);
lcd_wcom(0x80+9);
//显示日
if(an==5)
n2=Read_ds1302(Read_month);
n2=((n2&
4)*10+(n2&
write_sfm1(5,n2);
lcd_wcom(0x80+6);
//显示月
}
if(an==6)
n1=Read_ds1302(Read_year);
n1=((n1&
4)*10+(n1&
write_sfm1(2,n1);
lcd_wcom(0x80+3);
//显示年
if(an==7)
lshi=0;
an=0;
Write_ds1302(Write_second,0x00);
//从新开启时钟
lcd_wcom(0x0c);
n=1;
}
switch(an)
case1:
if(ID2==0)
{delay(4);
{while(!
ID2);
asm("
NOP"
);
jia_key(Write_second,Read_second,6,1);
if(ID3==0)//秒的减
{delay(4);
if(ID3==0)
ID3);
jia_key(Write_second,Read_second,6,0);
break;
case2:
if(ID2==0)//分的加
delay(4);
{while(!
jia_key(Write_minute,Read_minute,3,1);
if(ID3==0)//分的减
jia_key(Write_minute,Read_minute,3,0);
case3:
if(ID2==0)//时的加
hjia_key(Write_hour,Read_hour,0,1);
if(ID3==0)//小时的减
hjia_key(Write_hour,Read_hour,0,0);
case4:
if(ID2==0)//日的加
rjia_key(Write_day,Read_day,8,1);
if(ID3==0)//日的减
rjia_key(Write_day,Read_day,8,0);
case5:
if(ID2==0)//月的加
yjia_key(Write_month,Read_month,5,1);
if(ID3==0)//月的减
{
yjia_key(Write_month,Read_month,5,0);
case6:
if(ID2==0)//年的加
njia_key(Write_year,Read_year,2,1);
if(ID3==0)//年的减
njia_key(Write_year,Read_year,2,0);
_asm("
}
while(lshi==1);
return(n);
voidWrite_ds1302(charaddr,chardat)
chari;
PC_DDR|=0xFF;
PC_CR1|=0xFF;
PC_CR2|=0X00;
ce=0;
//先复位
sclk=0;
//清零,保持io口的低电平,以待数据的写入
ce=1;
//置1,开始写数据
//发送地址
for(i=0;
i<
8;
i++)
dio=addr&
0x01;
//将一位bcd码的数据送给io口
addr=addr>
//右移一位
sclk=1;
//产生上升沿,发送数据
sclk=0;
//发送数据
for(i=0;
dio=dat&
//将一位bcd码的地址数据送给io口
dat=dat>
sclk=1;
/