单片机课程设计-基于51单片机的万年历.doc

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机课程设计报告 万年历的设计 姓 名: 施韧 学 号: 0915321028 班 级: 09自动化 指导教师:晏来成 基于51单片机的万年历 摘要: 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准功能AT89C52单片机,LCD显示电路,以及调时按键电路等组成。在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。 软件方面主要包括日历程序、时间调整程序,显示程序等。程序采用C语言编写。所有程序编写完成后,在KeilC51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 一、设计要求 基本要求: 1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”; 2,具有日历功能; ③ 时间可以通过按键调整。 发挥部分: ④ 具有闹钟功能(可以设定多个)。 二:总体设计 电路设计框图 系统硬件概述 本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由单片机定时功能提供;温度的采集由DS18B20构成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。测温范围 -55℃~+125℃,固有测温分辨率0.5℃ 液晶显示模块的设计 LCD1602有16个引脚,其中VCC、VSS分别为电源正负极;VO为液晶偏压信号输入端,图中W1可调节液晶明亮度; DB0—DB7 8位数据段;BLA、BLK背光源正负极; RS数据/命令选择端;R/W读写选择端;E使能端 温度采集模块设计 采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。 PCB图 三电子时钟的软件设计 系统软件按键检测流程图 系统软件定时器程序流程图 子程序的设计 DS18B20温度子程序 void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置 { uchar gw,sw,bw; if(dat=0dat=128) { gw=dat%10;//取得个位数字 sw=dat%100/10;//取得十位数字 bw=dat/100 ;//取得百位数字 } else { dat=256-dat; gw=dat%10;//取得个位数字 sw=dat%100/10;//取得十位数字 bw=-3; //0x30-3表示为负号 } write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+bw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write_1602dat(0x43); //显示C符号,0x43是液晶屏字符库里大写C的地址码 } 1602子程序 void write_byte(uchar dat)//写一个字节 { ACC=dat; RST=1; for(a=8;a0;a--) { IO=ACC0; SCLK=0; SCLK=1; ACC=ACC1; } } uchar read_byte()//读一个字节 { RST=1; for(a=8;a0;a--) { ACC7=IO; SCLK=1; SCLK=0; ACC=ACC1; } return (ACC); } //---------------------------------------- void write_1302(

文档评论(0)

文档分享 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档