ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

MSP430F5529 温度传感器 DS18B20 LCD显示温度数值 绘制温度曲线 实验 代码 程序

2020-12-19 18:02:11  阅读:335  来源: 互联网

标签:MSP430F5529 temp unsigned us delay 温度传感器 byte 温度 DQ


MSP430F5529 温度传感器 DS18B20 LCD显示温度数值 绘制温度曲线 实验 代码 程序

一.实验要求
采用实验开发板控制温度传感器,将温度曲线及数值变化实时显示在LCD屏上。
二.系统组成
实验器材:
1.PC 一台
2.MSP430F5529 一个
3.USB数据线 一条
4.DS18B20温度传感器 一个
5.连接线 3条
开发平台:
CCS v6.1.1
接线和配置:
1.MSP430F5529通过左下角USB接入PC,并将开发板PowerSel拨到eZ-FET,使用CCS对开发板进行调试。
2.将开发板上VCC接入DS18B20的VDD,GND接DS18B20的GND,P3.7接DS18B20的DQ。

三.软件设计
软件功能:通过DS18B20温度传感器、LCD显示屏,实现实时变化的温度显示和温度曲线。
程序框图:

软件总体设计方案:通过MSP430F5529获取DS18B20温度传感器上的数据,在LCD屏幕上显示温度值和绘制温度曲线。

温度数值显示:将读取到的温度分别取十位、个位、小数点后一位。并与符号“C”、小数点“.”组合成温度数值显示,例如“27.0C”。

温度曲线绘制:使用Dogs102x6_lineDraw画线函数,程序每进入一次循环,横坐标加1,纵坐标取温度的负值+58(该操作为了让曲线绘制在显示器中央,LCD默认为左上角为(0,0)取负数是为了屏幕从下到上为增,便于观察)。每次取新的温度后,绘制线段的起始点为上一次取的温度值,终点为下一次取的温度值,再通过横坐标递增,实现绘制连续的曲线,直到横坐标达到102,溢出屏幕时,清屏。

四.实验步骤与结果
实验步骤:
1.按程序所写正确接线:MSP430F5529通过左下角USB接入PC,并将开发板PowerSel拨到eZ-FET,使用CCS对开发板进行调试。
2.将开发板上VCC接入DS18B20的VDD,GND接DS18B20的GND,P3.7接DS18B20的DQ。
3.通过CCS将编辑好的程序写入MSP430F5529。
4.运行和调试。
实验结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五.参考代码
1.main主程序关键代码及其注释。

void main( void )
{
/* Stop WDT */
WDTCTL = WDTPW + WDTHOLD; /* 关闭看门狗 */
/* Use 32.768kHz XTAL as reference */
LFXT_Start( XT1DRIVE_0 ); /* 利用LFXT1(32.768kHZ)作为时钟参考 */
/* Set system clock to max (25MHz) */
Init_FLL_Settle( 25000, 762 ); /* 利用FLL(锁频环)将系统时钟设为最大25MHZ */
SFRIFG1 = 0; /* 清中断标志 */
SFRIE1 |= OFIE; /* 使能晶振失效中断 */
/* Globally enable interrupts */
__enable_interrupt(); /* 使能全局中断 */
/* Set up LCD */
Dogs102x6_init(); /* 初始化LCD */
Dogs102x6_backlightInit(); /* 背光初始化 */
Dogs102x6_setBacklight( brightness ); /* 设置初始背光值 */
Dogs102x6_setContrast( contrast ); /* 设置初始对比度值 */
Dogs102x6_clearScreen(); /* 清屏 */
/* 主循环 */
while ( 1 )
{
readDS18B20andDisplay(); /* 读取温度值并显示 */
}
}

2.lab7程序关键代码及其注释

