КАТЕГОРИИ: Архитектура-(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; Просмотров: 680; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |