遥控定时插座论文

更新时间:2024-05-25 12:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

山东大学(威海)

机电与信息工程学院

挑 战 杯

课题名称 遥控定时插座 专 业 测控技术与仪器 班 级 10级 学 号 201000800011 姓 名 胡旭东

2013年 3 月 20 日

目录

1.摘要……………………………………………………………………..….…..3 2. 前言……………………………………………….........................................….4 3.市场前景…………………………………………………………………….…...5

3.1 宏观环境分析.. ……………………………………………...…….…….5 3.2 微观环境分析……………………………………………………………5 3.3遥控定时插座与传统插座优劣势比较……………….…………………5 3.4遥控定时插座市场营销策略…………………………….………………5 4.系 统 设 计…………………………………………………………..…………7

4.1系统设计任务……………………………………………….……………7 4.2系统设计方案选择…………………………………………….…………7

4.2.1单片机芯片的选择……………………………………..…………7 4.2.2显示模块选择…………………………………………..…………7 4.2.3继电器选择………………………………………………..………8 4.2.4按键的选择………………………………………………...………8 4.2.5红外遥控控制方案选择…………………………………...………8

5.硬件电路设计及工作原理………………………………………………….……9

5.1主控制器MSP430…………………………………………………...……9 5.2升压电路…………………………………………………………………10 5.3LCD显示电路……………………………………………………………12 5.4红外遥控电路……………………………………………………………16 5.5继电器电路………………………………………………………………18 6.软件设计…………………………………………………………………...……18

6.1计时程序的编写…………………………………………………………19 6.2 LCD显示电路的编写……………………………………...……………21 6.3 主程序的编写………………………………………...…………………25 7.系统调试……………………………………………………………...…………27

7.1电路设计前期工作………………………………………………………27 7.2软件部分的调试…………………………………………………………27 7.3设计结果…………………………………………………………………28 7.4设计中存在的不足及其改进……………………………………………28 8. 结 束 语………………………………………………………….……………29 9.参考文献…………………………………………………………………………29 附录1 程序……………………………………………………………….….……30

2

1.摘 要

随着家用电器的越来越普及和人们生活节奏的加快,人们对电器的依赖性进一步提高,对电器的定时需求也进一步增大。定时开关插座可对路灯、广告灯、电饭煲、饮水机、水族箱、电热水器、电热毯、抽水机排气扇空调机、防盗器、台灯等多数用电器进行定时控制。

本设计主要是解决普通家电的智能化控制,主要描述一个遥控定时插座的设计与制作。该定时插座可以弥补现实生活中普通插座功能的不足,能够通过外设按键或遥控器设置插座的供电时间,使外接电器可以按照一定规律工作,既可以达到智能控制的目的,又在很大程度上起到节能的作用。

关键词

MSP430;定时;插座;红外遥控;继电器;LCD1602

Abstract

This paper mainly describes the design and production of a timing socket. The timing socket could compensate for the shortage of the common socket .It also could set any timding in a day and six grouds of fast timing by the key.At the same time,it could also be remotly controlled through infrared remote control so that home applianes could work according to certain rules.In this way, it can achieve the purpose of being intelligently controlled and will largely save the electric energy.

Key Words

MSP430; Timing; Socket; Infrared; relay; LCD1602

3

2.前 言

电,是现代人生活中,不可或缺的能源。近年来地球气候日益变暖,国家也越来越提倡节能减排、绿色环保,节约用电正作为一个新的方面纳入议题,各种节能、节电产品层出不穷,这在一定程度上也促进了我国节能环保事业的发展,然而,这些产品的节电程度如何,怎样在已有的基础上进一步做到节电,这仍旧是我们不断追求的。根据对现今市场上已经存在的节电设备以及对部分用电产品的考查,我们提出了定时插座的想法,解决某些特殊原因给我们的生活或工作带来一些困扰和遗憾。比如:家中的水塔忘记抽水而造成生活的一时不便;学校的起床广播因值班人员睡过头而推迟广播;家中的鱼缸因太久没有供氧造成鱼儿缺氧死亡;许多球迷或者新闻爱好者因为错过了开机时间而与精彩球赛或者新闻擦肩而过;夏天里风扇的定时时间过短(一般为1个小时),不便于晚上分段定时使用等等。而上面的这些问题都可以通过定时开关插座的定时功能得到解决。 定时插座可对任何电器进行定时控制,方便我们的日常生活。

4

3.市 场 前 景

3.1 宏观环境分析

