

免费预览已结束,剩余17页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机课程论文基于ds12c887时钟芯片的多功能万年历设计 学生姓名 学 号 院 系 电子与信息工程学院专 业 电子信息工程指导教师 二一一年 六 月 十三 日基于ds12c887时钟芯片的多功能万年历设计 1、 设计目的(1)巩固单片机课程学习知识,熟悉单片机的开发流程。 (2)掌握硬件电路的设计、焊接以及调试的基本能力。(3)掌握单片机编程语言,学会运用模块化的设计思想。(4)培养动手实践能力, 具备设计、开发、应用单片机系统的能力。2、 系统功能(1)自动计时,显示年、月、日、时、分、秒、星期。(2)测试环境温度并显示(3)具备闰年闰月自动补偿功能(4)可设定每日的某一时刻闹钟(5)时间显示可调整3、 系统的结构和工作原理3.1 系统结构 此次课程设计的万年历,以at89s52单片机为主控核心,由lcd显示屏、ds12c887时钟芯片、温度传感器ds18b20、蜂鸣器、功能键盘、复位电路、晶振、电源模块等组成,系统结构框图如图1所示。图1 系统结构框图3.2 工作原理 主控制器每隔一段时间(小于一秒钟)读一次时钟芯片的内部寄存器的值,将读出的时间、星期、温度等值实时显示在lcd液晶屏上。同时,主控制器不断的扫描按键电路和温度测量电路,当有按键按下时,识别出按键的值并调整相应的时间、星期值再写入时钟芯片内部。温度数据由测量电路获得的环境温度值送人显示电路。4、 硬件设计4.1 主控核心at89s52单片机at89s52是一个低功耗,高性能cmos8位单片机,具有8k 在系统可编程flash 存储器。采用atmel公司的高密度、非易失性存储技术制造,兼容标准mcs-51指令系统及80c51引脚结构。4.2 ds12c887时钟电路ds12c887是美国dallas半导体公司推出的并行接口实时时钟日历芯片,采用cmos技术制成,具有内部晶振和时钟芯片备份锂电池,同时它与计算机常用的时钟芯片mc146818和ds12887管脚兼容,可直接替换。采用ds12c887芯片设计的时钟电路无需任何外围电路和器件,并且有良好的微机接口。ds12c887芯片内有微功耗,外围接口简单,精度高,工作稳定可靠等优点,广泛用于各种需要较高精度的实时时钟系统中。ds12c887主要功能如下:(1)内含一个锂电池,断电后运行十年以上不丢失数据;(2)计秒、分、时、天、星期、日、月、年、并有闰年补偿功能;(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与单片机的连接4.3 ds18b20温度传感器采用数字式温度传感器ds18b20,其仅需一条数据线进行数据传输,易于与单片机连接,可以去除a/d模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。ds18b20特性如下:(1) 独特的单线接口方式:ds18b20与微处理器连接时仅需要一条口线即可实现微处 理器与ds18b20的双向通讯。(2)在使用中不需要任何外围元件。(3)可用数据线供电,电压范围:+3.0+5.5v。(4)测温范围:-55+125。固有测温分辨率为0.5。(5)通过编程可实现912位的数字读数方式。(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 其它硬件电路蜂鸣器电路:为了实现闹钟功能,选择蜂鸣器作为闹铃。采用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才从0000h地址开始执行程序.本系统采用按键复位方式的复位电路。电源电路:电路采用5v电源进行供电,为了得到稳定的直流电源,通过电源处理电路进行调理,得到稳定电压。5、 软件设计本次系统设计软件部分采用模块化结构,由主程序ds12c887子程序、ds18b20子程序、lcd1602子程序构成。模块程序设计法的主要优点是:单个模块比起一个完整的程序易编写及调试;模块可以共存,一个模块可以被多个任务在不同条件下调用;模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。5.1 主程序说明及流程图主程序主要实现了从ds12c887各时间单元中读出数据和ds18b20传感器中读取数据,并送到lcd1602中显示的功能,同时检测有没有按键按下,如果有键被按下,则执行按键处理子程序。首先进行ds12c887时钟芯片、ds18b20芯片和lcd1602的初始化函数,然后进行按键扫描,不断地检测按键是否按下,读取ds12c887时钟芯片、ds18b20检测环境温度的数据,并且送到液晶显示器显示;当数据发生变化时候,重新进行扫描写入。主程序流程图如图6。图6 主程序流程图5.2 ds12c887流程图及初始化程序进入主程序后,ds12c887首先进行初始化设置,若串行口有数据,最后则调用函数从日历时钟芯片获取日历时钟信息,调用显示函数显示日历时钟信息显示出来,重复进行。这部分包括ds12c887某个单元写、读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 ds_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=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,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所示。开始 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;ds18b20=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;uchar 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);tmpwrite(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;tmpchange();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)指令,命令先将数据指针定位在第一行第一个字处,然后写入第一行要显示的数据,在每个字之间简短的延时;在第二行重新定位数据指针write_com(0x80+0x40),将数据指针定位在第二行,然后再将第二行所要显示的数据写入,继而显示。1602lcd的写命令操作和读数据操作分别用两个独立的函数来完成,函数内部唯一的区别就是液晶数据命令选择端的电平。1602lcd的流程图如图9所示。1602初始化 读取数据 第一行显示 读取数据 第二行显示 开始 结束 图9 1602lcd的流程图 1602lcd的子程序:#ifndef lcd_1602_h #define lcd_1602_h #include #define 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(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/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);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);break;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_spe(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焊接调试过程 在焊接之前,先要对构成系统的所有元器件总体布局,这方便后面的硬件电路的调试。 首先,按照上课时的要求,焊接单片机的最小系统,包括单片机底座部分、电源部分、下载口部分、晶振、复位部分以及一个发光二极管。电源部分:使用5v直流电源变压器的接口,插孔最后面的一个引脚为电源正极,其他两个引脚为接地。电源要经过一个可以锁定的开关,因为开关是六个引脚的,为了搞清哪两个引脚可以使用,分别在按下和松开的情况下,我用万用表测试了引脚之间的通断情况。后来经过检测找到其中一对引脚在按下通,松开时断,所以使用此两个引脚。因为整个电路图中有较多部分都要用到接地和接电源,所以为了方便焊接,将电源和地线分别连接至万用板的外围上。这样方便检查错误,接线时要规范,黑线表示接地,红线表示接电源。电源焊完之后,按下开关电源指示灯可以正常地发光。 单片机底座部分可以最先焊,把电源、地等连好,如ea要接低电平,否则就用片外存储器了。下载器接口则按照教材p240所画的图来进行连接,需要注意的是用于焊接的为短脚,不能颠倒。时钟部分比较简单,因为瓷片电容和晶振没有正负极,但要注意晶振、电容得靠近单片机底座。发光二极管(需要外加一个1k的电阻限流)接在p1.0口,作为最小系统的显示部分。 最小系统焊接完后,可以插上单片机,这里注意的是不能插反一定要注意方向。另外因为我用的是5v的变压器供电,所以下载时插上下载器时不会出现像usb供电时出现的倒流问题。连到计算机并口检测到器件后,把一个简单程序的hex文件写进单片机,发现可以正常运行,说明可以焊接其他单元了。 接下来焊接剩余的元器件,如ds12c887时钟芯片、ds18b20温度芯片、蜂鸣器、lcd等。主要是针对按照耐热性能的好坏来排列,与电子工艺的焊接要求基本相同。ds12c887时钟芯片是整个万年历的重要芯片模块。在焊接之前,我查阅了该芯片的相关资料,认真阅读了解各引脚的作用。同时看了该芯片引脚在实际应用中的连接情况。ds18b20温度传感器芯片,外形和三极管一样,只有3个引脚。在焊接的时候,尤其要注意1脚接地,三脚接电源。为了能够重复使用该芯片,我先焊了三脚底座,然后可以直接把芯片插上去。蜂鸣器焊接的时候,注意了正负极,通过9015和限流电阻后接到p1.6。四个功能按键是对角线连接,一端接单片机口,一端接地。边焊接边调试,直到所有部分都已经焊接完毕。6.2软件调试 硬件焊接完之后,我开始软件了调试。我运用keil软件进行软件程序的调试。我上网找了些程序,关于ds12c887时钟芯片、ds18b20芯片、lcd液晶的初始化程序,然后根据我硬件电路的实际焊接情况,把相应的定义端口改过来,然后阅读了每一部分的程序,之后一一编译,直至运行成功。我在51单片机论坛网上,找了些主程序,然后根据需要进行调试。由于我的万年历里包含测温,所以我找了关于ds18b20的主程序加进去。在编译过程中,出现了不少错误,我一边读程序,不懂的地方就查阅书本,了解整个主程序的内容,然后慢慢修改。编译成功之后,我把生成的hex文件通过下载器下载进单片机,“跑一跑”程序看看。没想到,液晶屏就没有显示。 出现了这些状况,我思考了下,决定根据硬件电路再检查一下电路板的焊接情况。我耐下心来使用数字万用表进行通过检查。在检查中,发现了一些漏焊、虚焊以及焊接错误短路情况。我一一排查过去,确保硬件部分不再出问题。下了程序进去,硬件不存在问题了,不过程序的运行还是有些偏差。 此后便是对程序进行认真地编写、调试、修改,经过多
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗科技助力精准医疗的突破与挑战
- 企业健康保险与医疗保险的结合管理
- 2025年互联网个人工作总结模版
- 医疗技术转移与商业化中的知识产权挑战与对策
- 医疗器械行业中的项目管理挑战与机遇
- 嘉善物业公司今冬明春火灾防控工作总结模版
- AI技术在商业决策分析中的应用价值
- 丝绸加工合同范例
- 公司电脑转让合同范例
- 仓库保洁合同范例
- 福建省厦门市2025届高中毕业班高三5月第四次质量检测物理试卷(厦门四检)
- 【2025二轮复习】读后续写专题
- 2025年国家民委直属事业单位招聘考试笔试试题(附答案)
- 运动健康产业的市场分析与前景
- 商品房门窗加工合同协议
- 药品知识产权保护
- (四调)武汉市2025届高中毕业生四月调研考试 物理试卷(含答案)
- 2025年济南市中区九年级中考数学一模考试试题(含答案)
- 大模型原理与技术-课件 chap6 大模型微调
- 数学建模与系统仿真智慧树知到期末考试答案2024年
- TSG11-2020 锅炉安全技术规程
评论
0/150
提交评论