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

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

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

Рік:
2024
Тип роботи:
Розрахункова робота
Предмет:
Мікропроцесори

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

Міністерство освіти і науки Україниіі Національний університет „Львівська політехніка” Кафедра «Захисту інформації» Розрахункова робота З курсу: «Мікропроцесорні пристрої» Львів-2010 Завдання: Написати та відлагодити програму для схеми, яка б здійснювала дискретизацію вхідного сигналу з діапазоном Uвх=0-5 В з частотою FS Гц аналого-цифровим перетворювачем МАХ1241 (опорна напруга UREF=5 В) та відображала знаення напруги на рідкокристалічному дисплеї LM020L з контролером HD44780 та передавала її значення через послідовний порт в ПК зі швидкістю передачі R Бод. Тактова частота FT МА АТ90S2313 становить 7.3728 МГц. Якщо напруга виходить за межі 2.5 В ± 0.чч В (хх – дві останні цифри номера залікової книжки, якщо хх=00 то прийняти хх=99) на дисплей виводиться повідомлення Alarm. № варіанту Частота дискретизації FS, Гц Швидкість передачі по УАПП R, Бод  29 2.0 2400   Номер в списку – 2 Номер залікової книжки – 0609163 Код програми мовою С: #include <stdio.h> #include <stdlib.h> #include <string.h> #define LCD_Rom 16 typedef unsigned char byte; #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" /* quartz crystal frequency [Hz] */ #define xtal 1000000L /* Baud rate */ #define baud 9600 void main(void) { int T_100000, T_10000, T_1000, T_100; long int tt; char data[2]; int i=0,time=5; unsigned char buffer[6]; LCD_Init(); DDRB.0=1; PORTB.0=1; DDRB.1=0; DDRB.2=1; PORTB.2=0; //OCR1=3999; OCR1=35999 TCCR1B=0x0D; TIMSK=0b01000000; MCUCR=(1<<SE); UCR=0x18; // UBRR=95; /* initialize the UART's baud rate */ UBRR=xtal/16/baud-1; #asm sei #endasm while (1) { #asm sleep #endasm tt=ADC_Result*(long int)12207; T_100000=tt/10000000; tt=tt-T_100000*10000000; T_10000=tt/1000000; tt=tt-T_10000*1000000; T_1000=tt/100000; tt=tt-T_1000*100000; T_100=(tt/10000) + 1; tt=0; if (ADC_Result>1933 && ADC_Result<2162) { 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); }; 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.87 до 3.13 Нижній рівень = (4096*1.87)/5 = Верхній рівень = (4096*3.13)/5 = Fs = 2.0 Гц. Часовий інтервал генерації таймером переривання обчислюється за формулою:  Враховуючи, що при максимальному значені N = 65535, значення подільника становить DIV = 562, потрібно взяти подільник на порядок вище (DIV = 1024), тоді значення N становить: !!!!!!!!!!!!! Схема у Proteus 7   Висновок: Виконуючи дану розрахункову роботу я набув навиків програмування на мові С програм для дискретизації вхідного аналогового сигналу від аналогово-цифрового перетворювача МАХ1241 та відображення інформації про виміряну напругу на рідкокристалічному монохромному дисплеї LM020L з контролером HD44780, для мікроконтроллера AT90S2313.
Антиботан аватар за замовчуванням

08.09.2012 17:09-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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