近年来,随着我国科学发展观的贯彻执行,绿色的发展理念正在被越来越多控制能源消费总量,改善环境质量,维护人民健康。在倡导节能减排的宏观经济环境下,遥控定时插座一经推广,必然会受到企业的支持,因而有着广阔的发展前景。

3.2 微观环境分析

随着人们文化素质的不断提升,绿色消费理念在人们的脑海中逐渐萌芽。遥控定时插座在节能的同时也能减少消费者的电费支出,因而与传统的插座相比,遥控定时插座有着巨大的优势。

3.3遥控定时插座与传统插座优劣势比较

遥控定时插座 ?节电 ?可保护电池,延长电池寿命 ?能够实现远距离遥控 传统插座 成本相对较低 ?费电 ?损害电池 ?无法远距离遥控

优势 成本相对较高 劣势 3.4遥控定时插座市场营销策略

在电器普及的今天,插座作为一种日常生活用品,存在于家家户户。因而我们所研发的遥控定时插座的目标消费者为普通老百姓。任何需要插座的人都是我们的潜在顾客。针对改进的新产品,我们设计了如下市场营销策略。

5

3.4.1产品策略

我们所研发的遥控定时插座属于在原有普通插座上加以改进而来的新产品。与传统插座相比,该款插座可以定时断电,减少了电能的损耗,延长了电器的电池寿命。同时,其附带的遥控板也可以实现远程控制,为消费者带来了巨大的便利性。为了是其能够在市场上顺利的得意推广,我们认为应该在保证以上功能的前提下提高产品质量,增强产品的安全性,并尽可能的将其打造成一个插座行业的知名品牌。

3.4.2价格策略

在定价时,我们采用成本定价和竞争导向定价相结合的定价方法,在考虑成本、保证利润的前提下,尽量缩小与普通插座的价格差别。虽然我们所研发的遥控定时插座在成本上会高于普通插座,但是因为它属于日常消费品,有着众多的目标顾客和巨大的市场空间,因而可以通过大规模标准化批量生产减少其成本,尽量缩短其与普通插座的价差。

3.4.3分销策略

在分销渠道的选择上,我们会利用普通插座的分销渠道,如各个商店、超市、小卖店等,做到只要有普通插座的地方就有遥控定时插座。

3.4.4 促销策略

在新产品刚推入市场时,我们会选择公共关系和广告等促销策略。通过权威部门对节能减排的呼吁和在电视上做一些公益广告来达到初期扩大产品知名度的需要。

6

4.系 统 设 计

4.1系统设计任务

设计一个以单片机MSP430控制的定时开关插座,要求能控制一路220V/10A的插座,使其可以在24小时内能预先设定定时范围,控制用电器具的自动关闭,同时还能通过红外遥控随时控制插座的开关,从而达到方便、智能、节电的目的。

4.2系统设计方案选择

4.2.1单片机芯片的选择

与其余厂家的MCU比较可得,MSP430是一款非常低功耗的单片机。MSP430 单片机具有超低的功耗,是因为其在降低芯片的电源电压和灵活而可控的运行时钟方面都有其独到之处。首先,MSP430 系列单片机的电源电压采用的是1.8-3.6V 电压。因而可使其在1MHz 的时钟条件下运行时,芯片的电流最低会在165μA左右,RAM 保持模式下的最低功耗只有0.1μA。其次,独特的时钟系统设计。在 MSP430 系列中有两个不同的时钟系统:基本时钟系统、锁频环(FLL 和FLL+)时钟系统和DCO数字振荡器时钟系统。可以只使用一个晶体振荡器(32768Hz),也可以使用两个晶体振荡器。由系统时钟系统产生 CPU 和各功能所需的时钟。并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。由于系统运行时开启的功能模块不同,即采用不同的工作模式,芯片的功耗有着显著的不同。在系统中共有一种活动模式(AM)和五种低功耗模式(LPM0~LPM4)。在实时时钟模式下,可达2.5μA ,在RAM 保持模式下,最低可达0.1μA .

4.2.2显示模块选择

采用LCD1602液晶显示。LCD1602液晶能够同时显示16*02即32个字符,1602液晶显示模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等。

7

4.2.3继电器选择

