Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Ввод-вывод в Usart




Ввод-вывод через порты

Ввод-вывод в С51

Указатель даных в памяти Code

Указатель на размещение данных в Data

char * xx[] =”abcdef”;

Обращение косвенное к байтам *xx[0]=0x55;

Обращение косвенное к int *(int *)xx[0]=0x1234; //возможность обращения к одному и тому же массиву данных в разных форматах

char code *aa []=”abcdef”; //указатель-адрес начала константы в Data

Указатель данных в памяти Xdata размещается в Data

char xdata *aa[]; //указатель-адрес данных из xdata, указатель в Data Константы определять в Data и Xdata не целесообразно, так как реально они хранятся в памяти Code

Для размещения указателей также могут быть выбраны адресуемые ячейки в памяти Data или Xdata..

char * xdata xx; // данные в Data, указатель в Xdata

Определение массива char data * data xx[10];

 

(1. тестировать размещение многобайтовых форматов в памяти Data, Code,Xdata в А51)

 

.

В С51 прямой Ввод-вывод представлен цифровыми 8-битовыми прямо-доступными портами P0-P3 и последовательным программируемым интерфейсом USART.

Порт P0 двунаправленный и может в реальной схеме использоваться для ввода и вывода в разные моменты времени и не требуют настройки.

Порты P1,P2,P3 в реальных схемах включены как однонаправленные и настраиваются на соответствующий режим обмена. Детали их использования в совместном режиме конкретизируются на уровне А51.

 

Вывод P2=0x55;

Ввод char bb=P1;

bb+=P1;

Порт представляет двоичный 8-битовый код и приобретает смысл типа при вводе с записью в конкретный формат или при выполнении операций с конкретными типами данных.

 

(2.Как определяется тип данных при вводе с порта – привести тест)

#include <reg51.h>

char x;

int y,z;

main()

{ P1=0x80; //двоичный код

x=P1; //x= -128 интерпретируется как знаковое целое

z=x; //z= -128

y=P1; //y=128 в формате int интерпретируется как целое беззнаковое

y=x*P1; //y <0 P1=0x80 >0 и char x<0

y=z*P1; //y >0 P1=0x80 >0 и unsigned char z>0

PSW=0xC0;

y=PSW;

}

 

Оператор Чтение-модификация–запись для порта приемлем только для двунаправленного порта P0 и выходных портов P1,P2,P3.

P2+=0x55; P3&=0x0f; P1++;

 

В стандарте С используются стандартные устройства, подключаемые через контроллеры к стандартной системной шине, например, PCI в PC. Контроллеры реализуют систему команд, ориентированную на форматный ввод и вывод

В С51 используется библиотека stdio.h. Cтандартный ввод (с клавиатуры) и вывод (в принтер) осуществляется через последовательный интерфейс UART-.

#include <stdio.h>

main()

{

char code mcu MM ={"80c51BH", 8, 32};

TI=1;

printf("тип %s\n ", MM.name); //вывод через UART

}

 

 

2.4.Вычислеиия в С51

Доступ к данным - прямой(ассоциативный) к значениям по имени

При вычислении арифметических выражений форматы выравниваются и приводятся к максимальному формату результата или одного из операндов

Однако надежнее использовать одинаковые форматы для всех операндов и результата.

Два основных типа –целые числа и плавающая точка используют соответсвующие библиотеки в С51 – встроенную для целых и math.h для плавающей.

Для хранения и обработки целых используется формат с фиксированной после младшего разряда запятой.

Целые числа в форматах с фиксированной точкой можно характеризовать абсолютной погрешностью D =1 в некотором целом масштабе и диапазоном в форматах char, int, long.

Большие целые числа могут быть представлены в разных масштабах с округлением и заданной абсолютной точностью (например, соответствующие значениям в некотором масштабе единиц измерения (расстояния, длины проводников, время, ….),.

Дробные числа характеризуются абсолютной погрешностью,

для хранения и обработки дробных используется формат с фиксированной перед старшим разрядом запятой В компьютерах с целой арифметикой.

дробные преобразуются в целые и обратно масштабированием, абсолютная погрешность определяется этим масштабом.

Числа с плавающей точкой характеризуются постоянной относительной погрешностью, переменной абсолютной (с переменным масштабом) и диапазоном в форматах float и double.

При вычислениях оценка погрешности – ответственная задача, необходимая для выбора форматов чисел.

 

А) Пример вычислений в целых y=x*(k+z/10)

 

int kk=2500,zz=700; //масштаб m=1;

main()

{ int yy, xx=1000; //масштаб m=1;

yy=xx*(kk+zz/10); // yy=14096 - не верно

//исправление - long yy

// long yy; int xx=1000;

//yy=xx*(kk+zz/10); // yy=14096 - не верно

 

 

//исправление - long xx

//long yy, xx=1000;

// yy=xx*(kk+zz/10); // yy=2570000 масштаб m=1;

}

Если ориентируемся при выборе форматов только на значения (диапазон) операндов, то результат неверный, что является следствием унифицированного исполнения (машинной независимостью) операций в С, где операнды и результат должны быть одного типа.

В машинном исполнении возникают неконтролируемые в С переполнения и искажения результата.

Можно ориентироваться на худший случай и выбирать формат максимального размера l ong, что не исключает возможного искажения результата.

Выбор формата упрощается, если моделировать вычисления в форматах float и оптимизировать выбор форматов (масштабов) с фиксированной точкой, распределение памяти и время вычислений.

При этом выбираются контрольные точки, где возможно переполнение или потеря точности при максимальных значениях операндов и выбираются необходимые форматы. Точность теряется при выполнении деления и возможно исчезновение числа..

Б)Тестирование c float

 

#include <math.h>

float x=35,kk=2500,zz=700,xx=1000,y; //масштаб m=1

main() {

y=xx*(kk+zz/10); // y=2570000

zz/=10; // 250 выбираем unsigned char zz;

zz=kk+zz; //2570 выбираем int kk, zz;

y=xx*zz; //2570000 выбираем long y,

а с учетом свойства операции умножения в С также long xx

}

 

В) Вычисления в целых с выбранными форматами

int kk=2500,zz=700;

long yy,xx=1000;

main() {

yy=xx*(kk+zz/10); // y=2570000 m=1

}

 




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 650; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.019 сек.