- •П.С. Довгий, в.И. Скорубский
- •Содержание
- •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.Высокоуровневая программная модель в с51.
2.1. Организация памяти и размещение информации в с51
Диаграмма MCU(рис.2.1.) представляет иерархию памяти и средства ввода-вывода, которые доступны на программном уровне в виде операторов и резервированных переменных языка С51.
Ссылаясь на архитектуру mcs51, в дальнейшем будем иметь ввиду базовую архитектуру(ядро) [ Википедия ].
Традиционно используется конструктивное разделение памяти на внутреннюю (в кристалле MCU) и внешнюю, где (используются дополнительные схемы памяти на печатной плате. В дальнейшем внешняя память интегрируется в одном кристалле с MCU частично или полностью, поэтому их смысл (внутренняя-внешняя изменяется).
Все типы памяти отличаются объемом и способом доступа.







SFR Code


бит
Data
Idata Xdata


Tmod Usart
Tcon P0 P1 P2 P3

Рис. 2.1. Программная модель ЭВМ в С51.
В отличие от классической Неймановской архитектуры разделены адресные пространства памяти программ Code и данных (Data , Idata, Xdata).
1) Data – память данных, режимы использования чтение и запись, объем 128 байт, быстрая по сравнению с другими типами памяти.
Часть ячеек памяти имеет побитовый доступ – поле бит.
Idata обозначает в mcs51 косвенный доступ к Data через регистровую память и имеет смысл только в С51. В mcs52 обозначает расширенную память 256 байт с косвенным доступом.
2) Регистровая память SFR (8-разрядные регистры специальных функций) – 128 байт адресное пространство. В С51 и Ассемблере А51 резервированы
идентификаторы специальных регистров, используемые в периферии и системных модулях, в том числе 8-разрядные порты ввода-вывода P0, P1,P2,P3, регистры управления таймерами Tmod,Tcon, регистры управления последовательным интерфейсом Usart и др.(Приложение 2)
Все занятые регистры SFR определены в файле reg51.h
Остальные регистры свободны и определяются для доступа в С51 как
sfr xx=0x81; //поименован свободный байт для доступа
sfr16 tt= TH0; //обозначен формат из двух байтов — TH0.TL0
sfr16 yy=0xab; //поименованы 2 свободных байта для доступа
Часть регистров имеет побитовый доступ в поле бит. Биты управления в управляющих регистрах идентифицируются для прямого доступа. Например,PSW=C.AC.F0.RS1.RS0.OV.-.P. Прямые адреса этих регистров в
С51 задаются в заголовочном файле системы Keil (#include <reg51.h> или #include <reg52.h>)
3) Сode -постоянная (энергонезависимая) память – 64 Кбайт адресное пространство, доступ – чтение данных, чтение и исполнение команд
4) Расширенная память данных
Xdata –– запись и чтение. 64 Кбайт адресное пространство, доступ к данным – чтение и запись
2.2.Типы и форматы данных в с51
Распределение данных в памяти задано различными типами. На высоком уровне в С51 предполагается прямой (ассоциативным) доступом к значениям данных по имени.
Тип данных, по определению (Алгол), – задает множество допустимых значений и операции преобразования. Множество значений (диапазон) определяем форматом. Таким образом, в определении данных необходимо присутствуют признаки функционального назначения (тип данных) и ихмашинноепредставление (формат) в памяти и при выполнении операций .
В алгоритмических языках приняты унифицированные идентификаторы типа данных и классификация типов данныхстандартная –машинно-независимая
1) числа для простого счета - целые, числа заданной точности — дробные, ,числа с переменным диапазоном и точностью
- байт(char) – единица информации 8 бит – целое число, код символа, единица измерения объема памяти,
сhar x; //знаковое число +/- 27 -1 8-битовый формат с фиксированной
точкой
7 0

