نمایش دمای lm35 توسط lpc1768 روی lcd با استفاده از وقفه تایمر
به نام خدا و با سلام خدمت هموطنان گرامی!
در این پست پروژه ای رو که الان انجام دادم با همه کتابخونه های طبقه بندی میخوام معرفی کنم…
این پروژه با میکروکنترلر lpc1768 انجام شده که میتونه مقدار ولتاژ(خواندن دما از طریق آنالوگ lm35 ) رو از همه کانال های adc با دقت ۱۲ بیت بخونه و با استفاده از وقفه تایمر که زمان سر ریز تایمر به راحتی قابل تعیین هستش رو روی lcd کاراکتری نمایش بده که در ادامه کد رو میذارم و توضیحاتش رو میگم…
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 |
#include <lpc17xx.h> #include "delay.h" #define LCD_LPC1768 /* Char LCD definition */ #define LCD_PORT_0 #define LCD_RS 16 #define LCD_RW 17 #define LCD_E 18 #define LCD_DB4 19 #define LCD_DB5 20 #define LCD_DB6 21 #define LCD_DB7 22 #include "lcd.h" #include "stdutils.h" #include "gpio.h" #include "timer.h" #define LED1 P0_20 #define LED2 P0_23 int x=1456; char ch[]="microdroidprj.ir"; char ch1[]="*LM35 & CH_LCD* "; float pot_value,ldr_value, temp_raw, temp_final; float voltage; float templm35; char buffer[16]; char buffer1[16]; int j; void myTimerIsr_0(void) { //GPIO_PinToggle1(LED1); /* Toggle the LED1 (P2_0) */ pot_value = ADC_GetAdcValue(5); // 5 => CHNEL 5 IN LPC1768 => P1.31 voltage = (pot_value * 3300)/ 4096.0; /// vahed mili volt::: if you want volt write 3.3 insted of 3300 sprintf(buffer ,"VOLT=%fmV", voltage); lcd_gotoxy(1,1); // satr1,ston1 lcd_putsf( buffer); } void myTimerIsr_1(void) { // GPIO_PinToggle1(LED2); /* Toggle the LED1 (P2_0) */ pot_value = ADC_GetAdcValue(5); // 5 => CHNEL 5 IN LPC1768 => P1.31 templm35=voltage/10; sprintf(buffer1 ,"TEMP=%fC",templm35); lcd_gotoxy(2,1); //satr2,ston1 lcd_putsf( buffer1); } main() { lcd_init(); SystemInit(); ADC_Init(); lcd_clear(); for(j=0;j<32;j++) { lcd_gotoxy(1,j+1); lcd_putchar(ch[j]); lcd_gotoxy(2,j+1); lcd_putchar(ch1[j]); delay_ms(300); } delay_ms(900); for(j=0;j<16;j++){ lcd_gotoxy(1,j+1); lcd_putchar(' '); lcd_gotoxy(2,j+1); lcd_putchar(' '); delay_ms(250); } //--------- timmer -------------------------------------------- GPIO_PinDirection1(LED1,OUTPUT); /* Configure the pins as Output to blink the Leds*/ GPIO_PinDirection1(LED2,OUTPUT); TIMER_Init(0,1000000); /* Configure timer0 to generate 1000ms(1000000us) delay*/ TIMER_Init(1,3000000); /* Configure timer1 to generate 3000ms(3000000us) delay*/ TIMER_AttachInterrupt(0,myTimerIsr_0); /* myTimerIsr_0 will be called by TIMER0_IRQn */ TIMER_AttachInterrupt(1,myTimerIsr_1); /* myTimerIsr_1 will be called by TIMER1_IRQn */ TIMER_Start(0); /* Start the Timers */ TIMER_Start(1); //--------- timmer -------------------------------------------- while (1) { } } |
در ابتدای این برنامه چند کتابخونه اضافه شده که حتما باید دقت داشته باشید define های مربوط به lcd باید قبل اضافه شدن کتابخونه lcd معرفی بشن!!!
بعده تعریف کتابخونه ها چند تا متغییر معرفی کردیم که ازشون استفاده میکنیم…
در این برنامه از وقفه های تایمر ۰ و ۱ استفاده کردم که اسم وقفه با استفاده از خط کد زیر تعیین میشه!
1 2 |
TIMER_AttachInterrupt(0,myTimerIsr_0); TIMER_AttachInterrupt(1,myTimerIsr_1); |
که اسم وقفه تایمر ۰ و ۱ مشخص شده .
برای تعیین زمان سر ریز تایمر هم از خط کد زیر استفاده میکنیم و زمان هم بر حسب میکروثانیه هستش!
1 2 |
TIMER_Init(0,1000000); /* Configure timer0 to generate 1000ms(1000000us) delay*/ TIMER_Init(1,3000000); /* Configure timer1 to generate 3000ms(3000000us) delay*/ |
در نهایت بعده تنظیمات دلخواه که به راحتی هم برای همه تایمر ها به همین صورت انجام میشه ،تایمر های مورد نیاز رو start میکنیم; تابع stop تایمر هم نوشته شده و در کتابخونه موجوده…!!!
برای خوندن مقادیر ولتاژ از طریق کانال های adc هم کافیه بعد از نوشتن تابع adc_init در هر جا که مورد نیازه مقادیر رو از طریق دستور زیر برای همه کانال به کار ببریم…
1 |
pot_value = ADC_GetAdcValue(5); |
با دستور بالا مقدار خام کانال پنجم واحد adc تا سقف ۳٫۳ ولت خونده میشه و درون متغیر float pot_value ریخته میشه که با عملیات ریاضی زیر مقدار خام adc به واحد ولتاژ تبدیل میشه…
1 |
voltage = (pot_value * 3.3)/ 4096.0; |
در اینجا عدد ۳٫۳ ولتاژ مرجع هستش و عدد ۴۰۹۶ هم از اونجایی که adc میکرومون ۱۲ بیتی هستش ، ۲ به توان ۱۲ میشه ۴۰۹۶٫
برای همه کانال های adc میشه ازین تابع به راحتی استفاده کرد…
lcd کاراکتری هم به پورت صفر متصل شده که
و ترتیب پایه های اون هم به شکل زیر هستش
1 2 3 4 5 6 7 |
#define LCD_RS 16 #define LCD_RW 17 #define LCD_E 18 #define LCD_DB4 19 #define LCD_DB5 20 #define LCD_DB6 21 #define LCD_DB7 22 |
و شماتیکش اتصال میکرو به lcd هم مانند شکل زیر هستش…
مطلب پیشنهادی :پروژه کنترل رله و دریافت دما از ماژول SIM800L توسط میکروکنترلر LPC1768
و در آخر هم نحوه عملکرد به این صورته که تو این برنامه تایمر ۰ هر ۱ ثانیه مقدار ولتاژ رو روی lcd نشون میده و تایمر ۱ هم هر ۳ ثانیه مقدار دما رو روی lcd نشون میده…!!!
فایل های سورس با استفاده از کامپایلر keil در زیر قابل دانلود می باشد…
تا مطالب بعدی خدا نگهدار
لینک های پیشنهادی :
لینک مطلب بخش نرم افزار پروژه که تحت #C نوشته شده است.
لینک مطلب بخش سخت افزار پروژه ارتباط میکروکنترلر lpc1768 با برنامه اندرویدی و c# )
لینک مطلب بخش نرم افزار پروژه که تحت اندروید نوشته شده است.