پروژه اندازه گیری دما و ارسال از طریق سریال
در این پست پروژه اندازه گیری دما و ارسال از طریق سریال را برای دانلود قرار داده ام. در این پروژه از یک عدد میکروکنترلر AVR به عنوان پردازنده و کنترل کننده استفاده شده است. با استفاده از سنسور دمای LM35 دمای محیط اندازه گرفته شده و به میکروکنترلر ارسال می شود. میکروکنترلر نیز دما را از طریق رابط سریال RS232 به کامپیوتر ارسال می کند.در زیر به صورت جزیی توضیحات این پروژه اورده شده است.
سنسور دمای استفاده شده در این پروژه از نوع آنالوگ به شماره LM35 می باشد. این سنسور به ازای هر درجه تغییر در خروجی خود 10 میلی ولت ولتاژ تولید می کند. ولتاژ خروجی سنسور به ورودی مبدل آنالوگ به دیجیتال میکروکنترلر یا همان ADC وارد می شود. دقت اندازه گیری این مبدل روی 10 بیت تنظیم شده است و ولتاژ مرجع نیز روی پایه AREF است که ما به آن ولتاژ 5 ولت داده ایم،بنابراین به ازای هر 10 میلی ولت روی پایه ADC ما عدد 2 را خواهیم داشت. مقدار عددی که از ADC خوانده می شود را بر عدد 2 تقسیم کرده و دما به دست می آید.
برای نمایش دمای محیط از یک عدد LCD کاراکتری با سایز 16*2 استفاده نموده ایم.همچنین از طریق رابط سریال USART اطلاعات را به کامپیوتر ارسال می کنیم. به علت اینکه منطق صفر و یک در میکروکنترلر و کامپیوتر با یکدیگر متفاوت می باشد از یک عدد آیسی مبدل به شماره max232 در این پروژه استفاده کرده ایم. همچنین شما می توانید از مبدل های USB به سریال نیز استفاده کنید که در اینصورت می توانید به صورت مستقیم به USB کامپیوتر متصل شود.برای خواندن دما از طریق کامپیوتر شما باید برای میکروکنترلر اینتر را ارسال کنید.در زیر نمایی از پروژه به همراه سورس کد آن آورده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
#include <mega32.h> #include <delay.h> #include <stdlib.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> bit Receiver=0 , Transmit=0 ; #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; Receiver = 1 ; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif // Standard Input/Output functions #include <stdio.h> #define ADC_VREF_TYPE 0x00 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void main(void) { int i ; char str[20],str1[20],data_in; float temp ; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x47; // ADC initialization // ADC Clock frequency: 86.400 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE; ADCSRA=0x87; // LCD module initialization lcd_init(16); // Global enable interrupts #asm("sei") while (1) { temp=read_adc(0); temp=(temp*100/1024) ; ftoa(temp,1,str); lcd_clear(); lcd_gotoxy(0,0); sprintf(str1,"Temp : %s \xdfC\r",str); lcd_puts(str1); delay_ms(100); if (Receiver==1) { data_in=getchar(); printf("%c\r",data_in); if (data_in==13) { Transmit=1; } if (Transmit==1) { for(i=0;i<10;i++) { delay_ms(1000); puts(str1); } if(i>=10) { Receiver=0; Transmit=0; } } } }; } |
دانلود پروژه اندازه گیری دما و ارسال از طریق رابط سریال