/***************************************************** This program was produced by the CodeWizardAVR V1.25.7f Pro Project : Termometr_DS18B20 Version : 0.1 Date : 02.02.2008 Author : Danil Company : home Comments: ðàáî÷àÿ âåðñèÿ, íî ïðè -1,0 ïîêàçàíèÿ -8,8 äèíàìè÷åñêàÿ èíäèêàöèÿ ñ çàìåòíûì ìåðöàíèåì Chip type : ATtiny2313 Clock frequency : 4,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *****************************************************/ #include <tiny2313.h> // 1 Wire Bus functions (bit 0 PORTA) #asm .equ __w1_port=0x1b .equ __w1_bit=0 #endasm //#include <1wire.h> // DS18b20 Temperature Sensor functions #include <ds18b20.h> #include <delay.h> #define digit1 PORTD.0 #define digit2 PORTD.4 #define digit3 PORTD.5 #define digit4 PORTD.6 eeprom char digits[] = { 0xD7, // 0 0x14, // 1 0xCD, // 2 0x5D, // 3 0x1E, // 4 0x5B, // 5 0xDB, // 6 0x15, // 7 0xDF, // 8 0x5F, // 9 0x08, // 10 - çíàê ìèíóñ 0x0F, // 11 - ñèìâîë ãðàäóñ öåëüñèÿ 0x00, // 12 - ïóñòî 0x8B, // 13 - F 0x98, // 14 - n 0xFC, // 15 - d. 0xCB, // 16 - E 0x88, // 17 - r 0xA8 // 18 - r. }; #define MINUS 10 #define GRADUS 11 #define PROBEL 12 char digit_out[4], cur_dig; int temperature; float temperature_DS18B20; bit isfloat; /* maximum number of DS18B20 connected to the 1 Wire bus */ #define MAX_DEVICES 2 /* DS18B20 devices ROM code storage area */ unsigned char rom_code[MAX_DEVICES][9]; // Timer 1 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { switch (cur_dig){ case 0:{digit1=0;digit2=1;digit3=1;digit4=1;break;}; case 1:{digit1=1;digit2=0;digit3=1;digit4=1;break;}; case 2:{digit1=1;digit2=1;digit3=0;digit4=1;break;}; case 3:{digit1=1;digit2=1;digit3=1;digit4=0;break;}; } PORTB=digits[digit_out[cur_dig]]; if (cur_dig==1&isfloat) PORTB.5=1; cur_dig++; if (cur_dig==4) cur_dig=0; } // Declare your global variables here void hex_to_dec(void); void main(void) { //================================================= main ======================================================== unsigned char i,devices; i=0; devices=0; // Declare your local variables here // Crystal Oscillator division factor: 1 CLKPR=0x80; CLKPR=0x00; // Ïîðò À íà ââîä DDRA=0x00; PORTA=0x00; // Ïîðò B íà âûâîä + ïîäòÿãèâàþùèå ðåçèñòîðû íå âêëþ÷àòü DDRB=0xFF; PORTB=0x00; // Ïîðò D (áèòû 6,5,4,0 íà âûâîä, áèòû 3,2,1 íà ââîä) DDRD=0x71; PORTD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 62,500 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR0A=0x00; TCCR0B=0x03; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // 1 Wire Bus initialization //w1_init(); // Global enable interrupts #asm("sei") devices=w1_search(0xf0,rom_code); // íà 2 ñåêóíäû âûñâåòèòü íà èíäèêàòîðå Fnd 'êîë-âî íàéäåíûõ óñòðîéñòâ' digit_out[0]=13; // F digit_out[1]=14; // n digit_out[2]=15; // d. digit_out[3]=devices; // 'devices' delay_ms(2000); while (1) { devices=w1_search(0xf0,rom_code); // îïðåäåëèòü óñòðîéñòâà (îïðîñèòü äàò÷èêè) if (devices) { // åñëè îáíàðóæåíî õîòÿ áû îäèí äàò÷èê for (i=0;i<devices;) { temperature_DS18B20=ds18b20_temperature(&rom_code[i++][0]); if (temperature_DS18B20!=-9999) { temperature=(int)(temperature_DS18B20*10); // òåìïåðàòóðà * 10 ò.å. 24,3 ãðàäóñîâ áóäåò 243 hex_to_dec(); if (devices!=1) delay_ms(2000); } } } } } // =============================================================== end main ================================================== // ----------------------------------------------------------------------------------------------------------------------------- // âõîäíûå äàííûå: òåìïåðàòåðà îò -99 äî +199 ò.å åñëè òåìï. 201 ãðàäóñ òî íà èíäèêàòîðå 101, åëè -150 òî íà èíäèêàòîðå -15 // ----------------------------------------------------------------------------------------------------------------------------- void hex_to_dec(void) { char i; unsigned int temp; isfloat=1; // ïîêàçàòü çàïÿòóþ // temperature = 1000 ýòî 100,0 ãðàäóñîâ öåëüñèÿ ò.å. òî÷íîñòü 0,1 ãðàäóñà if (temperature>=0) { // åñëè òåìïåðàòóðà ïîëîæèòåëüíàÿ temp = temperature; // åñëè áîëüøå 100 ãðàäóñîâ, òî çàïÿòóþ íå âûñâå÷èâàòü è îòñå÷ü äåñÿòûå äîëè ò.å òî÷íîñòü 1 ãðàäóñ, // digit_out[0] = ñîòíè, åñëè ìåíüøå òî digit_out[0] = äåñÿòêè if (temperature>=1000) { isfloat = 0; temp = temperature/10; }; i=0; while (temp>=100) { temp=temp-100; i++; }; if (i) digit_out[0]=i; else digit_out[0]=PROBEL; // åñëè ïåðâûé ñèìâîë "0" òî âûñâåòèòü ïðîáåë (ïóñòî) i=0; while (temp>=10) { temp=temp-10; i++; }; digit_out[1]=i; digit_out[2]=temp; } else { // åñëè òåìïåðàòåðà îòðèöàòåëüíàÿ temp = -temperature; // èç îòðèöàòåëüíîé ñäåëàòü ïîëîæèòåëüíóþ if (temp > 100) { isfloat=0; temp = temp/10; } // åñëè òåìïåðàòóðà áîëüøå 10 ãð. òî çàïÿòóþ íå ïîêàçûâàòü // è òî÷íîñòü óìåíüøèòü äî 1 ãðàäóñà i=0; while (temp>=10) { temp=temp-10; i++; }; digit_out[0]=MINUS; digit_out[1]=i; digit_out[2]=temp; } digit_out[3]=GRADUS; }
fred1144