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;
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237640.html
標籤:其他
