温度的采集与显示资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告
课程名称综合电子设计
题目温度的采集与显示______________________
指导教师
设计起止日期2015年4月-5月
系别自动化
专业自控
学生姓名
班级/学号
成绩___________________
摘要
本系统由单片机控制模块MSP430f5529,AY-SEB Kit模块组成,运用模块
MSP430f5529的温度传感器与 AY-SEB Kit模块的显示屏,通过编程实现对温度的采集与显示,并且超过一个预定值可以闪红灯报警。

一、功能介绍
1.单片机控制模块MSP430f5529中的温度传感器采集当前温度
2.AY-SEB Kit中的LED驱动模块显示采集的摄氏温度
3.AY-SEB Kit中的LED驱动模块显示采集的华氏温度,华氏温度由公式计算出
4.AY-SEB Kit中的LED驱动模块显示制作者姓名拼音
5.超过设定报警温度可以闪烁单片机上的红灯报警
二、方案论证与比较
对采集来的温度进行显示的方法有两种:
方案一用1602显示屏显示。

1602采用并口传输,速度较快。

内部集成有显示芯片,可以识别英文字母、阿拉伯数字和日语片假名。

1602总共有两行每行十格,可以符合本次显示要求。

价格带背光的蓝底白字12元一块,不带光和绿光黑字会便宜一些。

方案二用老师提供的口袋电子系统实验套件AY-SEB Kit中的LED显示模块显示。

LED 采用恒流驱动,BUCK斩波电路反馈端的不同接法可以实现恒压输出或恒流输出。

FB 所接位置不同,输出情况不同。

TPS62260内部Vref为0.6V,所以无论何种接法,反馈的最终效果都是VFB=Vref=0.6V。

实验平台采用集成BUCK斩波芯片TPS62260的恒流输出来实现LED驱动。

比较:方案二中的模块显示效果更好,但是由于老师提供的数量有限不能满足每位同学都能用到。

而方案一的1602显示屏更容易获得,但显示效果欠佳。

三、系统设计
整个系统可以分为三个部分:温度采集、LCD液晶显示、LED报警灯。

系统总体的设计图如下:
温度采集
MSP430F5529内置温度传感器,经过A/D模块采样,量化,将得到的数据送到MSP430F5529控制器处理。

经过一定的算法,得到温度的正常值。

12864LCD液晶显示
该部分主要是通过程序控制,按照12864LCD液晶模块的时序,将要显示的字符数据送到12864LCD中,经过驱动程序处理,可以使字符显示出来。

LED报警灯
该部分结果最为简单,直接使用MSP430F5529单片机的P1.0口控制的LED灯。

若温度超上限,则灯亮报警,否则灯灭,不报警。

四、单元电路设计
12864LCD液晶显示部分电路
RST为复位端,与P36引脚相连;
SDA为片选端,与P12引脚相连;
SCLK为数据/命令选择端,与P40引脚相连;
A0为时钟信号端,与P37相连;
CS为数据端,与P82引脚相连。

五、软件设计
12864LCD液晶显示时序图(串口模式)
SPI是串行外设接口,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。

其中SDO 为主设备数据输入,从设备数据输出端口;SDI为主设备数据输出,从设备数据输入端口; SCLK为时钟信号端口,由主设备产生;CS为从设备使能信号,由主设备控制。

CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时,对此芯片的操作才有效。

通讯是通过数据交换完成的,数据是一位一位的传输的。

这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。

数据输出通过 SDO线,数据在时钟上升沿时改变,在紧接着的下降沿被读取,完成一位数据传输。

这样,在至少8次时钟信号的改变,就可以完成8位数据的传输。

此外它的传输是一位一位的,但不同于普通的串行通信(一次连续传输至少8位),SPI
是允许中断的。

控制流程图
首先进行初始化,通过A/D
到温度传感器的温度,经过一定算法之后可以得到温度值,值型的值,需要将其转换成字符。

接下
来判忙,等空闲时传递命令和数据,最后在显示屏上显示。