采用SONGLE SRD-05VDC-SL-C继电器。该继电器最大可以耐压交流250V,最大可通过10A的交流电流。继电器输出一般都是弱电控制的强电,普通继电器相当于一个单刀双掷开关,控制外部电路的有三个管脚,不通控制电流时(默认状态)中间管脚接通一个左边管脚,通入控制电流时中间管脚接通右边管脚,继电器的吸合是要电流作用于电磁铁,由于这个电流不小,所以单靠单片机I/O口是不足以使继电器吸合的,应该加一个驱动(起功率放大作用,给继电器提供足够的电流),再单片机用I/0口来控制驱动。故在电路中起着自动调节、安全保护、转换电路等作用,实现小电压控制大电压的目的。

4.2.4WiFi模块的选择

由于自主开发wifi模块成本较高,所以采用市场上已有的wifi模块

TI CC3200方案:采用TI方案,品质和供货均有保证,基于ARM Cortex-M4

内核,运行频率高达80MHz;

超低功耗:在网功耗低至3.5mA,深度休眠最低25uA;

8

插座采用无线通信与联网,然后数据通过云端进行控制,手机通过联网来进行管理。在传统插座端集成无线通信模组,连接到家里的路由器,通过路由器把数据分享到小米云端,手机通过登录小米云端进行控制。

开放SDK:TI CC3200是一颗强大的MCU,可以直接用内部资源而省掉外部的单片机,支持用户根据TI的SDK自行开发,后期也支持利用“有人”封装的SDK二次开发;

超小尺寸:只有一个拇指大小,18.22*26.65*2.8(mm); 高速UART:波特率最高支持3M bps; Simplelink:一键联入Wi-Fi网络;

4.2.5红外遥控控制方案选择

本系统采用已编码的38kHz红外遥控器发射接收模块,介于自制红外编码发送接收模块的设计复杂,成本也会增加不少,因而采用已编码完成的红外遥控器和红外接收管实现红外控制的目的。

5.硬件电路设计及工作原理

定时插座系统在未设置任何定时的时候显示界面00:00:00,通过App应用可设置在24小时内的定时模式,控制插座的开关,从而控制外部电器的工作与否。红外遥控要实现的就是通过App应用控制定时开关插座的定时功能。 总体的硬件电路框图如下图所示:

9

5V稳压模块 MSP430 继电器模块 内部时钟 计时模块 液晶显示模红外接收模块 WiFi网络模块

5.1主控制器MSP430

MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7 种源操作数寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。这些特点保证了可编制出高效率的源程序。 运算速度快

MSP430 系列单片机能在25MHz晶体的驱动下,实现40ns的指令周期。16位的数据宽度、40ns的指令周期以及多功能的硬件乘法器(能实现乘加运算)相配合,能实现数字信号处理的某些算法(如 FFT 等)。 超低功耗

内部时钟 计时模块:

·8031中的计数器除了可以作为计数之用外,还可以用作时钟,时钟的用途当然很大,如打铃器,电视机定时关机,空调定时开关等等,那么计数器是如何作为定时器来用的呢?

一个闹钟,我将它定时在1个小时后闹响,换言之,也可以说是秒针走了(3600)次,所以时间就转化为秒针走的次数的,也就是计数的次数了,可见,计数的次数和时间之间的确十分相关。那么它们的关系是什么呢?那就是秒针每一次走动正好是1秒。

10

图1 MSP430单片机引脚图

5.2升压电路

当前3.3V供电的系统已经十分常见了,并且差不多超过了5V供电系统的应用,而5V系统依然存在,这就造成了现在许多系统中出现3.3V供电和5V供电同时存在的现象,这也就给我们提出了对3.3V和5V两种电平进行相互转换的课题。3.3V向5V的转换因为3.3V和5V系统的逻辑电平是统一的,所以大多数场合是不需要做转换。但是在一些特殊的场合,特别是一些需要5V驱动的场合,就必须要求实现3.3V向5V的完全转换。比较简单的分离电路如下:

图2 电压转换电路图

11

从图中我们可以看出,关键在于二极管的应用。当逻辑低电平,即3.3IN = 0V时,二极管导通,5OUT = 0.6V符合要求,这是不难理解的。关键是当逻辑高电平,即3.3IN = 3.3V时,二极管能截至吗?如果能截至则5OUT = 5V。因为我们平常受发光二极管点亮需要几mA电流的影响,当我们一算导通电流是(5-3.3-0.6)/10K = 0.11mA时,则会认为此时电流太小二极管是不会导通的,即此时二极管是截至的。但是,如果我们翻一下模电的书,我们就会发现,二极管根本不存在导通电流这样一个概念,只是存在正向导通电压这样的特性。这其实要从二极管的基本概念和构造说起,二极管在物理上是一个PN结,PN结之间只要加上超过门槛值的正向电压就可以出现电子的流动。这一点,我们从二极管的伏安特性曲线上也可以看出。

