第一篇:制冷技术教学中的单片机教学实践_基于51单片机温度计设计实践
制冷技术教学中的单片机教学实践_基于51单片机温度计设计实践.txt小时候觉得父亲不简单,后来觉得自己不简单,再后来觉得自己孩子不简单。越是想知道自己是不是忘记的时候,反而记得越清楚。本文由372133376贡献
pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
湖南农机 2008.1 制冷技术教学中的单片机教学实践
——基于 51 单片机温度计设计实践
陈建明
(广东省韶关市第二高级技工学校 广东 韶关 512031)摘 要: 从事技工教育多年,深切感到单片机基础知识的重要性。故从制冷专业应用实际出 发,结合单片机课程教学的内容,提出了基于 MCS-51 温度计的设计实习。本文针对技工 学校学生单片机知识结构,深入浅出,以应用为基础,充分激发学生的兴趣和求知欲。在整 个设计方案中,都从学生角度出发,采用常见、通用、主流的芯片和方案设计规划。对学生 全面掌握单片机知识,提高学生动手能力,了解制冷温控制原理取得了良好的效果。关键词: MCS-51 单片机 温度计 制冷技术 中图分类号: TP301.1 文献标识码: A 文章编号: 1007-8320(2008)01-0072-02 On the teaching of single chip micyoco for refrigeration specialty —— based on the thermometer experiment of MCS-51 SCM Chen Jianming Abstract: because of long-term educational work in vestibule school, the writer notices the importance of basic knowledge for SCM.This paper brings forward an exercitation based on the MCS-51 thermometer, combining with the specialty characteristic for refrigeration specialty.Key words: MCS-51 SCM(Single Chip Micyoco), thermometer, refrigeration specialty 1 序言
近年来,行业内单片机发展迅速,技术突飞猛进。作为 从事技工教育工作的一份子,更是切身感到单片机教学的 重要性。因为我们培养的人才以后是到生产基层工作的,是生产的重要环节。本文从制冷专业特色出发,结合单片机课程教学,提出 了基于 MCS-51 温度计的设计实习。针对技工在校生单片 机知识结构,深入浅出,以活泼生动的例子充分激发学生的 兴趣和求知欲。在整个设计方案中,都从学生角度出发,采 用常见、通用、主流的芯片和方案设计规划。让学生亲自动 手从一片片的芯片,焊接成完整的电路,再编写程序,成为 制冷系统温度控制的一部分。对学生全面掌握单片机知 识,提高学生动手能力,了解制冷温控制原理取得了良好的 效果。
机的理解仅仅停留在课本知识层面上,在实际应用中出现 很大的歧义。单片机寄存器如何使用?中断如何实现?定 时器如何工作?等等这些问题,学生都只能从书上有一个 抽象的概念,使很多学生失去了学习的兴趣甚至产生畏惧 情绪。故设法从制冷专业出发,结合专业特色,设计一门鲜 明生动的课程实践来充分激发学生的兴趣和求知欲,让学 生可以改变学习状态。在整个设计中,紧紧围绕制冷特色,结合本专业的基本 应用,提出基于单片机 MCS-51 温度计设计。在设计中,既 使用了单片机的计数/定时器,又使用到中断; 既要求到外 围扩展,又是从最基本应用出发; 既考虑到应用的实际性,又针对学生基础知识掌握程度。温度的采集时间控制有单 片机的定时器产生,可以使学生掌握定时器的运用; 温度采 集的控制使用了单片机的外部中断功能,有助学生理解中 断机制的运行; 温度信号转换有外围 A/D0809 芯片完成,使 学生对外围设备的扩展有了初步的了解。该设计从中技生 的知识结构点出发,结合本专业的基本应用,不但可以提高 学生的兴趣又具用专业特色,为学生以后的工作积累经验。2 实践目的与思路
在从事制冷技术教学多年中,常常会遇到学生对单片
收稿日期: 2008-01-03 作者简介: 陈建明,(1956-)男 广东韶关人,韶关市第二高级技工学校一级实习指导教师。研究方向: 制冷技术 72 ? 2008.1 陈建明: 制冷技术教学中的单片机教学实践 D 转换器进行转换。三态输出锁存器用于锁存 A/D 转换完 的数字量,OE 端为高电平时,当 才可以从三态输出锁存器 取走转换完的数据。3.3 温度传感器参数简介 温度传感器选择集成器件 LM35。LM35 是 公司生产 的集成电路温度传感器系列产品之一,它具有很高的工作 精度和较宽的线性工作范围,该器件输出电压与摄氏温度 线性成比例。因而,从使用角度来说,LM35 与用开尔文标 准的线性温度传感器相比更有优越之处,LM35 无需外部 校准或微调,可以提供±1/4℃的常用的室温精度。参数如下: ?工作电压: 直流 4 ~ 30V; ?工作电流: 小于 133 A ?输出电压: +6V ~-1.0V ?输出阻抗: 1mA 负载时 0.1 ; ?精度: 0.5℃精度(在+25℃时); ?漏泄电流: 小于 60 A; ?比例因数: 线性+10.0mV/℃; ?非线性值: ±1/4℃; ?校准方式: 直接用摄氏温度校准; ?使用温度范围: ~+150℃额定范围。-55 3 实践内容及实现
本实践,是为制冷专业学生而设计。温度是最常接触 的参数,所以学生对此较为熟悉和感兴趣。经过本次实践,不但可以使学生在本专业知识上有更深的认识,同时也加 深了基本知识的了解和掌握。3.1 单片机的原理及运用 单片机型号方面,选用上最常见的 MCS-51 系列的 AT89S51。该系列的单片机是采用高性能的静态 80C51 设 计,由先进 CMOS 工艺制造并带有非易失性 Flash 程序存 储器。支持 12 时钟和 6 时钟操作。包含 128 字节 RAM,32 个 I/O 口脚,个 16 位定时/计数器,输入 2 优先级嵌 2 5 套中断结构,个串行 I/O 口可用于多机通信 I/O 扩展或全 1 双工 UART 以及片内振荡器和时钟电路。在设计过程中,引导学生了解温度控制原理。温度计 的实时性需要利用单片机的定时/计数器实现。而数据的 采样则可以由查询与中断方式输入。在实践过程中,我们 鼓励有能力的学生用中断方式实现数据的采集。这样可以 使学生更好地掌握单片机的知识,充分调动了优秀学生的 主动性和积极性。
图 3 LM35 引脚图 图 1 AT89S51 引脚图 3.4 相关外围设备 在单片机外设扩展方面,我们选择常见的 74LS373 锁存器 作地址总线扩展; 使用P1、口的联合编址对外围A/D转换器 P2 进行控制,使学生有机会把课本的知识转化有实际应用。理论 联系实际,对知识有更深刻的了解; 同时也可以鼓励学生的创 新,思考更优的设计方案,使优秀的学生有更多的空间发展。在显示温度读数时,采用动态方式,因为动态 LED 显 示在理解起来比较抽象难懂,若可以有实际操作的经验,学 生将更容易接受,印象深刻。对于实在有困难的学生,可以 提供静态显示的硬件设计电路,为学生适当降低难度。以下提供硬件设计框图,如图 4,仅供考:
图 2 ADC0809 引脚图 3.2 A/D 的选择与概述 至于 A/D 转换器外设的扩展则采用常见的 ADC0809。可以节省学生查找资料的时间,也避免学生选择器件的麻 烦。ADC0809 在市场上相对常见,价格经济,不易烧坏,在 调试中省去了不必要的麻烦。ADC0809 由一个 8 路模拟开关、一个地址锁存与译码 器、一个 A/D 转换器和一个三态输出锁存器组成。多路开 关可选通 8 个模拟通道,允许 8 路模拟量分时输入,共用 A/ 图 4. 硬件框图(图中省略了显示电路部分)(下转第 76 页)73 ? 湖南农机
指标,根据高职院校专业不同阶段的特征来准确把握专业 的发展状况,其目的是为高职院校专业的设置和调整提供 一个现实可靠的依据,从而减少专业设置与发展中的盲目 性和随意性。在确定专业发展的阶段之后,必须对专业发展作出相 应的规划和调整。对于处于新生期的专业,高职院校将其作为新专业要 积极引导,试探性的发展,此阶段要把提高专业水平作为发 展重点,为占领市场打好基础,要着眼于未来的长远发展,根据其初步的发展状况再决定是否扩大规模和深度发展。对于处于衰退期的专业,要逐步控制发展规模,不能再盲 目招生,最重要的是尽可能积极向别的专业转化,减少专业衰 退带来的毕业生就业等压力,不能转化或调整的,要及时删减; 对于处于成长期和成熟期的专业,一方面要大力的扶 持,加大投入力度,在软硬件上都尽可能满足专业发展的需 要,积极创造条件帮助专业向纵深发展,另一方面必须占领 和保证一定的市场份额。尤其对处于成熟期的专业,其优 势和特色已经比较显著,维持其健康发展非常重要,将“订 单式”服务惯彻深入发展,这也是各类高职院校突现各自特 征,吸引生源的重要保障之一。将模糊识别模型运用在高职院校专业发展阶段上,为(上接第 73 页)3.5 调试步骤 按照硬件框图设计出合理的电路并焊接,程序的烧写 完成,就可以进入到调试阶段了。调试阶段可以分为以下 几个步骤: 1)89S51 能正常工作; 电源模块,复位模块,始终模块,三大模块要工作正常,2)单片机才能正常的运行。可以使用万用表和示波器 进行测试个模块的工作情况。3)89S51 总线输出正确无误; 在这部分的调试中,要 使用到较好的示波器,有条件的可以利用单片机仿真器。确保由 P1 口输出的总线和经过 74LS373 的控制总线正 确无误。4)ADC0809 转换数据正确; ADC0809 转换速度会比 AT89S51 单片机的速度稍慢,所以,单片机在发送控制信号 的时候要注意对 ADC0809 状态的监测,避免指令冲突混 乱; 只要数据转换无误,单片机就会有温度数值的显示。5)整体调试; 因为整个电路涉及模拟和数字两部分,所 以整体调试的时候,要注意相互的干扰和温度的矫正。这 部分需要温度计及万用表来矫正显示数值的偏差。学生对类似这种结合专业设计的实践反应热烈,对专 业技术的提高有很大帮助。特别在教学过程中的抽象难懂 问题,为学生提供一个能看得着,摸得到,自己能亲手实践 的机会,消除了学生对技术问题的恐惧感,在以后的学习和 工作中有莫大的帮助。图 5. 实践制作的温度计两组测量值的对比 图 5: 2008.1 高职院校准确把握高职院校专业的发展状况提供了科学的 理论基础,为高职院校调整、修改、增设、删减专业提供了一 个比较可靠的现实依据,减少了高职院校在专业设置与发 展上的盲目性和随意性,使高职院校的专业设置与发展更 好地适应产业结构和市场的变化,从而使高职院校更加积 极蓬勃的发展。同时,对于考察专业发展阶段的指标需要 不断地进行必要的分析和确定,保证指标考察的科学性和 准确性,以便更好地识别专业发展阶段和进行专业调整。参考文献:
[1] 陈新辉;乔忠.产品生命周期模糊的模糊识别模型 [J].中国农 业大学学报.2001(06)[2] 陈晓春;颜克高.非营利组织多元化经营探析 [J].财经理论与 实践(双月刊).2004(03)[3]柯其才.对高职专业设置趋势的思考[J].职教论坛.2005(03)[4] 谷丽应;王晓虹.高职高专院校专业设置的原则和方法研究 [J].贵阳金筑大学学报.2005(12)[5]卢致俊;曾华;张海峰.高职院校专业体系的特征及其构建[J].教育与职业.2006(11)[6]欧阳球林; 张华.高职高专教育专业设置基本原则的探讨[J].九江职业技术学院学报.2004 03)(可以从图中看到,本实践设计制作的温度计与市面成 品测量值相差不超过 5%。由于手工焊接和制作环境因素 的影响,再加上单片机运行环境因素的影响,5%的偏差属 于正常现象。要达到更好的精度,通过一定的补偿和调整,可以把精度提高一个级别。老师可以籍此话题在学生中展 开讨论,引导学生往更深入的层次钻研。4.2 教学效果与总结 在从事多年的教学工作中,深切感到跨专业知识的重 要性。但苦于未曾有类似相关针对技校学生的跨专业的设 计实践。故从自身需要出发,根据学生特点提出了跨专业 的课程实践。本设计实践由于其实用性强,可大大提高了 学生对单片机的兴趣,确实收到了意想不到的效果。学生对本实践反响热烈,巩固了专业技术知识,也提高 了学生对本专业的认识和兴趣,使学生在日后的专业学习中更加有动力和激情。通过亲自动手,学生有一个能自己 能亲手实践的机会,消除了对技术问题的恐惧感,在以后的 学习和工作中起到莫大的帮助。4 实践设计测试效果及总结
4.1 测试效果 以下是实践设计制作的温度计与市面成品的对比图如 76 ? 1本文由372133376贡献
pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
湖南农机 2008.1 制冷技术教学中的单片机教学实践
——基于 51 单片机温度计设计实践
陈建明
(广东省韶关市第二高级技工学校 广东 韶关 512031)摘 要: 从事技工教育多年,深切感到单片机基础知识的重要性。故从制冷专业应用实际出 发,结合单片机课程教学的内容,提出了基于 MCS-51 温度计的设计实习。本文针对技工 学校学生单片机知识结构,深入浅出,以应用为基础,充分激发学生的兴趣和求知欲。在整 个设计方案中,都从学生角度出发,采用常见、通用、主流的芯片和方案设计规划。对学生 全面掌握单片机知识,提高学生动手能力,了解制冷温控制原理取得了良好的效果。关键词: MCS-51 单片机 温度计 制冷技术 中图分类号: TP301.1 文献标识码: A 文章编号: 1007-8320(2008)01-0072-02 On the teaching of single chip micyoco for refrigeration specialty —— based on the thermometer experiment of MCS-51 SCM Chen Jianming Abstract: because of long-term educational work in vestibule school, the writer notices the importance of basic knowledge for SCM.This paper brings forward an exercitation based on the MCS-51 thermometer, combining with the specialty characteristic for refrigeration specialty.Key words: MCS-51 SCM(Single Chip Micyoco), thermometer, refrigeration specialty 1 序言
近年来,行业内单片机发展迅速,技术突飞猛进。作为 从事技工教育工作的一份子,更是切身感到单片机教学的 重要性。因为我们培养的人才以后是到生产基层工作的,是生产的重要环节。本文从制冷专业特色出发,结合单片机课程教学,提出 了基于 MCS-51 温度计的设计实习。针对技工在校生单片 机知识结构,深入浅出,以活泼生动的例子充分激发学生的 兴趣和求知欲。在整个设计方案中,都从学生角度出发,采 用常见、通用、主流的芯片和方案设计规划。让学生亲自动 手从一片片的芯片,焊接成完整的电路,再编写程序,成为 制冷系统温度控制的一部分。对学生全面掌握单片机知 识,提高学生动手能力,了解制冷温控制原理取得了良好的 效果。
机的理解仅仅停留在课本知识层面上,在实际应用中出现 很大的歧义。单片机寄存器如何使用?中断如何实现?定 时器如何工作?等等这些问题,学生都只能从书上有一个 抽象的概念,使很多学生失去了学习的兴趣甚至产生畏惧 情绪。故设法从制冷专业出发,结合专业特色,设计一门鲜 明生动的课程实践来充分激发学生的兴趣和求知欲,让学 生可以改变学习状态。在整个设计中,紧紧围绕制冷特色,结合本专业的基本 应用,提出基于单片机 MCS-51 温度计设计。在设计中,既 使用了单片机的计数/定时器,又使用到中断; 既要求到外 围扩展,又是从最基本应用出发; 既考虑到应用的实际性,又针对学生基础知识掌握程度。温度的采集时间控制有单 片机的定时器产生,可以使学生掌握定时器的运用; 温度采 集的控制使用了单片机的外部中断功能,有助学生理解中 断机制的运行; 温度信号转换有外围 A/D0809 芯片完成,使 学生对外围设备的扩展有了初步的了解。该设计从中技生 的知识结构点出发,结合本专业的基本应用,不但可以提高 学生的兴趣又具用专业特色,为学生以后的工作积累经验。2 实践目的与思路
在从事制冷技术教学多年中,常常会遇到学生对单片
收稿日期: 2008-01-03 作者简介: 陈建明,(1956-)男 广东韶关人,韶关市第二高级技工学校一级实习指导教师。研究方向: 制冷技术 72 ? 2008.1 陈建明: 制冷技术教学中的单片机教学实践 D 转换器进行转换。三态输出锁存器用于锁存 A/D 转换完 的数字量,OE 端为高电平时,当 才可以从三态输出锁存器 取走转换完的数据。3.3 温度传感器参数简介 温度传感器选择集成器件 LM35。LM35 是 公司生产 的集成电路温度传感器系列产品之一,它具有很高的工作 精度和较宽的线性工作范围,该器件输出电压与摄氏温度 线性成比例。因而,从使用角度来说,LM35 与用开尔文标 准的线性温度传感器相比更有优越之处,LM35 无需外部 校准或微调,可以提供±1/4℃的常用的室温精度。参数如下: ?工作电压: 直流 4 ~ 30V; ?工作电流: 小于 133 A ?输出电压: +6V ~-1.0V ?输出阻抗: 1mA 负载时 0.1 ; ?精度: 0.5℃精度(在+25℃时); ?漏泄电流: 小于 60 A; ?比例因数: 线性+10.0mV/℃; ?非线性值: ±1/4℃; ?校准方式: 直接用摄氏温度校准; ?使用温度范围: ~+150℃额定范围。-55 3 实践内容及实现
本实践,是为制冷专业学生而设计。温度是最常接触 的参数,所以学生对此较为熟悉和感兴趣。经过本次实践,不但可以使学生在本专业知识上有更深的认识,同时也加 深了基本知识的了解和掌握。3.1 单片机的原理及运用 单片机型号方面,选用上最常见的 MCS-51 系列的 AT89S51。该系列的单片机是采用高性能的静态 80C51 设 计,由先进 CMOS 工艺制造并带有非易失性 Flash 程序存 储器。支持 12 时钟和 6 时钟操作。包含 128 字节 RAM,32 个 I/O 口脚,个 16 位定时/计数器,输入 2 优先级嵌 2 5 套中断结构,个串行 I/O 口可用于多机通信 I/O 扩展或全 1 双工 UART 以及片内振荡器和时钟电路。在设计过程中,引导学生了解温度控制原理。温度计 的实时性需要利用单片机的定时/计数器实现。而数据的 采样则可以由查询与中断方式输入。在实践过程中,我们 鼓励有能力的学生用中断方式实现数据的采集。这样可以 使学生更好地掌握单片机的知识,充分调动了优秀学生的 主动性和积极性。
图 3 LM35 引脚图 图 1 AT89S51 引脚图 3.4 相关外围设备 在单片机外设扩展方面,我们选择常见的 74LS373 锁存器 作地址总线扩展; 使用P1、口的联合编址对外围A/D转换器 P2 进行控制,使学生有机会把课本的知识转化有实际应用。理论 联系实际,对知识有更深刻的了解; 同时也可以鼓励学生的创 新,思考更优的设计方案,使优秀的学生有更多的空间发展。在显示温度读数时,采用动态方式,因为动态 LED 显 示在理解起来比较抽象难懂,若可以有实际操作的经验,学 生将更容易接受,印象深刻。对于实在有困难的学生,可以 提供静态显示的硬件设计电路,为学生适当降低难度。以下提供硬件设计框图,如图 4,仅供考:
图 2 ADC0809 引脚图 3.2 A/D 的选择与概述 至于 A/D 转换器外设的扩展则采用常见的 ADC0809。可以节省学生查找资料的时间,也避免学生选择器件的麻 烦。ADC0809 在市场上相对常见,价格经济,不易烧坏,在 调试中省去了不必要的麻烦。ADC0809 由一个 8 路模拟开关、一个地址锁存与译码 器、一个 A/D 转换器和一个三态输出锁存器组成。多路开 关可选通 8 个模拟通道,允许 8 路模拟量分时输入,共用 A/ 图 4. 硬件框图(图中省略了显示电路部分)(下转第 76 页)73 ? 湖南农机
指标,根据高职院校专业不同阶段的特征来准确把握专业 的发展状况,其目的是为高职院校专业的设置和调整提供 一个现实可靠的依据,从而减少专业设置与发展中的盲目 性和随意性。在确定专业发展的阶段之后,必须对专业发展作出相 应的规划和调整。对于处于新生期的专业,高职院校将其作为新专业要 积极引导,试探性的发展,此阶段要把提高专业水平作为发 展重点,为占领市场打好基础,要着眼于未来的长远发展,根据其初步的发展状况再决定是否扩大规模和深度发展。对于处于衰退期的专业,要逐步控制发展规模,不能再盲 目招生,最重要的是尽可能积极向别的专业转化,减少专业衰 退带来的毕业生就业等压力,不能转化或调整的,要及时删减; 对于处于成长期和成熟期的专业,一方面要大力的扶 持,加大投入力度,在软硬件上都尽可能满足专业发展的需 要,积极创造条件帮助专业向纵深发展,另一方面必须占领 和保证一定的市场份额。尤其对处于成熟期的专业,其优 势和特色已经比较显著,维持其健康发展非常重要,将“订 单式”服务惯彻深入发展,这也是各类高职院校突现各自特 征,吸引生源的重要保障之一。将模糊识别模型运用在高职院校专业发展阶段上,为(上接第 73 页)3.5 调试步骤 按照硬件框图设计出合理的电路并焊接,程序的烧写 完成,就可以进入到调试阶段了。调试阶段可以分为以下 几个步骤: 1)89S51 能正常工作; 电源模块,复位模块,始终模块,三大模块要工作正常,2)单片机才能正常的运行。可以使用万用表和示波器 进行测试个模块的工作情况。3)89S51 总线输出正确无误; 在这部分的调试中,要 使用到较好的示波器,有条件的可以利用单片机仿真器。确保由 P1 口输出的总线和经过 74LS373 的控制总线正 确无误。4)ADC0809 转换数据正确; ADC0809 转换速度会比 AT89S51 单片机的速度稍慢,所以,单片机在发送控制信号 的时候要注意对 ADC0809 状态的监测,避免指令冲突混 乱; 只要数据转换无误,单片机就会有温度数值的显示。5)整体调试; 因为整个电路涉及模拟和数字两部分,所 以整体调试的时候,要注意相互的干扰和温度的矫正。这 部分需要温度计及万用表来矫正显示数值的偏差。学生对类似这种结合专业设计的实践反应热烈,对专 业技术的提高有很大帮助。特别在教学过程中的抽象难懂 问题,为学生提供一个能看得着,摸得到,自己能亲手实践 的机会,消除了学生对技术问题的恐惧感,在以后的学习和 工作中有莫大的帮助。图 5. 实践制作的温度计两组测量值的对比 图 5: 2008.1 高职院校准确把握高职院校专业的发展状况提供了科学的 理论基础,为高职院校调整、修改、增设、删减专业提供了一 个比较可靠的现实依据,减少了高职院校在专业设置与发 展上的盲目性和随意性,使高职院校的专业设置与发展更 好地适应产业结构和市场的变化,从而使高职院校更加积 极蓬勃的发展。同时,对于考察专业发展阶段的指标需要 不断地进行必要的分析和确定,保证指标考察的科学性和 准确性,以便更好地识别专业发展阶段和进行专业调整。参考文献:
[1] 陈新辉;乔忠.产品生命周期模糊的模糊识别模型 [J].中国农 业大学学报.2001(06)[2] 陈晓春;颜克高.非营利组织多元化经营探析 [J].财经理论与 实践(双月刊).2004(03)[3]柯其才.对高职专业设置趋势的思考[J].职教论坛.2005(03)[4] 谷丽应;王晓虹.高职高专院校专业设置的原则和方法研究 [J].贵阳金筑大学学报.2005(12)[5]卢致俊;曾华;张海峰.高职院校专业体系的特征及其构建[J].教育与职业.2006(11)[6]欧阳球林; 张华.高职高专教育专业设置基本原则的探讨[J].九江职业技术学院学报.2004 03)(可以从图中看到,本实践设计制作的温度计与市面成 品测量值相差不超过 5%。由于手工焊接和制作环境因素 的影响,再加上单片机运行环境因素的影响,5%的偏差属 于正常现象。要达到更好的精度,通过一定的补偿和调整,可以把精度提高一个级别。老师可以籍此话题在学生中展 开讨论,引导学生往更深入的层次钻研。4.2 教学效果与总结 在从事多年的教学工作中,深切感到跨专业知识的重 要性。但苦于未曾有类似相关针对技校学生的跨专业的设 计实践。故从自身需要出发,根据学生特点提出了跨专业 的课程实践。本设计实践由于其实用性强,可大大提高了 学生对单片机的兴趣,确实收到了意想不到的效果。学生对本实践反响热烈,巩固了专业技术知识,也提高 了学生对本专业的认识和兴趣,使学生在日后的专业学习中更加有动力和激情。通过亲自动手,学生有一个能自己 能亲手实践的机会,消除了对技术问题的恐惧感,在以后的 学习和工作中起到莫大的帮助。4 实践设计测试效果及总结
4.1 测试效果 以下是实践设计制作的温度计与市面成品的对比图如 76 ? 1
第二篇:基于51单片机数字温度计设计课程设计
课
题:
基于51单片机数字温度计设计
专
业:
电子信息工程
班
级:
班
学
号:
姓
名:
指导教师:
设计日期:
成绩:
XX大学XX学院电气学院
基于51单片机数字温度计设计
一、设计目的1、掌握单片机电路的设计原理、组装与调试方法。
2、掌握LED数码显示电路的设计和使用方法。
3、掌握DS18B20温度传感器的工作原理及使用方法。
二、设计要求
1、本次单片机课程设计要求以51系列单片机为核心,以开发板为平台。
2、设计一个数字式温度计,要求使用DS18B20温度传感器测量温度。
3、经单片机处理后,要求用4位一体共阴LED数码管来设计显示电路,以显示测量的温度值。
4、另外还要求在设计中加入报警系统,如果我们所设计的系统用来监控某一设备,当设备的温度超过或低于我们所设定的温度值时,系统会产生报警。
5、要求在设计中加入上下限警报温度设置电路。
三、设计的具体实现
1数字温度计设计的方案
在做数字温度计的单片机电路中,对信号的采集电路大多都是使用传感器,这是非常容易实现的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。采集之后,通过使用51系列的单片机,可以对数据进行相应的处理,再由LED显示电路对其数据进行显示。
2系统设计框图
温度计电路设计总体设计方框图如下图所示,控制器采用单片机AT89C51,温度传感器采用DS18B20,用4位一体共阴LED数码管以串口传送数据实现温度显示。此外,还添加了报警系统,对温度实施监控。
3主控器AT89C51芯片
对于单片机的选择,可以考虑使用8031与8051系列,由于8031没有内部RAM,系统又需要大量内存存储数据,因而不适用。AT89C51
以低价位单片机可为提供许多高性价比的应用场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要该器件是INTEL公司生产的MCS一5l系列单片机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS—51的CMOS产品。
AT8951的管脚如下图所示:
AT89C51芯片管脚图
4时钟电路
80C51时钟有两种方式产生,即内部方式和外部方式。80C51中有一个构成内部震荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。本次采用内部震荡电路,瓷片电容采用22PF,晶振为12MHZ。
晶体震荡电路图
复位电路
单片机系统的复位电路在这里采用的是上电+按钮复位电路形式,其中电阻R采用10KΩ的阻值,电容采用10μF的电容值。
复位电路
温度传感电路
DALLAS
最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS
半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125
摄氏度,可编程为9位~12
位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM
中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出。
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式,DQ
为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地,如下图所示。
DS18B20管脚图
显示电路
对于数字温度的显示,我们采用4位一体共阴LED数码管。足够显示0~100中各位数,并且还能显示一位小数部分。
4位LED数码显示管
温度报警电路
对于数字温度计的设计,除了温度的数字显示功能外还加入了报警系统,当测量的温度超过或低于我们所设定的温度值时,系统会产生报警并亮红灯报警。
其电路图如下所示。
蜂鸣器红灯报警系统电路图
源程序:
/********************************************************************
*
程序名;
基于51单片机的温度计
*
功
能:
实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来
*
进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限
*
调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动
*
退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除
*
按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能,*
K1是实现减1功能,K3是用来设定上下限温度正负的。
*********************************************************************/
#include
#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
uchar
max=0x00,min=0x00;
//max是上限报警温度,min是下限报警温度
bit
s=0;
//s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右
bit
s1=0;
//s1标志位用于上下限查看时的显示
void
display1(uint
z);
#include“ds18b20.h“
#include“keyscan.h“
#include“display.h“
/******************************************************/
/*
主函数
/
/*****************************************************/
void
main()
{
beer=1;
//关闭蜂鸣器
led=1;
//关闭LED灯
timer1_init(0);
//初始化定时器1(未启动定时器1)
get_temperature(1);
//首次启动DS18B20获取温度(DS18B20上电后自动将EEPROM中的上下限温度复制到TH和TL寄存器)
while(1)
{
keyscan();
get_temperature(0);
display(temp,temp_d*0.625);
alarm();
}
}
/**********************************************************************
*
程序名;
ds18b20数码管动态显示头文件
*
功
能:
通过定时器0延时是数码管动态显示
**********************************************************************/
#ifndef
__ds18b20_display_H__
#define
__ds18b20_display_H__
#define
uint
unsigned
int
//变量类型宏定义,用uint表示无符号整形(16位)
#define
uchar
unsigned
char
//变量类型宏定义,用uchar表示无符号字符型(8位)
sbit
wei1=P2^4;
//可位寻址变量定义,用wei1表示P2.4口
sbit
wei2=P2^5;
//用wei2表示P2.5口
sbit
wei3=P2^6;
//用wei3表示P2.6口
sbit
wei4=P2^7;
//用wei4表示P2.7口
uchar
num=0;
//定义num为全局无符号字符型变量,赋初值为‘0’
uchar
code
temperature1[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//定义显示码表0~9
uchar
code
temperature2[]={
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//带小数点的0~9.uchar
code
temperature3[]={
0x00,0x80,0x40,0x76,0x38};//依次是‘不显示’‘.’‘-’‘H’‘L’
/******************************************************/
/
延时子函数
/
/*****************************************************/
void
display_delay(uint
t)
//延时1ms左右
{
uint
i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);
}
/******************************************************/
/*
定时器1初始化函数
/
/*****************************************************/
void
timer1_init(bit
t)
{
TMOD=0x10;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET1=1;
TR1=t;
//
局部变量t为1启动定时器1,为0关闭定时器1
}
/******************************************************/
/*
定时器1中断函数
/
/*****************************************************/
void
timer1()
interrupt
{
TH0=0x3c;
//重新赋初值,定时50ms
TL0=0xb0;
num++;
//每进入一次定时器中断num加1(每50ms加1一次)
if(num<5)
{s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}}
else
//进入4次中断,定时200ms时若报警标志位w为‘1’则启动报警,不为‘1’不启动
//实现间歇性报警功能
{s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}}
if(num>20)
//进入20次中断,定时1s
{
num=0;
//num归0,重新定开始定时1s
s1=0;
//定时1s时间到时自动关闭报警上下限显示功能
v1=1;
//定时1s时间到时自动关闭报警上下限查看功能
}
}
/******************************************************/
/*
调整报警上下限选择函数
/
/*****************************************************/
void
selsct_1(uchar
f,uchar
k)
//消除百位的0显示,及正负温度的显示选择
{
if(f==0)
//若为正温度,百位为0则不显示百位,不为0则显示
{
if(k/100==0)
P0=temperature3[0];
else
P0=temperature1[k/100];
}
if(f==1)
//若为负温度,若十位为0,百位不显示,否则百位显示‘-’
{
if(k%100/10==0)
P0=temperature3[0];
else
P0=temperature3[2];
}
}
void
selsct_2(bit
f,uchar
k)
//消除十位的0显示,及正负温度的显示选择
{
if(f==0)
//若为正温度,百位十位均为0则不显示十位,否则显示十位
{
if((k/100==0)&&(k%100/10==0))
P0=temperature3[0];
else
P0=temperature1[k%100/10];
}
if(f==1)
//若为负温度,若十位为0,十位不显示,否则十位显示‘-’
{
if(k%100/10==0)
P0=temperature3[2];
else
P0=temperature1[k%100/10];
}
}
/******************************************************/
/*
主函数显示
/
/*****************************************************/
void
display(uchar
t,uchar
t_d)
//用于实测温度、上限温度的显示
{
uchar
i;
for(i=0;i<4;i++)
//依次从左至右选通数码管显示,实现动态显示
{
switch(i)
{
case
0:
//选通第一个数码管
wei2=1;
//关第二个数码管
wei3=1;
//关第三个数码管
wei4=1;
//关第四个数码管
wei1=0;
//开第一个数码管
if(a==0){selsct_1(f,t);}
//若a=0则在第一个数码管上显示测量温度的百位或‘-’
if(a==1)
{
P0=temperature3[3];
//若a=1则在第一个数码管上显示‘H’
}
if(a==2)
{
P0=temperature3[4];
//若a=2则在第一个数码管上显示‘L’
}
break;
case
1:
//选通第二个数码管
wei1=1;
wei3=1;
wei4=1;
wei2=0;
if(a==0){selsct_2(f,t);}
//若a=0则在第二个数码管上显示测量温度的十位或‘-’
if(a==1)
//若a=1则在第二个数码管上显示上限报警温度的百位或‘-’
{
if(s==0)
selsct_1(f_max,max);//若s=0则显示第二个数码管,否则不显示
else
P0=temperature3[0];
//通过s标志位的变化实现调节上下限报警温度时数码管的闪烁
if(s1==1)
selsct_1(f_max,max);//若s1=1则显示第二个数码管(s1标志位用于上下限查看时的显示)
}
if(a==2)
//若a=2则在第二个数码管上显示下限报警温度的百位或‘-’
{
if(s==0)
selsct_1(f_min,min);
else
P0=temperature3[0];
if(s1==1)
selsct_1(f_min,min);
}
break;
case
2:
//选通第三个数码管
wei1=1;
wei2=1;
wei4=1;
wei3=0;
if(a==0){P0=temperature2[t%10];}//若a=0则在第三个数码管上显示测量温度的个位
if(a==1)
//若a=1则在第三个数码管上显示上限报警温度的十位或‘-’
{
if(s==0)
selsct_2(f_max,max);//若s=0则显示第三个数码管,否则不显示
else
P0=temperature3[0];
if(s1==1)
selsct_2(f_max,max);//若s1=1则显示第三个数码管
}
if(a==2)
//若a=2则在第三个数码管上显示下限报警温度的十位或‘-’
{
if(s==0)
selsct_2(f_min,min);
else
P0=temperature3[0];
if(s1==1)
selsct_2(f_min,min);
}
break;
case
3:
//选通第四个数码管
wei1=1;
wei2=1;
wei3=1;
wei4=0;
if(a==0){P0=temperature1[t_d];}//若a=0则在第四个数码管上显示测量温度的小数位
if(a==1)
//若a=1则在第四个数码管上显示上限报警温度的个位
{
if(s==0)
P0=temperature1[max%10];//若s=0则显示第四个数码管,否则不显示
else
P0=temperature3[0];
if(s1==1)
P0=temperature1[max%10];//若s1=1则显示第四个数码管
}
if(a==2)
//若a=2则在第四个数码管上显示下限报警温度的个位
{
if(s==0)
P0=temperature1[min%10];
else
P0=temperature3[0];
if(s1==1)
P0=temperature1[min%10];
}
break;
}
display_delay(10);
//每个数码管显示3ms左右
}
}
/******************************************************/
/*
开机显示函数
/
/*****************************************************/
void
display1(uint
z)
//用于开机动画的显示
{
uchar
i,j;
bit
f=0;
for(i=0;i //‘z’是显示遍数的设定 { for(j=0;j<4;j++) //依次从左至右显示‘-’ { switch(j) { case 0: wei2=1; wei3=1; wei4=1; wei1=0; break; P0=temperature3[2];//第一个数码管显示 case 1: wei1=1; wei3=1; wei4=1; wei2=0;break; P0=temperature3[2];//第二个数码管显示 case 2: wei1=1; wei2=1; wei4=1; wei3=0;break; P0=temperature3[2];//第三个数码管显示 case 3: wei1=1; wei2=1; wei3=1; wei4=0;break; P0=temperature3[2];//第四个数码管显示 } display_delay(400); //每个数码管显示200ms左右 } } } #endif /******************************************************************** * 程序名; DS18B20头文件 * 说 明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d * (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表 * 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表 * 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表 * 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。 *********************************************************************/ #ifndef __ds18b20_h__ //定义头文件 #define __ds18b20_h__ #define uint unsigned int #define uchar unsigned char sbit DQ= P2^3; //DS18B20接口 sbit beer=P1^0; //用beer表示P1.0 sbit led=P1^1; //用led表示P1.1 uchar temp=0; //测量温度的整数部分 uchar temp_d=0; //测量温度的小数部分 bit f=0; //测量温度的标志位,0’表示“正温度” ‘1’表示“负温度”) bit f_max=0; //上限温度的标志位‘0’表示“正温度” ‘1’表示“负温度”) bit f_min=0; //下限温度的标志位‘0’表示“正温度”、‘1’表示“负温度”) bit w=0; //报警标志位‘1’启动报警‘0’关闭报警 /******************************************************/ /* 延时子函数 / /*****************************************************/ void ds18b20_delayus(uint t) //延时几μs { while(t--); } void ds18b20_delayms(uint t) //延时1ms左右 { uint i,j; for(i=t;i>0;i--) for(j=120;j>0;j--); } /******************************************************/ /* DS18B20初始化函数 / /*****************************************************/ void ds18b20_init() { uchar c=0; DQ=1; DQ=0; //控制器向DS18B20发低电平脉冲 ds18b20_delayus(80); //延时15-80μs DQ=1; //控制器拉高总线,while(DQ); //等待DS18B20拉低总线,在60-240μs之间 ds18b20_delayus(150); //延时,等待上拉电阻拉高总线 DQ=1; //拉高数据线,准备数据传输; } /******************************************************/ /* DS18B20字节读函数 / /*****************************************************/ uchar ds18b20_read() { uchar i; uchar d=0; DQ = 1; //准备读; for(i=8;i>0;i--) { d >>= 1; //低位先发; DQ = 0; _nop_(); _nop_(); DQ = 1; //必须写1,否则读出来的将是不预期的数据; if(DQ) //在12us处读取数据; d |= 0x80; ds18b20_delayus(10); } return d; //返回读取的值 } /******************************************************/ /* DS18B20字节写函数 / /*****************************************************/ void ds18b20_write(uchar d) { uchar i; for(i=8;i>0;i--) { DQ=0; DQ=d&0x01; ds18b20_delayus(5); DQ=1; d >>= 1; } } /******************************************************/ /* 获取温度函数 / /*****************************************************/ void get_temperature(bit flag) { uchar a=0,b=0,c=0,d=0; uint i; ds18b20_init(); ds18b20_write(0xcc); //向DS18B20发跳过读ROM命令 ds18b20_write(0x44); //写启动DS18B20进行温度转换命令,转换结果存入内部RAM if(flag==1) { display1(1); //用开机动画耗时 } else ds18b20_delayms(1); ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0xbe); a=ds18b20_read(); //读内部RAM (LSB) b=ds18b20_read(); //读内部RAM (MSB) if(flag==1) //局部位变量f=1时读上下线报警温度 { max=ds18b20_read(); //读内部RAM (TH) min=ds18b20_read(); //读内部RAM (Tl) } if((max&0x80)==0x80) //若读取的上限温度的最高位(符号位)为‘1’表明是负温度 {f_max=1;max=(max-0x80);} //将上限温度符号标志位置‘1’表示负温度,将上限温度装换成无符号数。 if((min&0x80)==0x80)//若读取的下限温度的最高位(符号位)为‘1’表明是负温度 {f_min=1;min=(min-0x80);} //将下限温度符号标志位置‘1’表示负温度,将下限温度装换成无符号数。 i=b; i>>=4; if (i==0) { f=0; //i为0,正温度,设立正温度标记 temp=((a>>4)|(b<<4)); //整数部分 a=(a&0x0f); temp_d=a; //小数部分 } else { f=1; //i为1,负温度,设立负温度标记 a=~a+1; b=~b; temp=((a>>4)|(b<<4)); //整数部分 a=(a&0x0f); //小数部分 temp_d=a; } } /******************************************************/ /* 存储极限温度函数 / /*****************************************************/ void store_t() { if(f_max==1) //若上限温度为负,将上限温度转换成有符号数 max=max+0x80; if(f_min==1) //若下限温度为负,将上限温度转换成有符号数 min=min+0x80; ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x4e); //向DS18B20发写字节至暂存器2和3(TH和TL)命令 ds18b20_write(max); //向暂存器TH(上限温度暂存器)写温度 ds18b20_write(min); //向暂存器TL(下限温度暂存器)写温度 ds18b20_write(0xff); //向配置寄存器写命令,进行温度值分辨率设置 ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x48); //向DS18B20发将RAM中2、3字节的内容写入EEPROM } //DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器 /******************************************************/ /* 温度超限报警函数 / /*****************************************************/ void alarm() { //若上限值是正值 if(f_max==0) { if(f_min==0) //若下限值是正值 { if(f==0) //若测量值是正值 { if(temp<=min||temp>=max) {w=1;TR1=1;} //当测量值小于最小值或大于最大值时报警 if((temp {w=0;} //当测量值大于最小值且小于最大值时不报警 } if(f==1){w=1;TR1=1;} //若测量值是负值时报警 } if(f_min==1) //若下限值是负值 { if(f==0) //若测量值是正值 { if(temp>=max)//当测量值大于最大值时报警 {w=1;TR1=1;} if(temp {w=0;} } if(f==1) //若测量值是负值 { if(temp>=min)//当测量值大于最小值时报警 {w=1;TR1=1;} if(temp {w=0;} } } } if(f_max==1) //若下限值是负值 { if(f_min==1) //若下限值是负值 { if(f==1) //若测量值是负值 { if((temp<=max)||(temp>=min)) {w=1;TR1=1;} //当测量值小于最大值或大于最小值时报警 if((temp {w=0;} //当测量值小于最小值且大于最大值时不报警 } if(f==0){w=1;TR1=1;} //若测量值是正值时报警 } } } #endif /******************************************************************** * 程序名; 基于51单片机的温度计 * 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来 * 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限 * 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动 * 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除 * 按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。 *********************************************************************/ #include #include //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时) #define uint unsigned int #define uchar unsigned char uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度 bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右 bit s1=0; //s1标志位用于上下限查看时的显示 void display1(uint z); //声明display1()函数(display.h头文件中的函数,ds18b20.h要用应先声明) #include“ds18b20.h“ #include“keyscan.h“ #include“display.h“ /******************************************************/ /* 主函数 / /*****************************************************/ void main() { beer=1; //关闭蜂鸣器 led=1; //关闭LED灯 timer1_init(0); //初始化定时器1(未启动定时器1) get_temperature(1); //首次启动DS18B20获取温度(DS18B20上电后自动将EEPROM中的上下限温度复制到TH和TL寄存器) while(1) { keyscan(); get_temperature(0); display(temp,temp_d*0.625); alarm(); } } /********************************************************************** * 程序名; ds18b20keyscan函数 * 功 能: 通过键盘设定设定上下限报警温度 **********************************************************************/ #ifndef __keyscan_H__ //定义头文件 #define __keyscan_H__ sbit key1=P2^2; sbit key2=P2^1; sbit key3=P2^0; sbit key4=P3^3; uchar i=0; //定义全局变量i用于不同功能模式的选择,‘0’正常模式,‘1’上限调节模式,‘2’下限调节模式 uchar a=0; //定义全局变量a用于不同模式下数码管显示的选择 bit k4=0; //K4按键双功能选择位,k4=0时K4按键选择消按键音的功能,k4=1时K4按键选择正负温度设定功能 bit v=0; //K2、K3按键双功能选择位,v=0时选择上下限查看功能,v=1时选择上下限温度加减功能 bit v1=0; //v1=1时定时1250ms时间到自动关闭报警上下限查看功能 bit v2=0; /消按键音功能调整位,为‘0’时开按键音,为‘1’时关按键音 /******************************************************/ /* 读键盘延时子函数 / /*****************************************************/ void keyscan_delay(uint z) //延时1ms左右 { uint i,j; for(i=z;i>0;i--) for(j=120;j>0;j--); } /******************************************************/ /* 温度调节函数 / /*****************************************************/ int temp_change(int count,bit f) //上下限温度调整 { if(key2==0) //判断K2是否按下 { if(v2==0)beer=0; //v2=0开按键音,否则消按键音 keyscan_delay(10); //延时10ms if(key2==0) //再次判断K2是否按下(实现按按键时消抖) { beer=1; //K2按下关按键音 if(f==0) //若温度为正 { count++; //每按一下K2温度上调1 if(a==1){if(count>125) count=125;}//当温度值大于125时不上调 if(a==2){if(count>125) count=125;} } if(f!=0) //若温度为负 { count++; //每按一下K2温度下调1 if(a==1){if(count>55) count=55;}//当温度值小于-55时不再下调 if(a==2){if(count>55) count=55;} } } while(key2==0); //K2松开按键时消抖 keyscan_delay(10); } if(key3==0) { if(v2==0)beer=0; keyscan_delay(10); if(key3==0) //K3按按键时消抖 { beer=1; count--; //每按一下K3温度为正时下调1,为负时上调1 if(a==1){if(count<0) count=0;}//当温度值达到0时不再调 if(a==2){if(count<0) count=0;} } while(key3==0); keyscan_delay(10); //K3松开按键时消抖 } return count; } /******************************************************/ /* 读键盘函数 / /*****************************************************/ void keyscan() { if(key1==0) { if(v2==0)beer=0; keyscan_delay(10); if(key1==0) //K1按按键时消抖 { beer=1; TR1=1; //开定时器1,通过s标志位的变化,实现在上下限温度调整时温度显示时闪烁的功能 k4=1; //在上下温度调节功能模式下选择K4的调整上下限温度正负的功能 v=1; //在上下温度调节功能模式下选择K2、K3的温度加减功能 i++; //K1按一下i加1,i=‘0’进入正常模式,i=‘1’进入调上限模式,i=‘2’进入调下限模式 if(i>2) //K1按下三次后退出调节模式 { i=0; //进入正常模式 TR1=0; //关定时器1 k4=0; //在正常模式下选择K4的消按键音功能 v=0; //在正常模式下选择K2、K3的查看上下限报警温度功能 store_t(); //存储调整后的上下限报警温度 } switch(i) //显示选择 { case 0:a=0;break; //a=0选择显示测得的温度 case 1:a=1;break; //a=1选择显示上限温度 case 2:a=2;break; //a=2选择显示下限温度 default:break; } } while(key1==0); //K1松按键时消抖 keyscan_delay(10); } if(a==1&&v==1) //a=1选择显示上限温度且v=1时选择上下限温度加功能 {led=0;max=temp_change(max,f_max);}//显示上限温度 else if(a==2&&v==1) //a=2选择显示下限温度且v=1时选择上下限温度减功能 {led=1;min=temp_change(min,f_min);} else; if(k4==1) //k4=1时K4按键选择正负温度设定功能 { if(key4==0) { if(v2==0)beer=0; keyscan_delay(5); if(key4==0) { beer=1; if(a==1) {if(max>55) f_max=0;else f_max=~f_max;}//当温度大于55度时,只能设定为正温度 if(a==2) {if(min>55) f_max=0;else f_min=~f_min;}//当温度大于55度时,只能设定为正温度 } while(key4==0); keyscan_delay(10); } } if(v==0) //v=0时选择上下限查看功能 { if(key2==0) { if(v2==0)beer=0; keyscan_delay(10); if(key2==0) { beer=1; a=1; //选择上限显示 TR1=1; //开定时器1开始定时一分钟左右 s1=1; //上限显示不闪烁,显示一分钟左右自动退出 } while(key2==0); keyscan_delay(10); } if(key3==0) { if(v2==0)beer=0; keyscan_delay(10); if(key3==0) { beer=1; a=2; //选择下限显示 TR1=1; //开定时器1开始定时1s s1=1; //下限显示不闪烁,显示1s自动退出 } while(key3==0); keyscan_delay(10); } if(v1==1) //v1=1时定时1s时间到自动关闭报警上下限查看功能 {a=0;v1=0;TR1=0;} //a=0显示实测温度,v1清零,关定时器1 if(k4==0) //k4=0时K4按键选择消按键音的功能 { if(key4==0) { if(v2==0)beer=0; keyscan_delay(10); if(key4==0) { beer=1; v2=~v2; //为‘0’时开按键音,为‘1’时关按键音 } while(key4==0); keyscan_delay(10); } } } } #endif 四、总结 单片机的学习与应用相关的总结与体会。在课设过程中,我们不仅巩固了平时所学习的单片机知识,而且通过不断查阅相关资料,学习新的知识,可以说,通过这次单片机的实践学习,我们学到了很多,而且对单片机的有关知识以及其在现实生活中的多方面应用有了更深层次的认识,这对于我们以后的学习和步入社会后参加工作都有很大的帮助。 在此次课程设计的进程中,我们遇到了很多问题,例如,一开始我们在确定课设题目后,在编写程序时,由于思路不太清晰,而且设计要求中需要使用新器件DS18B20智能测温,而其相关知识我们很模糊甚至可以说一无所知,不过后来,我们通过查找一些相关的资料书以及寻求辅导老师的帮助,又经过我们的主动思考,理清思路,终于将程序修改正确。在仿真时,由于我们有了之前的数模电课设仿真经验,所以此时我们课设进行的很顺利,并没有受到什么大的阻碍。 通过此次单片机课程设计,我们明白了很多,理论指导实践,但是理论也需要实践给予证明,不能盲目的相信书本,凡事都要通过自己的思考推敲,否则自己不会取的大的进步。而且在平时的学习生活中应该多和周围的同学相互学习,交流经验,遇到不会的东西时,切忌焦躁,首先要经过自己的独立思考,有了一定想法后,可以去查找相关的资料书刊或者找同学讨论,如果实在解释不了,再去找辅导老师,在这个遇到问题解决问题的过程中,不断加强自我的动脑能力,进而去指导动手能力,也只有这样,在思路清晰,条理顺畅的时候,再去进行软件编写和硬件操作工作,才有可能起到事半功倍的效果。 五、附录 系统硬件原理电路图 数字温度计设计器材表 单片机STC89C52 DS18B20 晶振12M 三极管8850 电容30PF 电解电容10UF/25V 小蜂鸣器 LED ø5红 电阻10k,3k,2k,1k,510,330 各5 4位一体共阴数码管 AC/DC(5V/1A)电源 IC插座40 9X15cm万用板 六、参考文献 1、李群芳编.《单片微型计算机及接口技术》[M].电子工业出版社.2、楼然苗编.《51系列单片机设计实例》[M].北京航空航天大学出版社.3、黄勤编.《计算机硬件技术基础实验教程》[M].重庆大学出版社. 基于51单片机的电子时钟设计 摘要 本电子时钟以STC89C52单片机作为主控芯片,采用DS12C887时钟芯片,使用1602液晶作为显示输出。该时钟走时精确,具有闹钟设置,以及可同时显示时间、日期等多种功能。本文将详细介绍该电子时钟涉及到的一些基本原理,从硬件和软件两方面进行分析。 【关键词】 STC89C52单片机 DS12C887时钟芯片 1602液晶 蜂鸣器 目录 一、绪论…………………………………………………………4 1.1 电子时钟功能…………………………………………1.2设计方案………………………………………………4 二、硬件设计……………………………………………………4 2.151 2.2 单片机部分设计………………………………4 USB供电电路设计………………………………5 2.3 串行通信电路设计………………………………6 2.4DS12C887时钟芯片电路的设计…………………6 2.51602LCD液晶屏显示电路设计………………7 2.6 蜂鸣器电路设计………………………………8 2.7 按键调整电路设计…………………………8 三、软件设计…………………………………………9 3.1 系统程序流程图设计…………………………9 3.2程序设计……………………………………11 四、心得体会………………………………………………22 参考文献……………………………………………………23 一、绪 论 1.1电子时钟功能 (1)在1602液晶上显示年、月、日、星期、时、分、秒,并且按秒实时更新显示。(2)具有闹铃设定即到时报警功能,报警响起时按任意键可取消报警。 (3)能够使用实验板上的按键随时调节各个参数,四个有效键分别为功能选择键、数值增大键、数值减小键和闹钟查看键。 (4)每次有键按下时,蜂鸣器都以短“滴”声报警。 (5)利用DS12C887自身掉电可继续走时的特性,该时钟可实现断电时间不停、再次上电时时间仍准确显示在液晶上的功能。 1.2设计方案 DS12C887时钟芯片+1602LCD液晶屏 DS12C887时钟芯片功能丰富、价格适中,能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部含有世纪寄存器,从而利用硬件电路解决“千年”问题。DS12C887中自带锂电池,外部掉电时,其内部时间信息还能保持10年之久。1602LCD液晶屏可以输出2行,每行显示16个字符。1602LCD液晶屏显示清晰且不会闪烁,由于液晶屏是数字式的,因此和单片机系统的接口简单,操作方便。 以STC89C52为主控芯片,DS12C887为时钟芯片,1602LCD液晶屏作为显示器。程序控制DS12C887时钟芯片实现小时、分、秒和年、月、日的计时,并在1602LCD液晶屏上显示出来。当时间走到程序所设定的时间时,蜂鸣器响起,起到闹钟功能。 二、硬 件 设 计 2.1 51单片机部分设计 单片机部分如图2—1所示: 以STC89C52单片机为核心,选用12MHZ的晶振,由于晶振的频率越高,单片机的运行速度就越快,考虑到单片机的运行速度快会导致对存储器的要求就会变高,因此12MHZ为最佳选择。外接电容的值虽然没有严格的要求,但是外接电容的大小会影响振荡器的频率高低、振荡器的稳定性和起振的快速性,因此选用30pF的电容作为起振电容。复位电路为按键高电平复位,当按键按下,RES端为高电平,当高电平持续4us的时间单片机即复位。 2.2 USB供电电路设计 USB供电电路如下图2—2所示: 该电子时钟采用USB端口的方式为单片机供电,LPOW1为电源显示灯,当按键S5按下,电源显示灯LPOW1亮,表示给单片机供+5V电。 2.3 串行通信电路设计 串行通信电路如下图2—3所示: 图中通过MAX232进行RS—232电平与单片机TTL电平之间的转换,从而为单片机和上位机之间通信提供通道。通信电路的目的就是让通信双方的电平匹配,单片机用的是TTL电平,上位机的串口用的是RS—232电平。TTL电平逻辑1的电压范围是+3.3V到+5V,逻辑0的电压范围是0到+3.3V;RS—232电平的逻辑1的电压范围是—15V到—5V,逻辑0的电压范围是+5V到+15V。MAX232可以把输入的+5V电源电压变换成为RS—232输出电平所需的+10V电压。所以采用此芯片接口的串行通信系统只需单一的+5V电源就可以了。对于没有+12V电源的场合,其适应性更强,2.4 DS12C887时钟芯片电路的设计 时钟芯片电路如下图2—4所示: DS12C887时钟芯片共需要13条信号线,分别是并行数据地址复用线AD0~AD7,CS,AS,R/W,DS和IRQ。 MOT—总线操作时序选择端。它有两种工作模式,当MOT接 VCC时,选用Motorola模式;当MOT接GND或悬空时,选用Intel模式。NC—空引脚。 AD0~AD7—复用地址数据总线。在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的是数据信息。GND,VCC—系统电源接入端。当 VCC输入为+5V时,用户可以访问DS12C887内RAM的输入小于+4.25V时,禁止用户对内部RAM中的数据,并可对其进行读/写操作;当 VCC进行读/写操作,此时用户不能正确芯片内的时间信息;当 VCC的输入小于+3V时,DS12C887会自动的将电源切换到内部自带的锂电池上,以保证内部的电路能正常工作。 CS—芯片片选端。 AS—地址选通输入端。在进行读/写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论CS是否有效,DS12C887都将执行该操作。 R/W—读/写输入端。该引接脚有两种工作模式,当MOT接 VCC时,R/W工作在Motorola模式。此时该引脚的作用是区分读操作还是写操作,R/W高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该引脚工作在Intel模式,此时该引脚为写允许输入,此信号的上升沿锁存数据。 DS—数据选择或读输入脚。该引脚有两种工作模式,当MOT接 VCC时,选用Motorola模式,此时,每个总线周期后一部分的DS为高电平,称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁存在DS12C887中。当MOT接GND时,选用Intel模式,此时该引脚是读允许输入引脚。 RESET—芯片复位引脚。 IRQ—中断请求输出。用作处理器的中断申请输入。只要引起中断的状态位置位,并且相应中断使能位也置位,IRQ将一直保持低电平,处理器程序通常读取C存储器来清除IRQ引脚输出,RESET引脚也会清除未处理的中断。没有中断发生时,IRQ为高阻状态,可将多个中断器件接到一条IRQ总线上,只要它们均为漏极开路输出即可。IRQ引脚为漏极开路输出,需要使用一个外接上拉电阻与SQW—方波输出引脚。当供电电压 VCC相连。 VCC大于4.25V时,SQW引脚可输出方波。 2.5 1602LCD液晶屏显示电路设计 1602LCD液晶屏显示电路如下图2—5所示: 1602液晶为5V电压驱动,带背光,可显示2行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。接口说明如下:(1)液晶1,2端为电源;15,16为背光电源;为防止直接加5V电压烧坏背光灯,在15脚串接一个1K电阻用于限流。 (2)液晶3端为液晶对比度调节端,通过一个10K电位器接地来调节液晶显示对比度。首次使用时,在液晶上电状态下,调节至液晶上面一行显示出黑色小格为止。 (3)液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.5口。 (4)液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择为写状态,即低电平接地。 (5)液晶6端为使能信号,是操作时必须的信号,接单片机的P3.4口。 2.6 蜂鸣器电路设计 蜂鸣器电路如下图2—6所示: 蜂鸣器电路接在单片机的P2.3引脚上,当该引脚一个低电平,三极管导通,蜂鸣器发出声音作为闹铃。 2.7 按键调整电路设计 按键调整电路如下图2—7所示: 四个独立键盘均采用查询方式,将按键的一端接地,另一端各接一根输入线直接与STC89C52的I/O口相连。当按键闭合时,相当于该I/O口通过按键与地相连,变成低电平,单片机通过检测I/O口的电平状态,即可识别出按下的键。通过四个键实现参数的调节,S1为功能选择键,S2为数值增大键,S3为数值减小键,S4为闹钟查看键。 三、软 件 设 计 3.1 系统程序流程图设计 流程图1:实验主程序流程图 流程图2:定时中断程序流程图 流程图3:调时功能流程图 3.2 程序设计 #include //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);} void di() //蜂鸣器报警声音 { beep=0; delay(100); beep=1;} void write_com(uchar com) //写液晶命令函数 { rs=0; lcden=0; P0=com; delay(3); lcden=1; delay(3); lcden=0;} void write_data(uchar data) //写液晶数据函数 { rs=1; lcden=0; P0=data; delay(3); lcden=1; delay(3); lcden=0;} void init() //初始化函数 { uchar num; EA=1; //打开总中断 EX1=1; //开外部中断1 IT1=1; //设置负跳变沿触发中断 flag1=0; //变量初始化 t0_num=0; s1num=0; week=1; dula=0; //关闭数码管显示 wela=0; lcden=0; rd=0;/*以下几行在首次设置DS12C887时使用,以后不必再写入 write_ds(0x0A,0x20); //打开振荡器 write_ds(0x0B,0x26); //设置24小时模式,数据二进制格式,开启闹铃中断 set_time(); //设置上电默认时间 ---------------*/ write_com(0x38); //1602液晶初始化 write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<15;num++) //写入液晶固定部分显示 { write_data(table[num]); delay(1);} write_com(0x80+0x40); for(num=0;num<11;num++) { write_data(table1[num]); delay(1); } } void write_sfm(uchar add,char data) { //1602液晶刷新时分秒函数,4为时,7为分,10为秒 char shi,ge; shi=data/10; ge=data%10; write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge);} void write_nyr(uchar add,char data) { //1602液晶刷新年月日函数,3为年,6为月,9为日 char shi,ge; shi=data/10; ge=data%10; write_com(0x80+add); write_data(0x30+shi); write_data(0x30+ge);void write_week(char we) //写液晶星期显示函数 { write_com(0x80+12); switch(we) { case 1: write_data('M');delay(5); write_data('O');delay(5); write_data('N'); break; case 2: write_data('T');delay(5); write_data('U');delay(5); write_data('E'); break; case 3: write_data('W');delay(5); write_data('E');delay(5); write_data('D'); break; case 4: write_data('T');delay(5); write_data('H');delay(5); write_data('U'); break; case 5: write_data('F');delay(5); write_data('R');delay(5); write_data('I'); break; case 6: write_data('S');delay(5); write_data('A');delay(5); write_data('T'); break; case 7: write_data('S');delay(5); write_data('U');delay(5); write_data('N'); break; } } void keyscan(){ if(flag_ri==1){ //这里用来取消闹钟报警,按任意键取消报警 if((s1==0)||(s2==0)||(s3==0)||(s4==0)) { delay(5); if((s1==0)||(s2==0)||(s3==0)||(s4==0)) { while(!(s1&&s2&&s3&s&s4));di(); flag_ri=0; //清除报警标志 } } } if(s1==0) //检测s1 { delay(5); if(s1==0) { s1num++; //记录按下次数 if(flag1==1) if(s1num==4) s1num=1; flag=1; while(!s1);di(); switch(s1num) { //光标闪烁点定位 case 1: write_com(0x80+0x40+10); write_com(0x0f); break; case 2: write_com(0x80+0x40+7); break; case 3: write_com(0x80+0x40+4); break; case 4: write_com(0x80+12); break; case 5: write_com(0x80+9); break; case 6: write_com(0x80+6); break; case 7: write_com(0x80+3); break; case 8: s1num=0; write_com(0x0c); flag=0; write_ds(0,miao); write_de(2,fen); write_ds(4,shi); write_ds(6,week); write_ds(7,day); write_ds(8,month); write_ds(9,year); break; } } } if(s1num!=0) //只有当s1按下后,才检测s2和s3 { if(s2==0) { delay(1); if(s2==0) while(!s2);di(); switch(s1num) { //根据功能键次数调节相应数值 case 1: miao++; if(miao==60) miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); break; case 2: fen++; if(fen==60) fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); break; case 3: shi++; case 4: case 5: case 6: case 7: } } } if(s3==0) { delay(1); if(shi==24) shi=0; write_sfm(4,shi); write_com(0x80+0x40+4); break;week++; if(week==8) week=1; write_week(week); write_com(0x80+12); break;day++; if(day==32) day=1; write_nyr(9,day); write_com(0x80+9); break;month++; if(month==13) month=1; write_nyr(6,month); write_com(0x80+6); break;year++; if(year==100) year=0; write_nyr(3,year); write_com(0x80+3); break; if(s3==0) { while(!s3);di(); switch(s1num) { //根据功能键次数调节相应数值 case 1: miao--; if(miao==-1) miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); break; case 2: fen--; if(fen==-1) fen=59; write_sfm(7,fen); write_com(0x80+0x40+7); break; case 3: shi--; if(shi==-1) shi=23; write_sfm(4,shi); write_com(0x80+0x40+4); break; case 4: week--; if(week==0) week=7; write_week(week); write_com(0x80+12); break; case 5: day--; if(day==0) day=31; write_nyr(9,day); write_com(0x80+9); break; case 6: month--; if(month==0) month=12; write_nyr(6,month); write_com(0x80+6); break; case 7: year--; if(year==-1) year=99; write_nyr(3,year); write_com(0x80+3); break; } } } } if(s4==0) //检测s4 { delay(5); if(s4==0) { flag1=~flag1; while(!s4);di(); if(flag1==0) { //退出闹钟设置时保存数值 flag=0; write_com(0x80+0x40); write_data(' '); write_data(' '); write_com(0x0c); write_ds(1,miao); write_ds(3,fen); write_ds(5,shi); } else { //进入闹钟设置 read_alarm(); //读取原始数据 miao=amiao; //重新赋值用以按键调节 fen=afen; shi=ashi; write_com(0x80+0x40); write_data('R'); //显示标志 write_data('i'); write_com(0x80+0x40+3); write_sfm(4,ashi); //送液晶显示闹钟时间 write_sfm(7,afen); write_sfm(10,amiao); } } } } void write_ds(uchar add,uchar data){ //写12C887函数 dscs=0; dsas=1; dsds=1; dsrw=1; P0=add; //先写地址 dsas=0; dsrw=0; P0=data; //再写数据 dsrw=1; dsas=1; dscs=1;} uchar read_ds(uchar add){ //读12C887函数 uchar ds_data; dsas=1; dsds=1; dsrw=1; dscs=0; P0=add; //先写地址 dsas=0; dsds=0; P0=0xff; ds_data=P0; //再读数据 dsds=1; dsas=1; dscs=1; return ds_data;} /*---首次操作12C887时给予寄存器初始化-----void set_time(){ //首次上电初始化时间函数 write_ds(0,0); write_ds(1,0); write_ds(2,0); write_ds(3,0); write_ds(4,0); write_ds(5,0); write_ds(6,0); write_ds(7,0); write_ds(8,0); write_ds(9,0);}----------------------*/ void read-alarm(){ //读取12C887闹钟值 amiao=read_ds(1); afen=read_ds(3); ashi=read_ds(5);} void main() //主函数 { init(); //调用初始化函数 while(1) { keyscan(); //按键扫描 if(flag_ri==1) //当闹钟中断时进入这里 { di(); delay(100); di(); delay(500); } if(flag==0&&flag1==0) //正常工作时进入这里 { keyscan(); //按键扫描 year=read_ds(9); //读取12C887数据 month=read_ds(8); day=read_ds(7); week=read_ds(6); shi=read_ds(4); fen=read_ds(2); miao=read_ds(0); write_sfm(10,miao); //送液晶显示 write_sfm(7,fen); write_sfm(4,shi); write_week(week); write_nyr(3,year); write_nyr(6,month); write_nyr(9,day); } } } void exter()interrupt 2 //外部中断1服务程序 { uchar c; //进入中断表示闹钟时间到 flag_ri=1; //设置标志位,用于大程序中报警提示 c=read_ds(0x0c); //读取12C887的C寄存器表示响应了中断 } _______________________________________________________________________________ 以下为define.h源代码: _______________________________________________________________________________ #define uchar unsigned char #define uint unsigned int sbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0; //功能键 sbit s2=P3^1; //增大键 sbit s3=P3^2; //减小键 sbit s4=P3^6; //闹钟查看键 sbit rd=P3^7;sbit beep=P2^3; //蜂鸣器 sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^3;bit flag1,flag_ri; //定义两个位变量 uchar count,s1num,flag,t0_num; //其他变量定义 char miao,shi,fen,year,month,day,week,amiao,afen,ashi;uchar code table[]=“201- ”; //液晶固定显示内容 uchar code table1[]=“ : : ”; void write_ds(uchar,uchar); //函数申明 void set_alarm(uchar,uchar,uchar);void read_alarm();uchar read_ds(uchar);void set_time(); 四、心 得 体 会 在本次电子时钟设计中对单片机的内部结构有了一定的了解,熟悉了各个引脚的功能,同时熟知了1602LCD液晶、DS12C887时钟芯片的使用,以及各种电路的功能。 通过此次课程设计,无论是从软件方面还是硬件方面,都进一步学习和巩固了程序的总体设计和单片机的应用。在软件方面,进一步熟悉了各条指令的功能及用法,定时、中断的用法,更深一步学习了用C语言编写实现电子时钟的功能。在硬件方面,进一步熟悉并使用了keil软件,在keil中编程,调试,运行;对电路的一些基本结构和设计有了更深一步的了解。在整个设计过程中,虽然出现了很多问题,有时确实叫人很心烦,但在发现问题后努力去解决,并获得成功,这时会感到无比的快乐和具有成就感。只有自己动手去做,去应用,才能将学到的知识变成自己的。 程序不要光看不写,一定要自己写一次。最开始的时候,可能自己啥都不懂,这时可以抄人家的程序过来。但在抄的时候一定要看看每一句是干什么用的,来达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次。此时会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。 单片机提高重在实践,想要学好单片机,软件编程必不可少。但是熟悉硬件对于学好单片机也是非常重要的。如何学习好硬件,动手实践是必不可少的。我们可以通过自己动手做一个自己的电子制作,通过完成它,以提高对一些芯片的了解和熟练运用。这样我们就可以多了解一些芯片的结构。 我学习的目标是希望在若干年以后能够独立设计一个复杂的系统,包括硬件电路和软件部分。总之,通过这次电子技术设计我学到了许多,似乎离自己的目标又近了一步。 参 考 文 献 [1]郭天祥.51单片机C语言教程.电子工业出版社.2009 [2]谭浩强.C程序设计.清华大学出版社.1991 [3]孙育才 王荣兴 孙华芳.ATMEL新型AT89S52系列单片机及其应用.清华大学出版社.2006 [4]谢维成.单片机原理及应用与51程序设计.清华大学出版社.2006 [5]鲍宏亚.MCS—51系列单片机应用系统设计及实用技术.中国宇航出版社.2005 [6]赵文博 刘文涛.单片机语言C51程序设计.人民邮电出版社.2006 [7]求是科技.8051系列单片机C程序设计.人民邮电出版社.2006 毕业设计(论文) (2015届) 题 目:基于51单片机的电子秤设计 专业名称:应用电子技术 姓 名:谢玉夏 学 号:1210401038 班 级:2012级应用电子技术 指导教师:刘志芳 2014年 12 月 30 日 摘要 称重技术是人类生活中不可缺少的部分,自古以来就被人们所重视。作为一种计量手段,被广泛应用于工业、农业、贸易等各个领域。随着现代文明和科学技术的不断进步,人们对称重技术的准确度要求也越来越高,电子秤产品技术水平的高低,直接影响各行各业的现代化水平和社会经济效益的提高。近年来,电子称重技术取得了突飞猛进的发展,电子秤在称重计量领域中也占有越来越重要的地位,其应用领域也在不断地扩大。尤其是商用电子秤,由于其具有准确度高、反应灵敏、结构简单等优点,被广泛应用于工商贸易、轻工食品、医药卫生等领域。目前,机械秤正在逐步被电子秤取代,这就促使电子秤的研究需要进一步的深入。 本设计是以AT89S51为核心的一种高精度电子秤,系统采用模块化设计法,其硬件结构主要包括:数据采集模块、最小系统模块、电源模块、键盘和显示模块。其中,数据采集模块包括称重传感器和A/D转换电路;最小系统部分主要包括AT89S51和扩展的外部数据存储器;键盘由4×4位矩阵键盘组成;显示部分LM4229液晶显示。软件部分由C语言编程,实现对各部分的控制。该电子秤可以能够显示商品的名称、价格、总量、总价等;能够自动完成商品的价格计算;能够储存几种简单商品的价格;能够具有超重提醒功能。其称重范围为0~5Kg,分度值为0.001g。整个系统结构简单,使用方便。 关键词:电子秤;AT89S51单片机;称重传感器;A/D转换电路;液晶显示II 目录 绪论...........................................................1 1.1 选题的背景与意义.........................................1 1.1.1 选题的背景..........................................1 1.1.2 选题的意义..........................................2 1.2 电子秤的研究现状及发展趋势...............................2 1.2.1 电子秤的研究现状....................................2 1.2.2 电子秤的发展趋势....................................3 1.3 本文的结构...............................................4 2 系统总体方案设计...............................................5 2.1 电子秤的基本知识介绍.....................................5 2.1.1 电子秤的基本结构....................................5 2.1.2 电子秤的工作原理....................................5 2.1.3 电子秤的计量参数....................................6 2.2 总体方案设计.............................................7 2.3 系统各部分设计方案论证...................................8 2.3.1 电子秤分度数的设定..................................8 2.3.2 称重传感器的选定....................................8 2.3.3 A/D转换器的选定....................................14 2.3.4 单片机型号的选定...................................16 硬件设计......................................................18 3.1 系统硬件结构图..........................................18 3.2 单片机主控单元的设计....................................18 3.2.1 单片机引脚说明.....................................18 3.2.2 AT89S51最小系统设计................................20 3.3 数据采集模块设计........................................22 III 3.3.1 传感器单元设计.....................................22 3.3.2 A/D转换单元设计....................................22 3.4 键盘和显示电路单元设计..................................24 3.4.1 键盘电路设计.......................................24 3.4.2 显示电路设计.......................................25 3.5 系统总体原理图..........................................25 3.6 硬件抗干扰设计..........................................26 4 系统软件设计..................................................29 4.1 主程序设计..............................................29 4.2 LM4229液晶显示驱动程序..................................30 4.3 ADC0832采样程序.........................................31 4.4 键盘程序................................................31 5 系统仿真......................................................33 5.1 欢迎界面的仿真..........................................33 5.2 无重物情况仿真..........................................34 5.3 称量物体仿真............................................35 5.4 最大量程仿真............................................36 5.5 仿真总结与问题补充......................................37 5.5.1 仿真总结...........................................37 5.5.2 问题补充...........................................37 总结与展望....................................................39 附录程序.........................................................40 参考文献.........................................................49 IV 绪论 1.1 选题的背景与意义 1.1.1 选题的背景 (1)电子技术渗入衡器制造业 随着第二次世界大战后的经济繁荣,为了把称重技术引入生产工艺过程中去,对称重技术提出了新的要求,希望称重过程自动化,为此电子技术不断渗入衡器制造业。在1954年使用了带新式打印机的倾斜杠杆式秤,其输出信号能控制商用结算器,并且用电磁铁机构与代替人工操作的按键与办公机器联用。在1960年开发出了与衡器相联的专门称重值打印机。当时的带电子装置的衡器其称量工作是机械式的,但与称量有关的显示、记录、远传式控制器等功能是电子方式的。(2)电子秤步入社会 电子秤的发展过程与其它事物一样,也经历了由简单到复杂、由粗糙到精密、由机械到机电结合再到全电子化、由单一功能到多功能的过程。特别是近30年以来,工艺流程中的现场称重、配料定量称重、以及产品质量的监测等工作,都离不开能输出电信号的电子衡器。这是由于电子衡器不仅能给出质量或重量信号,而且也能作为总系统中的一个单元承担着控制和检验功能,从而推进工业生产和贸易交往的自动化和合理化。 近年来,电子秤已愈来愈多地参与到数据处理和过程控制中。现代称重技术和数据系统已经成为工艺技术、储运技术、预包装技术、收货业务及商业销售领域中不可缺少的组成部分。随着称重传感器各项性能的不断突破,为电子秤的发展奠定了基础,国外如美国、西欧等一些国家在20世纪60年代就出现了0.1%称量准确度的电子秤,并在70年代中期约对75 %的机械秤进行了机电结合式的电子化改造。 我国的衡器在20世纪40年代以前还全是机械式的,40年代开始发展了机电结合式的衡器。50年代开始出现了以称重传感器为主的电子衡器。80年代以来,我国通过自行研制、引进消化吸收和技术改造,已由传统的机械式衡器步入集传感器、微电子技术、计算机技术于一体的电子衡器发展阶段。目前,由于电子衡器具有称量快、读数方便、能在恶劣环境下工作、便于与计算机技术相结合而实现称重技术和过程控制的自动化等 特点,已被广泛应用于工矿企业、能源交通、商业贸易和科学技术等各个部门。随着称重传感器技术以及超大规模集成电路和微处理器的进一步发展,电子称重技术及其应用范围将更进一步的发展,并被人们越来越重视。 1.1.2 选题的意义 电子秤是日常生活中常用的电子衡器,广泛应用于超市、大中型商场、物流配送中心。电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。目前市场上使用的称量工具,或者是结构复杂,或者运行不可靠,且成本高,精度稳定性不好,调整时间长,易损坏,维修困难,装机容量大,能源消耗大,生产成本高。而且目前市场上电子秤产品的整体水平不高,部分小型企业产品质量差且技术力量薄弱,设备不全,缺乏产品的开发能力,产品质量在低水平徘徊。因此,有针对性地开发出一套有实用价值的电子秤系统,从技术上克服上述诸多缺点,改善电子秤系统在应用中的不足之处,具有现实意义。 1.2 电子秤的研究现状及发展趋势 1.2.1 电子秤的研究现状 近几年,我国的电子称重系统从最初的机电结合型发展到现在的全电子型和数字智能型。电子称重技术逐渐从静态称重向动态称重发展,从模拟测量向数字测量发展,从单参数测量向多参数测量发展。电子称重系统制造技术及其应用得到了新发展。国内电子称重技术基本达到国际上20世纪90年代中期的水平,少数产品的技术已处于国际领先水平。 在研究方法上,电子称重系统的工作原理一般是将作用在承载器上的质量或力的大小,通过压力传感器转换为电信号,并通过控制电路来处理该电信号。其中压力传感器大多数采用电阻应变片压力传感器,由于应变片的体积较小,市场上有多种规格可供选择,而且可以针对弹性敏感元件的形式可以灵活设计来适应各种应用场合的要求,所以 应变片式压力传感器得到广泛的应用。但是电阻应变片压力传感器的一个严重缺陷是应变灵敏度、应变片本身的电阻都随温度变化,而且灵敏度随温度变化较大。在不同的环境中,应变片的阻值发生变化,输出零点漂移明显。并且应变片的输出信号很小、线性范围窄,而且动态响应较差,有待进一步开发。 在国际上,一些发达国家在电子称重方面,从技术水平、品种和规模等方面都达到了较高的水平。特别是在准确度和可靠性等方面有了很大的提高。其中梅特勒.托利多公司生产的BBK4系列高精度电子秤精度达到了lmg,速度大约为1次/秒。目前,电子秤在称量速度方面需要进一步的研究。 在称重传感器方面,国外产品的品种和结构又有创新,技术功能和应用范围不断扩大。 1.2.2 电子秤的发展趋势 电子秤的称重功能是基于微处理器这一核心技术来实现的。由于目前在设计电子称重系统时大量地采用集成芯片,因此电子称重系统已经摆脱了以往的电子模式,正向小型化、模块化、智能化、集成化发展;其技术性能趋向于高速率、高准确度、高稳定性、高可靠性;其应用性趋向于综合性、组合性。 小型化:体积小、高度低、重量轻,即小薄轻。为使电子衡器的承载器达到小、薄、轻,开始采用重量轻且刚度大的空心波纹铜板和方形闭合截面的薄壁型材。 模块化:电子衡器的承载器采用模块式一体组合或分体组合,产生新的品种和规格。这种模块化组合不但提高了产品的通用性和可靠性,而且也大大提高了生产效率,降低了成本。 智能化:与电子计算机组合或开发称重用计算机,利用计算机的智能来增加称重显示控制的功能,使其在原有功能的基础上增加推理、判断、自诊断、自适应、自组织等功能。 集成化:对于某些品种和结构的电子衡器,可以实现承载器与称重传感器一体化或承载器、称重传感器与称重显示控制器一体化。 综合性:电子称重技术和电子衡器产品的应用范围不断扩大,它已渗透到一些学科和工业自动控制领域。对某些商用电子计价秤而言,只具备称重、计价、显示、打印功能还远远不够,现代商业系统还要求它能提供各种销售信息,把称重与管理自动化紧密 结合,使称重、计价、进库、销售管理一体化,实现管理自动化。这就要求电子计价秤能与电子计算机联网,把称重系统与计算机系统组成一个完整的综合控制系统。 组合性:在工业生产过程或工艺流程中,不少称重系统还应具有可组合性,即:测量范围可以任意设定;硬件能够依据不定的程序进行修改和扩展;输入输出数据与指令可使用不同的语言,并能与外部的控制和数据处理设备进行通信。 今后, 随着电子高科技的飞速发展, 电子秤技术的发展定将日新月异。同时, 功能更加齐全的高精度的先进电子秤将会不断问世, 其应用范围也会更加拓宽。 1.3 本文的结构 本设计是以AT89S51为核心的一种高精度电子秤,系统采用模块化设计法,其硬件结构主要包括:数据采集模块、最小系统模块、电源模块、键盘和显示模块。软件部分由C语言编程,实现对各部分的控制。可以实现称重、去皮、置零、计价和显示等功能。其称重范围为0~5Kg,分度值为0.001g。整个系统结构简单,使用方便。全文共分为五章,各章主要内容如下: 第一章为绪论部分,简要介绍了选题的背景及意义、电子秤的研究现状及发展趋势以及本文的主要内容及结构; 第二章为总体设计部分,简要介绍了电子秤的结构及工作原理,论证了系统总体方案的设计,以及对各种方案的选择做出了比较; 第三章为系统硬件设计部分,主要是通过对各种模块的介绍以及对电路功能的分析,对系统硬件进行了选型和设计,得出系统硬件结构图; 第四章为系统软件设计部分,主要介绍了系统各部分软件的设计流程,给出了简单的程序; 第五章为系统软件仿真; 第六章为总结与展望,主要是对本课题的总结,以及对存在的问题进行归纳和进一步研究的方向。系统总体方案设计 2.1 电子秤的基本知识介绍 2.1.1 电子秤的基本结构 电子秤是利用物体的重力作用来确定物体质量(重量)的测量仪器,也可用来确定与质量相关的其它量大小、参数、或特性。不管根据什么原理制成的电子秤均由以下三部分组成: (1)承重、传力复位系统 它是被称物体与转换元件之间的机械、传力复位系统,又称电子秤的秤体,一般包括接受被称物体载荷的承载器、秤桥结构、吊挂连接部件和限位减振机构等。(2)称重传感器 即由非电量(质量或重量)转换成电量的转换元件,它是把支承力变换成电的或其它形式的适合于计量求值的信号所用的一种辅助手段。 按照称重传感器的结构型式不同,可以分直接位移传感器(电容式、电感式、电位计式、振弦式、空腔谐振器式等)和应变传感器(电阻应变式、声表面谐振式)或是利用磁弹性、压电和压阻等物理效应的传感器。 对称重传感器的基本要求是:输出电量与输入重量保持单值对应,并有良好的线性关系;有较高的灵敏度;对被称物体的状态的影响要小;能在较差的工作条件下工作;有较好的频响特性;稳定可靠。 (3)测量显示和数据输出的载荷测量装置 即处理称重传感器信号的电子线路(包括放大器、模数转换、电流源或电压源、调节器、补偿元件、保护线路等)和指示部件(如显示、打印、数据传输和存贮器件等)。这部分习惯上称载荷测量装置或二次仪表。在数字式的测量电路中,通常包括前置放大、滤滤、运算、变换、计数、寄存、控制和驱动显示等环节。 2.1.2 电子秤的工作原理 当被称物体放置在秤体的秤台上时,其重量便通过秤体传递到称重传感器,传感器 随之产生力-电效应,将物体的重量转换成与被称物体重量成一定函数关系(一般成正比关系)的电信号(电压或电流等)。通常此电压信号很小,需要通过前端信号处理电路进行准确的线性放大,放大后的模拟电压信号经过滤波电路和A/D转换电路转换成数字信 1号被送入到主控电路的单片机中○,单片机不断扫描键盘和各种功能开关,根据键盘输入内容和各种功能开关的状态进行必要的判断、分析、由仪表的软件来控制各种运算。运算结果送到内存贮器,需要显示时,单片机发出指令,从内存贮器中读出送到显示器显示。 2.1.3 电子秤的计量参数 电子秤的计量性能涉及的主要技术指标有:量程、安全载荷、额定载荷、允许误差、分度值、分度数、准确度等级等。 (1)量程:一台电子秤不计皮重,所能称量的最大的载荷Max,即电子秤在正常工作情况下,所能称量的最大值。 (2)安全载荷:为电子秤正常称量案范围的120%。(3)额定载荷:电子秤的正常称量范围。(4)允许误差:等级检定时允许的最大偏差。 (5)分度值:电子秤的测量范围被分成若干等份,每份值即为分度值。用e或d来表示。 (6)分度数:衡器的测量范围被分成若干等份,总份数即为分度数用n表示。电子衡器的最大称量Max可以用总分度数n与分度值d的乘积来表示,即Max=n*d。 (7)准确度等级:国际法制计量组织把电子秤按照不同的分度数分成Ⅰ、Ⅱ、Ⅲ、Ⅳ四类等级,分别对应不同准确度的电子秤和分度数n的范围,如表 1因为本设计采用软件仿真而不能进行实际的称量,故信号的放大滤波电路部分舍去,直接输入模拟电压信号,○放大滤波部分内容会在第五章仿真总结与问题补充中进行后续介绍。 2-1所示。 表2-1 电子秤等级分类 标志及等级 特种准确度 电子秤种类 基准衡器 分度数范围 n>100,000 高准确度 中准确度 普通准确度 精密衡器 商业衡器 粗衡器 10,000 按照设计的基本要求,可以确定系统共分为五大模块,数据采集模块、最小系统模块、超重报警模块、键盘和显示模块。其中,数据采集模块包括称重传感器和A/D转换电路;最小系统模块由AT89S51单片机及其外围电路组成;键盘由4×4位矩阵键盘组成,可以控制显示商品种类和价钱等信息;显示部分采用LM4229液晶显示,显示当前商品的名称、单价、重量及总价等信息。软件部分由C语言编程,实现对各部分的控制。该电子秤可以实现显示商品的名称、单价、重量、总价等功能。其称重范围为0~5Kg,分度值为0.001g。在扩展功能上,本设计增加了一个超重报警提示。其总体设计的框图如图2-1所示: 数据采集模块单片机最小系统超重报警模块键盘模块显示模块 图2-1 总体设计方框图 系统工作原理:把所称物体放到秤台上,物体的重力通过秤体传给称重传感器,传感器受到压力使电阻发生变化引起电压变化,再将电压值送到A/D转换电路,将模拟量转换成数字量,转换后的数字量送至单片机进行处理,并显示结果。单片机最小系统由AT89S51和外围的时钟电路及复位电路组成。显示电路设计采用LM4229液晶显示,对各部分的控制由采用C语言编程的软件来实现。 2.3 系统各部分设计方案论证 2.3.1 电子秤分度数的设定 当前,一些单位为了提高Ⅲ级商贸秤的准确度,尝试改小电子秤的分度值,扩大电子秤的分度数,以便达到高精度称量的目的。这样做非但不能进行高精度称量,还会破坏电子秤原有的计量性能,降低电子秤的准确度,有损电子秤的可靠性,使电子秤出现更多的计量误差。 现在我国已经完全与OIML规定接轨,衡器计量检定规程完全按OIML规定而来。表2-2为Ⅲ级商业秤误差要求。 表2-2 Ⅲ级数字显示商用衡器允差表 m <500e 500e< m≤2000e 2000e< m≤Max 允差e(检定分度值) 检定要求 ±0.5e ±1.0e ±1.5e 使用中要求 ±1.0e ±2.0e ±3.0e 由表2-2可知,它的整个称量范围允差规定是变化的,误差是从大到小再变大,最高准确度在中间。从0~500分度数为低精度称量段,到高于3000个分度数之后的实际称量精度逐渐变低,实际误差不断加大。分度数再高其允差也是不变的。从国外电子秤的准确度和分度数设置、国内原先衡器的检定标准和现在我们统计的电子秤分度数的准确度以及OIML对Ⅲ级秤的允差规定看,说明现有Ⅲ级商业秤的分度数设置为2000~3000是比较理想的,属于最佳分度数。这样设置决定了电子秤的准确度首检为±0.05%,使用中为±0.1%的正确性、合理性与必要性。 2.3.2 称重传感器的选定 称重传感器在电子秤中占有十分重要的位置,被喻为电子秤的心脏部件,它的性能好坏很大程度上决定了电子秤的精确度和稳定性。考虑到不同使用地点的重力加速度和空气浮力对转换的影响,称重传感器的性能指标主要有线性误差、滞后误差、重复性误差、蠕变、零点温度特性和灵敏度温度特性等。在各种衡器和质量计量系统中,通常用 综合误差带来综合衡量传感器准确度,并将综合误差带与衡器误差带联系起来,以便选用对应于某一准确度衡器的称重传感器。国际法制计量组织(OIML)规定,传感器的误差带δ占衡器误差带Δ的70%,称重传感器的线性误差、滞后误差以及在规定温度范围内由于温度对灵敏度的影响所引起的误差等的总和不能超过误差带δ。若在环境恶劣的条件下(如高低温、湿热),传感器所占的误差比例就更大,因此,在人们设计电子秤时,正确地选用称重传感器非常重要。1.常用各种称重传感器 称重传感器按转换方法分为光电式、液压式、电磁力式、电容式、磁极变形式、振动式、陀螺仪式、电阻应变式等8类,以电阻应变式使用最广。 光电式传感器包括光栅式和码盘式两种。光栅式传感器利用光栅形成的莫尔条纹把角位移转换成光电信号。光栅有两块,一为固定光栅,另一为装在表盘轴上的移动光栅。加在承重台上的被测物通过传力杠杆系统使表盘轴旋转,带动移动光栅转动,使莫尔条纹也随之移动。利用光电管、转换电路和显示仪表,即可计算出移过的莫尔条纹数量,测出光栅转动角的大小,从而确定和读出被测物质量。码盘式传感器的码盘是一块装在表盘轴上的透明玻璃,上面带有按一定编码方法编定的黑白相间的代码。加在承重台上的被测物通过传力杠杆使表盘轴旋转时,码盘也随之转过一定角度。光电池将透过码盘接受光信号并转换成电信号,然后由电路进行数字处理,最后在显示器上显示出代表被测质量的数字。光电式传感器曾主要用在机电结合秤上。 液压式传感器:在受被测物重力P作用时,液压油的压力增大,增大的程度与P成正比。测出压力的增大值,即可确定被测物的质量。液压式传感器结构简单而牢固,测量范围大,但准确度一般不超过1/100。 电磁力式传感器:它利用承重台上的负荷与电磁力相平衡的原理工作。当承重台上放有被测物时,杠杆的一端向上倾斜;光电件检测出倾斜度信号,经放大后流入线圈,产生电磁力,使杠杆恢复至平衡状态。对产生电磁平衡力的电流进行数字转换,即可确定被测物质量。电磁力式传感器准确度高,可达1/2000~1/60000,但称量范围仅在几十毫克至10千克之间。 电容式传感器:工作原理是利用电容器振荡电路的振荡频率f与极板间距d成正比的关系。极板有两块,一块是固定不动的,另一块是可移动的。在秤体加载重物时,两 极板间的距离发生变化,随之,电路的振荡频率也改变。只要测出频率的变化便可求出被测物的质量。电容式传感器耗电量少,造价低,准确度为1/200~1/500。 磁极变形式传感器:原理为铁磁元件在被测物体重力下发生形变,产生应力引起导磁率的变化,随之,绕在铁磁元件两侧的次级线圈的感应电压也变化。这样测出电压的变化量便可求出加到磁极上的力,从而确定物体的质量。磁极变形式传感器的准确度不高,一般为1/100,称量范围为几十至几万千克。 振动式传感器弹性元件受力后,其固有振动频率与作用力的平方根成正比。测出固有频率的变化,即可求出被测物作用在弹性元件上的力,进而求出其质量。振动式传感器有振弦式和音叉式两种。 振弦式传感器的弹性元件是弦丝。当承重台上加有被测物时,V形弦丝的交点被拉向下,且左弦的拉力增大,右弦的拉力减小。两根弦的固有频率发生不同的变化。求出两根弦的频率之差,即可求出被测物的质量。振弦式传感器的准确度较高,可达1/1000~1/10000,称量范围为100克至几百千克,但结构复杂,加工难度大,造价高。 音叉式传感器的弹性元件是音叉。音叉端部固定有压电元件,它以音叉的固有频率振荡,并可测出振荡频率。当承重台上加有被测物时,音叉拉伸方向受力而固有频率增加,增加的程度与施加力的平方根成正比。测出固有频率的变化,即可求出重物施加于音叉上的力,进而求出重物质量。音叉式传感器耗电量小,计量准确度高达1/10000~1/200000,称量范围为500g~10kg。 陀螺仪式传感器,转子装在内框架中,以角速度ω绕X轴稳定旋转。内框架经轴承与外框架联接,并可绕水平轴Y倾斜转动。外框架经万向联轴节与机座联接,并可绕垂直轴Z旋转。转子轴(X轴)在未受外力作用时保持水平状态。转子轴的一端在受到外力(P/2)作用时,产生倾斜而绕垂直轴Z 转动(进动)。进动角速度ω与外力P/2成正比,通过检测频率的方法测出ω,即可求出外力大小,进而求出产生此外力的被测物的质量。陀螺仪式传感器响应时间快(5秒),无滞后现象,温度特性好(3ppm),振动影响小,频率测量准确精度高,故可得到高的分辨率(1/100000)和高的计量准确度(1/30000~1/60000)。 电阻应变式传感器利用电阻应变片变形时其电阻也随之改变的原理工作。主要由弹性元件、电阻应变片、测量电路和传输电缆4部分组成。电阻应变片贴在弹性元件上,弹性元件受力变形时,其上的应变片随之变形,并导致电阻改变。测量电路测出应变片电阻的变化并变换为与外力大小成比例的电信号输出。电信号经处理后以数字形式显示出被测物的质量。电阻应变式传感器的称量范围为300g至数千Kg,计量准确度达1/1000~1/10000,结构较简单,可靠性较好,大部分电子衡器均使用此传感器。2.称重传感器的选择 传感器种类繁多,分类方式也千差万别,它们都有各自的特点,但在设计电子秤时,选择一种合适的传感器非常重要,传感器的性能在很大程度上决定了电子秤的精确度和稳定性。称重传感器的选择主要从以下几个方面考虑。(1)对传感器数量和量程的选择 传感器数量的选择是根据电子秤的用途、秤体需要支撑的点数(支撑点数应根据使秤体几何重心和实际重心重合的原则而确定)而定。一般来说,秤体有几个支撑点就选用几只传感器,但是对于一些特殊的秤体,如电子吊秤,就只能采用一个传感器,一些机电结合秤就应根据实际情况来确定选用传感器的个数。传感器的量程选择可依据秤的最大称量值、选用传感器的个数、秤体自重、可产生的最大偏载及动载因素综合评价来决定。一般来讲,传感器的量程越接近分配到每个传感器的载荷,其称量的准确度就越高。但是在实际的使用当中,由于加在传感器上的载荷除被称物体外,还存在秤体自重、皮重、偏载及振动冲击等载荷,因此选用传感器时,要考虑诸多方面的因素,保证传感器的安全和寿命。公式2-1给出了传感器量程选择的计算公式。 K0K1K2K3WmaxWC N(2-1) 式中C—单个传感器的额定量程;W—秤体自重;Wmax一被称物体净重的最大值;N—秤体所采用支撑点的数量;K0—保险系数,一般取1.2~1.3之间;K1—冲击系数;K2—秤体的重心偏移系数;K3—风压系数(2)传感器准确度等级的选择 传感器的准确度等级概括了传感器的非线性、蠕变、蠕变恢复、滞后、重复性、灵敏度等技术指标。称重传感器已按准确度等级划分,且已考虑了0.7倍误差因子,非自动衡器称重传感器的准确度等级要选择与电子秤相对应的准确度等级。称重传感器按综合性能分为A、B、C、D四个准确度等级,分别对应于衡器Ⅰ、Ⅱ、Ⅲ、Ⅳ四个准确度等级。 (3)各种类型传感器的使用范围 称重传感器形式的选择主要取决于称重的类型和安装空间,保证安装合适,称重安全可靠;另一方面要考虑厂家的建议。对于传感器制造厂家来讲,它一般规定了传感器的受力情况、性能指标、安装形式、结构形式、弹性体的材质等。譬如铝合金悬臂梁传感器适合于电子计价秤、平台秤、案秤等;钢式悬臂梁传感器适用于电子皮带秤、分选秤等;钢质桥式传感器适用于轨道衡、汽车衡等;柱式传感器适用于汽车衡、动态轨道衡、大吨位料斗秤等。(4)使用环境 称重传感器实际上是一种将质量信号转换成可测量的电信号输出装置。用传感器首先要考虑传感器所处的实际工作环境,这点对于正确选用传感器至关重要,它关系到传感器能否正常工作以及它的安全和使用寿命,乃至整个衡器的可靠性和安全性。一般情况下,高温环境对传感器造成涂覆材料融化、焊点开化、弹性体内应力发生结构变化等问题;粉尘、潮湿对传感器造成短路的影响;在腐蚀性较高的环境下会造成传感器弹性体受损或产生短路现象;电磁场对传感器输出会产生干扰。相应的环境因素下我们必须选择对应的称重传感器才能满足必要的称重要求。3.电阻应变式称重传感器 按照称重传感器选择的指标要求,以及对各种传感器的比较,本设计选定电阻应变片式传感器,下面对此类传感器做详细介绍。 电阻应变式称重传感器是把电阻应变计粘贴在弹性敏感元件上,弹性体(弹性元件,敏感梁)在外力作用下产生弹性变形,使粘贴在他表面的电阻应变片(转换元件)也随同产生变形,电阻应变片变形后,它的阻值将发生变化(增大或减小),再经相应的测量电路把这一电阻变化转换为电信号(电压或电流),从而完成了将外力变换为电信号的过程。 电阻应变式称重传感器包括两个主要部分,一个是弹性敏感元件:利用它将被测的重量转换为弹性体的应变值;另一个是电阻应变计:它作为传感元件将弹性体的应变,同步地转换为电阻值的变化。电阻应变片所感受的机械应变量一般为10-6~10-2,随之而产生的电阻变化率也大约在10-6~10-2数量级之间。这样小的电阻变化用一般测量电阻的仪表很难测出,必须采用一定形式的测量电路将微小的电阻变化率转变成电压或电流的变化,才能用二次仪表显示出来。在电阻应变式称重传感器中通过桥式电路将电阻的变化转换为电压变化。当传感器不受载荷时,弹性敏感元件不产生应变,粘贴在其上的应变片不发生变形,阻值不变,电桥平衡,输出电压为零;当传感器受力时,即弹性敏感元件受载荷P时,应变片就会发生变形,阻值发生变化,电桥失去平衡,有输出电压。图2-2为电阻应变式称重传感器桥式测量电路。 图2-2 电阻应变式称重传感器桥式测量电路 R1、R2、R3、R4为4个应变片电阻,组成了桥式测量电路,Rm为温度补偿电阻,e为激励电压,V为输出电压。若不考虑Rm,在应变片电阻变化以前,电桥的输出电压为: R4R1Ve R1R2R3R4(2-2) 由于桥臂的起始电阻全等,即R1=R2=R3=R4=R,所以V=0。当应变片的电阻R1、R2、R3、R4变成R+△R1、R+△R2、R+△R3、R+△R4时,电桥的输出电压变为: RR1RR4Ve RR1RR2RR3RR4(2-3) 通过化简,上式则变为: VeR1R2R3R4 4RRRR(2-4) 也就是说,电桥输出电压的变化与各桥臂电阻变化率的代数和成正比。如果四个桥臂应R变片的灵敏系数相同,且=Kε,则上式又可写成: R VeK1234 4(2-5) 式中K为应变片灵敏系数,ε为应变量。式2-5表明,电桥的输出电压和四个轿臂的应变片所感受的应变量的代数和成正比。在电阻应变式称重传感器中,4个应变片分别贴在弹性梁的4个敏感部位,传感器受力作用后发生变形。在力的作用下,R1、R3被拉伸,阻值增大,△R1、△R3正值,R2、R4被压缩,阻值减小,△R2、△R4为负值。再加之应变片阻值变化的绝对值相同,即 因此 VeK4eK 4R1R3R或13 R2R4-R或24 (2-6)(2-7) (2-8) 若考虑Rm,则电桥的输出电压变成: 令Su V,则 eSuRK R2RmRRRRRRVeKe 2RR2RmR2Rm2R(2-9) (2-10) Su称为传感器系数或传感器输出灵敏度。 对于一个高精度的应变传感器来说,仅仅靠4个应变片组成桥式测量电路还是远远不够的。由于弹性梁材料金相组织的不均匀性及热处理工艺、应变片性能及粘贴工艺、温度变化等因素的影响,传感器势必产生一定的误差。为了减少传感器随温度变化产生的误差,提高其精度和稳定性,需要在桥路两端和桥臂中串入一些补偿元件。如:初始不平衡值的补偿、零载输出温度补偿、输出灵敏度温度补偿等。 2.3.3 A/D转换器的选定 在实际的测量和控制系统中检测到的常是时间、数值都连续变化的模拟量,模拟量要输入到单片机中进行处理,首先要经过模拟量到数字量的转换,单片机才能接收、处理。目前有多种类型的A/D转换器,其类型有积分型、逐次逼近型、并行比较型、Σ- Δ调制型、压频变换型等。多种类型的ADC各有其优缺点,并能满足不同的具体要求。1.A/D转换器的分类:(1)积分型 积分型ADC工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。其优点是用简单电路就能获得高分辨率,但缺点是由于转换精度依赖于积分时间,因此转换速率极低。初期的单片AD转换器大多采用积分型,现在逐次比较型已逐步成为主流。(2)逐次逼近型 逐次逼近型ADC由一个比较器和D/A转换器通过逐次比较逻辑构成,从MSB开始,顺序地对每一位将输入电压与内置D/A转换器输出进行比较,经n次比较而输出数字值。其电路规模属于中等。其优点是速度较高、功耗低,在低分辩率(<12位)时价格便宜,但高精度(>12位)时价格很高。(3)并行比较型/串并行比较型 并行比较型ADC采用多个比较器,仅作一次比较而实行转换,又称Flash(快速)型。由于转换速率极高,n位的转换需要2n-1个比较器,因此电路规模也极大,价格也高,只适用于视频AD转换器等速度特别高的领域。串并行比较型AD结构上介于并行型和逐次比较型之间,最典型的是由2个n/2位的并行型AD转换器配合DA转换器组成,用两次比较实行转换,所以称为 Half flash(半快速)型。还有分成三步或多步实现AD转换的叫做分级型ADC,而从转换时序角度又可称为流水线型ADC,现代的分级型AD中还加入了对多次转换结果作数字运算而修正特性等功能。这类AD速度比逐次比较型高,电路规模比并行型小。(4)Σ-Δ调制型 Σ-Δ型AD由积分器、比较器、1位DA转换器和数字滤波器等组成。原理上近似于积分型,将输入电压转换成时间(脉冲宽度)信号,用数字滤波器处理后得到数字值。电路的数字部分基本上容易单片化,因此容易做到高分辨率。主要用于音频和测量。(5)压频变换型 压频变换型是通过间接转换方式实现模数转换的。其原理是首先将输入的模拟信号转换成频率,然后用计数器将频率转换成数字量。从理论上讲这种AD的分辨率几乎可 以无限增加,只要采样的时间能够满足输出频率分辨率要求的累积脉冲个数的宽度。其优点是分辩率高、功耗低、价格低,但是需要外部计数电路共同完成AD转换。2.A/D转换器选用的原则: (1)A/D转换器的位数。A/D转换器决定分辨率的高低,在系统中,A/D转换器的分辨率应比系统允许引用误差高一倍以上。 (2)A/D转换器的转换速率。不同类型的A/D转换器的转换速率大不相同。积分型的转换速率低,转换时间从几豪秒到几十毫秒,只能构成低速A/D转换器,一般用于压力、温度及流量等缓慢变化的参数测试。逐次逼近型属于中速A/D转换器,转换时间为纳秒级,用于个通道过程控制和声频数字转换系统。 (3)是否加采样/保持器。 (4)A/D转换器的有关量程引脚。有的A/D转换器提供两个输入引脚,不同量程范围内的模拟量可从不同引脚输入。 (5)A/D转换器的启动转换和转换结束。一般A/D转换器可由外部控制信号启动转换,这一启动信号可由CPU提供。转换结束后A/D转换器内部转换结束信号触发器置位,并输出转换结束标志电平,通知微处理器读取转换结果。 (6)A/D转换器的晶闸管现象。其现象是在正常使用时,A/D转换器芯片电流骤增,时间一长就会烧坏芯片。 2.3.4 单片机型号的选定 1.单片机选定准则 市场上的单片机型号很多,功能也有差异,在选择单片机型号的时候主要应该注意以下几个方面:(1)市场货源 系统设计者只能在市场上能够提供的单片机中选择,特别是作为产品大批量生产的应用系统,所选的单片机型号必须有稳定、充足的货源。(2)单片机性能 应根据系统的功能要求和各种单片机的性能,选择最容易实现系统技术指标的型号,而且能达到较高的性能价格比。单片机性能包括片内硬件资源、运行速度、可靠性、指令系统功能、体积和封装形式等方面。影响性能价格比的因素除单片机的性能价格外,还包括硬件和软件设计的容易程度、相应的工作量大小,以及开发工具的性能价格比。(3)研制周期 在研制任务重、时间紧的情况下,还要考虑所选的单片机型号是否熟悉,是否能马上着手进行系统的设计。与研制周期有关的另一个重要因素是开发工具,性能优良的开发工具能加快系统地研制进程。2.AT89S51单片机介绍 根据以上对单片机选型知识的介绍,本设计选用AT89S51单片机,下面对此型号单片机进行简介。 AT89S51是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机。AT89S51是一种带4K字节闪烁可编程可擦除只读存储器的单片机,其指令集和传统的51单片机指令集是一样的。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。硬件设计 3.1 系统硬件结构图 图3-1为系统总体硬件结构方框图,系统共分为三大部分:数据采集模块、单片机控制模块以及键盘和显示模块。各模块所采用的主要芯片型号已于图中有所标示。 AD转换ADC0832AT89S51单片机最小系统超重报警模块4*4矩阵键盘LM4229液晶显示 图3-1 系统总体硬件设计方框图 3.2 单片机主控单元的设计 3.2.1 单片机引脚说明 AT89S51单片机芯片为40个引脚,图3-2为单片机AT89S51引脚图。下面简单叙述各引脚的功能。 VCC/GND:电源/接地引脚; P0口:P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端;P0还可以用作总线方式下的地址数据复用管脚,用来操作外部存储器。在这种工作模式下,P0口具有内部上拉作用。对内部Flash程序存储器编程时,接收指令字节、校验程序、输出指令字节时,要求外接上拉电阻; P1口:P1是一个带有内部上拉电阻的8位双向I/0端口,输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用; 另外,P1.0、P1.1可以分别被用作定时器/计数器2的外部计数输入(P1.0/T2)和触发输入(P1.1/T2EX);对内部Flash程序存储器编程时,接收低8位地址信息; P2口:P2是一个带有内部上拉电阻的8位双向I/0端口;输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用; P2口在存取外部存储器时,可作为高位地址输出;内部Flash程序存储器编程时,接收高8位地址和控制信息; P3口:P3是一个带有内部上拉电阻的8位双向I/0端口,输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。P3引脚功能复用见表3-1所示: 表3-1 P3口引脚功能复用 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 串行通讯输入(RXD)串行通讯输出(TXD)外部中断0(INT0)外部中断1(INT1)定时器0输入(T0)定时器1输入(T1)外部数据存储器写选通WR 外部数据存储器写选通RD RST:在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此管脚时,将使单片机复位。只要这个管脚保持高电平,51芯片便循环复位。复位后P0—P3口均置1,管脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序; XTAL1、XTAL2:XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz至24MHz内选择,电容取30PF左右。 ALE/PROG:访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节,即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6),在访问外部数据存储器时,出现一个ALE脉冲; PSEN:外部程序存储器的选通信号输出端。当AT89S51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲,即两次有效。但访问外部数据存储器时,将不 会有脉冲输出; EA/Vpp:外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使AT89S51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。 图3-2单片机AT89S51引脚图 3.2.2 AT89S51最小系统设计 单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统包括:单片机、晶振电路、复位电路。其中复位电路采用上电复位。其最小系统电路图见图3-3所示: 图3-3 单片机最小系统图 对于AT89S51单片机,其最小系统只需要电源、复位电路、时钟电路就能工作。由于我们的程序存储器(ROM)采用内部Flash存储单元,所以单片机上的EA接高。 微处理器系统在开始工作时必须对微处理器内部的寄存器等进行复位,使各个寄存器的值设为预定状态才能顺利开始工作。复位电路的好坏决定着单片机能否正常工作。复位电路基本功能是在系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。复位电路可以使用专用复位芯片,也可以用电阻电容搭建。本文从可靠性和成本考虑最终选用电阻电容来搭建复位电路。对于51内核的单片机,RST是复位信号输入端,高电平有效。当此输入端保持两个机器周期(24个时钟振荡周期)的高电平时,可以完成复位操作。 3.3 数据采集模块设计 3.3.1 传感器单元设计 根据第二章对各种类型传感器特性的介绍,本设计决定采用L-psⅢ型称重传感器,该传感器为双孔平衡梁形式,是制作电子计价秤的专用产品,也可用于制造由单只传感器构成的电子案秤、台秤及专用衡器等。其主要技术指如表3-2所示: 表3-2 L-psⅢ型称重传感器技术指标 额定载荷 灵敏度 准确度等级 最大分度数 最小检定分度值 综合误差 重复性 蠕变 最小静载荷 最大安全载荷 极限过载荷 输入电阻 输出电阻 温度补偿范围 使用温度范围 接线方式 Kg mV/V %F.S.%F.S.%F.S./30min %Fmax %Fmax %Fmax 3,6,10,20,30,50 1.8±0.08 C3 3000 Fmax/10000 0.02 0.01 ±0.017 1 150 200 415~445 349~355-10~+50-20~+60 ℃ ℃ 输入(+):红,输入(-):白,输出(+):绿 输出(-):蓝,屏蔽:黄 3.3.2 A/D转换单元设计 根据对各种A/D转换器的介绍与分析,本设计选定ADC0832作为本设计的A/D转 换模块。下面对该芯片的情况进行简要的介绍。 ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。具有体积小,兼容性强,性价比高的特点,具体参数如下: 8位分辨率; 双通道A/D转换; 输入输出电平与TTL/CMOS相兼容; 5V电源供电时输入电压在0~5V之间; 工作频率为250KHZ,转换时间为32uS; 一般功耗仅为15mW; 8P、14P-DIP(双列直插)、PICC多种封装; 商用级芯片温宽为0℃~70℃,工业级芯片温宽为-40℃~85℃; 1、下面对ADC0832的引脚进行说明,图3-4为该芯片的引脚图: 图3-4 ADC0832引脚图 CS—:片选端,低电平芯片使能; CH0:模拟输入通道0,或作为IN+/-使用; CH1:模拟输入通道1,或作为IN+/-使用; GND:芯片参考零点位(地); DI:数据信号输入,选择通道控制; DO:数据信号输出,转换数据输出; CLK:芯片时钟输入; Vcc/REF:电源输入及参考电压输入(复用)。 2、ADC0832的接口电路 正常情况下,ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI,但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO与DI并联在一根数据线上使用。单片机与ADC0832的接口电路如图3-5所示。 图3-5 单片机与ADC0832连接图 当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可以任意,当要进行A/D转换时,须先将CS使能端置于低电平并保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。 3.4 键盘和显示电路单元设计 3.4.1 键盘电路设计 在本设计中,采用的是4×4的矩阵式键盘,将单片机的P1.0-P1.3作为键盘的行线接口,P1.4-P1.7作为列线接口,列线通过电阻接+5V。商品的单价已由程序设定好,并 号连接。3.4.2 显示电路设计 3.5 系统总体原理图 可由键盘选择各种商品的价格。 图3-6所示,为完善其功能,电路中添加了上拉电阻。 图3-6 液晶显示模块LM4229与单片机接线图 在系统各部分的设计完成后,把各模块根据其功能和信号处理的流程连接起来,便得到系统总体设计的原理图,如图3-7所示,为简洁起见,其中的接线部分采用网络标本设计中显示部分采用了当今常用的LM4229液晶显示模块。其与单片机的接线如 措施。3.6 硬件抗干扰设计 图3-7 系统总体原理图 方面,但更重要的方面是外界干扰和接地引起的异常。 度。就单片机测控系统来讲,其主要干扰是来自电源和信号传输通道的干扰。用到称重传感器,所采用的应变式传感器是高阻抗器件,其绝缘性能、机械结构的稳定性等,直接影响工作特性的稳定。因此,应变片传感器的绝缘材料必须有很高的绝缘性统的可靠性更倍受人们的关注,这是因为系统的可靠性决定了系统能否达到所需要的精能、足够的机械强度、高形状稳定性及良好的抗湿性能。下面重点介绍单片机的抗干扰随着科学技术的迅速发展,人们对单片机测控系统的各种性能要求越来越高。而系本电子称重器的核心部件是单片机,所以我们的抗干扰措施主要是针对单片机。还电子秤在使用中,常常会出现各种各样的异常现象,电子秤本身的质量问题是一个 1、电源的抗干扰措施 普通用电中含有多种高次谐波,它们很容易经电源进入单片机系统,还有一些射频发射、电磁波等也会由电源线感应反馈进入单片机系统造成干扰。因此,在电源电路中必需采取有效地滤波措施,来抑制这些高频干扰的侵入。电源滤波的一般方法是在电源变压器初、次级分别设置低通滤波器和线间电容滤波器,使50Hz市电基波通过,而抑制掉高频信号。此外在变压器的初、次级之间均采用屏蔽层隔离,其中初级屏蔽层接大地,次级屏蔽层接系统逻辑地,以减少其分布电容,提高抗共模干扰的能力。 2、信号传输通道的抗干扰措施 信号传输通道包括系统的前向通道和后向通道,其主要干扰有:杂散电磁场通过感应和辐射方式进入通道的干扰;由于地阻抗耦合、漏电流等因素产生的加性干扰;以及因传输线衰减、阻抗失配等因素引起的乘性干扰。对于这三类干扰,可以采用以下几种措施加以排除。(1)光电隔离技术 光电耦合器对干扰信号具有良好的隔离性能,一是它的输入阻抗很小,约为100fl-lldl,而干扰源内阻则很大,通常为105Q~108Q,因此能分压到光电耦合器输入端的噪声很小;二是光电耦合器输入部分的发光二极管是在电流状态下工作的,即使干扰噪声有较高的电压幅度,但由于能量小,不能提供足够的电流使发光二极管发光而被抑制掉;三是光电耦合器的输入回路与输出回路之间分布电容极小,绝缘电阻很大,回路一边的干扰很难通过光电耦合器馈送到另一边去。因此,采用光电耦合器可将单片机与前向通道、后向通道及其他部分从电气上隔离开来,能有效地防止干扰信号的侵入。(2)接地技术 本系统既有模拟电路又有数字电路,因此数字地与模拟地要分开,最后只在一点相连,如果两者不分,则会互相干扰。(3)输入输出信号线采用屏蔽双绞线 屏蔽双绞线对于静电干扰和电磁干扰有很好的抑制作用,有条件的话应尽量采用。但使用中应注意: 线缆敷设时不要过分用力或使电缆打结、避免弯曲超过900、避免过紧地缠绕电缆,以保护双绞47线的扭绞状态; 做线时,避免损坏线缆的外皮、不要切坏线缆内的导线; 接线时,双绞线的开绞长度尽量小,不要超过20mm; 双绞线的屏蔽层采用设备端单端接地方式。系统软件设计 本系统程序使用模块化的程序设计思想,主程序通过调用子程序以实现各部分功能。先进行软件的总体设计,然后进行各功能模块设计。 4.1 主程序设计 电子秤需要有数据采集、处理、存结果、送显示的运行过程。根据这一要求,电子秤的信息采集与处理分三个阶段:在微处理器的控制下,经传感器转换的电压信号通过输入电路送入A/D转换器处理,存入到数据存储器中;微处理器对采集的测量数据进行必要的数据处理,把数据信号处理为显示所要求的信号格式,通过输出接口电路输出并显示。主流程图见图4-1所示: 开始单片机初始化、LM4229进入欢迎界面、ADC0832初始化载物台是否有重物Y单片机存储ADC0832采样值N是否输入商品代码按键Y单片机执行计算并将结果送LM4229显示N测量结束键是否按下Y结束N 图4-1 主程序流程图 4.2 LM4229液晶显示驱动程序 开始写入控制字写入初始行Y是否换行?N全部数据已写完?Y结束N 图4-2 LM4229液晶显示驱动程序流程图 LM4229液晶能够显示比较复杂的汉字和图形,首先必须对其写入控制操作字,包括图形的显示方式,字体的模式。然后写入初始行地址,指针自动左移,直到写完全部数据为止。 write_data(place&0xff);//写入地址高位 write_data(place/256);//写入地址低位 write_com(0x24);//地址设置 write_com(0xb0);//设置数据自动写 write_data(ASC_MSK[(c1-0x20)*16+k]);/*---例如:0的ASCII码为0x30, 在ASC_MSK中的位置为0x10*16---16字节字码依次写入LCD---*/ write_com(0xb2);//自动复位 place=place+30; 4.3 ADC0832采样程序 开始拉低CS、拉高CLKDATA右移八位?Y拉高CS、拉低CLK,返回数据N结束 图4-3 ADC0823采样程序流程图 单片机通过拉低CS、拉高CLK来启动ADC0832进行外部压力传感转换后的电压信号进行采样,每产生8个CLK脉冲,DATA获得一位完整的8bit数据,此时MCU发送中断请求,拉高CS,拉低CLK,并将数据DAT返回。 4.4 键盘程序 本设计中采用了4×4矩阵式键盘,单片机定时进行查询。首先单片机发送行扫描代码,然后进行列扫描,当发现某一列出现了低电平时,即返回相应的键盘值。若没有发现则说明当前行没有键按下,行扫描右移一位,继续执行列扫描。 开始发送行扫描码发送列扫描码右移一位右移一位列扫描完毕?NYN行扫描完毕?Y返回键值结束图4-4 键盘程序流程图 系统仿真 在系统硬件与软件全部设计完成的情况下,将系统在protues7.5环境下进行了软件仿真,以确保本设计方案的可行性与准确性。因为在仿真时不能实际的把物体放到称重台上,所以在仿真时采用直接输入模拟电压信号的方法,来代替信号的采集。 5.1 欢迎界面的仿真 开始仿真时,先将用C语言编写的程序用Keil软件进行编译,生成可执行程序,然后装入单片机中进行仿真,按开始按钮,单片机及其他各部分电路开始工作,单片机调用内部存储数据对各部分接口电路初始化。200ms后LM4229进入欢迎界面,如图5-1所示。 图5-1 电子秤欢迎界面仿真 5.2 无重物情况仿真 欢迎界面过后,电子秤进入称重界面。此时,ADC0832不断对外部数据进行采样交给单片机进行处理,一旦有物品放入载物台,ADC0832立即发送中断请求,并将本次采集数据交给单片机进行处理。调节压力传感模拟电路电压,将电压设为0.00表示此时载物台上没有物体。此时LM4229显示指示“实用电子秤,名称······单价:0.000元/千克,总重量:0.000千克,总价:00.000元”。如图5-2所示。 图5-2 无重物称重界面仿真 5.3 称量物体仿真 上调压力传感电压,表示已有商品放在载物台上,ADC0832立即发送中断请求,并将本次采集的数据交给单片机进行处理,之后送入LM4229显示相应数据量。在此过程中,键盘不断进行扫描,一旦有键按下,单片机便对其数据进行相应处理,然后将对LM4229进行写操作。此时,按下键盘,选择相应的商品。如按下3号键,选择草莓,此时LM4229上显示“名称:草莓,单价:3.6元/千克,总重量:2.499千克,总价:“8.999元”(实际3.6×2.499=8.999元)。达到基本要求。如图5-3所示。当要称量下一种不同商品的时候,只需按下0键,选择商品代码,再按下相应商品键。 图5-3 称重情况仿真 5.4 最大量程仿真 将称重传感器调节到最大,显示最大称量,其结果如图5-4所示。由于元件及系统的误差,使得最大量程不能达到预定的5Kg,而是4.980Kg,这是在误差允许范围内的,符合要求。因为本设计添加了超重报警模块,所以在称量的过程中,一旦物体自身的重量超出电子秤的称量范围,蜂鸣器立即会发出“滴滴····”,警报声告诉工作人员,所称量物品超重。 图5-4 最大量程仿真 5.5 仿真总结与问题补充 5.5.1 仿真总结 以上,我们进行了几种基本情况的仿真,总结仿真的过程,我们可以得出以下结论: 1、该电子秤设计简单,操作方便,可以很容易的进行称量; 2、由于元件设置的原因,使电子秤的量程未达到预设的范围; 3、各商品的价格已在程序中设定好,既给称量带来了方便,也带来了麻烦,使得称量其他物品时需要修改程序。 5.5.2 问题补充 因为本设计采用软件仿真的方法,而不能进行实际的称量,所以采用了直接输入电压信号的方式代替了传感器采集的信号。但是经传感器采集的信号通常很小,需要通过前端信号处理电路进行准确的线性放大。放大后的模拟电压信号经过滤波电路和A/D转换电路转换成数字信号才被送入到主控电路的单片机中进行处理。在实际称量中,可以加入放大滤波电路如图5-5所示。 图5-5 放大滤波电路 图5-5为放大滤波电路的设计。放大器采用放大芯片AD620电容C1、C3用来滤除 采样信号电压中的低频噪声,选用22uF的普通独石电容;电容C2、C4用来滤除采样信号电压中的高频噪声,选用0.1uF的普通独石电容。因为采样信号电压值只有毫伏级,所以电阻R1、R2选用较小的阻值,否则导致放大器由于输入电流太小而放大效果不明显。微弱信号Vi1和Vi2被分别放大后从AD620的第6脚输出。 总结与展望 电子称重器是贸易市场中的常见的称重计量仪器。本文先说明了称重器的设计思路,并介绍了几种设计方案,选择了其中一种简单可行的方案。然后从电子秤的核心部件称重传感器的介绍开始,逐个进行各个模块器件的论证与选择。后面详细介绍了电子秤的硬件以及软件设计。 本设计为小量程(0~5Kg)称量器件,可以广泛应用于商店、菜市场等场合。在硬件部分设计过程中选用了A/D转换芯片ADC0832和LM4229液晶显示,大大简化了硬件电路及软件编程,并提高了系统的准确性和稳定性。人机界面部分由液晶显示与4×4位矩阵键盘组成,可以由键盘控制显示商品名称、重量和价格等信息,操作简单方便。软件设计中使用了C语言编程,便于修改和应用。 本次设计的电子称重器还存在一些缺点与不足,主要以下这两点:一是量程仅是5Kg,从而限制了该电子秤的使用范围。可采用大量程的称重传感器,但同时需要提高A/D转换芯片的位数,以保持精度。二是商品的种类与价格已编入程序,给称量其它的商品带来不便。三是本次设计没有完成实物的制作,从而不能预见商业产品开发中的所有问题,需要进一步研究。 通过这次电子秤的设计,我对所学的专业课知识有了更深的理解,尤其是单片机方面。在设计过程中,查阅了大量的中外文资料,解决了不少难题。另外本次设计提升了我分析问题解决问题的能力,增强了对学习的信心,相信这对我以后的工作和学习有重要的帮助。 附录程序 #include unsigned int sbit ADCS =P3^5;sbit ADDI =P3^7; sbit ADDO =P3^7; sbit ADCLK =P3^6; uint x1,y1,z1=0,w1;uchar ad_data,k,n,m,e,num,s; //采样值存储 uint temp1;sbit beep =P3^0; char press_data; //标度变换存储单元 float press;unsigned char ad_alarm,temp; //报警值存储单元unsigned char abc[5]={48,46,48,48,48};unsigned char price_all[6]={48,48,46,48,48,48};float price_unit[10]={5.5,2.8,3.6,4.5,2.4,4.2,3.8,6.0,1.5,0}; //商品初始单价 uchar price_danjia[5]={48,46,48,48,48};float price;uint price_temp1,price_temp2; //商品总价 uchar Adc0832(unsigned char channel); void alarm(void);void data_pro(void);void delay(uint k);void keyscan(); void disp_init();void price_jisuan();/************ 主函数 ************/ void main(void){ delay(500); //系统延时500ms启动 //ad_data=0; //采样值存储单元初始化为0 lcd_init(); //显示初始化 disp_init(); //开始进入欢迎界面 delay(1000); //延时进入称量画面 clear_lcd(0,4,40); clear_lcd(16,0,100); clear_lcd(28,0,40); clear_lcd(44,0,100); clear_lcd(56,0,40); clear_lcd(72,0,100); clear_lcd(84,0,40); clear_lcd(100,0,100); clear_lcd(112,0,40); write_lcd(0,8,“实用电子秤”); while(1) { ad_data =Adc0832(0); //采样值存储单元初始化为0 alarm(); data_pro();//读取重量 keyscan();//查询商品种类 write_lcd(40,0,“------------------------------”); write_lcd(56,0,“单 价:”); write_lcd(56,11,price_danjia); write_lcd(56,20,“元/千克”); write_lcd(72,0,“总重量:”); write_lcd(72,11,abc); write_lcd(72,20,“千克”); write_lcd(88,0,“总 价:”); price_jisuan(); //计算出价格 write_lcd(88,10,price_all); write_lcd(88,20,“元”); write_lcd(112,0,“设计学生:1210401038 谢玉夏”);} } /************ 读ADC0832函数 ************/ //采集并返回 uchar Adc0832(unsigned char channel) //AD转换,返回结果 { uchar i=0; uchar j; uint dat=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低CS端 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉搞CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高数据端,回到初始状态 dat<<=8; dat|=ndat; return(dat); //return ad k } void data_pro(void){ unsigned int; if(0 { int vary=ad_data; press=(0.019531*vary); temp1=(int)(press*1000); //放大1000倍,便于后面的计算 abc[0]=temp1/1000+48; //取压力值百位 abc[1]=46; abc[2]=(temp1%1000)/100+48; //取压力值十位 abc[3]=((temp1%1000)%100)/10+48; //取压力值个位 abc[4]=((temp1%1000)%100)%10+48;//取压力值十分位 } } /*****************报警子函数*******************/ void alarm(void){ if(ad_data>=256) beep=0; //则启动报警 else beep=1; } void delay(uint k){ uint i,j; for(i=0;i for(j=0;j<100;j++);} //开机欢迎界面 void disp_init(){ write_lcd(0,8,“欢迎使用电子秤”); write_lcd(16,0,“------------------------------”); write_lcd(28,0,“设计学生:谢玉夏”); write_lcd(44,0,“------------------------------”); write_lcd(56,0,“班级学号:1210401038”); write_lcd(72,0,“------------------------------”); write_lcd(84,0,“指导老师:刘志芳”); write_lcd(100,0,“------------------------------”); write_lcd(112,0,“设计日期:2014年12月”); } //键盘服务程序 void keyscan(){ P1=0xfe; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num=1,price=price_unit[0], write_lcd(24,0,“名 break;case 0xde:num=2,price=price_unit[1],write_lcd(24,0,”名 break;case 0xbe:num=3,price=price_unit[2],write_lcd(24,0,“名 break;case 0x7e:num=4,price=price_unit[3],write_lcd(24,0,”名 break; } while(temp!=0xf0) { 称: 杏称: 李 称: 草 称: 葡 仁“);子”);莓“);萄”); temp=P1; temp=temp&0xf0; } } } P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xed:num=5,price=price_unit[4],write_lcd(24,0,“名 break;case 0xdd:num=6,price=price_unit[5],write_lcd(24,0,”名 break;case 0xbd:num=7,price=price_unit[6],write_lcd(24,0,“名 break;case 0x7d:num=8,price=price_unit[7],write_lcd(24,0,”名 break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb; temp=P1; temp=temp&0xf0; 称: 西称: 苹称: 雪称: 核 瓜“);果”);梨“);桃”); 成都大学电子信息工程学院 07级单片机课程设计 题目:简单51单片机数字时钟设计 院 系: 电子信息工程 专 业:电信专业 班 级:08级电信本科三班 姓 名: 刘 涛 学 号:200810312340 老 师:杨加国 2010-6 成都大学电子信息工程学院 摘要 班级学号 ···········1 设计内容 ···········3 进度安排 ···········3 MCS-51单片机系统简介·····3 课程设计背景 ·········4 课程设计目的 ·········4 MCS-51单片机内部定时器/计数器中 断系统简介 ···········4 课程设计原理 ·········5 课程设计代码 ·········6 设计相关说明·········10 345 成都大学电子信息工程学院 MOV 20H,#0;秒个位寄存器清零 MOV 21H,#0;秒十位寄存器清零 MOV 22H,#0;分个位寄存器清零 MOV 23H,#0;分十位寄存器清零 MOV 24H,#0;时个位寄存器清零 MOV 25H,#0;时十位寄存器清零 LJMP DISPLAY TIMER_0: CLR EA INC R6 INC R5 MOV TH0,#03CH MOV TL0,#0B0H;重新赋初值,定时50ms SETB EA RETI ADD_TIME: CJNE R6,#20,EXIT;定时器中断20次,1秒到 MOV R6,#0 INC 20H MOV A,20H CJNE A,#10,EXIT;如果秒个位等于10,清零 MOV 20H,#00H INC 21H MOV A,21H CJNE A,#6,EXIT;如果秒十位等于6,清零 MOV 21H,#00H INC 22H MIN: MOV A,22H CJNE A,#10,EXIT;如果分个位等于10,清零 MOV 22H,#00H INC 23H MOV A,23H CJNE A,#6,EXIT;如果分十位等于6,清零 MOV 23H,#00H INC 24H HOUR: MOV A,25H CJNE A,#2,LOOP;如果时十位等于2,检查时个位 MOV A,24H CJNE A,#4,EXIT;如果时个位等于4,清零 MOV 24H,#00H;清零时个位 MOV 25H,#00H;清零时十位 成都大学电子信息工程学院 CLR P2.2 LCALL DELAY SETB P2.2;显示“-” MOV A,24H MOVC A,@A+DPTR MOV P0,A CLR P2.1 LCALL DELAY SETB P2.1;显示时个位 MOV DPTR,#TABLE1;该位使用TABLE1以消除前置0 MOV A,25H MOVC A,@A+DPTR MOV P0,A CLR P2.0 LCALL DELAY SETB P2.0;显示时十位 CJNE R5,#4,EXIT0;当R5到4时,扫描按键 MOV R5,#0 KEY_SCAN: JNB K1,ADD_HOUR JNB K2,ADD_MIN LJMP ADD_TIME;无键按下,跳至走时 ADD_HOUR: INC 24H;小时加1 LJMP HOUR;更新 ADD_MIN: INC 22H;分钟加1 LJMP MIN;更新 EXIT0: LJMP ADD_TIME DELAY: MOV R7,#150;扫描延时 DJNZ R7,$ RET TABLE:;数码管字形显示编码表 DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;字形显示编码 TABLE1: DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;小时位的十位数编码,该位如果为0则不显示 END;程序结束第三篇:基于51单片机电子时钟设计
第四篇:基于51单片机的电子秤设计
第五篇:简单的51单片机数字钟设计