表1. 清单
六、 结束语
基本功能
(1)通过单片机内部的温度传感器获得当前温度; (2)显示所获温度
(3)可以预设标准温度;
(4)如果温度大于预设值或小于预设值,用LED 通知。

能通过串口与上位机通信,传输并显示当前温度。

七、附录
附录中主要包含有主要元器件清单,程序清单(要求有中文注释),印制板图和系统使用说明
1.印制板图
如图所示,显示板第一行显示Celsius 29.85,表示当前摄氏温度为29.85度;第二行显示姓名拼音,第三行显示Fahrenheit 85.7,表示当前华氏温度为85.7。

而当摄氏温度超过30度时,红色LED灯会闪烁。

2.程序清单:
#include"driverlib.h"
#include"DAC.h"
#include"Template_Driver.h"
#include"grlib.h"
#include"adc12_a.h"
#include"timer_a.h"
#define CALADC12_15V_30C *((unsigned int *)0x1A1A) // Temperature Sensor Calibration-30 C
//See device datasheet for TLV table memory mapping
#define CALADC12_15V_85C *((unsigned int *)0x1A1C) // Temperature Sensor Calibration-85 C
unsigned int temp;
volatile float temperatureDegC;
volatile float temperatureDegF;
#define MAX_DAC_DIV8 (4096>>3)
tContext g_sContext;
extern uint16_t ADC12_SingleSample(void);
extern void GrStringNumberCentered(const tContext*pContext, int16_t Number,uint8_t ui8Dot,uint8_t ui8X, uint8_t ui8Y);
unsigned int dCnt[4];
void main(void)
{
WDTCTL = WDTPW | WDTHOLD;
REFCTL0 &= ~REFMSTR; // Reset REFMSTR to hand over control to
// ADC12_A ref control registers ADC12CTL0 = ADC12SHT0_8 + ADC12REFON + ADC12ON;
// Internal ref = 1.5V ADC12CTL1 = ADC12SHP; // enable sample timer
ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_10; // ADC i/p ch A10 = temp sense i/p ADC12IE = 0x001; // ADC_IFG upon conv result-ADCMEMO __delay_cycles(100); // delay to allow Ref to settle ADC12CTL0 |= ADC12ENC;
P2DIR |= BIT0; // 关闭白光LED灯
P2OUT |= BIT0;
P3DIR |= BIT4; //打开背光LED
P3OUT |= BIT4;
P3OUT &= ~BIT4;
Template_DriverInit();
GrContextInit(&g_sContext, &g_sTemplate_Driver);
GrContextForegroundSet(&g_sContext, ClrWhite);
GrContextBackgroundSet(&g_sContext, ClrBlack);
GrContextFontSet(&g_sContext, &g_sFontCm16b);
GrClearDisplay(&g_sContext);
GrStringDraw(&g_sContext, "Celsius", AUTO_STRING_LENGTH, 0,0, OPAQUE_TEXT);
GrStringDraw(&g_sContext, "Fan meng ran", AUTO_STRING_LENGTH, 0,20,
OPAQUE_TEXT);
GrStringDraw(&g_sContext, "Fahrenheit", AUTO_STRING_LENGTH, 0,40, OPAQUE_TEXT);
GrFlush(&g_sContext);
_EINT();
P1DIR|=BIT0;
P1OUT&=~BIT0;
while(1)
{
ADC12CTL0 &= ~ADC12SC;
ADC12CTL0 |= ADC12SC; // Sampling and conversion start
__bis_SR_register(LPM4_bits + GIE); // LPM0 with interrupts enabled
__no_operation();
temperatureDegC = (float)(((long)temp - CALADC12_15V_30C) * (85 - 30)) /
(CALADC12_15V_85C - CALADC12_15V_30C) + 30.0f;
// Temperature in Fahrenheit Tf = (9/5)*Tc + 32
temperatureDegF = temperatureDegC * 9.0f / 5.0f + 32.0f;
GrStringNumberCentered(&g_sContext, temperatureDegC*100,2,80,5);
GrStringNumberCentered(&g_sContext, temperatureDegF*10,1,100,45);
GrFlush(&g_sContext);
__no_operation(); // SET BREAKPOINT HERE
if(temperatureDegC>30)
P1OUT|=BIT0;
else
P1OUT&=~BIT0;
}
}
#pragma vector=ADC12_VECTOR;
__interrupt void ADC12ISR (void)
{
switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow case 6: // Vector 6: ADC12IFG0
temp = ADC12MEM0; // Move results, IFG is cleared __bic_SR_register_on_exit(LPM4_bits); // Exit active CPU break;
case 8: break; // Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: break; // Vector 12: ADC12IFG3
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
case 32: break; // Vector 32: ADC12IFG13
case 34: break; // Vector 34: ADC12IFG14 default: break;
}
}
void Boost_Init()
{
GrStringDrawCentered(&g_sContext, "Lv", AUTO_STRING_LENGTH, 80, 40, OPAQUE_TEXT);
GrStringNumberCentered(&g_sContext, 1,0,100,40);
GrFlush(&g_sContext);
}
//====================数字转字符串函数=========================
void Num2String(int16_t i16Number,uint8_t ui8Dot,uint8_t *p)
{
int8_t i=0 ,ds=0;
uint8_t pos=0,m=0;
uint8_t DispBuff[11]={0};
uint8_t tempBuff[11]={0};
if(i16Number<0)
{
i16Number=-i16Number; //处理负数
DispBuff[0]='-'; //显示负号
m=1; //跟踪缓存位置
}
else
m=0; //等效为-清除负号
for(i=m;i<11;i++) //拆分数字
{
DispBuff[i]=(i16Number%10);
i16Number /= 10;
}
for(i=10;i>=0;i--) //消隐无效"0"
{
if (DispBuff[i]==0) DispBuff[i]=0;
else
{
pos=i; // 保存当前第一个有效值
break;
}
}
tempBuff[0] = DispBuff[0]; // 保存对应的符号位
for(i=10;i>=m;i--) // 高低位数据转换存储位置,高位在前,符号位不变
{
if(i <= pos)
{
tempBuff[pos-i+m] = DispBuff[i]+ 0x30;
}
else
tempBuff[i] = 32; // 空格(ASCII) }
if(ui8Dot>0)
{
if(ui8Dot < pos+1-m) // pos +1 - m 为当前数组数据位数
{
for(i=pos;i>=pos-(ui8Dot-1);i--)
{
tempBuff[i+1]=tempBuff[i];
}
tempBuff[pos-(ui8Dot-1)] = 0x2e; // 小数点
}
else//if(ui8Dot > pos+m)
{
ds = ui8Dot - (pos+1-m); // 移位距离(既需要增加几个0)
for(i=pos;i>=m;i--)
{
tempBuff[i+ds+2]= tempBuff[i]; //这里+2是为了增加前置:“0.”
}
for(i=0;i<ds;i++)
{
tempBuff[m+2+i]=0x30; //这里小数点后“补0操作”
}
tempBuff[m] = 0x30; // 添加前置“0.”
tempBuff[m+1] = 0x2e;
}
}
for(i=0;i<7;i++)
{
if(tempBuff[i]!= ' ')
{
*p=tempBuff[i];
*p++;
}
else
break;
}
}
void GrStringNumberCentered(const tContext *pContext, int16_t Number,uint8_t
ui8Dot,uint8_t ui8X, uint8_t ui8Y)
{
uint8_t String[8]={0};
Num2String(Number,ui8Dot,String);
GrStringDrawCentered(pContext, (const char*)String,
AUTO_STRING_LENGTH,ui8X,ui8Y, OPAQUE_TEXT);
}
3.系统使用说明
首先将MSP430f5529开发板与SEB-Kit连接,再用CCS软件编译并加载本实验程序,并通过USB线下载到单片机中,显示屏会自动开始显示温度等信息。

4.硬件清单见表格。

相关文档
最新文档