
- •П.С. Довгий, в.И. Скорубский
- •Содержание
- •2.Высокоуровневая программная модель в с51.
- •2.1. Организация памяти и размещение информации в с51
- •4) Расширенная память данных
- •2.2.Типы и форматы данных в с51
- •2.3. Ввод-вывод в с51
- •2.5. Управление программой.
- •3.1. Структура Памяти, команды обмена данными.
- •Idata sfr Data Sfr
- •2.4.2. Ввод-вывод в а51
- •2.4.4 Арифметические и логические операции.
- •2) Беззнаковая арифметика
- •3) Десятичная арифметика
- •4) Логика поразрядная 8 битовая
- •5) Битовые операции
- •3.1.1. Беззнаковые целые численные данные.
- •3.1.2. Дробные численные данные.
- •5. В mcs51 доступна простая десятичная арифметика – предлагается составить программу преобразования двух разрядной десятичной дроби
- •3.2. Двоичная арифметика
- •3.2.2.Умножение знаковое в с51
- •3.2.3. Беззнаковое деление
- •3. Вычисления
- •3.1. Вычисление функции с плавающей точкой.
- •График функции в окне Анализатора.
- •3.2. Вычисление функции с фиксированной точкой в целых числах и выбор масштабов.
- •3.3. Макроассемблер
- •3.4. Вычисление функции с фиксированной точкой в дробных числах.
- •3.3. Иерархия памяти эвм.
- •1) Прямой доступ к данным
- •2) Косвенный доступ к данным по адресу через адрес-указатель
- •3.4. Битовые данные.
- •1) Доступ к битам в с51
- •2) Адресация к битам в Ассемблере
- •3.5. Система прерывания.
- •Void Ex00(void) interrupt 0 using 1
- •3.5.1. Подсчет внешних прерываний
- •1) Программа в с51
- •Внутренние прерывания при переполнении таймеров.
- •3.5.2. Часы реального времени..
- •Intt0() interrupt 0
- •2.5.4. Широтно-импульсная модуляция (шим).
- •Xrl a,{ri,@rj,#d,ad} xchd a,@rj a(3-0)@rj(3-0)
- •Xrl ad,{#d,a} swap a a(3-0)a(7-4)
- •Open -
- •Save - все остальные имеют стандартное назначение
- •Окно Загрузчика (Debug)
- •Вопросы по курсу лабораторных работ к зачету и экзамену.
- •Кафедра вычислительной техники
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
}