图3 二极管I-V曲线

普通的二极管比如IN4148的正向导通电压为1V,也就是说只要在二极管的正负极加上的正向电压超过1V则二极管就会导通。在上面的系统中5-3.3-0.6 = 1.1 〉1V。因此,当3.3IN = 3.3V时,图中的二极管肯定会导通的,输出 3.3V <= 5OUT <= 3.9V。那么,我们上面的电路不能实现3.3V向5V的转换了吗?通过上面的分析,我们可以发现用普通的二极管是肯定不能实现的,但是我们忘了我们还有另外一种熟悉的二极管,就是我们上面曾经提到过的发光二极管,它的基本物理结构和普通二极管是一样的,但是由于其要实现发光,这样它的正向导通电压至少要为1.7V,所以在这个电路中,我们只要把普通二极管换成发光二极管,当3.3IN = 3.3V时,发光二极管的正向电压小于正向导通电压1.7V,因此截至,这样5OUT = 5V。最终符合了我们的要求。

12

5.3LCD显示电路

本设计采用的是LCD1602字符型液晶显示器。LCD液晶显示器是一种低功耗的显示器件,它广泛应用于工业控制、消费电子及便携式电子产品中。它不仅省电,而且能够显示大量的信息,如文字、曲线、图形、动画等,其功能比数码管强大得多。

LCD1602液晶显示模块可同时显示16*2即32个字符,内部含有的字符发生存储器里面存储了160个不同的点阵字符图形,包括阿拉伯数字、英文字母的大小写、常用的符号和日文的片假名等,每个字符都有一个固定的代码,比如大小写英文字母的A的代码是01000001B(41H),显示模块在显示A时就把地址41H中的点阵字符图像显示出来,我们就能看到屏幕显示字母A了。

图4 为1602字符型液晶显示器实物图

1602LCD 分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图所示:

图5 为1602LCD 尺寸图

5.3.1引脚功能说明

13

1602LCD 采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表所示:

表1:引脚接口说明表 编号 1 2 3 4 5 6 7 8

第1脚:VSS 为地电源。 第2脚:VDD 接5V 正电源。

第3脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产

生“鬼影”,使用时可以通过一个10K 的电位器调整对比度。

第4脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和R/W 共同为低电平时可

以写入指令或者显示地址,当RS 为低电平R/W 为高电平时可以读忙信号,当RS 为高电平R/W 为低电平时 可以写入数据。

第6脚:E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。

符号 VSS VDD VL RS R/W E D0 D1 引脚说明 电源地 电源正极 液晶显示偏压信号 数据/命令选择端 读/写选择端 使能信号 Data I/O Data I/O 编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 Data I/O Data I/O Data I/O Data I/O Data I/O Data I/O 背光源正极 背光源负极 14

5.3.2 LCD1602的指令说明及时序

1602液晶模块内部的控制器共有11条控制指令,如下表所示:

表2:控制命令表

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

指令1:清显示,指令码01H,光标复位到地址00H 位置。 指令2:光标复位,光标返回到地址00H。

指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移

或者右移。高电平表示有效,低电平则无效。

指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标

的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时

双行显示F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM 地址设置。

15

指令8:DDRAM 地址设置。

指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为 低电平表示不忙。 指令10:写数据。 指令11:读数据。

5.3.3 LCD1602 的RAM 地址映射及标准字库表

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,下图是1602的内部显示地址。

图6 为1602LCD 内部显示地址

例如第二行第一个字符的地址是40H,那么是否直接写入40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H 中的点阵字符图形显示出来,我们就能看到字母“A”

16

5.4网络控制电路

这里使用的是已编码完成的红外遥控器如图7和对应的红外线接收管如图8所示

图7 红外遥控器 图3 1838T红外接收管

键盘 编码调制 LED 遥控发射器

光/电放大 解调 遥控接收器

解码

图9 红外遥控系统框图

如图9为红外遥控系统框图。遥控器的每个按键都已经经过编码,当发射器拨键开关拨到ON档时,即有遥控码发出(可以发送任意数字暂定为发送0AAH(二进制:10101010B),这种遥控码具有以下特征:采用脉宽调制的串行码,刚开始发送38K码5ms来判定发射码开始标志,以脉宽为1.5ms、间隔0.5ms、周期为2ms的组合表示二进制的“1”;以脉宽为0.5ms、间隔1.5ms、周期为2ms的组合表示二进制的“0”。

解码的关键是如何识别“0”和“1”,从位的定义我们可以发现接收判定“0”、“1”就是判定每个周期开始时低电平(注意发射与接收码正好反相)出现时间的长短,如果接收到为0的时间为1.5ms则为1,如果接收到0的时间为0.5ms则接收到的值为0。

图10为红外接收管电路,通过红外遥控即可通过单片机解码红外信号得出

17

对应的键码,执行相应的动作。

图10 红外接收电路

5.5继电器电路

本设计采用的是如图11所示的SONGLE SRD-05VDC-SL-C继电器,其参数如图所示。

图11 5V继电器

继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系

18

统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用,实现小电压控制大电压的目的【6】。在本系统中,主要是用于控制插座的开关状态,通过单片机I/O输出信号控制继电器的工作已否从而达到控制插座开关的目的。

6.软件设计

本设计中用到的单片机是MSP430,为了使编写的程序更加简单明了,采用C语言进行编程,用IAR软件进行编译,BSL430软件进行下载。

软件设计部分包括液晶显示程序、计时程序、独立式按键处理程序、红外遥控处理程序等。由于定时设置是通过独立式按键或者红外遥控器按键进行设置的,程序在按键扫描部分和红外信号的解码部分相对重要。在检测到被设置了定时任务时,系统要检测是否到达定时时间,执行相应的动作。

图12为主程序的流程图。

19

开始 系统初始化 N 是否设置定时 Y 按键 任意定时 遥控 Y 模式定时 执行定时程序 N 是否到达定时时间 Y 执行相应开关程序

图12 程序流程图

6.1计时程序的编写

MSP430的3种时钟信号:MCLK系统主时钟;SMCLK系统子时钟;ACLK辅助时钟。

(1)MCLK系统主时钟。除了CPU运算使用此时钟以外,外围模块也可以使用。MCLK可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其

20

信号源。

(2)SMCLK系统子时钟。供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。SMCLK可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。

(3)ACLK辅助时钟。供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。但ACLK只能由LFXT1进行1、2、4、8分频作为信号源。PUC复位后,MCLK和SMCLK的信号源为DCO,DCO的振荡频率默认为800KHZ。ACLK的信号源为LFXT1。MSP430内部含有晶体振荡器失效监测电路,监测LFXT1(工作在高频模式)和XT2输出的时钟信号。当时钟信号丢失50us时,监测电路捕捉到振荡器失效。如果MCLK信号来自LFXT1或者XT2,那么MSP430自动把MCLK的信号切换为DCO,这样可以保证程序继续运行。但MSP430不对工作在低频模式的LFXT1进行监测。由于单片机内部默认采用的数字时钟受环境影响比较大,计时不准确,所以采用外部的8M石英晶振产生的时钟脉冲进行计数。MSP430内部有三个时钟源,对时钟进行切换时必须有起振时间,只有当时钟源稳定了,单片机才能够正常工作。

MSP430选用内部8M时钟初始化程序如下: void Clock_Init() {

uchar i;

BCSCTL1&=~XT2OFF; //START XT2(8MHZ) BCSCTL2|=SELM1+SELS;

do{ //等待时钟转换 IFG1&=~OFIFG; for(i=0;i<100;i++) _NOP(); }

while((IFG1&OFIFG)!=0); IFG1&=~OFIFG; }

21

计时程序如下: void Clock(void) {

second -= 1; if(second==-1) {

second = 59; minute -= 1;

if(minute ==-1) {

minute = 59;

hour -= 1; hour0 -= 1; if(hour == -1) hour = 23; }

} }

6.2 LCD显示电路的编写

这部分的显示过程主要是显示从定时器A读取的时钟数值,同时当检测到独立式按键有键按下时,显示相应的设置菜单等。 基本操作时序:

读状态:输入:RS=L,RW=H,E=H 输出:DO~D7=状态字 写状态:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:无

读数据:输入:RS=H,RW=H,E=H 输出:DO~D7=数据 写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲 输出:无【8】

图13为LCD1602的具体读写时序。

22

a.读操作时序

b.写操作时序

图13 LCD1602的读写时序

红外信号解码及按键处理程序编写:

当红外线接收管接收到红外信号时,通过单片机执行相应的程序进行红外信号的解码,具体解码原理前文已详细叙述,解码得到的键码赋值给data数组,通过检测data[5]和data[6]的值即可执行相应的动作。当检测到ok键被按下时即可执行定时插座的设置功能;当检测到▲键和▼按键时则进行相应的增减定时设置,具体程序编写如下所示:

#pragma vector = PORT1_VECTOR __interrupt void Port1()

23

{

char j,k,n=0; P1IE &=~BIT5; //关中断 delay_us(360); //360us if (IRIN==1) //高电平 {

P1IFG=0x00;

P1IE|=BIT5;//从新打开中断

return;//返回 }

while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。

{delay_us(120);} // for (j=0;j<4;j++)// {

for (k=0;k<8;k++)// {

while (IRIN) //等 IR 变为低电平 {delay_us(120);}

while (!IRIN) //等 IR 变为高电平 {delay_us(120);}

while (IRIN) //计算IR高电平时长 {

delay_us(120);//延时120us,n++ n++; if (n>=30) {

P1IFG=0x00; P1IE|=BIT5;

24

return;}//高电平>30*120=3600us=3.6ms,出错返回 }

dat[j]=dat[j] >> 1;//取出第一位

if (n>=8) {dat[j] = dat[j]|0x80;}//0.96ms,确定为1,否则为0 n=0;// } }

if (dat[2]!=(~dat[3]-0xff00)) //貌似IAR环境下,char变量为16位 {P1IFG=0x00;P1IE|=BIT5;return;}//此句刚开始可以屏蔽,见到效果后再尝试打开校验,出现乱码,返回

dat[5]=dat[2] & 0x0F;//输入的低4位 dat[6]=dat[2] & 0xF0;//高4位 dat[6]=dat[6] >> 4;//移位 if(dat[5] >9)// {

dat[5] = dat[5]+0x37;//转为16进制 } else

dat[5] = dat[5]+0x30; //

if(dat[6] >9)// {

dat[6] = dat[6]+0x37;// } else//

dat[6] = dat[6]+0x30; //

P1IE|=BIT5; P1IFG=0x00;

while(P1IFG&0x11!=0) {

P1IFG=0x00;

25

}

_EINT(); }

6.3 主程序的编写

如以上所述,编程过程中需要注意的主要有计时程序、定时器A计时程序, LCD1602显示程序、按键处理程序和红外信号解码及处理的相关程序,通过各项整合,就得到了下列主函数。 主函数的编写如下所示: void main(void) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 /*下面六行程序关闭所有的IO口*/ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF;

P5SEL=0X00;P5DIR=0XFF;P5OUT=0X00; P6DIR = 0XFF;P6OUT = 0XFF;

P3SEL = 0x00; //设置IO口为普通I/O模式 P3DIR = 0xF8; //设置IO口方向为输入(P3.0,P3.1,P3.2输入)

P3OUT = 0xFF; //初始设置为FF 全为高电平 P1IE=BIT5; //P1.5中断功能打开 P1IES|=BIT5; //P1.5下降沿触发中断 IR_DIR_IN; //P1.5设置为输入 Clock_Init();

CCR0 = 32768 - 1; //设置定时器A的中断时间为1S TACTL = TASSEL_1 + MC_1; //计数时钟ACLK, 增计数模式 CCTL0 |= CCIE; //使能CCR0比较中断

26

_EINT(); //打开全局中断

SetTime(00,03,21); //顺序:时,分,秒,格式:BCD码 LcdReset();

DispNChar(0,0,11,tishi); //显示提示文字 Disp1Char(6,1,':'); //显示字符 : Disp1Char(9,1,':'); while(1) {

keyscan1(); HW(); stop(); } }

