Advertisement
Guest User

kodzik

a guest
Dec 13th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.23 KB | None | 0 0
  1. #include<msp430x14x.h>
  2.  
  3. #include "lcd.h"
  4. #include "wire.h"
  5. #include "LCD_.h"
  6. #define SKIP_ROM 0xCC
  7. #define CONVERT_T 0x44
  8. #define READ_SCRATCHPAD 0xBE
  9. #define klawisz BIT4&P4IN
  10. #define INTERVAL 50000 //okres licznika 0,5s
  11. #define _5s 10 //okres pomiarów
  12.  
  13. int temp;
  14.  
  15. void show(void)
  16. {
  17. int cyfra, waga=10;
  18. if(temp<0)
  19. {
  20. SEND_CHAR('-');
  21. temp*=-1;
  22. }
  23. if(temp<10)
  24. SEND_CHAR('0');
  25.  
  26. if (temp >= 1000)
  27. {
  28. SEND_CHAR('?');
  29. return;
  30. }
  31. while (waga <= temp)
  32. {
  33. waga*=10;
  34. }
  35. while ((waga/=10)>1)
  36. {
  37. cyfra = temp / waga;
  38. SEND_CHAR((int)('0'+cyfra));
  39. temp-=cyfra*waga;
  40. }
  41. SEND_CHAR('.');
  42. SEND_CHAR((int)('0'+temp));
  43. }
  44.  
  45. int main()
  46. {
  47. unsigned int k;
  48. int spec[8] = {7, 5, 7, 0, 0, 0, 0, 0};
  49. WDTCTL = WDTPW | WDTHOLD;
  50. IE1 |= WDTIE; // aktywuje przerwania NMI
  51. _EINT(); // odblokowanie przerwań
  52. BCSCTL1 |= XTS; // oscylator LFXT1 w trybie wysokiej częstotliwości (8MHz)
  53. _BIC_SR(OSCOFF); // włączenie oscylatora LFXT1
  54. unsigned char i;
  55. do
  56. {
  57. IFG1 &= ~OFIFG; // wyczyszczenie flagi OFIFG rejestru IFG1
  58. for (i = 0xFF; i != 0; i--);// odczekanie
  59. }
  60. while (IFG1 & OFIFG);
  61. BCSCTL1 |= DIVA0; // ACLK = LFXT1/8 = 1MHz
  62. BCSCTL1 |= DIVA1;
  63. BCSCTL2 &= ~DIVM0; // MCLK = LFXT1/1 = 8MHz
  64. BCSCTL2 &= ~DIVM1;
  65. BCSCTL2 |= SELM0 | SELM1; // MCLK taktowany z LFXT1
  66. for (i = 0xFF; i != 0; i--); // odczekanie
  67. _BIS_SR(SCG0); // wyłączenie oscylatora DCO
  68. _BIS_SR(SCG1);
  69. InitLCD();
  70. initPort();
  71. SEND_CMD(0x40);
  72. for(int i=0 ; i<8; i++)
  73. {
  74. SEND_CHAR(spec[i]);
  75. }
  76. int temp_jednosc=0;
  77. int temp_dzies=0, calk;
  78. int temperatura;
  79. ADC12CTL0=ADC12ON|REFON|SHT0_15; //wł. rdzenia, wł.gen. nap. odniesienia, wybór nap. odniesienia
  80. ADC12CTL1=SHP|CSTARTADD_0; //próbkowanie impulsowe, wynik składany w ADC12MEM0
  81. ADC12MCTL0=INCH_10|SREF_1; //kanał 10, źródło nap. odniesienia - wew. generator (1,5V)
  82. for(k=0;k<0x3600;k++); //czas na ustabilizowanie generatora nap. odniesienia
  83.  
  84. CCR0=INTERVAL; //ustala nowy okres licznika
  85. TACTL=TASSEL_2|ID_3|MC_1; //źródło taktowania SMCLK, dzielone przez 8,tryb UP
  86. CCTL0=CCIE; //uaktywnienie przerwania od TACCR0 CCIFG
  87. _BIS_SR(GIE); //właczenie przerwań
  88.  
  89. ADC12CTL0 |= ENC; //uaktywnienie konwersji
  90. while (1)
  91. {
  92. reset(); // make initialization of DS18B20
  93. write_byte(SKIP_ROM); // send SKIP ROM command
  94. write_byte(CONVERT_T); // send CONVERT TEMPERATURE command
  95. P1DIR |= BIT7; // magistrala w trybie wyjściowym
  96. P1OUT |= BIT7; // jedynka na wyjście
  97. __Delayx1ms(500); // wait (passive) 750 ms (exactly 768ms)
  98. __Delayx1ms(250); //
  99. reset(); // make initialization of DS18B20
  100. write_byte(SKIP_ROM); // send SKIP ROM command
  101. write_byte(READ_SCRATCHPAD);
  102. temp_dzies = read_byte();
  103. temp_jednosc = read_byte();
  104.  
  105. if((klawisz) == 0)
  106. {
  107. P2OUT |= BIT1;
  108. clearDisplay();
  109. __Delayx1ms(500);
  110. P2OUT &= ~BIT1;
  111. calk = temp_dzies >> 4;
  112. calk += (temp_jednosc & 0x07) << 4;
  113. if (temp_dzies < 0 ) // ujemna temperatura, zamiana części całkowitej temperatury z kodu U2 na NKB
  114. {
  115. calk ^= 0x7F;
  116. temperatura = (temp_dzies & 0x08) ? 0 : 5000; // temperatura ujemna, jedynki części ułamkowej
  117. temperatura += (temp_dzies & 0x04) ? 0 : 2500; // interpretuj jak zera
  118. }
  119. else
  120. {
  121. temperatura = (temp_dzies & 0x08) ? 5000 : 0; // temperatura dodatnia, jedynki części ułakmkowej
  122. temperatura += (temp_dzies & 0x04) ? 2500 : 0; // interpretuj jako jedynki
  123.  
  124. }
  125. if (calk < 10)
  126. {
  127. SEND_CHAR((temp_jednosc & 0x80) && (calk || temperatura) ? '-' : ' '); // w zależności czy ujemna/dodatnia temp
  128. SEND_CHAR(calk+'0');
  129. }
  130. else
  131. {
  132. CHAR_DD(((temp_jednosc & 0x80) ? '-' : ' '), 0x00); // w zależności czy ujemna/dodatnia temp
  133. SEND_CHAR(calk/10+'0');
  134. SEND_CHAR(calk%10+'0');
  135. }
  136. SEND_CHAR(',');
  137. SEND_CHAR(temperatura / 1000+'0');
  138. SEND_CHAR(0);
  139. SEND_CHAR('C');
  140. gotoSecondLine();
  141. ADC12CTL0 |= ADC12SC; //start konwersji
  142. while((ADC12CTL1&ADC12BUSY)==1); //czekanie na koniec konwersji
  143. temp=ADC12MEM0*1.0318-2777.4647; //wartość temperatury z dok. 1-miejsce po przecinku
  144. SEND_CHAR('C');
  145. SEND_CHAR('P');
  146. SEND_CHAR('U');
  147. SEND_CHAR(':');
  148. show(); //wyświetla na LCD
  149. SEND_CHAR(0);
  150. SEND_CHAR('C');
  151. }
  152.  
  153. else
  154. P2OUT &= ~BIT1;
  155. }
  156.  
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement