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;
}
}
}
}