27

7.系统调试

7.1电路设计前期工作

设计电路前先查询相关资料,通过上网查找资料,去图书馆查询等确定系统的主要模块及其工作原理,如红外遥控编解码的原理、MSP430内部时钟的工作原理、LCD1602液晶显示原理等。

初步熟悉这些主要器件的外部电路后,在条件允许的情况下先分别制作主要模块的电路,测试其可用性,比如继电器部分的电路,因为之前没有使用过继电器,对这块的外部电路完全不熟,只能先制作模块部分的电路测试是否可用。

7.2软件部分的调试

在软件设计前,先把大致的程序流程理清,然后再分模块调试,将各模块部分的程序先调试可行后再整合到一起,编写主程序。

首先是LCD1602显示程序,通过编写过的程序掌握了1602的显示原理及其显示过程用到的指令如清屏,开关显示等。初步设计了显示器需要显示的显示菜单。然后通过独立式按键设置显示菜单,执行相应的功能。因为所有的设置在独立式按键处理上都要实现,使得按键处理程序必须有条不紊的编写,先列好按键处理的大致流程,需要设置的的显示菜单和各个按键按下后必须实现的菜单选项等。有了这些流程后才能在编程过程中减少一些不必要的麻烦

编程上最主要的是计时程序,当分模块调试时,计时程序可以正常读取时间,显示时间。当把独立式按键扫描程序加入总程序时,发现时间不动了,原因可能是单片机无法从里面读取数据了,也可能是采集到的数据无法在显示器上显示,或者是在按键处理过程中出现了问题。通过检查程序和修改程序,发现可能是因为I/O无法驱动问题,当更换I/O口时发现计时正常了,显示菜单也基本完成预期效果。至于后期需要继续扩展功能可以继续添加。

软件过程中遇到的最大问题是红外信号解码和红外按键处理部分。当分模块调试时单片机确实可以接收到红外编码信号,也可以将解码得到的键值显示在流水灯上。可是,当把红外信号解码程序和红外按键处理程序植入主程序中时,单

28

片机可以收到红外编码信号,也可以正常解码红外信号,执行相应动作,但是同时也让整个系统工作不正常了,具体反映到了显示时间上,时间显示变成每隔两秒跳一次。针对这个问题,我非常不解,因为先前对红外编码解码原理和编程不了解,一时找不出具体原因。通过询问同组使用过红外遥控的同学才知道,未执行红外信号扫描时应该先关闭总中断,执行完主要程序后开启中断扫描红外编码信号。通过修改程序后发现系统可以正常工作,设置定时正常,显示也正常了。可是还出现了个问题,当通过红外遥控器按键设置开关插座后,系统虽然还能正常显示,但想再通过独立式按键设置定时的时候,出现了系统延迟,按键设置缓慢,甚至有时候不能继续设置定时。问题可能出在系统只能执行一种控制模式,而不能同时有两种控制模式,程序可能在红外检测解码过程中出问题,也可能在中断控制过程。通过各种调试,还是无法解决此问题,只能通过复位键使系统复位,再执行按键定时设置。

7.3设计结果

通过一番努力,终于在此次设计中完成了预期设计任务。所设计的定时插座已经可以实现预期功能。该定时插座可以控制一路220V/10A的插座,可以设置在一天24小时内的任意定时开关时间的固定模式定时。同时,通过红外遥控的电源键可以一键控制插座的工作状态,而遥控器则同样可以实现无线设置固定模式定时。当定时插座变换工作状态时,会听到继电器切换电路的滴答声。

7.4设计中存在的不足及其改进

本次设计的定时插座虽然可以实现定时控制一路插座的功能,但是可定时的路数和定时组数仍然不够。现实生活中,随着人们的生活水平不断的提高,家电等用电器具越来越多,单一的一路控制明显不能满足要求。因而,如果在设计时多加入几路的插座控制,而且各路控制互不干扰,各司其职的话,用户只需要将要定时控制的用电器具都插在定时插座上,通过各自的定时设置,就可以使各电器按照人们的习惯有规律地工作,很大程度上方便人们的日常生活。同时,可以给定时插座加上保护措施,如漏电保护开关等,达到安全的目的。另外,本次设计中所使用的红外遥控器基本只能在同一室内控制插座,如果采用无线电遥控器

29

等更加先进的遥控器的话,人们或许就可以在室内的任何地方随时控制家电的开关状态了。再者,如果可以加入扬声器等反应更加明显的指示,甚至是自动语音指示等比较能引起人们注意的外部设备,会让定时插座变得更加人性化,实用性也更高。

8. 结 束 语

本设计基于MSP430单片机的定时插座到此就告一段落了,所设计的硬件和软件都可以正常工作,各项设计均达到了设计任务的要求。定时插座已经可以完成一天24小时内的定时开关设置的固定模式定时,同时也可以通过红外遥控控制插座,设置定时时间。设计过程中有喜有忧,但是经过多次反复的问题分析和系统调试,还是解决了各个难题,也使我在设计电路及分析电路问题上学到了很多。而在编程上,通过这次设计,我对C语言编程有了进一步的熟悉,巩固了所学知识。但是,在这过程中,我也发现了自己所学知识的不足,在今后仍需不断努力学习。

参考文献