#define CPU_F ( (double) 25000000) /* 外部高频晶振8MHZ */
/* #define CPU_F ((double)32768) //外部低频晶振32.768KHZ */
#define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
unsigned int temp_value = 0; /* 温度 */
unsigned int temp_2 = 27; /* temp_2初始温度 */
unsigned int x1 = 0;
unsigned int temp_value_1 = 0;
unsigned int temp_3 = 0;
/*********************************
** 引脚定义 使用引脚P3.7**
*********************************/
#define DQ_1 P3OUT |= BIT7
#define DQ_0 P3OUT &= ~BIT7
#define DQ_in P3DIR &= ~BIT7
#define DQ_out P3DIR |= BIT7
#define DQ_val (P3IN & BIT7)

unsigned int DS18b20_Init(void) //初始化DS8B20
{
unsigned Check_val;
DQ_out;
DQ_0;
delay_us(600);
DQ_1;
delay_us(60);
DQ_in;
_NOP();

if ( DQ_val == 1)
{
Check_val = 0; /* 初始化失败 */
}
if ( DQ_val == 0)
{
Check_val = 1; /* 初始化成功 */
}
delay_us(10);
DQ_out;
DQ_1;
delay_us(100);
return (Check_val);
}
void DS18b20_write_byte(unsigned int dat)
{
unsigned int i;
for (i = 0; i < 8; i++)
{
DQ_0;
delay_us(2);
if (dat & 0X01)
DQ_1;
else
DQ_0;
delay_us(60);
dat >>= 1;
;
DQ_1;
delay_us(10);
}
}
unsigned int DS18b20_read_byte(void)
{
unsigned i;
unsigned int byte = 0;
for (i = 0; i < 8; i++)
{
byte >>= 1;
DQ_0;
delay_us(2);
DQ_1;
delay_us(2);
DQ_in;
_NOP();
if ( DQ_val)
byte |= 0x80;
delay_us(60);
DQ_out;
DQ_1;
delay_us(10);
}
return (byte);
}
unsigned int get_one_temperature(void) /* 只读取了整数,没读取小数的部分 */
{
unsigned int Temp_l = 0, Temp_h = 0, Temp = 0;
float f_temp;
/* delay_ms( 1000 ); */
DS18b20_Init();
DS18b20_write_byte( Skip_ROM);
DS18b20_write_byte( Read_Scratchpad);
Temp_l = DS18b20_read_byte();
Temp_h = DS18b20_read_byte();
DS18b20_Init();
DS18b20_write_byte( Skip_ROM);
DS18b20_write_byte( Convert_Temperature);
Temp_h <<= 8;
Temp = Temp_h + Temp_l;
f_temp = Temp * 0.0625; /* 18b20的分辨率是0.0625 */
Temp = f_temp * 10 + 0.5; /* 乘以10表示小数点后面取一位,加0.5是四舍五入 */
return (Temp); /* Temp是整型 */
}
void readDS18B20andDisplay(void)
{

//Dogs102x6_stringDraw(0, 0, " HUATU ", DOGS102x6_DRAW_NORMAL); /* 初始化显示界面 */
unsigned char dis[10];
unsigned char time_cyc = 0;
while (1)
{
delay_ms(10);
time_cyc = (time_cyc + 1) % 30;
if (time_cyc == 1) /* 30 个10ms执行一次 */
{
temp_value = get_one_temperature(); /* 读取温度 */
dis[0] = temp_value % 1000 / 100 + '0';
dis[1] = temp_value % 100 / 10 + '0';
dis[2] = '.';
dis[3] = temp_value % 10 + '0';
dis[4] = 'C';
dis[5] = 0;
Dogs102x6_stringDraw(0, 0, dis, DOGS102x6_DRAW_NORMAL);
temp_3=58-temp_value;
delay_us( 10 );
Dogs102x6_lineDraw(x1,temp_2,x1+1,temp_3,0);
temp_2=temp_3;
x1 += 1; //横坐标+1
if(x1>102) //LCD显示溢出时,清屏
{
Dogs102x6_clearScreen();
x1=0;
}
}
}
}

标签:MSP430F5529,temp,unsigned,us,delay,温度传感器,byte,温度,DQ
来源: https://blog.csdn.net/pigyellow98/article/details/111405181

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有