单片机课程设计
- 格式:pdf
- 大小:551.44 KB
- 文档页数:24
单片机课程设计任务及要求第一篇:单片机课程设计任务及要求13Z机制《单片机课程设计》任务书及要求一、本课程设计的目的和意义通过课程设计使学生深入理解单片机的基本结构和工作原理。
掌握单片机系统常用接口的设计及扩展方法。
掌握汇编语言程序设计和程序调试的技巧。
学会单片机应用系统的设计与开发,培养学生分析问题和解决问题的能力。
为学生将来在机械设计制造及其自动化及其他领域应用单片机技术打下良好基础。
二、设计任务及要求1.硬件设计:根据所选题目要求,完成基于单片机的完整硬件接口电路设计。
2.程序设计:根据需要画出程序流程图,设计出全部汇编程序并给出程序设计说明和程序注释。
3.设计文件:设计报告字数约4000~5000字(不包括程序清单),内容及格式要求如下:(1)报告内容的一般安排λ目录(1页)λ前言(1页):说明所选题目的、当今应用说明、对课题的理解,及要解决的问题和课题的意义。
λ总体方案设计(3~4页):通过列举和分析若干可行技术方案、原理,从中选定可行最优设计方案,给出组成原理(框图)及技术路线。
λ硬件设计(4~8页):元器件选择与必要的介绍;单片机硬件系统及外围接口电路的设计,原理说明。
系统总电路图可占完整一页。
λ软件设计(6~10页):设计各功能子程序、中断服务程序,及主程序,程序中应有必要的注释。
对于复杂程序结构可先绘制程序流程图。
λ设计小结(1页):对设计中所存在的问题和不足进行分析和总结,提出建议、解决的方法和对这次设计实践的认识、收获和提高。
参考文献(1页)(2)设计报告书写要求以班级为单位购买徐师大标准的课程设计报告本,人手一册。
课程设计报告本应双面书写,每页的文字部分不得少于16行、每行不少于22字。
若整页为汇编语言程序,则该页不得少于20行。
设计说明书中插图总数不宜超过10个,插图可包括元器件图、单片机系统硬件电路图、程序流程图等,插图大小及所占篇幅根据线条密度定,线条不能太稀疏。
插图上下之外部不得留有超过一行文字高度的空白行。
单片机课程设计任务书一、教学目标本课程旨在让学生了解和掌握单片机的基本原理和应用技能,通过理论学习和实践操作,使学生能够熟练使用单片机进行简单的程序设计和控制系统设计。
具体的教学目标如下:知识目标:使学生了解单片机的基本结构、工作原理和编程方法;掌握单片机的硬件接口和编程语言;了解单片机在不同领域的应用。
技能目标:培养学生具备单片机的程序设计、系统调试和故障排查能力;能够运用单片机实现简单的控制系统和智能设备。
情感态度价值观目标:培养学生对单片机技术和电子信息科学的兴趣和热情,提高学生创新意识和团队协作能力,使学生认识到单片机技术在现代社会中的重要地位和作用。
二、教学内容本课程的教学内容主要包括以下几个部分:1.单片机的基本原理:介绍单片机的结构、工作原理和性能特点,使学生了解单片机的基本概念。
2.单片机的编程语言:讲解单片机的编程语言,包括指令系统、编程规范和程序结构,培养学生具备编写简单程序的能力。
3.单片机的硬件接口:介绍单片机的各种接口电路,如并行接口、串行接口、ADC和DAC等,使学生掌握单片机与外部设备的数据交换方法。
4.单片机的应用案例:分析单片机在各个领域的应用实例,如家电、工业控制、智能交通等,帮助学生了解单片机的实际应用。
5.单片机编程实践:安排一定的实验课时,让学生动手实践,进行单片机的编程和系统调试,提高学生的实际操作能力。
三、教学方法为了提高教学效果,本课程将采用多种教学方法相结合的方式进行教学:1.讲授法:教师讲解单片机的基本原理、编程方法和应用案例,引导学生掌握单片机的相关知识。
2.讨论法:学生进行课堂讨论,分享学习心得和经验,提高学生的思维能力和团队协作能力。
3.案例分析法:分析单片机在实际应用中的典型案例,让学生了解单片机技术的应用前景。
4.实验法:安排实验室实践环节,让学生动手操作,进行单片机的编程和系统调试,提高学生的实际操作能力。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:《单片机原理与应用》等教材,为学生提供理论学习的参考。
简单单片机课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本结构、工作原理及其在各行各业中的应用。
2. 让学生了解并掌握单片机编程的基本语法和常用指令。
3. 使学生了解单片机与其他电子元器件的连接方式和接口技术。
技能目标:1. 培养学生运用单片机进行简单电路设计和程序编写的能力。
2. 培养学生运用编程软件进行单片机程序调试和优化的技能。
3. 培养学生团队协作、沟通表达和问题解决的能力。
情感态度价值观目标:1. 激发学生对电子技术和单片机编程的兴趣,培养其创新精神和实践能力。
2. 培养学生严谨、认真、负责的学习态度,使其具备良好的学习习惯。
3. 增强学生的环保意识,使其关注单片机在节能减排领域的应用,培养其社会责任感。
课程性质:本课程为实践性较强的课程,旨在培养学生的动手能力、编程能力和创新能力。
学生特点:初中年级学生,具备一定的物理、数学和电子基础知识,好奇心强,求知欲旺盛。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,充分调动学生的主观能动性,培养其自主学习和合作学习的能力。
在教学过程中,关注学生的学习进度和情感态度,确保课程目标的达成。
将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 单片机基础知识:包括单片机的定义、发展历程、基本结构、工作原理及其在各行各业中的应用。
相关教材章节:第一章单片机概述。
2. 单片机编程基础:学习单片机编程的基本语法、常用指令、程序结构及其功能。
相关教材章节:第二章单片机编程基础。
3. 单片机电路设计:介绍单片机与其他电子元器件的连接方式、接口技术以及电路设计方法。
相关教材章节:第三章单片机电路设计。
4. 单片机程序调试与优化:学习使用编程软件进行单片机程序调试、下载和优化。
相关教材章节:第四章单片机程序调试与优化。
5. 实践项目:设计并实现一个简单的单片机控制系统,如温度控制器、灯光控制器等。
相关教材章节:第五章实践项目。
单片机显示控制课程设计一、课程目标知识目标:1. 让学生理解单片机显示控制的基本原理,掌握显示器件的工作机制;2. 学会使用编程语言对单片机进行编程,实现字符、图形的显示控制;3. 了解单片机显示控制在不同应用场景下的实际运用。
技能目标:1. 培养学生动手操作能力,能够独立完成单片机显示控制电路的搭建;2. 提高学生编程能力,使其能够熟练编写并调试显示控制程序;3. 培养学生分析问题和解决问题的能力,能够针对实际应用场景设计合适的显示控制方案。
情感态度价值观目标:1. 培养学生对单片机技术的兴趣,激发其学习热情;2. 培养学生团队协作精神,使其在合作中共同解决问题;3. 增强学生的创新意识,鼓励其勇于尝试新的显示控制方法。
课程性质:本课程为实践性较强的课程,结合理论知识,注重培养学生的动手操作能力和实际应用能力。
学生特点:学生具备一定的单片机基础知识,对编程和电路搭建有一定了解,但实践经验不足。
教学要求:教师应注重理论与实践相结合,通过讲解、示范、指导等教学手段,帮助学生掌握单片机显示控制技术,并能够将其应用于实际项目中。
同时,关注学生的个体差异,给予个性化的指导和支持。
通过本课程的学习,使学生能够达到上述课程目标,为后续相关课程的学习打下坚实基础。
二、教学内容1. 单片机显示控制原理:讲解显示器件的工作原理,如LED、LCD等,分析单片机与显示器件的接口技术。
- 教材章节:第二章 单片机显示技术基础2. 显示控制编程:介绍单片机编程语言,以C语言为例,讲解显示控制编程方法,实现字符、图形的显示。
- 教材章节:第三章 单片机显示控制编程3. 电路设计与搭建:指导学生进行显示控制电路的设计与搭建,包括硬件连接、调试等。
- 教材章节:第四章 单片机显示控制系统设计4. 实践项目:开展单片机显示控制实践项目,如电子时钟、温度显示等,让学生在实际操作中掌握所学知识。
- 教材章节:第五章 单片机显示控制应用实例5. 创新设计与展示:鼓励学生进行创新设计,将所学知识应用于实际项目中,并进行展示和交流。
单片机系统的设计课程设计一、课程目标知识目标:1. 让学生理解单片机系统的基本原理和组成,掌握其设计流程和方法。
2. 使学生掌握单片机编程的基础知识,能运用C语言或汇编语言进行简单程序编写。
3. 帮助学生了解单片机系统在实际应用中的功能与作用,如智能家居、机器人等。
技能目标:1. 培养学生具备独立设计单片机系统的能力,包括硬件电路设计和软件编程。
2. 提高学生运用单片机解决实际问题的能力,如数据采集、信号处理等。
3. 培养学生动手实践和团队协作的能力,能够完成课程项目的设计与实施。
情感态度价值观目标:1. 培养学生对单片机系统设计和开发产生兴趣,提高其学习积极性和主动性。
2. 培养学生具备创新精神和实践意识,敢于尝试新方法,解决实际问题。
3. 培养学生具备良好的团队合作精神和沟通能力,能够在团队中发挥积极作用。
课程性质:本课程为实践性较强的学科,要求学生在理解理论知识的基础上,动手实践,完成单片机系统的设计与实现。
学生特点:学生具备一定的电子技术基础和编程能力,对单片机系统有一定了解,但实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,充分调动学生的积极性,培养其创新能力和实践能力。
通过课程学习,使学生能够达到上述课程目标,为后续专业课程学习和实际工程应用打下坚实基础。
二、教学内容1. 单片机系统概述:介绍单片机的基本概念、发展历程、应用领域及未来发展趋势。
- 教材章节:第一章 单片机概述2. 单片机硬件结构:讲解单片机的内部结构、工作原理、主要性能指标及硬件连接方式。
- 教材章节:第二章 单片机硬件结构3. 单片机编程语言:学习单片机编程所需的基础知识,包括C语言和汇编语言。
- 教材章节:第三章 单片机编程语言4. 单片机I/O口编程:介绍I/O口的基本操作方法,包括输入、输出、中断等。
- 教材章节:第四章 单片机I/O口编程5. 单片机系统设计流程与方法:讲解单片机系统设计的步骤、方法及注意事项。
单片机综合实验课程设计一、课程目标知识目标:1. 学生能理解单片机的基本工作原理,掌握其内部结构和功能模块;2. 学生能掌握单片机编程的基本语法和常用指令,具备编写简单程序的能力;3. 学生能了解并运用单片机接口技术,实现与外围设备的通信和控制。
技能目标:1. 学生能运用所学知识,设计并实现简单的单片机控制系统;2. 学生能熟练使用编程软件和开发工具,进行单片机的程序编写、调试与优化;3. 学生能通过实验操作,培养动手能力和团队协作能力,提高问题解决能力。
情感态度价值观目标:1. 学生通过课程学习,增强对电子技术和编程的兴趣,培养主动探索和创新的意识;2. 学生在学习过程中,树立正确的价值观,认识到单片机技术在现实生活中的应用价值;3. 学生通过团队协作,培养沟通与协作能力,增强集体荣誉感和责任感。
课程性质:本课程为单片机原理与应用的综合实验课程,注重理论与实践相结合,以培养学生的动手能力和创新能力为主。
学生特点:学生具备一定的电子技术和编程基础,对单片机有一定了解,但实践经验不足。
教学要求:教师应结合学生特点和课程性质,采用任务驱动、案例教学等方法,引导学生主动参与实验,提高实践操作能力和创新能力。
同时,注重个体差异,因材施教,确保每位学生都能在课程中学有所获。
通过课程目标的分解与实现,为后续教学设计和评估提供依据。
二、教学内容本课程教学内容主要包括以下三个方面:1. 单片机原理与结构- 熟悉单片机的内部结构,掌握其功能模块;- 了解单片机的工作原理,理解指令执行过程;- 学习单片机编程语言,掌握基本语法和常用指令。
教学大纲:参照教材第1章至第3章,共计6学时。
2. 单片机编程与接口技术- 学习单片机程序设计方法,掌握程序编写、调试与优化技巧;- 了解单片机接口技术,掌握I/O口、定时器、中断等应用;- 学习外围设备与单片机的通信协议,实现数据交换和控制。
教学大纲:参照教材第4章至第6章,共计10学时。
单片机综合应用课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理和结构,理解其工作流程和编程方法。
2. 使学生了解并掌握单片机在综合应用中的关键技术和常见模块的使用。
3. 帮助学生掌握相关电子元器件的功能和连接方式,能够正确搭建单片机应用系统。
技能目标:1. 培养学生运用单片机进行创新设计的能力,能够独立完成简单的综合应用项目。
2. 提高学生编程和调试单片机程序的能力,解决实际问题。
3. 培养学生团队协作和沟通能力,能够共同完成复杂项目的搭建与调试。
情感态度价值观目标:1. 激发学生对单片机及电子技术的兴趣,培养其探究精神和创新意识。
2. 培养学生严谨、务实的科学态度,养成良好的实验操作习惯。
3. 增强学生的环保意识,使其关注可持续发展,将绿色环保理念融入单片机应用项目中。
课程性质:本课程为实践性较强的综合应用课程,注重理论知识与实际操作相结合,培养学生动手能力和创新能力。
学生特点:学生处于高年级阶段,已具备一定的单片机基础知识和编程技能,具有一定的自主学习能力和团队合作意识。
教学要求:结合课程性质、学生特点,明确课程目标,注重理论与实践相结合,提高学生的实际操作能力和创新能力。
将课程目标分解为具体的学习成果,以便进行后续的教学设计和评估。
二、教学内容1. 单片机基础回顾:回顾单片机的基本原理、结构、指令系统及编程方法,巩固学生对单片机基础知识点的掌握。
相关教材章节:第一章 单片机原理与结构2. 单片机应用模块:学习并实践单片机在综合应用中的常见模块,如传感器、执行器、显示模块等。
相关教材章节:第二章 单片机接口技术;第三章 常用传感器及其接口技术3. 编程与调试:学习单片机程序设计方法,掌握编程工具及调试技巧,能够解决实际问题。
相关教材章节:第四章 单片机C语言编程;第五章 单片机程序调试与优化4. 综合应用设计:结合所学知识,进行创新设计,完成一个具有实际应用价值的单片机综合项目。
51单片机课程设计报告一、课程目标知识目标:1. 理解51单片机的硬件结构、工作原理及其功能特点;2. 学会使用51单片机的指令系统进行程序设计;3. 掌握51单片机与外围电路的接口技术,能实现简单的硬件控制功能;4. 了解51单片机在嵌入式系统中的应用及发展趋势。
技能目标:1. 能够运用C语言编写51单片机的程序,实现基础控制功能;2. 能够运用仿真软件对51单片机程序进行调试,分析并解决简单问题;3. 能够设计简单的51单片机硬件系统,进行电路连接和功能测试;4. 培养学生的动手能力、创新能力和团队协作能力。
情感态度价值观目标:1. 培养学生对电子技术的兴趣,激发学习热情;2. 培养学生严谨、务实的科学态度,提高自主学习能力;3. 培养学生关注社会发展,了解科技在生活中的应用,增强社会责任感;4. 培养学生团队合作精神,尊重他人意见,善于沟通交流。
课程性质:本课程为实践性较强的电子技术课程,以51单片机为核心,结合硬件和软件,培养学生的实际操作能力和创新能力。
学生特点:学生具备一定的电子技术基础知识,对单片机有一定了解,但实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,提高学生的实际操作能力和解决问题的能力。
通过课程学习,使学生能够独立完成简单的51单片机控制系统设计。
二、教学内容根据课程目标,教学内容分为以下几个部分:1. 51单片机硬件结构及原理- 熟悉51单片机的内部结构、引脚功能;- 掌握51单片机的工作原理及性能特点。
2. 51单片机指令系统与编程- 学习51单片机的指令集,理解各指令的功能和使用方法;- 掌握C语言在51单片机编程中的应用。
3. 51单片机外围接口技术- 学习51单片机与常见外围电路(如LED、LCD、键盘等)的接口技术;- 掌握外围设备的控制原理及编程方法。
4. 仿真软件的使用- 学习使用Keil、Proteus等仿真软件进行51单片机程序设计和调试;- 掌握仿真软件的操作方法,提高程序调试效率。
简单51单片机课程设计一、课程目标知识目标:1. 理解51单片机的基本结构、工作原理及功能特点;2. 学会使用51单片机的开发环境,掌握相关编程语言及语法;3. 掌握51单片机外围电路的连接方法,了解常见传感器的使用;4. 掌握51单片机在实际应用中的调试与优化方法。
技能目标:1. 能够运用51单片机编写简单的程序,实现基本的功能;2. 能够分析并解决51单片机在实际应用中出现的问题;3. 能够运用所学知识,设计并实现简单的51单片机控制系统;4. 培养学生的动手能力、创新能力和团队协作能力。
情感态度价值观目标:1. 培养学生对单片机及嵌入式系统的兴趣,激发学习热情;2. 培养学生严谨、求实的科学态度,养成良好的学习习惯;3. 培养学生具备积极向上的心态,面对困难和挑战时保持乐观;4. 培养学生具备团队协作精神,学会与他人共同解决问题。
本课程针对初中学段学生,结合课程性质、学生特点和教学要求,明确以上课程目标。
通过本课程的学习,学生将能够掌握51单片机的基本知识和技能,培养实际应用能力,同时培养良好的情感态度价值观。
后续教学设计和评估将围绕这些具体的学习成果展开。
本章节教学内容依据课程目标,紧密结合教材,确保科学性和系统性。
具体教学内容如下:1. 51单片机基础知识:介绍51单片机的结构、原理及功能特点,包括内部资源、外部接口等,对应教材第一章。
2. 开发环境与编程语言:学习51单片机的开发环境搭建,掌握C语言编程基础,包括数据类型、运算符、控制语句等,对应教材第二章。
3. 基本I/O口操作:学习51单片机I/O口编程,实现LED灯、蜂鸣器等基本控制,对应教材第三章。
4. 中断与定时器:介绍中断系统、定时器原理及应用,学会编写中断服务程序,对应教材第四章。
5. 外围电路与传感器:学习51单片机与外围电路的连接方法,了解常见传感器的工作原理及使用,对应教材第五章。
6. 实际应用案例分析:分析51单片机在实际应用中的案例,如温度控制系统、智能家居等,对应教材第六章。
《单片机原理及应用课程设计》报告——带温度显示可调万年历设计专业:电子信息工程班级:电子0811姓名:姒绍辉学号:0820106120指导教师:黄伟军2011年4 月30 日1.课程设计目的1.1巩固和加深对单片机原理和接口技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。
2.课程设计要求本课程设计要求以AT89C51单片机为核心以实现带温度显示可调万年历。
该设计的实现由四大模块组成,即数据显示模块、温度采集模块、时间处理模块和调整设置模块。
2.1数据显示模块使用字符型LCD显示器显示当前时间及当前温度。
屏幕一显示格式为“年:月:日日期/时时:分分:秒秒”。
屏幕二显示格式为“温度值:××.×℃”2.2温度采集模块利用数字温度传感器DS18B20与单片机结合来测量温度。
利用数字温度传感器DS18B20测量温度信号。
其温度测量范围为−55℃~125℃,精确到0.5℃。
数字温度计所测量的温度采用数字显示,控制器使用单片机AT89C51,测温传感器使用DS18B20。
2.3时间处理模块与普通的万年历相同,采用通用的24小时制,实现秒钟逢60进位,分钟逢60进位,时钟逢24进位,年月日同样如此。
在51单片机低功耗工作状态下,实现持续的时间更新。
2.4调整设置模块在LCD显示器屏幕一上显示的初始时间需要更新为当前时间。
同时能切换到屏幕二上显示当前测量温度。
用4个功能键操作来设置当前时间。
功能键K1~K4功能如下。
●K1—进入现在时间及年月日的设置。
●K2—数字量加一。
●K3—数字量减一。
●K4—万年历与温度显示的屏幕切换。
当进入万年历时间及年月日设置时,每当按下K1都伴随蜂鸣器的提示。
3.课程硬件设计3.1设计思想及总体框架图本设计是以AT89C51单片机为控制核心单元,该系统突出特点是环境适应能力极强,功耗较低,成本低廉。
温度采集部分由DS18B20构成,它是一种新型数字温度传感器,具有体积小、精度高、适用电压宽而且独特的一线总线的传输方式,简化了电路连接。
数据显示部分由LCD1602模块构成,一体化的LCD部分提供了两行共三十二个字符的显示空间(可分为屏幕一和屏幕二),使得本设计的大量数据能够实时更新。
按键部分是常规的独立键盘接法。
系统硬件总体框架图如下图所示。
图1-1系统硬件总体框架图3.2主要模块的电路设计(1)单片机主控模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻及开关后构成上电复位电路,20引脚为接地端,40引脚为电源端。
图1-2单片机主控系统(2) 温度采集模块本设计才用的是DS18B20的外部电源供电方式。
在外部电源供电方式下,DS18B20工作电流由VDD 引脚接入,此时I/O 线不需要强上拉,不存在电源电流不足的问题,可以保证传唤精度,外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单。
在外界电源方式下,可以充分发挥DS18B20宽电源电压范围的优点,即使电源电压VCC 降到3V 时,依然能够保证温度量程精度。
外接电源解决了电压方面的苛刻要求,虽然多接了一跟线,但对于本课程设计的近距离测试来说还是比较合适的。
采用数字式温度传感器DS18B20仅需要一条数据线进行数据传输,使用P2.2与DS18B20的I/O 口连接加一个10K Ω的上拉电阻,其中Vcc 接电源,GND 接地。
S TC89C51VC图1-3 温度采集模块(3)显示模块的设计1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形。
这些字符有:阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一个固定的代码。
但1602液晶显示模块是一个慢显示器件,所以在执行每条指令之前一点要确认模块的忙标志为低电平,表示不忙,否则次指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。
图1-4 数据显示模块(1602)图1-5 1602内部RAM 地址映射图CDS 18B20姒绍辉 制于2011.4.27姒绍辉 制于2011.4.27(4)调整设置模块上电之后时间为初始时间,需要对其进行调整。
以此用到矩阵键盘来进行功能选择。
本设计本应可以只使用独立键盘即可,但是1062的RS 端与LCDEN 端已接到P3.4与P3.5,即占用了独立键盘的接口。
所以本设计采用将矩阵键盘分出一列作为独立键盘使用,具体方法是使P3.7(RD)接地。
图1-6 矩阵键盘与独立键盘在按下功能键时,同时为达到提示作用,伴随着蜂鸣器鸣叫“滴”声。
图1-7 蜂鸣器4.课程软件设计 4.1程序流程图P3P3P3P3P3P3P3P3Matrix keyboard晚BUZZ ER本设计软件主程序采用结构化程序设计方法,各个功能模块相互独立,主程序的流程图如下图所示。
主程序可分为初始化,按键扫描,数据显示等。
*注释:Temp_able=1,表示允许将温度显示于1602上,反之则为禁止;Miao_able=1,表示允许将时钟显示于1602上,反之则为禁止。
图1-8 主程序流程图4.2 C语言源程序由于程序较为复杂,已附于附录中。
5.测试及调试运行5.1测试仪器5.2硬件测试在本次实验中,功能键的实用非常频繁,不仅需要对万年历进行时钟的设定,同时通过切换键控制万年历显示或温度显示。
经过万用表测量,发现切换键与P3.0端口的连接存在问题,经常导致切换功能无法正常运行。
因此只能从独立键盘中取出S4按键作为切换键使用。
5.3软件测试电子万年历是多功能的数字型,可以看当前日期,时间,还有温度的仪器。
电子万年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。
最后经过多次模块子程序的修改,一步一步的完成,最终解决了软件。
在软件的调试过程中主要遇到的问题如下:(1)上电运行后,按下功能键,光标并未闪烁,即未进入万年历时钟设定。
解决:通过把不相关的程序暂时屏蔽,对按键的子程序中的功能键进行独立的调试。
发现keyscan()子程序未放进主程序的while(1)中进行不断实时扫描,这样变无法检测到按键。
(2)液晶显示器1602中不能接受到DS18B20实时采集的温度数据解决:1602未能显示温度数据主要在于C51单片机是否准确的接收到了DS18B20通过I/O送出的温度采集二进制数据。
在经过多次翻阅DS18B20 datasheet后发现对DS18B20规定的写一个字节与读一个字节的时序图理解不够透彻,其规定的微秒级别的延迟未能准确把握。
通过多次测试延迟时间,最终解决了此问题。
(3)该设计是基于将万年历与实时温度采集归并为一体。
但是起初将两者独立的子程序合并后,并未能正常工作。
在经过切换后,时钟往往要等待很长一段时间才能正常工作。
解决:由于1602液晶显示模块是一个慢显示器件,它自身执行显示的速度远没有单片机发送给其字节的速度快,同时又由于1602需要对万年历与温度采集进行实时显示,这便会使1602发生错误或不显示。
针对这个问题,经过反复调试,通过增加Miao_able与Temp_able这两个标志位来进行有效控制。
当在显示万年历时,关闭温度显示(Temp_able=0),但当第一次按下切换键时,打开温度显示(Temp_able=1),而关闭万年历显示(Miao_able=0) (数据只是不显示,还是在实时更新存于单片机RAM中);而在第二次按下切换键时,打开万年历显示(Miao_able=1),而关闭温度显示(Temp_able=0) (从DS18B20采集的温度数据只是不显示,但仍在实时更新存于单片机RAM中)。
6.设计心得体会在这次课程设计过程中,学到许多以前没有学到的知识。
不仅对电路的原理及功能更加熟悉,同时提高了设计能力及电路的分析能力,同时在软件的编程方面得到了很多提高与巩固。
在程序的编写中,由于思路不清晰,开始遇到了很多的问题,经过静下心来思考,开了相关的程序,清理了思路。
在这次的设计中,知道了做任何事都要有一颗平常心,不要想着走捷径,一步一个脚印,也就练就了我们的耐心。
总之,通过该课程设计我得到了全方位的提高。
参考书目:[1] 肖金球. 单片机原理与接口技术.[M].北京:清华大学出版社,2004.12[2] 杨子文单片机原理及应用.西安电子科技大学出版社2006[3] 郭天祥51单片机C语言教程电子工业出版社2009[4] 陈正振电子电路设计与制作附录:实物展示上电初始化及对时间进行设置(屏幕一):温度显示(屏幕二):功能键盘:最终成果展示:C源程序代码:/*curriculum project.c 姒绍辉写*/#include<reg52.h>#include"init.h" //初始化头文件#include"ds18b20.h"//DS18B20头文件#include"dis_show.h"//1602显示头文件void keyscan(){uchar i;/*功能键s1按下,秒表停止*///s1num=1~7 1602光标分别显示在秒,分,时,年,月,日,星期;// //s1num=8时,退出功能,恢复时钟正常工作//if(s1==0){delay(10);if(s1==0){s1num++;beep=0;while(!s1);beep=1;switch(s1num){case 1:TR0=0;write_com(0x80+0x40+0x0b);write_com(0x0f);break;case 2:write_com(0x80+0x40+0x08);break;case 3:write_com(0x80+0x40+0x05);break;case 4:write_com(0x80+0x04);break;case 5:write_com(0x80+0x07);break;case 6:write_com(0x80+0x0a);break;case 7:write_com(0x80+0x0e);break;case 8:s1num=0;write_com(0x0c);TR0=1;break;}}}if(s1num==1) //s1num=1,秒功能键{if(s2==0) //s2按下,秒针加1;s3按下,秒针减一;{delay(10);if(s2==0){while(!s2);miao++;if(miao==60)miao=0;write_sfm(0x0a,miao);write_com(0x80+0x40+0x0b);}}if(s3==0){delay(10);if(s3==0){while(!s3);miao--;if(miao==-1)miao=59;write_sfm(0x0a,miao);write_com(0x80+0x40+0x0b);}}}if(s1num==2) //s1num1=2,分功能键{if(s2==0) //s2按下,分针加1;s3按下,分针减一;{delay(10);if(s2==0){while(!s2);fen++;if(fen==60)fen=0;write_sfm(0x07,fen);write_com(0x80+0x40+0x08);}}if(s3==0){delay(10);if(s3==0){while(!s3);fen--;if(fen==-1)fen=59;write_sfm(0x07,fen);write_com(0x80+0x40+0x08);}}}if(s1num==3) //s1num=3,时功能键{if(s2==0) //s2按下,时针加一,s3按下,时针减一;{delay(10);if(s2==0){while(!s2);shi++;if(shi==24)shi=0;write_sfm(0x04,shi);write_com(0x80+0x40+0x05);}}if(s3==0){delay(10);if(s3==0){while(!s3);shi--;if(shi==-1)shi=23;write_sfm(0x04,shi);write_com(0x80+0x40+0x05);}}}if(s1num==4) //s1num=4,年功能键{if(s2==0) //s2按下,年加一;s3按下,年减一;{delay(10);if(s2==0){while(!s2);nian++;if(nian==60)nian=0;write_nyr(0x03,nian);write_com(0x80+0x04);}}if(s3==0){delay(10);if(s3==0){while(!s3);nian--;if(nian==-1)nian=60;write_nyr(0x03,nian);write_com(0x80+0x04);}}}if(s1num==5) //s1num=5,月功能键{ //s2按下,月加一;s3按下,月减一;if(s2==0){delay(10);if(s2==0){while(!s2);yue++;if(yue==13)yue=0;write_nyr(0x06,yue);write_com(0x80+0x07);}}if(s3==0){delay(10);if(s3==0){while(!s3);yue--;if(yue==-1)yue=12;write_nyr(0x06,yue);write_com(0x80+0x07);}}}if(s1num==6) //s1num=6,日功能键{ //s2按下,日加一;s3按下,日减一;if(s2==3){delay(10);if(s2==0){while(!s2);ri++;if(ri==32)ri=0;write_nyr(0x09,ri);write_com(0x80+0x0a);}}if(s3==0){delay(10);if(s3==0){while(!s3);ri--;if(ri==-1)ri=31;write_nyr(0x09,ri);write_com(0x80+0x0a);}}}if(s1num==7) //s1num=7,日期功能键{ //s2按下,日期加一;if(s2==0){delay(10);if(s2==0){while(!s2);riqi=riqi+4;if(riqi==8)riqi=0;write_riqi(0x0c,riqi);write_com(0x80+0x0e);}}}if(s4==0) //s4时钟温度切换键;{delay(10); //s2num=1,时钟切换至温度显示;if(s4==0){ //s2num=2;温度切换至时钟显示;s2num++;while(!s4);if(s2num==1){temp_able=1; //开启温度显示使能,同时关闭时钟显示使能;miao_able=0;for(i=16;i>0;i--){write_com(0x18);delay(20);}}if(s2num==2){temp_able=0; //开启时钟显示使能,同时关闭温度显示使能;miao_able=1;for(i=16;i>0;i--){write_com(0x1c);delay(20);}s2num=0;}}}}void main(){init();while(1){keyscan();temp_convert(); //温度开始转化存至ds18b20暂存器;if(temp_able==1) //判定是否开始进行温度显示;dis_temp(get_temp());}}void T0_timer() interrupt 1{TH0=(65536-46082)/256;TL0=(65536-46082)%256;num1++;if(num1==20){num1=0;miao++;if(miao==6){fen++;miao=0;if(fen==60){fen=0;shi++;if(shi==24){shi=0;ri++;if(ri==32){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==61){nian=0;}write_nyr(0x03,nian);}write_nyr(0x06,yue);}write_nyr(0x09,ri);}write_sfm(0x04,shi);}if(miao_able==1)write_sfm(0x07,fen);}if(miao_able==1) //判定是否开始进行时钟显示;write_sfm(0x0a,miao);}}/* init.h 初始化头文件姒绍辉写*/#define uchar unsigned char#define uint unsigned intsbit DQ=P2^2;sbit beep=P2^3;sbit dula=P2^6;sbit wela=P2^7;sbit s1=P3^1;sbit s2=P3^2;sbit s3=P3^3;sbit lcden=P3^4;sbit lcdrs=P3^5;sbit s4=P3^6;sbit rd=P3^7;uint temp;uchar temp_able,miao_able=1;float f_temp;uchar count,num1,s1num,s2num;uchar miao,fen,shi,nian,yue,ri,riqi;uchar code table0[]=" 2000-00-00 MON";uchar code table1[]=" 00:00:00";uchar code table2[]="MON TUE WED THU FRI SA T SUN"; uchar code table3[]=" Temperature Now";void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //1602写指令时序{lcdrs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date) //1602写数据时序{lcdrs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){uchar num;dula=0;wela=0;rd=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++) //初始化在1602屏幕一上显示初始时间{write_date(table0[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}write_com(0x80+0x10); //初始化在1602屏幕二上显示温度指示标记for(num=0;num<16;num++){write_date(table3[num]);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}/* ds18b20.h头文件姒绍辉写*/void dsreset_pre(void) //ds18b20初始化{uint i;DQ=1;i++; //delay 0.5usi++;DQ=0;i=150;while(i>0) i--; //delay about 600usDQ=1;i=4;while(i>0) i--; //delay about 17us}void temp_writebyte(uchar dat) //ds18b20写一个字节{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DQ=0;i++;i++;DQ=1;i=8; while(i>0) i--;}else{DQ=0;i=8; while(i>0) i--;DQ=1;i++; i++;}}bit temp_readbit(void) //ds18b20读一位{uint i;bit dat;DQ=0;i++;DQ=1; i++;i++;dat=DQ;i=8; while(i>0) i--;return(dat);}uchar temp_readbyte(void) //ds18b20读一个字节{uchar j,i,dat;dat=0;for(i=1;i<=8;i++){j=temp_readbit();dat=(j<<7)|(dat>>1);}return(dat);}void temp_convert() //温度转化功能(采集温度数据存至ds18b20的暂存器) {dsreset_pre();delay(1);temp_writebyte(0xcc);temp_writebyte(0x44);}uint get_temp() //从暂存器中获取两个二进制的温度数据,同时转化为实际温度十进制数据{uchar a,b;delay(1);temp_writebyte(0xcc);temp_writebyte(0xbe);a=temp_readbyte();b=temp_readbyte();temp=b;temp<<=8;temp=temp|a;f_temp=temp*0.0625;temp=f_temp*10+0.5;return temp;}/* dis_show.h 1602显示头文件姒绍辉写*/void write_sfm(uchar add,uchar date) //显示1602时、分、秒功能{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_nyr(uchar add,uchar date) //显示1602年、月、日功能{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void write_riqi(uchar add,uchar riqi) //显示日期功能{uchar j;write_com(0x80+add);for(j=riqi;j<(riqi+3);j++){write_date(table2[j]);delay(5);}}void lcd_temp(uchar i,uchar j,uchar k) //显示实际温度{write_com(0x80+0x56);write_date(0x30+i);write_date(0x30+j);write_date('.');write_date(0x30+k);write_date('C');}void dis_temp(uint t) //将获得的实际十进制温度数据在显示前经行分离{uchar i,j,k;i=t/100;j=t%100/10;k=t%100%10;lcd_temp(i,j,k);}。