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

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

Міністерство освіти і науки Україниіі Національний університет „Львівська політехніка” Кафедра «Захисту інформації» Розрахункова робота З курсу: «Мікропроцесорні пристрої» Львів-2010 Завдання: Написати та відлагодити програму для схеми, яка б здійснювала дискретизацію вхідного сигналу з діапазоном Uвх=0-5 В з частотою FS Гц аналого-цифровим перетворювачем МАХ1241 (опорна напруга UREF=5 В) та відображала знаення напруги на рідкокристалічному дисплеї LM020L з контролером HD44780 та передавала її значення через послідовний порт в ПК зі швидкістю передачі R Бод. Тактова частота FT МА АТ90S2313 становить 7.3728 МГц. Якщо напруга виходить за межі 2.5 В ± 0.чч В (хх – дві останні цифри номера залікової книжки, якщо хх=00 то прийняти хх=99) на дисплей виводиться повідомлення Alarm. № варіанту Частота дискретизації FS, Гц Швидкість передачі по УАПП R, Бод  2 0.02 4800   Номер в списку – 2 Номер залікової книжки – 0609114 Код програми мовою С: #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'); /* c++; if(ADC_Result < 1884) a++; if(c == 5) { putchar(a); a=0; c=0; }*/ } 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; }; Розрахунки: Напруга в межах – 2.36 до 2.64 Нижній рівень = (4096*2.36)/5 = 1933 Верхній рівень = (4096*2.64)/5 = 2162 Fs = 0,2 Гц. Часовий інтервал генерації таймером переривання обчислюється за формулою:  Враховуючи, що при максимальному значені N = 65535, значення подільника становить DIV = 562, потрібно взяти подільник на порядок вище (DIV = 1024), тоді значення N становить:  Схема у Proteus 7   Висновок: Виконуючи дану розрахункову роботу я набув навиків програмування на мові С програм для дискретизації вхідного аналогового сигналу від аналогово-цифрового перетворювача МАХ1241 та відображення інформації про виміряну напругу на рідкокристалічному монохромному дисплеї LM020L з контролером HD44780, для мікроконтроллера AT90S2313.
Антиботан аватар за замовчуванням

07.01.2012 14:05

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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