Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mcs51_1 / Пособие ч1.doc
Скачиваний:
47
Добавлен:
21.03.2016
Размер:
957.44 Кб
Скачать

2.3. Ввод-вывод в с51

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

Стандартные средства ввода-вывода объединены в библиотеке stdio.h и имеют машинно-ориентированную интерпретацию, учитывающую прямое управление вводом-выводом в MCU.

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

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

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

Вывод P2=0x55;

Ввод char bb=P1;

bb+=P1;

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

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

#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;

}

Чтение-модификация–запись приемлема только для портов , подключенных как выходные.

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

( 4. модифицировать выходной бит порта P2)

2.4.Вычислеиия в С51 организуются по общей схеме – выбираются типы данных, формулируется численный алгоритм вычислений , который приводится к элементарным арифметическим операциям.

Типы данных определяют распределение памяти .

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

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

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

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

В машинной арифметике определяются разные их свойства – целые числа в форматах с фиксированной точкой можно характеризовать абсолютной погрешностью =1 в некотором целом масштабе и диапазоном в форматах char, int, long. Большие целые числа могут быть представлены в разных масштабах с округлением и заданной абсолютной точностью (например, соответствующие значениям в некотором масштабе единиц измерения (расстояния, длины проводников, время, ….),.

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

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

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

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

Если числа X изменяются в широком диапазоне, то используют плавающую точку и для оценки точности - относительную погрешность ∂=/|X|=const Порядок числа задает изменяемый масштаб мантиссы. [Марон]

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

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

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

#include <reg51.h>

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;

}

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

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

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

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

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

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

#include <reg51.h>

#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

}

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

#include <reg51.h>

int kk=2500,zz=700;

long yy,xx=1000;

main()

{

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

}

Соседние файлы в папке mcs51_1