MSP430电子万年历.docx
《MSP430电子万年历.docx》由会员分享,可在线阅读,更多相关《MSP430电子万年历.docx(44页珍藏版)》请在冰豆网上搜索。
MSP430电子万年历
MSP430-电子万年历
1.系统总体设计
1.1功能说明
本次课程设计的要求是制作一个电子万年历,要求在显示屏上显示年、月、日、时、分、秒、周、温度等信息,并且能够自行修改相关信息,且在修改信息时时钟停振。
根据要求所设计的系统的总体框架如图1所示:
矩阵键盘
MSP430F5338A
DS130212864DS18B20
时钟芯片显示屏温度芯片
图1系统总体框架图
1、单片机最小系统
要求系统设计使用TexasInstrument公司的MSP430F5438A单片机作为系统的核心控制器。
2、时钟芯片DS1302
DS1302是dallas公司推出的一种高性能、定功耗的实时时钟芯片,内含一个实时时钟和31字节的静态RAM,采用SPI三线接口与CPU通信。
3、温度芯片DS18B20
DS18B20的数字温度计提供9位到12位的摄氏温度测量,并具有报警功能,DS18B20通过定义仅需要一个数据线(和地面)与中央微处理器通信。
它的工作范围为-55°C至+125°C,在-10°C至+85°C的范围内精确到±0.5℃。
4、矩阵键盘
使用4*3的矩阵键盘,可以通过矩阵键盘得到0~9的数字也可以生成“*”和“#”,用户可通过显示屏与矩阵键盘对DS1302的时间进行自定义修改。
5、液晶屏12864
液晶屏为128*64点阵屏幕,在液晶上显示时间和温度信息,用户可以通过显示屏查看时间和温度,并根据提示对DS1302内时间进行修改。
1.2任务分配情况
1.3系统工作流程
单片机开机后(第一次开机会对DS1302初始化赋初值),会在显示屏上显示从DS1302中读取的时间信息和从DS18B20中读出的温度信息,在不对矩阵键盘进行操作的情况下,系统正常读取时间和温度显示。
当需要修改时间信息时,按对应键进入修改界面,进入修改后,DS1302停止工作,通过矩阵键盘选择所要修改的内容,修改完成后将修改值存入DS1302,修改完成,使DS1302继续工作,退回显示时间和温度的界面。
2.硬件设计
此次课设课题中硬件部分的选取与设计主要包含以下模块:
MSP430F5438A单片机,液晶屏12864,4*3矩阵键盘,DS1302时钟芯片,DS18B20温度芯片,若干连接线。
2.1MSP430F5438A芯片简介
MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(MixedSignalProcessor)。
称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,以提供“单片机”解决方案。
该系列单片机多应用于需要电池供电的便携式仪器仪表中。
在超低功耗方面,其处理器功耗(1.8-3.6V,0.1-400uA)和口线输入漏电流(最大50nA)在业界都是最低的,在运算性能上,指令速度可以达到16MIPS,在开发工具上,支持最先进的JTAG调制,在系统整合方面,根据其不同产品,集成了许多功能模块,性能稳定,可靠性高。
MSP430F5438A主要性能参数:
(1)高达25MHz的CPU速度。
(2)1.8-3.6V工作电压。
(3)高达256KB的闪存。
(4)高达18KB的RAM。
(5)独特的USB开发套件。
(6)超低功耗5us之内快速从待机模式唤醒。
图2MSP430F5438A单片机实物图
2.2矩阵键盘模块
2.2.1矩阵键盘介绍
矩阵键盘将键盘以矩阵形式排列,本次课设使用的是4*3矩阵键盘,4行3列,用来修改时间,如图3所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接,将按键当作一个开关,以行扫描为例,在矩阵键盘函数中会对四行不断进行扫描,直到有按键按下后(扫描到对应行时),该键即可导通,从而使单片机收到按键信息。
2.2.2矩阵键盘实物图
图3矩阵键盘实物图
2.2.3矩阵键盘与MSP430F5438A接口电路
图4矩阵键盘电路接口
矩阵键盘每一列分别于单片机的P2.4~P2.6相连,每行分别于单片机的P2.0~P2.3相连。
2.3液晶12864模块
2.3.1液晶介绍
12864汉字图形点阵液晶显示模块,可显示汉字及图形。
其主要特征有如下几点:
(1)显示分辨率:
128*64
(2)内置汉字字库,提供8192个16*16点阵汉字
(3)内置128个8*16点阵字符
(4)通信方式:
串口、并口
(5)低电源电压(3~5.5V)
(6)工作温度:
0~55度
图512864液晶的引脚图
本次的课程设计使用的液晶屏是12864。
具有8位并行和3线串行连接方式,内部含有简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点阵的中文汉字,和128个8*16点阵的字符,可以显示4行8列16*16点阵的汉字,也可完成图形显示,具有光标显示、画面移位、自定义字符、睡眠模式等功能,操作简单。
2.3.2液晶与MSP430F5438A接口电路
图612864与单片机的接口电路
液晶的DB0-DB7与P4.0~P4.7是数据线,RS与P3.2相连,RW与P3.3相连,EN与P3.6相连,RST与P3.7相连,PSB与P3.0相连,置高,表示并行。
2.4DS1302实时时钟芯片模块
2.4.1DS1302实时时钟芯片简介
DS1302是DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,内含一个实时时钟/日历和31字节静态RAM,采用SPI三线接口与CPU通信。
(1)DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。
(2)内部含有31个字节静态RAM,可提供用户访问。
(3)采用串行数据传送方式,使得管脚数量最少,简单SPI3线接口。
(4)工作电压范围宽:
2.0~5.5V。
(5)工作电流:
2.0V时,小于300nA。
(6)时钟或RAM数据的读/写有两种传送方式:
单字节传送和多字节传送方式。
(7)采用8脚DIP封装或SOIC封装。
(8)与TTL兼容,Vcc=5V。
(9)可选工业级温度范围:
-40C~+85C。
(10)具有涓流充电能力。
(11)采用主电源和备份电源双电源供应。
(12)备份电源可由电池或大容量电容实现。
图7DS1302芯片的引脚图
2.4.2DS1302实时时钟芯片实物图
图8DS1302芯片实物图
2.4.3DS1302实时时钟芯片与MSP430F5438A接口电路
DS1302与单片机的连接仅需要3条线:
时钟线SCLK、数据线I/O和复位线RST。
连接图如下图。
时钟线SCLK与P6.7相连,数据线I/O与P6.6相连,复位线RST与P6.5相连,x1和x2之间连接了一个基频为32768HZ的外部晶振,GND接地,Vcc1为备用电源,Vcc2接单片机上3V电压。
图9DS1302接口电路图
2.4.4SPI协议简介
SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:
一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于CPU与各种外围器件进行全双工、同步串行通讯。
SPI主要特点有:
可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。
2.5DS18B20温度芯片模块
2.5.1DS18B20温度芯片简介
图10DS18B20芯片图
该芯片仅需一个端口引脚进行通信,每个器件有唯一的64位的序列号存储在存储器中,高速暂存器中含有两个字节的温度寄存器,这两个寄存器用来存储温度传感器输出的数据,除此之外,高速暂存器提供一个直接的温度报警值寄存器(TH和TL),和一个字节的配置寄存器,它们是非易失性的可擦除程序寄存器(EEPROM),所以存储的数据在器件掉电时不会消失。
可通过数据线供电,供电范围为3.0V到5.5V,测温范围为-55℃到+125℃,在-10℃到+85℃范围内精确度为±5℃。
温度计分辨率可以被使用者选择为9-12位,DS18B20芯片图如图9所示。
GND:
电源地。
VDD:
电源引脚。
DQ:
数据I/O。
2.5.2DS18B20温度芯片实物图
图11DS18B20芯片实物图
2.5.3DS18B20温度芯片与MSP430F5438A接口电路
图12DS18B20接口电路图
(1)DS18B20的VDD接单片机的电源(3.0V到5.5V),GND接地,DQ为数据接口,负责发送和接收数据。
(2)DS18B20的核心功能是它的直接读数字的温度传感器。
温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。
在上电状态下默认的精度为12位。
(3)DS18B20启动后保持低功耗等待状态;当需要执行温度测量和AD转换时,总线控制器必须发出[44h]命令。
在那之后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。
当DS18B20由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”,DS18B20正在温度转换中返回0,转换结束返回1。
如果DS18B20由寄生电源供电,除非在进入温度转换时总线被一个强上拉拉高,否则将不会由返回值。
(4)VDD连接5V电压,GND接地,DQ连接P6.0。
(5)DS18B20储存器如图13所示,位0和位1为测得温度信息的LSB和MSB。
这两个字节是只读的。
第2和第3字节是TH和TL的拷贝。
位4包含配置寄存器数据。
位5,6和7被器件保留,禁止写入;这些数据在读回时全部表现为逻辑1。
所以当读取温度时,需要连续读取两次(位0和位1)才能将温度信息完全读出。
图13DS18B20存储器图
2.5.4单总线协议简介
DS18B20通过达拉斯公司独有的单总线协议依靠一个单线端口通讯。
当全部器件经由一个3态端口或者漏极开路端口(DQ引脚在DS18B20上的情况下)与总线连接的时候,控制线需要连接一个弱上拉电阻。
在这个总线系统中,微控制器(主器件)依靠每个器件独有的64位片序列号辨认总线上的器件和记录总线上的器件地址。
由于每个装置有一个独特的片序列码,总线可以连接的器件数目事实上是无限的。
3.软件设计
3.1系统总体设计
课设中单片机连接显示屏12864、实时时钟芯片DS1302、温控芯片DS18B20以及矩阵键盘,在正常情况下矩阵键盘不工作,单片机从DS1302和DS18B20中读取相应信息并显示在显示屏12864上,具体读写代码在附录中有详细说明,当需要修改时间时,矩阵键盘开始工作。
按矩阵键盘“0”键进入修改界面,选择要修改的内容(年、月、日、时、分、秒、周),修改过程中DS1302停振(通过将秒寄存器中的最高位CH置1使其停振),DS18B20正常工作。
选择修改内容时,每一个键盘值对应修改一个内容(其中一个键代表退出),选择后即可进入修改,修改后,将修改内容发送给DS1302,最后退出修改界面,正常显示时间和温度。
3.1.1系统流程图
存入
否
是
1-7键其他键
#键
图14系统流程图
单片机在未收到矩阵键盘信号时,只是读取DS1302和DS18B20的时间和温度信息并在12864上进行显示,当有“0”按键按下时,进入按键中断,1-7号按键分别对应年、周、月、日、时、分、秒的修改,“#”为退出修改,修改时间时,DS1302停止工作,时间修改结束后从上一次进入中断的时间开始运行。
3.2矩阵键盘模块
3.2.1按键进入修改界面
if(P2IFG!
=0X00)
delay_ms(30);
if(P2IFG!
=0X00)
_EINT();
1、首先要进行按键进行修改界面的部分,由于程序采用按键中断,所以在判断时没有进行扫描,而是直接判断终端标志位,当有按键按下时,P2IFG将不等于0X00,以此判断出有按键按下,所以按下任意键都可以进入修改程序,但在本程序中,在液晶屏上显示为按“0”键进入修改,原因是本次课设矩阵键盘不太灵敏,1-7键在进入修改界面后都有选择修改内容的作用,而“0”键在进入修改界面后不再做功能键使用,即使出现消抖不到位的情况也不会对修改产生影响。
2、在确认有键按下后,进入中断,DS1302停振,进入修改界面,屏幕上显示供给用户修改的选择。
3.2.2按键选择修改内容
#pragmavector=PORT2_VECTOR
__interruptvoidPort2(void)//进入中断
do
change_disp();//修改界面
delayms(50);
key2();//key2用来取数值,选择对应修改内容
}while(j);//j初始化为1,当取到键值后变为0
1、进入修改界面后,用户可以选择修改内容(1.年、2.周、3.月、4.日、5.时、6.分、7.秒、#.退出),key2函数就是用来选择这些功能。
变量j初始化为1,一直进行循环,当在循环时有按键按下时进入key2函数,对矩阵键盘进行行扫描(0XFE、0XFD、0XFB、0XF7),当按键按下时,对应按键的开关被打开(由列控制),当行扫描扫到时,按键出形成通路,相应的按键信息将发送给单片机,按键成功。
2、key2函数中,不同键值实质代表不同的s值,s是选择修改哪种信息的变量,键盘值1-7代表s值1-7;而s值(1-7)分别代表进入年、周、月、日、时、分、秒修改,s值为11时表示按下为“#”键,意为退出修改。
当按键成功后,将j置为0,表示跳出当前DO-WHILE循环,程序继续向下执行。
__interruptvoidPort2(void)
if(s==1)//s=1时修改年
change_year();
if(s==7)//s=7时修改秒
change_second();
if(s==11)//s=11时退出修改
P2IFG=0X00;
lcd_clr();
if(s!
=7)//如果修改的不是秒,则将中断前的秒还原
//这是将之前时钟停振进行复原的操作
TIME[0]=TIME1[0];
Ds1302Init();
3、该段为选择修改内容的部分,键值1-7在上一阶段已经介绍,当s=11时意为按下“#”键,退出修改界面,回到主界面。
4、最后if(s!
=7)TIME[0]=TIME1[0];意为假如用户之前修改的内容不是秒,则修改完成后,时钟恢复运转后将秒数还原成停振时的秒数,也就是满足题目要求的修改过程中时钟停振的要求(TIME1[0]是暂存停振前秒数的数组,TIME[0]是用来存储时间信息的数组),如果修改的是秒(s=7),则停振后秒数已经发生改变,所以不用进行此操作(秒数已经有了新值),但并不影响时钟恢复工作(因为正常的秒数为0-59,CH位为0)。
3.2.3按键修改时间
key1():
键入个位内容函数
key0():
键入十位内容函数
1、当进入修改时间函数后(如change_year()...change_second()),用key1()和key0()函数分别键入所要修改值的个位和十位,根据我们平时的习惯,我们一般先输入十位,再输入个位,所以先调用key0()函数,再调用key1()函数,矩阵键盘扫描原理与之前相同。
假设我们要输入的年份为16年,则调用key0()函数时,按下按键“1”,得到p=0X10,然后调用key1()函数,按下键“6”,得到h=0X06,然后通过q=h|p,得到BCD码0X16,写入DS1302中,修改成功。
3.3液晶模块
电子万年历中,液晶的作用是显示时间和温度,以及给用户提供修改的显示界面,显示用户修改的信息。
显示功能在之前的实验中已经多次涉及,只需要注意汉字为16X16的点阵,一个屏幕上只能显示4X8个汉字即可,用数组存储汉字,通过for循环将所需要显示的相关信息读出。
需要注意的是在修改时间的时候,输入的时间需要显示在屏幕上,且输入的数字要实时显示在屏幕上,以修改年为例:
voidchange_year()
dis[16]={0xd6,0xd0+12,0xc9,0xe0+8,0xd6,0xc0+3,'',0,0,0,0,0,0,0,0,0};
Lcd_WriteCmd(0x90);
for(inti=0;i<7;i++)
Lcd_WriteData(dis[i]);
do
u=1;
key0();
temp1=p>>4;
dis[7]=askii[temp1];
}while(u==1);
Lcd_WriteData(dis[6]);
Lcd_WriteData(dis[7]);
do
u=1;
key1();
temp2=h&0x0f;
dis[8]=askii[temp2];
}while(u==1);
Lcd_WriteData(dis[8]);
delayms(1000);
在未按键输入的时候先显示“设置年”三个字,然后扫描键盘,当输入了数字后,将第一个数字存入dis[7]中(前六个存了设置年三个字),然后显示在屏幕上,然后继续扫描,将输入的按键存在dis[8]中,然后进行显示,延时一秒后返回初始界面。
其他相关函数:
voidWaitBusy(void)//延时一小段时间,等待LCD空闲
voidlcd_clr(void)//清除LCD的显示内容
voidLcd_WriteCmd(ucharcmdcode)//写指令
voidLcd_WriteData(uchardispdata)//写数据
voidLcd_Init()//初始化LCD
voidhanzi_Disp()//初始界面
voidchange_disp()//修改时间界面
3.4DS1302实时时钟芯片模块
首先要对DS1302的各个寄存器进行操作,那就要熟悉它的控制寄存器,控制寄存器用于存放DS1302的控制命令字,DS1302的RST引脚回到高电平后写入的第一个字就为控制命令。
它用于对DS1302读写过程进行控制,它的格式如下:
表2DS1302的控制命令的格式
D7
D6
D5
D4
D3
D2
D1
D0
1
RAM/CK
A4
A3
A2
A1
A0
R/W
3.4.1DS1302的初始化
1、首先要注意的是秒寄存器D7位的CH,该位如果置1的话,时钟就会停振,进入低功耗模式,所以在初始化该寄存器时注意该位不能置1.
2、所谓初始化也就是对DS1302各个寄存器进行写操作,将你要显示的值写进DS1302中,接下来就是要对DS1302各个寄存器进行写操作,做这一步之前首先要将写保护寄存器的写保护位去掉,也就是将该寄存器的值改为0x80,因为不去掉写保护位的话就不能对DS1302各个寄存器进行写操作。
3、接下来就是确定好写操作模式,是单字节写还是突发模式写,本次课设我采用的方式是突发模式写,所谓突发模式写就是一次性对8个特殊寄存器进行写操作。
用TIME[7]保存着特殊寄存器的值,其中TIME[7]={0x40,0x12,0x17,0x16,0x11,0x01,0x15};然后在利用Ds1302Init()函数对7个寄存器进行突发写模式。
4、写完之后再将写保护加上。
3.4.2DS1302的读写
图15DS1302读写时序图
1、DS1302的写过程,先要从单片机发送八个字节的写指令(地址),然后接着发送写的数据,如Ds1302Write(0x80,0x80);前一个0x80代表指令,后一个0x80代表数据。
2、DS1302的读过程,要先从单片机发送八个字节的指令,告诉DS1302要读的地址是什么,然后单片机做输入,接受DS1302传送过来的数据,读过程完成。
3、写进去的值是以二进制的BCD码存储在DS1302中的,要将该值取出其实很简单,就以0x56为例,它就代表着十进制的56,要取出十位5,只要(0x56>>4)就可以了,要取出各位就只需(0x56&0x0f)就可以了。
3.5DS18B20温度芯片模块
3.5.1DS18B20初始化
图16DS18B20初始化过程图
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。
若无低电平出现一直都是高电平说明总线上无器件应答。
做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。
若没有检测到就一直在检测等待。
3.5.2DS18B20写操作
图17DS18B20写过程图
写周期最少为60微秒,最长不超过120微秒。
写周期一开始做为主机先把总线拉低1微秒表示写周期开始。
随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。
若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。
而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
3.5.3DS18B20读操作
图18DS18B20读过程图
读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。
DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。
若要送出1则释放总线为高电平。
主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。
采样期内总线为高电平则确认为1。
完成一个读时序过程,至少需要60us才能完成。
intSave_Ds18b20()
inttemp3,temp4;
Init_Ds18b20();//初始化
delay_50us(18);
Write_Ds18b20(0xcc);//跳过ROM配置
Write_Ds18b20(0x44);//启动温度转换
Init_Ds18b20();
delay_50us(18);
Write_Ds18b20(0xcc);//跳过ROM配置
Write_Ds18b20(0xbe);//读温度寄存器
delay_50us(10);//600us
temp3=Read_Ds18b20();//读温度值的低字节
temp4=Read_Ds18b20();//读温度值的高字节
temp4=(temp4<<8|temp3);//高低位合并;
return(temp4);//返回温度
由于温度存在两位寄存器中,所以在读取过程中要连续进行两次读取,用两个变量保存,取出后再