|
(1)LED顯示系統(tǒng)運(yùn)行狀態(tài);
(2)外接鋰電池供電,設(shè)計(jì)的系統(tǒng)具有低功耗特點(diǎn);
(3)使用AD采集電池電壓,并且在OLED顯示;
(4)采集溫度數(shù)據(jù),實(shí)時(shí)OLED顯示;
(5)具有OLED顯示屏顯示功能,顯示測量的溫度,電池電壓;
(6)根據(jù)溫度傳感器測量的溫度,輸出PWM控制直流電機(jī)的轉(zhuǎn)速,模擬智能溫控風(fēng)扇。
文檔內(nèi)容:http://www.torrancerestoration.com/bbs/dpj-213910-1.html
單片機(jī)源程序如下:
- #include<MSP430G2553.h>
- #include <string.h>
- #include <stdio.h>
- #include <math.h>
- #include "OLED.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define DS18B20_IO_IN P2DIR &= ~BIT0
- #define DS18B20_IO_OUT P2DIR |= BIT0
- #define DS18B20_DQ_H P2OUT |= BIT0
- #define DS18B20_DQ_L P2OUT &= ~BIT0
- #define DS18B20_DQ_IN (P2IN & BIT0)
- float TEMP_Result;
- float ADC10_Result=0;
- //復(fù)位DS18B20
- void DS18B20_Rst(void)
- {
- DS18B20_IO_OUT;
- DS18B20_DQ_L;
- _delay_cycles(600);
- DS18B20_DQ_H;
- DS18B20_IO_IN;
- while(DS18B20_DQ_IN);
- while(!DS18B20_DQ_IN);
- }
- //寫一個(gè)字節(jié)到DS18B20
- //dat:要寫入的字節(jié)
- void DS18B20_Write_Byte(uchar dat)
- {
- uchar j;
- DS18B20_IO_OUT;
- for (j=1;j<=8;j++)
- {
- DS18B20_DQ_L;
- _delay_cycles(8);
- if(dat&0x01)
- {DS18B20_DQ_H;}
- else
- {DS18B20_DQ_L;}
- _delay_cycles(80);
- DS18B20_DQ_H;
- dat>>=1;
- }
- }
- //從DS18B20讀一個(gè)字節(jié)
- uchar DS18B20_Read_Byte()
- {
- uchar i=0;
- uchar dat=0;
- for(i=0;i<8;i++)
- {
- dat>>=1;
- DS18B20_IO_OUT;
- DS18B20_DQ_L;
- _delay_cycles(1);
- DS18B20_DQ_L;
- DS18B20_IO_IN;
- _delay_cycles(12);
- if(DS18B20_DQ_IN)
- dat|=0x80;
- _delay_cycles(55);
- }
- return(dat);
- }
- //開始溫度轉(zhuǎn)換
- void DS18B20_Start(void)
- {
- DS18B20_Rst();
- DS18B20_Write_Byte(0xCC);
- DS18B20_Write_Byte(0x44);
- }
- //從ds18b20得到溫度值
- //精度:0.1C
- //返回值:溫度值 (-550~1250)
- float DS18B20_Get_Temp(void)
- {
- uchar TL,TH;
- uint t=0;
- float tt=0;
- DS18B20_Start ();
- DS18B20_Rst();
- DS18B20_Write_Byte(0xCC);
- DS18B20_Write_Byte(0xBE);
- TL=DS18B20_Read_Byte();
- TH=DS18B20_Read_Byte();
- t=TH;
- t<<=8;
- t|=TL;
- tt=((float)(0.0625*(t&0x0f))+(t>>4)*1.000);
- tt=tt*10+0.5;
- tt=tt/10;
- return tt;
- }
- void PMW_OUT_Init () //PWM 輸出初始化
- {
- P3DIR |= BIT5;
- P3SEL |= BIT5;
- TA0CTL |= TASSEL_1+TACLR+MC_1;
- TA0CCTL1 |= OUTMOD_7; //選擇高電平模式的 PWM 輸出
- TA0CCR0=500; // TA1CCR0 寫入 2000(1MHZ/2000)輸出達(dá)到了 500HZ
- }
- void main(void)
- {
- WDTCTL=WDTPW+WDTHOLD;
- LCD_Init();//OLED初始化
- PMW_OUT_Init ();
- P3DIR|=BIT2;
- P3DIR|=BIT6;
- P3OUT&=~BIT6;
- ADC10CTL1 |= CONSEQ_2; //單通道重復(fù)采樣模式
- ADC10CTL0 |= SREF_1+REFON+REF2_5V;//選擇內(nèi)部參考源 2.5V,打開基準(zhǔn)源
- ADC10CTL0 |= ADC10SHT_3+MSC; //過采樣率設(shè)置為 64 個(gè)采樣周期,打開 AD 轉(zhuǎn)換
- ADC10CTL1|= ADC10SSEL_1+ADC10DIV_1+SHS_0; //ACLK2 分 頻 為 采 樣 時(shí) 鐘 , 用ADC10SC 觸發(fā)采集
- ADC10CTL1 |=INCH_3; //選擇通道 A1
- ADC10CTL0 |= ADC10ON; //開啟 ADC10
- ADC10AE0 |= BIT3; //開啟外部通道 A1
- while(1)
- {
- P3OUT^=BIT2;
- P3OUT^=BIT3;
- int i;
- for(i=0;i<20;i++)
- {
- ADC10CTL0 |=ENC+ADC10SC; //開始轉(zhuǎn)換
- while((ADC10CTL0 &ADC10IFG)==0); //等待 ADC10IFG 標(biāo)志變高(轉(zhuǎn)換完成)
- ADC10_Result+=ADC10MEM; //讀取采樣結(jié)果
- }
- ADC10_Result= ADC10_Result/20*2.5/1023*2;
- TEMP_Result=DS18B20_Get_Temp();
- int temp=TEMP_Result;
- TA0CCR1 =160+(temp-24)*34;
- LCD_P8x16Str(18,0,"PWM:");
- LCD_Write_8x16Int(68,0,(TA0CCR1)/5);
- LCD_P8x16Str(86,0,"%");
- LCD_P8x16Str(0,2,"Voltage:");
- LCD_Write_8x16Float(68,2,ADC10_Result);
- LCD_P8x16Str(110,2,"V");
- LCD_P8x16Str(8,4,"Temp:");
- LCD_Write_8x16Float(52,4,TEMP_Result);
- LCD_P8x16Str(104,4,"C");
- ADC10_Result=0;
- _delay_cycles(500000);
- }
- }
復(fù)制代碼
代碼下載:
RZD.zip
(110.46 KB, 下載次數(shù): 42)
2021-11-3 18:52 上傳
點(diǎn)擊文件名下載附件
ccs程序
|
評(píng)分
-
查看全部評(píng)分
|