[1] 曹立军.单片机原理与应用.西安电子科技大学出版社,2009.9. [2] 康华光.电子技术基础(第五版).高等教育出版社,2002. [3] MSP430中文资料. [4] 通用1602液晶资料.

[5] 秦龙.MSP430单片机常用模块与综合系统.电子工业出版社,2007.7

30

附录1 程序

#include #include \#include \#include \#include \

uchar tishi[]={\提示信息 uchar timeovr[]={\

extern signed char second,minute,hour,hour0; extern signed char pmin,phour,ps1;

#define SetTime(H,M,S) {second=S;minute=M;hour=H;hour0=H;} #define CPU_F ((double)8000000) //定义CPU 的时钟频率为8M #define

delay_us(x)

__delay_cycles((long)(CPU_F*(double)x/1000000.0))// 定义延时1us #define

delay_ms(x)

__delay_cycles((long)(CPU_F*(double)x/1000.0)) // 定义延时1ms

#define keyin (P3IN & 0x0f)

#define IR_DIR_IN P1DIR&=~BIT5 //红外接收头P1.5设置为输入

31

#define IRIN (P1IN&BIT5) //红外接收头输入值 uchar keypress,keypress1; char dat[8]; void Clock_Init() {

uchar i;

BCSCTL1&=~XT2OFF; //START XT2(8MHZ) BCSCTL2|=SELM1+SELS;

do{ //等待时钟转换 IFG1&=~OFIFG; for(i=0;i<100;i++) _NOP(); }

while((IFG1&OFIFG)!=0); IFG1&=~OFIFG; }

void keyscan1() {

if(keyin ==0x0e) //如果有键被按下

32

{

Delay5ms(); //延时消抖 if(keyin ==0x0e) //再次检测按键状态 {

keypress++;

while(keyin == 0x0e); //等待按键被放开 if(keypress==1) {

CCTL0&=~CCIE; LocateXY(11,1);

LcdWriteCommand(0x0f,1); }

if(keypress==2) {

LocateXY(8,1); }

if(keypress==3) {

LocateXY(5,1); }

if(keypress==4) {

33

keypress=0;

LcdWriteCommand(0x0c,1); CCTL0|=CCIE; } } }

if(keypress!=0) {

if(keyin ==0x0d) {

//delay(); if(keyin ==0x0d) {

while(keyin==0x0d); if(keypress==1) {

second+=1; if(second==60) second=0; Display(); LocateXY(11,1);

34

}

if(keypress==2) {

minute+=1; if(minute==60) minute=0; Display(); LocateXY(8,1); }

if(keypress==3) {

hour+=1; if(hour==24) hour=0; Display(); LocateXY(5,1); } } }

if(keyin==0x0b) {

// delay();

35

if(keyin ==0x0b) {

while(keyin==0x0b); if(keypress==1) {

second-=1; if(second==-1) second=59; Display(); LocateXY(11,1); }

if(keypress==2) {

minute-=1; if(minute==-1) minute=59; Display(); LocateXY(8,1); }

if(keypress==3) {

hour-=1;

36

if(hour==-1) hour=23; Display(); LocateXY(5,1); } } } } }

void stop(void) {

if((second|minute|hour)==0) { _DINT(); P5OUT=0XFF;

DispNChar(2,1,10,timeovr); } }

void HW(void)

37

{

if((dat[6]==0x31)&&(dat[5]==0x35)) {

dat[6]=0x00; dat[5]=0x00; keypress1++; if(keypress1==1) {

CCTL0&=~CCIE; LocateXY(11,1);

LcdWriteCommand(0x0f,1); }

if(keypress1==2) {

LocateXY(8,1); }

if(keypress1==3) {

LocateXY(5,1); }

if(keypress1==4) {

38

keypress1=0;

LcdWriteCommand(0x0c,1); CCTL0|=CCIE; } }

if(keypress1!=0) {

if((dat[6]==0x31)&&(dat[5]==0x31)) {

dat[6]=0x00; dat[5]=0x00; if(keypress1==1) {

second+=1; if(second==60) second=0; Display(); LocateXY(11,1); }

if(keypress1==2) {

39

minute+=1; if(minute==60) minute=0; Display(); LocateXY(8,1); }

if(keypress1==3) {

hour+=1; if(hour==24) hour=0; Display(); LocateXY(5,1); } }

if((dat[6]==0x31)&&(dat[5]==0x39)) {

dat[6]=0x00; dat[5]=0x00; if(keypress1==1) {

40

本文来源:https://www.bwwdw.com/article/t4a7.html

Top