单片机实训报告基于51单片机的数字万年历设计.docx
《单片机实训报告基于51单片机的数字万年历设计.docx》由会员分享,可在线阅读,更多相关《单片机实训报告基于51单片机的数字万年历设计.docx(12页珍藏版)》请在冰豆网上搜索。
单片机实训报告基于51单片机的数字万年历设计
《单片机应用实训》
课程设计报告
姓名:
班级:
指导老师:
实习时间:
基于51单片机的数字万年历设计
摘要:
利用单片机、DS1302芯片、DS18B20芯片搭建一个数字万年历模块,编写程序,实现了年、月、日、时、分、秒计数,温度测量、时钟报警等功能。
关键词:
STC89C51数字时钟
一、实训目的
电子时间显示器现在在任何地方都有涉及到,例如电子表和商场的时间显示等等,所以它是一种既方便又实用的技术,而我们所做的万年历则是在它的基础上做出来的,通过万年历的制作,我们可以进一步了解计数器的使用,了解各个进制之间的转换,以及其他的任意进制计数器的构成方法等,并且进一步了解DS1302芯片、DS18B20芯片的使用等。
二、总体设计方案
根据项目任务,该系统采用STC89C51为控制核心,以电子大赛开发板为实验平台,利用各种芯片实现相应功能,
三、硬件设计
1、单片机最小系统
STC89C52为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接晶振电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻及开关后够成上电复位电路,20引脚为接地端,40引脚为电源端。
时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个22pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处使单片机工作于内部振荡模式。
此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。
时钟振荡电路如下图所示。
复位电路由电阻和极性电容组成,如下图所示,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。
此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机、死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。
手动按钮复位需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源VCC之间接一个按钮以及在RST端和地之间接一个电阻,如图所示,当人为按下按钮时,则VCC的+5V电平就会直接加到RST端,由于人的动作再快也会使按钮保持接通达数十毫秒,所以完全能够满足复位的时间要求。
元件列表:
22pf瓷片电容2个
12mhz晶振1个
复位开关1个
22uf电解电容1个
1k电阻一个
2时钟模块
时钟功能由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、时、分、秒进行计时,且具有闰年补偿等多种功能,工作电压2.2-2.5V。
采用三线接口与cpu进行同步通信,并可采用突发方式以此传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。
可产生年、月、日、时、分、秒,具有使用寿命车长,精度高和功耗低等特点,同时具有掉电自动保存功能。
3显示模块
显示部分由1602液晶显示器构成。
液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。
该设计中采用此显示器分两行显示年、月、日、时、分、秒、温度信息等。
显示。
3脚用于调节LCD1602的背光,4、5、6为LCD1602的控制口,用于控制其写入或是读出指令,7至14脚为LCD1602的数据口,将数传送到LCD1602中。
4按键模块
按键模块采用普通触发式按键。
按键电路由4个轻触开关组成。
按键用来调整时间,其一端直接接到单片机的端口,另一端接地,当按下按键时,相应的端口变为低电平,通过检测这一低电平就可以判断是哪个键按下,从而作相应的操作。
5温度模块
温度的采集由DS18B20构成。
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢,封装式。
主要根据应用场合的不同而改变其外观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
6电源模块
由于整个电路工作在开发板上,所以设计采用usb供电,简单方便。
整个电路采用5V直流电压,在DS1302时钟芯片上还另外加上了3V的电压,采用双供电可以使时钟芯片工作更稳定。
下面是硬件电路的PCB设计图,这是我们第一次画的PCB图,由于和硬件开发板不兼容,所以不得不改进设计图。
在此得到教育:
软件的设计依托于硬件而存在,就像灵魂的火花依托于肉体而存在一样,两者缺一不可,所以在以后的电路设计中,一定要考虑好硬件的准备。
改进后的PCB图其实只是把一些元件的接口调了一下位置,去掉了一些不需要的元件。
7硬件的整体设计思想
采用16X2的lcd来显示年、月、日、星期、小时、分钟、秒、温度,并且可以任意设定时间。
系统设定详细说明。
系统的初始状态为显示时钟状态,显示此时的年、月、日、星期、小时、分钟、秒、温度。
初始状态下,按SM键进入时间调整模式,这时秒位闪烁,系统进入秒调整状态;按下“加1”或“减1”键来修改秒;按下“设置/添加”键系统进入分调整状态,按下“加1”或“减1”来修改分;按“设置/添加”键进入“年、月、日、星期、小时、分、秒、闹钟”调整等。
按OUT键立刻跳出调整模式。
系统电路如图所示,单片机由p2端口输入指令,通过p0端口输出显示信息,外接温度传感器和显示控制芯片,省去了用数码管显示器的一些繁琐步骤。
四、软件设计
主程序首先初始化定时器、LCD1602及DS1302,然后就开始查询按键,有键按下则开始调整时间和设置闹钟,若没有按下,则执行下面的时间、日期及闹钟时间的显示,最后依次循环这些相同的操作,相应流程图如下图所示
开始
系统初始化
正常工作
模式?
正常走时
闹钟控制
校正时间
首先,默认显示器由DS1302芯片控制,程序初始化之后,在主程序中首先调用数据处理程序,然后再调用显示程序,再判断是否有按键按下,若有按键按下则转到相应的功能程序执行,若没有按键按下则调用闹钟程序以判断是否到了闹钟时间,若没有到则循环执行,调时程序用于调整“年、月、日、星期、小时、分钟、秒、闹钟”;闹钟程序首先判断闹钟时间是否来到,若到了则进入闹钟的循环程序,此时的系统等待手动解除闹钟,若没闹钟时间则退出到主程序循环。
时间设定程序流程图
DS1302初始化
开始
从DS1302中读出数据
调用显示子程序
LCD模块显示时间
mo
时间设置
数据写回DS1302保存
返回主显单
在主程序中包含了以下几种模块:
1显示模块
一些基层程序已经由DS1302芯片提供,本设计中只要负责把DS1302芯片中的数据经过转换从LCD中显示出来即可。
2按键模块
触发式按键相当于一小段脉冲,每按下一次便有一小段脉冲传输到单片机中,按键另一端接地,故采用低电压脉冲,当单片机接收到来自按键接口的低电压脉冲时,便会做出相应指令。
3温度模块
温度测量模块中,数据采集工具采用DS18B20,采集的实时数据经过单片机处理后会通过显示器显示出来。
4闹钟模块
闹钟模块中,加入了一个蜂鸣器,当闹钟时间到后,单片机会通过此接口给蜂鸣器一个电压,使其导通,
五、仿真及调试结果
在调试中出现了很多问题,第一次是proteus仿真一直不能打开,后来找到原因,是因为联调步骤有错误,重新联调之后就能仿真了,但是在仿真中又发现可以仿真,但是显示器没有显示东西,经过分析发现是程序和电路不符合的原因,改过程序之后第三次运行,发现还是有问题,就是不显示温度,只有时间显示,温度显示处是空白的,后来仔细研究发现是LCD的问题,换了一个还是不行,最后还是修改了一下程序就好了。
最后的硬件调试中还是出现了很多问题,比如显示器不亮、蜂鸣器一直响等。
分析原因:
1、可能是程序错误;2、可能是板子上的电路老化出现问题;3、可能是单片机出现了问题;4、可能是电路图和实际的开发板图不一样;5、可能是显示器或蜂鸣器有问题。
经过一一排查,最后终于成功,下面是照片
六、实训体会
xx:
几天的实训终于落下帷幕了,但通过这次实训,也遇到了许多问题。
本次实训主要是数字钟的显示,虽然成功了,但由于自身的能力问题,并没有实现闹钟和报警的功能,暴露出我们对C语言的掌握还有一定的欠缺。
由于对protel掌握的还不熟练,经常出错,有的元件也找不到,所以画原理图的时候耽误了点儿时间。
开始的时候虽然有一个明确的方向,但也是屡屡碰壁。
实验被分为显示模块、时钟模块、温度模块和按键模块,但在给这些模块搭配合适的程序的时候,遇到了麻烦,不得不到处查资料,但还是碰到了麻烦。
如果不是指导老师给出了一个参考模板,其实就是完整的程序,我们估计得天天呆在机房了。
所以这次实训只是勉强的通过了。
但通过这次实训,锻炼了设计、制作和调试应用系统的能力,深入领会了单片机应用系统的软、硬件调试方法和系统的研制开发。
xx:
通过这次实训,我认识到了自己在单片机设计方面的很多不足,首先,是关于protel关于软件的使用中元件名称不够熟悉,对keil和proteus联调不够熟悉,对单片机程序的编写掌握的知识太少,缺乏一些实际单片机项目的练习,我们应该在以后的学习中,重点培养自己对实际项目的设计能力,和面对对象的分析能力。
面对一个问题,要有自己的主见,要有自己的方法,要学会自己独立编写程序,设计电路,解决问题。
我们对基础知识的掌握不够牢固,C语言的基础知识不够好,所以,在以后的学习生活中,我要努力学习基础知识,只有基础知识掌握牢固,才能在新的问题中,发挥自己的创造力,才能解决困难。
在这次实训中我对单片机的理论知识有了进一步的掌握,对单片机的原理和实际应用有了更多地理解和掌握。
我对单片机的C语言编程有了更深刻的认识,通过不断修改,不断尝试,对程序各个模块的函数都有了一个非常深入的掌握。
在收获知识的同时,还培养了独立思考、动手制作的能力,在各种其它能力上也都有了提高。
更重要的是,在课程设计里,我学会了很多学习的方法,而这是以后最实用的,真的是受益匪浅。
xx:
通过这次实训,我更清楚地看到了自己的能力,还需要很大的提高。
尤其是在C语言方面,还需要进一步的学习和了解。
当我们完成了时间和温度的显示仿真后,想在原来的基础上增加闹钟功能,程序成了我们最大的绊脚石,对我们来说有一定的难度,而且参考资料也不好找。
画图进行的还算比较顺利,Proteus图还算简单,器件也好找,pcb图和原理图有的没有相对应的器件,还需要手动,麻烦一点儿,但最终也画出来了,耽误了点儿时间。
遇到问题,机动性不是很好,还缺乏一定的主见,所以在今后的学习中,要锻炼自主解决问题的能力,要有自己的主见,提高综合素质。
努力学习专业知识,增长课外知识,在困难面前挑战自己,增长自己的能力,才是唯一的出路。
参考文献
1皮大能,《单片机课程设计指导》,北京理工大学出版社
2王静霞,《单片机应用技术》,电子工业出版社