s
- x
unsigned char y; //беззнаковый двоичный код 0` 28 -1
Все регистры SFR имеют тип unsigned char по умолчанию.
int x; целое число 16-битовое (216 -1 ~ 65000, диапазон с учетом знака +/-215l 16-битовый формат с фиксированной точкой
unsigned int y; – беззнаковый двоичный код
long x; 32 битовое целое (232 -1 ~ 109) с учетом знака +/- 231
unsigned long z; беззнаковый двоичный код
К целым числам (двоичным кодам) применимы элементарные арифметические опрации (+,-,*,/ ) , поразрядные логические операции (&,|,^,~),Библиотека основных арифметических операций в целых числах встроена и естественно доступна
float число с плавающей точкой фиксированного двоичного формата 32 бита представляет в ЭВМ числа с естественной записью (с естественной запятой). В общепринятом стандарте IEEE 754 числа изменяются в диапазоне
+/- 10 +/-38
естественная запятая 12345,6789
полулогарифмическая форма 0,123456789*105 = M*m
двоичный машинный формат float M* 2+/-p

p
M
31 23 0
double число с плавающей точкой удвоенного диапазона +/- 10+/-308
К числам с плавающей точкой применимы операции (+,-,*,/ ) и функции стандартной библиотеки math.h
Библиотека стандартных функций math.h содержит все необходимые в вычислениях функции с основным типом данных float (тригонометрические, трансцендентные, ….).
Тип данных может быть изменен оператором присваивания.
int x = -2500;
float y = x;
По умолчанию, в С51 численные данные размещаются в памяти Data – 128 байт
сhar x, xx[10]; //формат байт, для целых чисел – со знаком
int y,yy[5]; //формат 2 байта, для целых чисел – со знаком
long z,zz[8]; // формат 4 байта, для целых чисел – со знаком
Доступ по индексу к элементам массива y=yy[2];
беззнаковые (+), соответственно:
unsigned char x, xx[10];
unsigned int y,yy[5];
unsigned long z,zz[8];
Данные могут быть размещены и в других типах памяти программной модели
char code aa[]=”abcdef”; //текстовая константа
char xdata aa[100]; //доступ по адресу через DPTR-регистр
Тип данных, хранящихся в регистрах SFR, не определен и специфицируется при записи в переменную стандартного типа.
В следующем разделе приведены примеры тестирования описания типов данных в А51.
2) символьные данные – тексты в редакторах и компиляторах
Тексты определяются строкой символов, кодируются в виде последовательности байтов ASCII-кода, в памяти строка завершается последним кодом 0. набор стандартных функций со строками в библиотеке
string.h (cmp, cat, cpy,len,clr,spn,str….)
char code str[]=”библиотека функций” – кириллица в коде КОИ8
3) данные булевского (логического) типа
bool – тип данных , кодирующий значения истинности true/false утверждений в виде отношений (<,>,!,!=,==) используется при вычислении значений логических утверждений в условных операторах (код значения true (!=0) в любом формате целого двоичного числа
Например
bool xx= (a<b)&&(!(a==c))||(c!-b); переменные - любые числа, а предикаты--отношения, переменная xx определяются значениями истинности True=1,False=0. Здесь в вычислениях используются команды условных переходов , интерпретирующие соответствующие логические операции с булевскими значениями
В С/С++ могут быть реализованы вычисления в смешанных выражениях c числами, где применяются поразрядные логические операции с разными типами данных - булевскими и числами
zxy=xy&&(!yx)||(xy-22)||(!yx+5); Здесь логика с неявным булевским типом данных (T -1/ F 0) интерпретируется командами условных переходов
zxy=xy&(!yx)|(xy-22)|(!yx+5); Здесь используются поразрядные логические операции T(!=0), F(=0) и результат - число.
В С51 булевский тип (bool) не используется - вместо него применяется битовый тип Bit.
Биты упорядочены в поле , состоящем из 128 бит (16 байтов) в памяти Data и 128 бит в регистрах SFR
1/ bit x1,x2; //определение битовых переменных в битовом поле Data 00-7f
2/ char bdata mem //ячейка в Data c битовой адресацией
sbit y1= mem^0; //0-ой бит ячейки mem
3/ Часть регистров SFR с адресами кратными 8 бит-адресуемые. Биты доступны по именам, определяемым явно или по умолчанию в соответствующих регистрах
sbit y1=P1^2; //второй бит порта Р1
PSW=C.AC.F0.RS1.RS0.OV.-.P - зарезервированные имена битов в регистре PSW
sfr x=0xf0; //свободный бит-адресуемый регистр sfr
sbit x1=x^0;
тест на применение
x=0x55;
if(x1) x1=0;
4) Список целых констант
enum mm {x1=25, x2=33, x4=48};
5) Cтруктура определяет многоуровневую иерархическую организацию данных, например, описание модуля MCU
#include <reg51.h>
#include <stdio.h>
struct mcu {
char name[8];
int format;
int pin;
};
main()
{
code struct mcu MM ={"80c51BH", 8, 32};
TI=1;
printf("тип %s\n ", MM.name); //вывод через UART
printf("формат %d\n ", MM.format);
printf("пин %d\n", MM.pin);
while(1); //динамический останов
}
На языке С51 доступ к рассмотренным типам данных прямой (ассоциативный- по смыслу).
Формат различных типов данных зависит от организации конкретного MCU .К форматам относятся следующий свойства: двоичное кодирование, фиксированная длина и структура двоичных кодов.
6) Специальный машинно-ориентированный тип информации pointer
(адресный указатель). Все существующие компьютеры привязаны принципиально к адресной организации памяти практически на всех ее уровнях – внутренние регистры упорядочены в RGP(General Registers) по адресам в SFR.
В C51 необходимо учитывать иерархическую организацию памяти и разделение ее по типам Data, Code, Xdata. Для работы с указателем также предусмотрены адресуемые ячейки в памяти Data или Xdata..
Таким образом, возможно косвенное обращение к данным с явным определением адреса-указателя и адресного пространства
char data * data xx; //компилятор использует ячейку внутренней памяти data с именем xx для хранения адреcа этой переменной из data
Определение массива char data * data xx[10];
Обращение косвенное к байтам *xx[0]=0x55;
Обращение косвенное к int *(int *)xx[0]=0x1234; //возможность обращения к одному и тому же массиву данных в разных форматах
К указателю применимы целые арифметические операции (+, -, *). Получаемый при этом адрес при обращении к многобайтовым форматам должен учитывать физическое размещение этих форматов в адресуемой памяти – BigEndian (BE)-старший байт имеет больший адрес
(2. тестировать способ размещения long в памяти Data, Code ,Xdata)
Постоянная память Code
char code *aa[]=”abcdef”; //указатель-адрес константы
float code *pi;
*pi=3.143;
Расширенная память данных Xdata
Константы определять в Xdata не целесообразно, так как реально они хранятся в памяти Code
char xdata *aa[]; //указатель-адрес динамического массива
