Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<msp430x14x.h>
- #include "lcd.h"
- #include "wire.h"
- #include "LCD_.h"
- #define SKIP_ROM 0xCC
- #define CONVERT_T 0x44
- #define READ_SCRATCHPAD 0xBE
- #define klawisz BIT4&P4IN
- #define INTERVAL 50000 //okres licznika 0,5s
- #define _5s 10 //okres pomiarów
- int temp;
- void show(void)
- {
- int cyfra, waga=10;
- if(temp<0)
- {
- SEND_CHAR('-');
- temp*=-1;
- }
- if(temp<10)
- SEND_CHAR('0');
- if (temp >= 1000)
- {
- SEND_CHAR('?');
- return;
- }
- while (waga <= temp)
- {
- waga*=10;
- }
- while ((waga/=10)>1)
- {
- cyfra = temp / waga;
- SEND_CHAR((int)('0'+cyfra));
- temp-=cyfra*waga;
- }
- SEND_CHAR('.');
- SEND_CHAR((int)('0'+temp));
- }
- int main()
- {
- unsigned int k;
- int spec[8] = {7, 5, 7, 0, 0, 0, 0, 0};
- WDTCTL = WDTPW | WDTHOLD;
- IE1 |= WDTIE; // aktywuje przerwania NMI
- _EINT(); // odblokowanie przerwań
- BCSCTL1 |= XTS; // oscylator LFXT1 w trybie wysokiej częstotliwości (8MHz)
- _BIC_SR(OSCOFF); // włączenie oscylatora LFXT1
- unsigned char i;
- do
- {
- IFG1 &= ~OFIFG; // wyczyszczenie flagi OFIFG rejestru IFG1
- for (i = 0xFF; i != 0; i--);// odczekanie
- }
- while (IFG1 & OFIFG);
- BCSCTL1 |= DIVA0; // ACLK = LFXT1/8 = 1MHz
- BCSCTL1 |= DIVA1;
- BCSCTL2 &= ~DIVM0; // MCLK = LFXT1/1 = 8MHz
- BCSCTL2 &= ~DIVM1;
- BCSCTL2 |= SELM0 | SELM1; // MCLK taktowany z LFXT1
- for (i = 0xFF; i != 0; i--); // odczekanie
- _BIS_SR(SCG0); // wyłączenie oscylatora DCO
- _BIS_SR(SCG1);
- InitLCD();
- initPort();
- SEND_CMD(0x40);
- for(int i=0 ; i<8; i++)
- {
- SEND_CHAR(spec[i]);
- }
- int temp_jednosc=0;
- int temp_dzies=0, calk;
- int temperatura;
- ADC12CTL0=ADC12ON|REFON|SHT0_15; //wł. rdzenia, wł.gen. nap. odniesienia, wybór nap. odniesienia
- ADC12CTL1=SHP|CSTARTADD_0; //próbkowanie impulsowe, wynik składany w ADC12MEM0
- ADC12MCTL0=INCH_10|SREF_1; //kanał 10, źródło nap. odniesienia - wew. generator (1,5V)
- for(k=0;k<0x3600;k++); //czas na ustabilizowanie generatora nap. odniesienia
- CCR0=INTERVAL; //ustala nowy okres licznika
- TACTL=TASSEL_2|ID_3|MC_1; //źródło taktowania SMCLK, dzielone przez 8,tryb UP
- CCTL0=CCIE; //uaktywnienie przerwania od TACCR0 CCIFG
- _BIS_SR(GIE); //właczenie przerwań
- ADC12CTL0 |= ENC; //uaktywnienie konwersji
- while (1)
- {
- reset(); // make initialization of DS18B20
- write_byte(SKIP_ROM); // send SKIP ROM command
- write_byte(CONVERT_T); // send CONVERT TEMPERATURE command
- P1DIR |= BIT7; // magistrala w trybie wyjściowym
- P1OUT |= BIT7; // jedynka na wyjście
- __Delayx1ms(500); // wait (passive) 750 ms (exactly 768ms)
- __Delayx1ms(250); //
- reset(); // make initialization of DS18B20
- write_byte(SKIP_ROM); // send SKIP ROM command
- write_byte(READ_SCRATCHPAD);
- temp_dzies = read_byte();
- temp_jednosc = read_byte();
- if((klawisz) == 0)
- {
- P2OUT |= BIT1;
- clearDisplay();
- __Delayx1ms(500);
- P2OUT &= ~BIT1;
- calk = temp_dzies >> 4;
- calk += (temp_jednosc & 0x07) << 4;
- if (temp_dzies < 0 ) // ujemna temperatura, zamiana części całkowitej temperatury z kodu U2 na NKB
- {
- calk ^= 0x7F;
- temperatura = (temp_dzies & 0x08) ? 0 : 5000; // temperatura ujemna, jedynki części ułamkowej
- temperatura += (temp_dzies & 0x04) ? 0 : 2500; // interpretuj jak zera
- }
- else
- {
- temperatura = (temp_dzies & 0x08) ? 5000 : 0; // temperatura dodatnia, jedynki części ułakmkowej
- temperatura += (temp_dzies & 0x04) ? 2500 : 0; // interpretuj jako jedynki
- }
- if (calk < 10)
- {
- SEND_CHAR((temp_jednosc & 0x80) && (calk || temperatura) ? '-' : ' '); // w zależności czy ujemna/dodatnia temp
- SEND_CHAR(calk+'0');
- }
- else
- {
- CHAR_DD(((temp_jednosc & 0x80) ? '-' : ' '), 0x00); // w zależności czy ujemna/dodatnia temp
- SEND_CHAR(calk/10+'0');
- SEND_CHAR(calk%10+'0');
- }
- SEND_CHAR(',');
- SEND_CHAR(temperatura / 1000+'0');
- SEND_CHAR(0);
- SEND_CHAR('C');
- gotoSecondLine();
- ADC12CTL0 |= ADC12SC; //start konwersji
- while((ADC12CTL1&ADC12BUSY)==1); //czekanie na koniec konwersji
- temp=ADC12MEM0*1.0318-2777.4647; //wartość temperatury z dok. 1-miejsce po przecinku
- SEND_CHAR('C');
- SEND_CHAR('P');
- SEND_CHAR('U');
- SEND_CHAR(':');
- show(); //wyświetla na LCD
- SEND_CHAR(0);
- SEND_CHAR('C');
- }
- else
- P2OUT &= ~BIT1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement