Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2010
Тип роботи:
Розрахункова робота
Предмет:
Мікропроцесори
Група:
ІБ – 44

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет Львівська політехніка  Розрахункова робота з курсу: «Мікропроцесорні пристрої» Завдання Написати та відлагодити програму для схеми, яка б здійснювала дискретизацію вхідного сигналу з діапазоном Uвх=0..5 В з частотою FS Гц аналого-цифровим перетворювачем МАХ1241 (опорна напруга UREF=5 В) та відображала знаення напруги на рідкокристалічному дисплеї LM020L з контролером HD44780 та передавала її значення через послідовний порт в ПК зі швидкістю передачі R Бод. Тактова частота FT МА АТ90S2313 становить 7.3728 МГц. Якщо напруга виходить за межі 2.5 В ± 0.хх В (хх – дві останні цифри номера залікової книжки, якщо хх=00 то прийняти хх=99) на дисплей виводиться повідомлення Alarm. № варіанту Частота дискретизації FS, Гц Швидкість передачі по УАПП R, Бод  7 0.07 9600   Номер в списку – 7 Номер залікової книжки – 0609074 Теоретичні відомості Якщо напруга не належить цьому відрізку необхідно вивести повідомлення Alarm. Знайдемо значення констант спрацювання за формулою: , де - напруги порогів спрацювання,  - опорна напруга на АЦП (5 Вольт),  - шукана константа.   Знайдемо подільник та поріг спрацювання таймера Т1, для того, щоб проводити опитування напруги з частотою дискретизації Fs = 0,4 Гц. Часовий інтервал генерації таймером переривання обчислюється за формулою:  Враховуючи, що при максимальному значені N = 65535, значення подільника становить DIV = 281, потрібно взяти подільник на порядок вище (DIV = 1024), тоді значення N становить:  Отже, значення порогу порівняння для таймера Т1 становить TimerVal = 4000 Знайдемо подільник частоти для UART, щоб забезпечити швидкість передачі R = 9600 бод. Швидкість визначається наступним виразом:  де  – швидкість передачі (в бодах);  – тактова частота МК, Гц; UBRR – вміст регістру контролера швидкості передачі (0…255) Звідси Код програми мовою С #include<stdio.h> typedef unsigned char byte; #define LCD_Rom 16 #define LCD_Row 16 #define LCD_CLEAR 0x01 #define LCD_RETURN 0x02 #define LCD_AUTO 0x04 #define LCD_CURSOR_AUTOINC 0x02 #define LCD_CURSOR_AUTODEC 0x00 #define LCD_DISPL_AUTOSHIFT 0x01 #define LCD_DISPL_NOAUTOSHIFT 0x00 #define LCD_DISPLAY 0x08 #define LCD_DISPLAY_ON 0x04 #define LCD_DISPLAY_OFF 0x00 #define LCD_CURSOR_ON 0x02 #define LCD_CURSOR_OFF 0x00 #define LCD_CURSOR_BLICK 0x01 #define LCD_CURSOR_NOBLICK 0x00 #define LCD_SHIFT 0x10 #define LCD_SHIFT_CURSOR 0x00 #define LCD_SHIFT_DISPLAY 0x08 #define LCD_SHIFT_LEFT 0x00 #define LCD_SHIFT_RIGHT 0x04 #define LCD_MODE 0x20 #define LCD_MODE_4BIT 0x00 #define LCD_MODE_8BIT 0x10 #define LCD_MODE_1ROW 0x00 #define LCD_MODE_2ROW 0x08 #define LCD_MODE_7FONT 0x00 #define LCD_MODE_10FONT 0x04 #define LCD_SET_CGRAM 0x40 #define LCD_SET_DDRAM 0x80 #define PORT_LCD_DATA PORTB #define DDR_LCD_DATA DDRB #define PIN_LCD_DATA PINB #define LCD_D7 7 #define LCD_D6 6 #define LCD_D5 5 #define LCD_D4 4 #define BF LCD_D7 #define PORT_LCD_CTRL PORTD #define DDR_LCD_CTRL DDRD #define PIN_LCD_CTRL PIND #define LCD_WR 4 #define LCD_E 5 #define LCD_RS 6 #define CTRL 0 #define DATA 1 #define WRITE 0 #define READ 1 byte LCD_READ(byte ctrl); void LCD_WRITE(byte ctrl, byte val); void LCD_WRCMD(byte cmd); void LCD_WRDAT(byte arg); void LCD_Init(void); #define SE 5 void ADC_Convert(void); int ADC_Result; interrupt[5] Timer_Comp(void) { ADC_Convert(); } byte LCD_READ(byte ctrl); void LCD_WRITE(byte ctrl, byte val); void LCD_WRCMD(byte cmd); void LCD_WRDAT(byte arg); void LCD_Init(void); #include<90S2313.h> #include<delay.h> void main(void) { long int T_100000, T_10000, T_1000, T_100, tt; LCD_Init(); DDRB.0 = 1; PORTB.0 = 1; DDRB.1 = 0; DDRB.2 = 1; PORTB.2 = 0; OCR1 = 3999; TCCR1B = 0x0D; TIMSK = 0b01000000; MCUCR = (1<<SE); UCR = 0x18; UBRR = 95; #asm sei #endasm while(1) { #asm sleep #endasm tt = ADC_Result * (long int)12207; T_100000 = tt/10000000; tt = tt - T_100000 * (long int)10000000; T_10000 = tt/1000000; tt = tt - T_10000 * (long int)1000000; T_1000 = tt/100000; tt = tt - T_1000 * (long int)100000; T_100 = tt/10000; tt = 0; if (ADC_Result>1441 && ADC_Result<2654) { LCD_WRCMD(LCD_RETURN); LCD_WRDAT('U'); LCD_WRDAT('='); LCD_WRDAT(T_100000+0x30); LCD_WRDAT('.'); LCD_WRDAT(T_10000+0x30); LCD_WRDAT(T_1000+0x30); LCD_WRDAT(T_100+0x30); LCD_WRDAT(' '); LCD_WRDAT('V'); } else { LCD_WRCMD(LCD_RETURN); LCD_WRDAT('-'); LCD_WRDAT('!'); LCD_WRDAT('A'); LCD_WRDAT('L'); LCD_WRDAT('A'); LCD_WRDAT('R'); LCD_WRDAT('M'); LCD_WRDAT('!'); LCD_WRDAT('-'); }; } }; byte LCD_READ(byte ctrl) { byte temp1, temp2; DDR_LCD_DATA.LCD_D7 = 0; DDR_LCD_DATA.LCD_D6 = 0; DDR_LCD_DATA.LCD_D5 = 0; DDR_LCD_DATA.LCD_D4 = 0; PORT_LCD_DATA.LCD_D7 = 0; PORT_LCD_DATA.LCD_D6 = 0; PORT_LCD_DATA.LCD_D5 = 0; PORT_LCD_DATA.LCD_D4 = 0; PORT_LCD_CTRL.LCD_RS = ctrl; PORT_LCD_CTRL.LCD_WR = READ; PORT_LCD_CTRL.LCD_E = 1; delay_us(5); temp1 = PIN_LCD_DATA & 0xF0; PORT_LCD_CTRL.LCD_E = 0; delay_us(5); PORT_LCD_CTRL.LCD_E = 1; delay_us(5); temp2 = PIN_LCD_DATA; PORT_LCD_CTRL.LCD_E = 0; PORT_LCD_CTRL.LCD_WR = WRITE; temp1 = temp1 + (temp2>>4); return temp1; }; void LCD_WRITE(byte ctrl, byte val) { DDR_LCD_DATA.LCD_D7 = 1; DDR_LCD_DATA.LCD_D6 = 1; DDR_LCD_DATA.LCD_D5 = 1; DDR_LCD_DATA.LCD_D4 = 1; PORT_LCD_DATA.LCD_D7 = val & 0x80; PORT_LCD_DATA.LCD_D6 = val & 0x40; PORT_LCD_DATA.LCD_D5 = val & 0x20; PORT_LCD_DATA.LCD_D4 = val & 0x10; PORT_LCD_CTRL.LCD_RS = ctrl; PORT_LCD_CTRL.LCD_WR = WRITE; PORT_LCD_CTRL.LCD_E = 1; delay_us(5); PORT_LCD_CTRL.LCD_E = 0; delay_us(5); PORT_LCD_DATA.LCD_D7 = (val<<4) & 0x80; PORT_LCD_DATA.LCD_D6 = (val<<4) & 0x40; PORT_LCD_DATA.LCD_D5 = (val<<4) & 0x20; PORT_LCD_DATA.LCD_D4 = (val<<4) & 0x10; PORT_LCD_CTRL.LCD_E = 1; delay_us(5); PORT_LCD_CTRL.LCD_E = 0; #asm("nop"); DDR_LCD_DATA.LCD_D7 = 0; DDR_LCD_DATA.LCD_D6 = 0; DDR_LCD_DATA.LCD_D5 = 0; DDR_LCD_DATA.LCD_D4 = 0; }; void LCD_WRCMD(byte cmd) { while((LCD_READ(CTRL) & (1<<BF)) != 0) {}; LCD_WRITE(CTRL, cmd); }; void LCD_WRDAT(byte arg) { while((LCD_READ(CTRL) & (1<<BF)) != 0) {}; LCD_WRITE(DATA, arg); }; void LCD_Init(void) { byte ii; PORT_LCD_CTRL.LCD_RS = 0; PORT_LCD_CTRL.LCD_WR = 0; PORT_LCD_CTRL.LCD_E = 0; DDR_LCD_CTRL.LCD_RS = 1; DDR_LCD_CTRL.LCD_WR = 1; DDR_LCD_CTRL.LCD_E = 1; delay_ms(50); DDR_LCD_DATA.LCD_D7 = 1; DDR_LCD_DATA.LCD_D6 = 1; DDR_LCD_DATA.LCD_D5 = 1; DDR_LCD_DATA.LCD_D4 = 1; PORT_LCD_DATA.LCD_D7 = (LCD_MODE+LCD_MODE_8BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x80; PORT_LCD_DATA.LCD_D6 = (LCD_MODE+LCD_MODE_8BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x40; PORT_LCD_DATA.LCD_D5 = (LCD_MODE+LCD_MODE_8BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x20; PORT_LCD_DATA.LCD_D4 = (LCD_MODE+LCD_MODE_8BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x10; PORT_LCD_CTRL.LCD_RS = CTRL; PORT_LCD_CTRL.LCD_WR = WRITE; for(ii = 0; ii < 3; ii++) { PORT_LCD_CTRL.LCD_E = 1; delay_us(300); PORT_LCD_CTRL.LCD_E = 0; delay_ms(5); } PORT_LCD_DATA.LCD_D7 = (LCD_MODE+LCD_MODE_4BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x80; PORT_LCD_DATA.LCD_D6 = (LCD_MODE+LCD_MODE_4BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x40; PORT_LCD_DATA.LCD_D5 = (LCD_MODE+LCD_MODE_4BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x20; PORT_LCD_DATA.LCD_D4 = (LCD_MODE+LCD_MODE_4BIT+LCD_MODE_1ROW+LCD_MODE_7FONT) & 0x10; PORT_LCD_CTRL.LCD_E = 1; delay_us(300); PORT_LCD_CTRL.LCD_E = 0; delay_ms(5); LCD_WRITE(CTRL, LCD_MODE+LCD_MODE_4BIT+LCD_MODE_1ROW+LCD_MODE_7FONT); delay_us(50); LCD_WRCMD(LCD_DISPLAY+LCD_DISPLAY_OFF+LCD_CURSOR_OFF+LCD_CURSOR_NOBLICK); LCD_WRCMD(LCD_CLEAR); LCD_WRCMD(LCD_AUTO+LCD_CURSOR_AUTOINC+LCD_DISPL_NOAUTOSHIFT); LCD_WRCMD(LCD_DISPLAY+LCD_DISPLAY_ON+LCD_CURSOR_OFF+LCD_CURSOR_NOBLICK); }; Продовження стр. 6 Продовження стр. 6 void ADC_Convert(void) { byte ii; int temp = 2048; ADC_Result = 0; PORTB.0=0; #asm ("nop") #asm ("nop") #asm ("nop") while(PINB.1==0); for (ii=0; ii<12; ii++) { PORTB.2=1; #asm ("nop") #asm ("nop") #asm ("nop") PORTB.2=0; #asm ("nop") #asm ("nop") #asm ("nop") if (PINB.1==1) ADC_Result = ADC_Result + temp; temp = temp >> 1; } PORTB.0=1; }; Розрахунки Напруга в межах – 1.76 до 3.24 В Нижній рівень = (4096*1.76)/5 = 1441 Верхній рівень = (4096*3.24)/5 = 2654 Схема у Proteus 7   Висновок Виконуючи дану розрахункову роботу я набув навиків програмування на мові С програм для дискретизації вхідного аналогового сигналу від аналогово-цифрового перетворювача МАХ1241 та відображення інформації про виміряну напругу на рідкокристалічному монохромному дисплеї LM020L з контролером HD44780, для мікроконтроллера AT90S2313.
Антиботан аватар за замовчуванням

01.01.2012 19:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!