1、 课 程 设 计 说 明 书 课程名称: 《单片机技术》 设计题目: 基于单片机的万年历设计 院 (部): 电子信息与电气工程学院 学生姓名: 学 号: 专业班级: 电子信息工程 指导教师:
2、 2013年 5月 21日 课 程 设 计 任 务 书 设计题目 基于单片机的万年历设计 学生姓名 所在院部 电子信息与电气工程学院 专业、年级、班 电子信息工程 设计要求: 1、设计制作一个用LCD1602显示的带温度显示的万年历; 2、具有年、月、日、星期、时、分、秒、温度等显示功能; 3、具备年、月、日、星期、时、分、秒校准功能; 4、具有闹钟显示、调节设定、整点鸣叫功能。 学生应完成的工作: 设计一个万年历系统,四个人一组,自由组合,组长分配各自任务。首先应
3、该搜集相关资料拟定硬件方案,完成硬件电路的的设计,其次编写相应程序,然后在Proteus软件上仿真直到达到设计要求,然后用Altium Designer绘制原理图,最后根据设计原理图进行系统的安装调试,完成课程设计工作,并提交课程设计报告。该生主要负责系统的制作与调试。 参考文献阅读: [1]童诗白.模拟电子技术基础[M].北京:高等教育出版社,2005. [2]阎 石.数字电子技术(第五版)[M].北京:高等教育出版社,2005. [3]张毅刚,彭喜元,彭宇.单片机原理及应用[M].北京:高等教育出版社,2010. [4]周灵彬,任开杰.基于Proteus的电路与PCB设计[M
4、].北京:电子工业出版社,2010. [5]穆秀春,冯新宇,王宇.Altium Designer原理图与PCB设计[M].北京:电子工业出版社,2011. 工作计划: 5月6号:搜集资料;5月7号:方案论证并拟定硬件方案;5月8号:讨论优化并确定硬件方案;5月9号—10号:讨论确定程序流程并绘制流程图; 5月13号:根据流程图编写程序并且进行软件的仿真与调试;5月14号—15号:系统的制作并撰写课程设计报告;5月16号:烧录程序并调试; 5月17号:完成课程设计报告的撰写。 任务下达日期:2013 年 5 月 6 日 任务完成日期:2013 年 5 月17 日
5、 指导教师(签名): 学生(签名): 万 年 历 摘 要:以AT89S52为主控芯片设计了一个带温度显示的万年历系统,该系统具有年、月、日、星期、时、分、秒、闹钟显示和调整,并且还能显示温度和按键提示音、整点鸣叫、定时闹钟鸣叫等功能。其中显示部分采用LCD1602显示,时钟部分采用DS1302时钟芯片,温度部分采用DS18B20单线温度传感器。报时鸣叫采用有源蜂鸣器并用三极管驱动。软件方面采用C语言编程,利用Keil uVision4软件编写C语言程序并且生成HEX文件。先将程序通过Proteus软件仿
6、真,通过之后再烧录到单片机中。该设计的优点是充分利用了LCD1602的显示功能完成了万年历应该具有的功能并且还扩展了温度和闹钟。不足之处是受到LCD1602显示功能的限制没能显示农历日期和汉字,而且报时部分只是发出滴滴声而不是语音报时。 关键词: 万年历;AT89S52;LCD1602;温度传感器;时钟芯片;按键
7、 目 录 1.设计背景 ……………………………………………………………………1 1.1时钟的用途及精度的需求…………………………………………1 1.2万年历的使用现状及设计目的………………………………………1 2.设计方案……………………………………………………………………2 2.1任务分析…………………………………
8、……………………………2 2.2方案选择和论证 ………………………………………………………2 3. 方案实施 …………………………………………………………………6 3.1原理图设计 ……………………………………………………………6 3.2万用板焊接的步骤、注意事项及技巧…………………………………11 3.3系统的制作与调试 ………………………………………………14 4.结果与结论………………………………………………………………16 5.收获与致谢………………………………………………………………17 6.参考文献…………………………………………………………………18 7
9、附件 ………………………………………………………………………19 7.1电路原理图……………………………………………………………19 7.2 Proteus仿真图………………………………………………………20 7.3电路工作中实物图……………………………………………………21 7.4元器件清单……………………………………………………………23 7.5源程序清单 …………………………………………………………24 1.设计背景 1.1时钟的用途及精度的需求 时间,对人们来说是非常宝贵的,准确的掌握时间和分
10、配时间对人们来说至关重要。随着时间的流逝,科学技术的不断发展和提高,人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好、更方便、更精确的显示时间,这就要求人们不断设计研发出新型的时钟。 高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校。数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。 1.2万年历的使用现状及设计目的 如今万年历已经在人们生活中广泛的使用
11、它不仅是记录日期和时间的工具,而且也成为了一种装饰品。现在的万年历可以说是多种多样,外观精美。放在家里既可以计时也可作为风景壁画,因此越来越受到大众消费者的喜爱。 本次课程设计通过利用AT89S52单片机和DS1302芯片以及外围的按键和LCD显示器等部件,设计一个基于单片机的万年历。设计的万年历通过液晶显示器显示,并能通过按键对时间以及闹钟进行设置。目的来模拟真实产品中万年历的工作原理,具有很强的实用性和现实意义。 2.设计方案 2.1任务分析 目的是设计一个带温度显示的万年历系统,该系统具有年、月、日、星期、时、分、秒、闹钟显示和调整功能,并且还能显示温度
12、和按键鸣叫、整点鸣叫、定时闹钟鸣叫等功能。软件方面采用C语言编程,利用Keil uVision4软件编写C语言程序并且生成HEX文件。先将程序在Proteus仿真,通过之后再烧录到单片机中。最后系统制作并调试,完成课程设计报告并提交。 2.2方案选择和论证 2.2.1 显示模块选择方案和论证 方案一: 采用点阵式数码管显示。点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且难度也相对较高,所以不用此种作为显示。 方案二: 采用LED数码管动态扫描。LED数码管价格便宜,对于显示数字最合适,但功耗较大,且显示容量不够,所以也不用此
13、种方案。 方案三: 采用LCD液晶显示屏。液晶显示屏的显示功能强大,可显示大量文字,显示多样,清晰可见,且价格适中,所以采用了LCD液晶作为显示。 2.2.2 时钟模块的方案选择和论证 方案一: 直接采用单片机定时计数器提供秒信号,使用程序算法实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。软件算法复杂不易实现,所以不采用此方案。 方案二: DS12C887 实时时钟芯片功能丰富, 能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887 中
14、自带有锂电池,外部掉电时,其内部时间信息还能够保持10 年之久;DS12C887 中带有128 字节RAM,其中有11 字节RAM用来存储时间信息,4 字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113 字节通用RAM 使用户使用;但是它是采用的并行操作占用IO口的数量过多。而且价格昂贵。 方案三: 采用DS1302时钟芯片实现时钟,减小了单片机的负担。DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.成本较低且占用IO口较少,综合考虑所以采
15、用这种方案。 2.2.3 按键控制模块的方案选择和论证 方案一: 直接加减:使用7按键,1按键切换闹钟,6按键对时分秒分别加减,控制方式相当简单,但需要较多按键与I/O口,功能一般,成本较高。 方案二: 矩阵键盘:使用16按键对时分秒直接设置,能最为灵活的对数字钟进行设置,功能强大,但控制方式相对困难,成本较高,需要较多按键与I/O口。 方案三: 换位调整:使用4按键,1键设置闹钟,1键设置调整时间,1键调整,1键确定,此种控制方式采用按键复用方法,占用I/O口少,成本低廉,但功能完全满足设计要求。 经过反复比较,在3种方案中选取了第3种—换位调整,此方
16、案成本低,功能已经足够满足数字钟的需要,而且硬件软件均比较简单。 2.2.4 温度采集模块方案选择 DS18B20数字温度传感器接线方便,独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。因此DS18B20完全满足设计要求。 AT89S52 2.2.5 方案的整体框图
17、 DS1302 电源模块 DS18B20 复位电路 LCD1602 时钟电路 蜂 鸣 器 按 键 图1 整体方框图 2.2.6设计流程图程序部分小组的拟定方案 开始 相关引脚的特殊位定义 相关数字及字母数组设置 完成与DS18B20,LCD1602,DS1302相关的子函数的编程 完成与DS18B20,LCD160
18、2,DS1302相关的初始化设置 CPU读取DS18B20 ,DS1302的温度和时间数据 CPU将数据送至LCD1602显示 是否有时间校准按键按下? Y N 重新设置时间按键按下? Y 返回 图2
19、设计流程图 3.方案实施 3.1原理图设计 3.1.1原理图设计及工作原理分析 图3 整体原理图 我们首先构成单片机的最小系统,使单片机能正常工作,在程序中首先对LCD1602、DS1302、DS18B20进行初始化,由CPU完成对DS1302产生的各种时钟数据的读取,然后将数据写至LCD1602,以显示数据,达到可视化的效果。对于课程设计的拓展部分,我们可以利用DS18B20温度传感器来测试周围环境的温度,由CPU完成对数据的读取,然后通过CPU将数据写至LCD1602,以显示温度数据,达到可视化的效果。通过键盘扫描子程序通过测试按键是否闭合来调整各种时间数据和闹钟已达
20、到校准和定时的目的。在按键的同时调用蜂鸣器程序,驱动蜂鸣器响来作为按键提示音,另外我们还扩展了整点报时提示音和闹钟提示音等。 3.1.2电源电路 我们采用了USB和变压器双电源供电: 图4 变压器供电电路 变压器输出的9V交流电经桥堆2W10后变成有较大波动的的直流电,然后经过滤波电容和微调电容后变成直流电,再经过L7805三端稳压器输出5V直流电。7805输出端的电容起到了防干扰和微调作用。 图5 USB供电电路 3.1.3单片机最小系统 单片机采用了上电自动复位和按键复位的双复位,利用12MHZ晶振作为单片机的外部晶振来驱动单片机工作。其中
21、两个33pf的电容用于晶振的启动。由于单片机的P0口是准双向IO口,所以需要排阻RP1作为该口的上拉电阻。 图6 单片机系统 3.1.4蜂鸣器及驱动电路 我们采用的有源蜂鸣器,由于单片机的输出电流较小所以我们采用PNP形的三极管作为驱动电路,来驱动蜂鸣器发声,当单片机给低电平时蜂鸣器响。 图7 蜂鸣器电路 3.1.5时钟芯片DS1302电路 时钟芯片采用双电源,当系统断电之后由3V的电源—电池供电。保证了系统断电之后时钟继续工作,当系统再次上电之后时钟能显示正确的时间和日期。 图8 时钟电路 3.1.6温度采集芯片DS18B20电路 图9 温度
22、采集电路 3.1.7键盘控制电路 该设计采用的是独立按键,S1为时间设置,S2为时间或者日期调整,S3为确定键,S4为闹钟设置。 图10 按键控制电路 3.1.8 LCD1602控制电路 LCD1602是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。第1脚:VSS为电源地。第2脚:VDD接5V电源正极。第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进
23、行写操作。第6脚:E(或EN)端为使能(enable)端。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 图11 LCD1602液晶显示电路 3.2.1 万用板焊接的步骤、注意事项及技巧 焊接前的准备 : 在焊接点阵板之前你需要准备足够的细导线用于走线。细导线分为单股的和多股的:单股硬导线可将其弯折成固定形状,剥皮之后还可以当作跳线使用;多股细导线质地柔软,焊接后显得较为杂乱。 点阵板具有焊盘紧密等特点,这就要求我们的烙铁头有较高的精度,建议使用功率30瓦左右的尖头电烙铁。同样,焊锡丝也不能太粗,建议
24、选择线径为0.5~1mm的。 掌握好电烙铁的温度和焊接时间,选择恰当的烙铁头和焊点的接触位置,才可能得到良好的焊点。正确的手工焊接操作过程可以分成五个步骤: 图12 手工焊接操作过程 ⑴ 步骤一:准备施焊左手拿焊丝,右手握烙铁,进入备焊状态。要求烙铁头保持干净,无焊渣等氧化物,并在表面镀有一层焊锡。 ⑵ 步骤二:加热焊件 烙铁头靠在两焊件的连接处,加热整个焊件全体,时间大约为1~2秒钟。对于在印制板上焊接元器件来说,要注意使烙铁头同时接触两个被焊接物。例如,图(b)中的导线与接线柱、元器件引线与焊盘要同时均匀受热。 ⑶
25、步骤三:送入焊丝 焊件的焊接面被加热到一定温度时,焊锡丝从烙铁对面接触焊件。注意:不要把焊锡丝送到烙铁头上! ⑷ 步骤四:移开焊丝 当焊丝熔化一定量后,立即向左上45°方向移开焊丝。 ⑸ 步骤五:移开烙铁 焊锡浸润焊盘和焊件的施焊部位以后,向右上45°方向移开烙铁,结束焊接。从第三步开始到第五步结束,时间大约也是1~2秒。 焊接注意要点: ⑴ 保持烙铁头的清洁 ⑵ 靠增加接触面积来加快传热 ⑶ 加热要靠焊锡桥 ⑷ 烙铁撤离有讲究 烙铁的撤离要及时,而且撤离时的角度和方向与焊点的形成有关。烙铁不同的撤离方向对焊点锡量的影响如下图所示:
26、 图13 烙铁不同的撤离方向对焊点锡量的影响 ⑸ 在焊锡凝固之前不能动 ⑹ 焊锡用量要适中 ⑺ 焊剂用量要适中 ⑻ 不要使用烙铁头作为运送焊锡的工具 理想焊点的外观: ① 形状为近似圆锥而表面稍微凹陷,呈漫坡状,以焊接导线为中心,对称成裙形展开。虚焊点的表面往往向外凸出,可以鉴别出来。 ② 焊点上,焊料的连接面呈凹形自然过渡,焊锡和焊件的交界处平滑,接触角尽可能小。 ③ 表面平滑,有金属光泽。 ④ 无裂纹、针孔、夹渣。 点阵板的焊接方法: 对于元器件在洞洞板上的布局,大多数人习惯“顺藤摸瓜”,就是以芯片等关键器件为中心,其他元器件见缝插针的方法。这种方法是边焊
27、接边规划,无序中体现着有序,效率较高。但由于初学者缺乏经验,所以不太适合用这种方法,初学者可以先在纸上做好初步的布局,然后用铅笔画到洞洞板正面(元件面),继而也可以将走线也规划出来,方便自己焊接。 对于点阵板的焊接方法,一般是利用前面提到的细导线进行飞线连接,飞线连接没有太大的技巧,但尽量做到水平和竖直走线,整洁清晰。现在网上流行一种方法叫锡接走线法工艺不错,性能也稳定,但比较浪费锡。纯粹的锡接走线难度较高,受到锡丝、个人焊接工艺等各方面的影响。如果先拉一根细铜丝,再随着细铜丝进行拖焊,则简单许多。洞洞板的焊接方法是很灵活的,因人而异,找到适合自己的方法即可。 很多初学者焊的板子
28、很不稳定,容易短路或断路。除了布局不够合理和焊工不良等因素外,缺乏技巧是造成这些问题的重要原因之一。掌握一些技巧可以使电路反映到实物硬件的复杂程度大大降低,减少飞线的数量,让电路更加稳定。下面洞洞板的焊接技巧。 1、初步确定电源、地线的布局 电源贯穿电路始终,合理的电源布局对简化电路起到十分关键的作用。某些洞洞板布置有贯穿整块板子的铜箔,应将其用作电源线和地线;如果无此类铜箔,你也需要对电源线、地线的布局有个初步的规划。 2、善于利用元器件的引脚 洞洞板的焊接需要大量的跨接、跳线等,不要急于剪断元器件多余的引脚,有时候直接跨接到周围待连接的元器件引脚上会事半功倍。
29、另外,本着节约材料的目的,可以把剪断的元器件引脚收集起来作为跳线用材料。 3、善于设置跳线 特别要强调这一点,多设置跳线不仅可以简化连线,而且要美观得多。 4、善于利用元件自身构 焊接的矩阵键盘。这是一个利用了元器件自身结构的典型例子:轻触式按键有4只脚,其中两两相通,我们便可以利用这一特点来简化连线,电气相通的两只脚充当了跳线。 5、 善于利用排针 使用排针,因为排针有许多灵活的用法。比
30、如两块板子相连,就可以用排针和排座,排针既起到了两块板子间的机械连接作用又起到电气连接的作用。这一点借鉴了电脑的板卡连接方法。 6、在需要的时候隔断铜箔 在使用连孔板的时候,为了充分利用空间,必要时可用小刀或者打磨机割断某处铜箔,这样就可以在有限的空间放置更多的元器件。 7、充分利用双面板 双面板比较昂贵,既然选择它就应该充分利用它。双面板的每一个焊盘都可以当作过孔,灵活实现正反面电气连接。 8、充分利用板上的空间 芯片座里面隐藏元件,既美观又能保护元件。点阵板给我们带来了很大的方便,或许它已成为电子实验中不可缺少的一部分。 3.2.2系统的制作与调试 我主要是负
31、责系统的制作与调试。由于系统制作是最后一步,所以我之前一直在协助组员之间的工作,负责任务的分配与协调,在此期间我学会了Proteus仿真软件的使用和一些调试的方法,可以说对我以后的硬件电路的调试也是非常有用的。而且在硬件电路设计的时候我明白了各个芯片的使用和各个模块的功能,对以后的焊接与调试也是至关重要的,在此期间我又进一步熟悉了Altium designer原理图绘制软件的使用。在与小组成员讨论软件设计流程的时候我明白软件设计的要点和注意事项,明白了软件各个模块的作用和它们之间的执行顺序以及怎样协调工作。通过学习我明白系统开发的流程,了解了需要用到的工具软件。 在这次系统制作过程中,由于这
32、次采用的是万用板,可以说元件的布局是非常重要的一部分,我首先对电路进行布局,在布局的同时为了布线的方便对芯片的引脚的位定义进行了局部的调整,在确保无误后开始焊接。可以说焊接是个耐心和细致的工作,特别是用万用板制作,由于它的布线大部分采用的明线,所以看起来会非常乱,一不小心就会出错。还有这次用的万用板是两个插孔在一起的那种,由于从背面插元器件,看不到正面的焊盘是否连接。刚开始焊接的时候就出现了元件引脚相连的情况,而且有的焊盘在重焊的时候还发生了焊盘脱落的情况。这引起了我的重视,在以后的元件放置的时候我很注意焊盘的位置,防止焊盘相连的情况再次发生。我用了整整一天的时间进行焊接,又用了一天的时间进行
33、调试,最后功能完全实现,画上了圆满的句号。 在调试的过程中也遇到了不少的问题,我采用和软件调试类似的方法分模块测试。第一步:测试单片机的最小系统,看看单片机是否工作。我写了一个小程序,将4个IO口的电平全部拉低发现单片根本就不工作,IO口的引脚电平还是默认的高电平。经检查后发现是晶振的微调电容选取的不合适,经修改后单片机正常工作了。第二步:测试液晶的初始化程序,让其开显示并且光标闪烁发现液晶显示非常暗,后来发现是液晶的背光没有接,接上背光后液晶亮度有所改善,但是还是比较暗。后来我又将背光VCC上接的限流电阻去掉,液晶亮度很高,经调整可调电阻将液晶亮度调节到适中。第三步:DS18B20温度传
34、感器数据的读写,当单片机对其数据进行读入时发现读取的温度与实际有差别,经过讨论和测试后发现是接收温度的变量数据类型用的uchar型,改成uint型的后温度读取正确。原因是temp接收的数据超过了uchar的表示范围,所以造成了读数的错误。第四步:测试DS1302的读写程序,通过单片机读取DS1302时钟芯片的数据,终于显示了结果,可是现实的结果并不是自己设定的日期,后来才发现在设置初值时,将顺序搞乱了,重新整理后,上面显示正确的结果。但是显示的位置与预期的有些差异,经修改LCD1602的写入地址后一切正常了。第五步:测试蜂鸣器模块,我们是通过PNP型三极管来驱动蜂鸣器发声的,所以需要单片机给个
35、低电平才能使三极管导通,经测试三极管能正常工作。最后将修改过的主程序载入单片机发现各个部分的功能都能实现了。硬件调试与制作部分圆满成功。 4.结果与结论 完成了用LCD1602显示的带温度显示的万年历的预期的全部功能功能。具有年、月、日、星期、时、分、秒、温度等显示功能;具备年、月、日、星期、时、分、秒校准功能;具有闹钟显示、闹钟设定、整点鸣叫功能。 制作过程中将程序烧到板上时,LCD1602不能显示结果,经过排查,发现是接触不良,重新将其接好后,再次烧录程序,终于显示了结果。还有比如数据类型用错导致温度读数的错误,焊接
36、过程中的引脚短路,经用万用表测量并修正后一切正常。 该设计的缺点是没能显示农历和语音报时,这也是受到LCD1602显示功能的影响。如果换成LCD12864显示就能充分显示农历日期,再加上语音芯片实现语音报时功能就更好了。 5.收获与致谢 通过课程设计我明白单片机系统开发的流程和所用到的工具软件,并对其进行了系统的学习。整个课设的难点处在于程序设计部分。我们首先查阅芯片手册,研究其操作的时序图,然后按照时序图写程序。首先,对于DS1302时钟芯片、初始化设置以及CPU读取时间数据,均需要熟悉相应的引脚功能和运用相应的函数,
37、学会运用这些函数耗费了我不少时间,为此我专门复习了一下以前学习的C语言知识。掌握了DS1302的使用方法后,我开始学习LCD的使用方法,与前面一样,我复习了以前的知识,熟悉了其引脚功能,为后面的程序编写积累了知识。这也在一定程度上提高了我们对时序图的了解,也提高了我们的编程能力。焊接部分也查阅了大量资料,了解了一些好的焊接技巧,并进行了一定量的运用。另外在做拓展部分是,还掌握了DS18B20的使用方法,此次课程设计让我学到了很多硬件和软件方面的知识。 通过此次课设,我对单片机的C语言编程有了更深的掌握,熟悉了几种芯片的使用方法,同时提高了焊接的能力,理论和实践都有了提高。在此还要感谢
38、设计中段德功老师耐心细致的指导和组员之间的团结协作,以及在此期间所有帮助过我的同学和老师。 6. 参考文献 [1]童诗白.模拟电子技术基础[M].北京:高等教育出版社,2005. [2]阎 石.数字电子技术(第五版)[M].北京:高等教育出版社,2005. [3]邱关源,罗先觉.电路(第五版)[M].北京:高等教育出版社,2006. [4]周灵彬,任开杰.基于Proteus的电路与PCB设计[M].北京:电子工业出版社,2010. [5]穆秀春,冯新宇,王宇.Altium Designer原理图与PCB设计[M].北京:电子工业出版社,
39、2011. [6]郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2012. [7]张毅刚,彭喜元,彭宇.单片机原理及应用[M].北京:高等教育出版社,2010. [8]李升.单片机原理与接口技术[M].北京:北京大学出版社,2011. [9] 孟祥莲..单片机原理及应用[M].北京:哈尔冰工业大学出版社,2010.8 [10] 张齐.单片机应用系统设计技术[M].北京:电子工业出版社,2009.1 [11] 万文略.单片机原理及应用[M]. 重庆:重庆大学出版社,2004.5 7. 附件 7.1 电路原理图
40、 图14 整体电路原理图 7.2 Proteus仿真图 图15 正常工作状态下 图16 闹钟设置状态 图17 调时状态 7.3 实物图 图18 正常工作状态下 图19 调时状态 图20 闹钟设置状态 7.4 元器件清单 表1 元件清单 元器件名称 型号规格 数量 备注 单片机 STC89C52 1 加D
41、IP40底座 晶振 32.768M 1 (DS1302外部晶振) 11.0592MHZ 1 加2脚底座 排阻 4.7K(9引脚) 1 P0口的上拉电阻 USB USB电源接口 1 可调电阻 10K 1 LCD1602背光调节 电阻 10K 6 390欧 2 1K或100 4 电解电容 1000uF 1 100uF 2 10uF 5 非极性电容 0.1uF 4 33pF 2 发光二极管 红色LED 2 电源-电池 3V电池--电子 1 都需要底
42、座
按键
微动(脉冲)开关
5
开关
按键(自锁式)
1
三极管
PNP(8550)
1
液晶
LCD1602
1
加16脚单排插座
时钟芯片
DS1302
1
加DIP8底座
温度传感器
DS18B20
1
加3脚插座
整流二极管
1N4001
2
桥堆
2W10
1
三端稳压器
7805
1
蜂鸣器-BELL
有源蜂鸣器
1
7.5源程序清单
#include
43、nop_空指令及左右循环移位子函数库 #define uchar unsigned char //宏定义 #define uint unsigned int //宏定义 sbit lcden=P2^6; //定义下面通过lcden来操作P2^7口,1602液晶使能控制端 sbit lcdwr=P2^5; //定义下面通过lcdrw来操作P2^5口,1602读写选择端 sbit lcdrs=P2^4; //定义选数据寄存器选指令寄存器控制端 sbit sda=P1^1; //定义DS1302数据总线 sbit rst=P1^2; //DS1320复位
44、 sbit sck=P1^0; //定义时钟总线 sbit s1=P3^0; //定义设置按钮 sbit s2=P3^1; //定义调时按钮 sbit s3=P3^2; //定义确定按钮 sbit s4=P3^3; sbit DQ =P2^0; //定义DS18B20通信端口 sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit BELL=P1^4; char fen,shi,miao,ri,yue,nian,zhou,s1num,s2num,s4num,flag1,flag2,lshi,lfen; uchar cod
45、e table[]={" 2013- - "}; //要写入1602液晶的数据 uchar code alarm[]={" CLOCK SETTINGS "}; //要写入1602液晶的数据 uchar code alarm1[]={" : "}; //要写入1602液晶的数据 uchar code table1[]={" : : . "}; //字库中的字可直接以外加""号的形式直接写入 uchar code table2[]={" Wan Nian Li !"}; //欢迎
46、界面 uchar code table3[]={"Wo Men Jie Zuo!!"}; //欢迎界面 //*****************星期编码表********************************** uchar code Weeks[][3]={{"SUN"},{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}}; uchar i,j; //*********************短暂延时******************************** void delay0(uint z
47、) { while(z--); } //*********************毫秒延时******************************** void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //DS18B20初始化函数 void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay0
48、8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay0(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay0(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay0(20); } //DS18B20读一个字节 uchar ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--){ DQ = 0;
49、 // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay0(4); } return(dat); } //DS18B20写一个字节 void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--){ DQ = 0; DQ = dat&0x01; delay0(5); DQ = 1; dat>>=1; } } //DS18B20读取温度 uint
50、ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就






