DevioLab CRYPTO TRADING AUTOMATION
LIVE
AUTOMATED CRYPTO TRADING • BINANCE
Автоматизуйте свій криптопортфель
Торгові боти DevioLab аналізують крипторинок, автоматично відкривають і закривають позиції та керують вашим портфелем на Binance 24/7.
CRYPTO 80 Bots
BINANCE Spot Trading
TRADING 24 / 7
Спробувати DevioLab
deviolab.com

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

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

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

Рік:
2012
Тип роботи:
Розрахункова робота
Предмет:
Мікропроцесори
Група:
ІБ – 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:30

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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