欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    基于DS12C887时钟芯片的多功能万年历设计.doc

    • 资源ID:1031180       资源大小:138.81KB        全文页数:17页
    • 资源格式: DOC        下载积分:10积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要10积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于DS12C887时钟芯片的多功能万年历设计.doc

    1、基于DS12C887时钟芯片的多功能万年历设计 1、 设计目的(1)巩固单片机课程学习知识,熟悉单片机的开发流程。 (2)掌握硬件电路的设计、焊接以及调试的基本能力。(3)掌握单片机编程语言,学会运用模块化的设计思想。(4)培养动手实践能力, 具备设计、开发、应用单片机系统的能力。2、 系统功能(1)自动计时,显示年、月、日、时、分、秒、星期。(2)测试环境温度并显示(3)具备闰年闰月自动补偿功能(4)可设定每日的某一时刻闹钟(5)时间显示可调整3、 系统的结构和工作原理3.1 系统结构 此次课程设计的万年历,以AT89S52单片机为主控核心,由LCD显示屏、DS12C887时钟芯片、温度传感

    2、器DS18B20、蜂鸣器、功能键盘、复位电路、晶振、电源模块等组成,系统结构框图如图1所示。图1 系统结构框图3.2 工作原理 主控制器每隔一段时间(小于一秒钟)读一次时钟芯片的内部寄存器的值,将读出的时间、星期、温度等值实时显示在LCD液晶屏上。同时,主控制器不断的扫描按键电路和温度测量电路,当有按键按下时,识别出按键的值并调整相应的时间、星期值再写入时钟芯片内部。温度数据由测量电路获得的环境温度值送人显示电路。4、 硬件设计4.1 主控核心AT89S52单片机AT89S52是一个低功耗,高性能CMOS8位单片机,具有8K 在系统可编程Flash 存储器。采用ATMEL公司的高密度、非易失性

    3、存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。4.2 DS12C887时钟电路DS12C887是美国Dallas半导体公司推出的并行接口实时时钟日历芯片,采用CMOS技术制成,具有内部晶振和时钟芯片备份锂电池,同时它与计算机常用的时钟芯片MC146818和DS12887管脚兼容,可直接替换。采用DS12C887芯片设计的时钟电路无需任何外围电路和器件,并且有良好的微机接口。DS12C887芯片内有微功耗,外围接口简单,精度高,工作稳定可靠等优点,广泛用于各种需要较高精度的实时时钟系统中。DS12C887主要功能如下:(1)内含一个锂电池,断电后运行十年以上不丢失数据;(2)计

    4、秒、分、时、天、星期、日、月、年、并有闰年补偿功能;(3)二进制数码或BCD码表示时间,日历和定闹;(4)12小时或24小时制,12小时时钟模式带有PM和AM指示,有夏令时功能;(5)Motorola和Intel总线时序选择;(6)有128个字节RAM单元与软件接口,其中14个字节作为时钟和控制寄存器,114 字节为通用RAM,所有RAM单元数据都具有掉电保护功能;(7)可编程方波信号输出;(8)中断信号输出(IRQ)和总线兼容、定闹中断、周期性中断、时钟更新周期、结束 中断可分别由软件屏蔽,也可分别进行测试;DS12C887时钟芯片和单片机的硬件连接如下图2 :图2 DS12C887与单片机

    5、的连接4.3 DS18B20温度传感器采用数字式温度传感器DS18B20,其仅需一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。DS18B20特性如下:(1) 独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处 理器与DS18B20的双向通讯。(2)在使用中不需要任何外围元件。(3)可用数据线供电,电压范围:+3.0+5.5V。(4)测温范围:-55+125。固有测温分辨率为0.5。(5)通过编程可实现912位的数字读数方式。(6)用户可自设定非易失性的报警上下限值。(

    6、7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。 DS18B20芯片的连接如下图3所示:图3 DS18B20连接电路4.4 LCD1602显示屏本设计采用1602字符型LCD,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。 单片机的P2口与LCD的数据端口连接,用于数字信号的读取,控制端RS 、R/W分别与单片机的P3.3和P3.1相连。电路连接如图4所示。图4 1602LCD硬件电路4.5 其它硬件电路蜂鸣器电路:为了实现闹钟功

    7、能,选择蜂鸣器作为闹铃。采用PNP型9015三极管,发射极e脚连接+5V,基极b脚连接10K电阻后接到单片机P1.6口上,c脚连接蜂鸣器。电路如图5所示。图5 蜂鸣器电路功能键盘:本设计采用了4个键盘,分别实现万年历时间日期的调整键、闹钟设置键、增加键(也为闹钟开启键)、减小键组成,分别连接P1.0P1.3口。复位电路:89S52的复位输入引脚RST为其提供了初始化的手段,可以使程序从指定处开始执行,在MCS-52的时钟电路工作后,只要RST引脚上出现超过两个机器周期以上的高电平时,即可产生复位的操作.只要RST保持高电平,则MCS-52循环复位.只有当RST由高电平变低电平以后,MCS-52

    8、才从0000H地址开始执行程序.本系统采用按键复位方式的复位电路。电源电路:电路采用5V电源进行供电,为了得到稳定的直流电源,通过电源处理电路进行调理,得到稳定电压。5、 软件设计本次系统设计软件部分采用模块化结构,由主程序DS12C887子程序、DS18B20子程序、LCD1602子程序构成。模块程序设计法的主要优点是:单个模块比起一个完整的程序易编写及调试;模块可以共存,一个模块可以被多个任务在不同条件下调用;模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。5.1 主程序说明及流程图主程序主要实现了从DS12C887各时间单元中读出数据和DS18B20传感器中读取数据,并送到L

    9、CD1602中显示的功能,同时检测有没有按键按下,如果有键被按下,则执行按键处理子程序。首先进行DS12C887时钟芯片、DS18B20芯片和LCD1602的初始化函数,然后进行按键扫描,不断地检测按键是否按下,读取DS12C887时钟芯片、DS18B20检测环境温度的数据,并且送到液晶显示器显示;当数据发生变化时候,重新进行扫描写入。主程序流程图如图6。图6 主程序流程图5.2 DS12C887流程图及初始化程序进入主程序后,DS12C887首先进行初始化设置,若串行口有数据,最后则调用函数从日历时钟芯片获取日历时钟信息,调用显示函数显示日历时钟信息显示出来,重复进行。这部分包括DS12C8

    10、87某个单元写、读DS12C887某个单元的内容和DS12C887设定时间。DS12C887的流程图如图7所示。开始 DS12C887初始化 调用函数获取时钟信息 送数据显示 图7 DS12C887的流程图DS12C887的子程序:#ifndef DS12C887_H #define DS12C887_H #include#include#define uchar unsigned char#define uint unsigned intsbit fm=P14;sbit ds_as=P35;sbit ds_wr=P36;sbit ds_ds=P37;sbit ds_cs=P20;sbit d

    11、s_irq=P32;char second,minute,hour,asecond,aminute,ahour,day,week,month,year;void ds_write(uchar add,uchar date) /向DS12C887写数据的函数ds_cs=0;ds_as=1;ds_ds=1;ds_wr=1;P0=add;ds_as=0;ds_wr=0;P0=date;ds_wr=1;ds_as=1;ds_cs=1;uchar ds_read(uchar add) /从DS12C887读数据的函数uchar ds_date;ds_as=1;ds_ds=1;ds_wr=1;ds_cs=

    12、0;P0=add;ds_as=0;ds_ds=0;P0=0xff;ds_date=P0;ds_ds=1;ds_as=1;ds_cs=1;return ds_date;void settime() /设定时间初始值的函数第一次上电使用,之后可以屏蔽ds_write(0x0b,0x26); /设置24小时模式,数据二进制格式ds_write(0x0a,0x20); /打开振荡器ds_write(0,55);ds_write(1,0);ds_write(2,59);ds_write(3,0);ds_write(4,23);ds_write(5,0);ds_write(6,5);ds_write(7,

    13、1);ds_write(8,1);ds_write(9,9);void setalarm() /将设定的闹钟时间写进DS12C887的函数ds_write(1,asecond);ds_write(3,aminute);ds_write(5,ahour); void beep() /闹钟的声音函数 fm=0;delay(100);fm=1;delay(20);fm=0;delay(100);fm=1;#endif5.3 DS18B20流程图及初始化程序 进入主程序后,DS18B20首先进行初始化设置,然后通过对环境温度的检测,调用显示函数显示温度信息,重复进行。DS18B20的流程图如图8所示。

    14、开始 DS18B20初始化 检测环境温度获取信息 送数据显示 图8 DS18B20的流程图 DS18B20的子程序:#ifndef DS18B20_H#define DS18B20_H#include#include#define uchar unsigned char#define uint unsigned intsbit ds18b20=P16;uchar flag2/*零下标志位*/;void delay1(uint z) /DS18B20 延时函数uint i;while(z)i=200;while(i0)i-;z-;void dsreset() /发送复位和初始化uint i;ds

    15、18b20=0;i=103;while(i0)i-;ds18b20=1;i=4;while(i0)i-;bit tmpread_bit() /读取数据的一位uint i;bit dat;ds18b20=0;i+;ds18b20=1;i+;i+;dat=ds18b20;i=8;while(i0)i-;return dat;uchar tmpread_byte() /读一个字节uchar i,j,dat;dat=0;for(i=1;i=8;i+)j=tmpread_bit();dat=(j1);return dat;void tmpwrite(uchar dat) /写一个字节uint i;uch

    16、ar j;bit testb;for(j=1;j1;if(testb) /写“1”ds18b20=0;i+;i+;ds18b20=1;i=8;while(i0)i-;else /写“0”ds18b20=0;i=8;while(i0)i-;ds18b20=1;i+;i+;void tmpchange() /DS18B20开始转换dsreset();delay1(1);tmpwrite(0xcc);tmpwrite(0x44);uint read_tmp() /读取温度uchar a,b;uint t;float tt;dsreset();delay1(1);tmpwrite(0xcc);tmpw

    17、rite(0xbe);a=tmpread_byte();b=tmpread_byte();t=b;t=8;t=t|a;if(t0x0fff)flag2=0;elseflag2=1;t=-t;tt=t*0.0625;t=tt*10+0.5;return t;/*void rom() /读取期间序列号子程序/uchar i;uchar sn1,sn2;dsreset();delay1(1);tmpwrite(0x33);sn1=tmpread2();sn2=tmpread2();*/void display_tem() /显示温度的函数uchar a,b,c,flagdate;uint d;tmp

    18、change();delay1(200);d=read_tmp();a=d/100;b=d%100/10;c=d%10;if(flag2=0)flagdate=0x20;elseflagdate=0x2d;write_spe(9,flagdate);write_tem(10,a);write_tem(11,b);write_spe(12,46);write_tem(13,c);write_spe(14,223);write_spe(15,C);#endif5.4 LCD1602流程图及初始化程序进入主函数后,执行完1602LCD的初始化函数,然后用write_com(0x80)指令,命令先将数

    19、据指针定位在第一行第一个字处,然后写入第一行要显示的数据,在每个字之间简短的延时;在第二行重新定位数据指针write_com(0x80+0x40),将数据指针定位在第二行,然后再将第二行所要显示的数据写入,继而显示。1602LCD的写命令操作和读数据操作分别用两个独立的函数来完成,函数内部唯一的区别就是液晶数据命令选择端的电平。1602LCD的流程图如图9所示。1602初始化 读取数据 第一行显示 读取数据 第二行显示 开始 结束 图9 1602LCD的流程图 1602LCD的子程序:#ifndef LCD_1602_H #define LCD_1602_H #include #define

    20、uint unsigned int#define uchar unsigned char/Port Definitions*sbit rs= P33;sbit lcden = P30;/P1=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口void delay(uchar z) /时延函数 1msuchar x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com)/向液晶写指令rs=0;lcden=0;P2=com;delay(5);lcden=1;delay(5);lcden=0;void write_date

    21、(uchar date) /向液晶写数据rs=1;lcden=0;P2=date;delay(5);lcden=1;delay(5);lcden=0;void write_time(uchar address,uchar date)/写时分秒的函数uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+address);write_date(0x30+shi);write_date(0x30+ge);void write_cal(uchar address,uchar date) /写年月日的函数uchar shi,ge;shi=date

    22、/10;ge=date%10;write_com(0x80+address);write_date(0x30+shi);write_date(0x30+ge);void write_week(char we)/写液晶星期显示函数write_com(0x80+11);switch(we)case 1:write_date(M);delay(5);write_date(o);delay(5);write_date(n);write_com(0x80+11);break;case 2:write_date(T);delay(5);write_date(u);delay(5);write_date(e

    23、);write_com(0x80+11);break;case 3:write_date(W);delay(5);write_date(e);delay(5);write_date(d);write_com(0x80+11);break;case 4:write_date(T);delay(5);write_date(h);delay(5);write_date(u);write_com(0x80+11);break;case 5:write_date(F);delay(5);write_date(r);delay(5);write_date(i);write_com(0x80+11);bre

    24、ak;case 6:write_date(S);delay(5);write_date(a);delay(5);write_date(t);write_com(0x80+11);break;case 7:write_date(S);delay(5);write_date(u);delay(5);write_date(n);write_com(0x80+11);break;void write_tem(uchar address,uchar date)/写温度的值的函数write_com(0x80+0x40+address);write_date(0x30+date);void write_sp

    25、e(uchar address,uchar date) /写特殊符号的函数 单位write_com(0x80+0x40+address);write_date(date);void write_ala(uchar address,uchar date) /写闹钟的开关write_com(0x80+address);write_date(date);#endif6、 电路调试6.1焊接调试过程 在焊接之前,先要对构成系统的所有元器件总体布局,这方便后面的硬件电路的调试。 首先,按照上课时的要求,焊接单片机的最小系统,包括单片机底座部分、电源部分、下载口部分、晶振、复位部分以及一个发光二极管。电源

    26、部分:使用5V直流电源变压器的接口,插孔最后面的一个引脚为电源正极,其他两个引脚为接地。电源要经过一个可以锁定的开关,因为开关是六个引脚的,为了搞清哪两个引脚可以使用,分别在按下和松开的情况下,我用万用表测试了引脚之间的通断情况。后来经过检测找到其中一对引脚在按下通,松开时断,所以使用此两个引脚。因为整个电路图中有较多部分都要用到接地和接电源,所以为了方便焊接,将电源和地线分别连接至万用板的外围上。这样方便检查错误,接线时要规范,黑线表示接地,红线表示接电源。电源焊完之后,按下开关电源指示灯可以正常地发光。 单片机底座部分可以最先焊,把电源、地等连好,如EA要接低电平,否则就用片外存储器了。下

    27、载器接口则按照教材P240所画的图来进行连接,需要注意的是用于焊接的为短脚,不能颠倒。时钟部分比较简单,因为瓷片电容和晶振没有正负极,但要注意晶振、电容得靠近单片机底座。发光二极管(需要外加一个1K的电阻限流)接在p1.0口,作为最小系统的显示部分。 最小系统焊接完后,可以插上单片机,这里注意的是不能插反一定要注意方向。另外因为我用的是5V的变压器供电,所以下载时插上下载器时不会出现像USB供电时出现的倒流问题。连到计算机并口检测到器件后,把一个简单程序的HEX文件写进单片机,发现可以正常运行,说明可以焊接其他单元了。 接下来焊接剩余的元器件,如DS12C887时钟芯片、DS18B20温度芯片

    28、、蜂鸣器、LCD等。主要是针对按照耐热性能的好坏来排列,与电子工艺的焊接要求基本相同。DS12C887时钟芯片是整个万年历的重要芯片模块。在焊接之前,我查阅了该芯片的相关资料,认真阅读了解各引脚的作用。同时看了该芯片引脚在实际应用中的连接情况。DS18B20温度传感器芯片,外形和三极管一样,只有3个引脚。在焊接的时候,尤其要注意1脚接地,三脚接电源。为了能够重复使用该芯片,我先焊了三脚底座,然后可以直接把芯片插上去。蜂鸣器焊接的时候,注意了正负极,通过9015和限流电阻后接到P1.6。四个功能按键是对角线连接,一端接单片机口,一端接地。边焊接边调试,直到所有部分都已经焊接完毕。6.2软件调试

    29、硬件焊接完之后,我开始软件了调试。我运用keil软件进行软件程序的调试。我上网找了些程序,关于DS12C887时钟芯片、DS18B20芯片、LCD液晶的初始化程序,然后根据我硬件电路的实际焊接情况,把相应的定义端口改过来,然后阅读了每一部分的程序,之后一一编译,直至运行成功。我在51单片机论坛网上,找了些主程序,然后根据需要进行调试。由于我的万年历里包含测温,所以我找了关于DS18B20的主程序加进去。在编译过程中,出现了不少错误,我一边读程序,不懂的地方就查阅书本,了解整个主程序的内容,然后慢慢修改。编译成功之后,我把生成的HEX文件通过下载器下载进单片机,“跑一跑”程序看看。没想到,液晶屏

    30、就没有显示。 出现了这些状况,我思考了下,决定根据硬件电路再检查一下电路板的焊接情况。我耐下心来使用数字万用表进行通过检查。在检查中,发现了一些漏焊、虚焊以及焊接错误短路情况。我一一排查过去,确保硬件部分不再出问题。下了程序进去,硬件不存在问题了,不过程序的运行还是有些偏差。 此后便是对程序进行认真地编写、调试、修改,经过多次的努力,运行的情况比较顺利。 最后把认真修改的程序经过编译成HEX文件后,写入单片机,系统能够正常运行,所有功能正常实现。7总结部分利用89S52单片机设计万年历不是一件简单的事情。从构思设计内容,到流程图设计、程序设计,到自己去购买元器件、焊接、调试,再修改程序,这个过

    31、程确实也学到了很多东西。自己设计了整个系统,单片机中的基本概念也都理清了。在学单片机的过程中,也时常看微机原理,感觉也是很有帮助的,毕竟很多东西都是相通的。在做设计之前也做了很多准备的工作,比如了解扫描按键、显示、延时这些常用的子程序,这对我后面编写程序有了很大的帮助。这次设计用到了单片机的输入/输出功能、定时/计数功能和中断功能,这次的课程设计使得我对前面讲的单片机零散的知识点串起来了,是对基本功能知识的一次复习、总结和提高。在这次实践的过程中,主要的总结与体会有一下几个方面: 程序的模块化设计思想在程序编写过程中,用模块化设计与分析,可以达到事半功倍的效果。在主流程确定的情况下将比较复杂的

    32、大程序分解若干个功能模块,然后再综合,就显得比较清晰。这就好比是有一个粗线条、总轮廓再到最小的子程序单元。另外,有很多程序模块非常典型,所以保存好这些模块也有利于以后再次的使用。 做成一个实际的系统需要有良好的步骤先画原理图,再列清单,再焊最小单元,然后调试,焊接调试多次交替进行。在焊接的时候,也是有基本的步骤,先电源,然后是单片机底座、晶振、下载接口等等。 对单片机的存储单元有了更深刻的了解。因为要对程序初始化定义,所以必须对片内的数据存储器有了解。片内存储区的20K-2FH为位寻址区,设置位标志位的话可设于此处,30H-7FH为用户RAM区(堆栈、数据缓冲去),变量一般设在这里。特殊功能SFR的单元为80H-FFH,含有各种如输入输出、中断、串口、计时/倒数等功能,都与SFR有关。 设计制作一个单片机系统,最重要的还是软件程序。写程序首先要确定一些常数、地址,其实当某器件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确定了。然后用文本编辑器编写软件,之后用编译器对源程序文件编译、查错,直到无语法错误,修改直到程序运行正确。然后可以写片(将程序固化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,用编程器将此文件调入即可写片。附录1、 硬件原理图


    注意事项

    本文(基于DS12C887时钟芯片的多功能万年历设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922