Смит_Сопряжение комп с внешн устр_Часть1 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть2 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть3 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть4 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть5 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть6 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть7 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть8 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть9 ø2
Смит_Сопряжение комп с внешн устр_Часть
Смит_Сопряжение комп с внешн устр_Часть10 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть11 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть12 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть13 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть14 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть15 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть16 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть17 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть18 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть19 ø2
Смит_Сопряжение комп с внешн устр_Часть1
Смит_Сопряжение комп с внешн устр_Часть20 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть21 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть22 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть23 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть24 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть25 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть26 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть27 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть28 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть29 ø2
Смит_Сопряжение комп с внешн устр_Часть2
Смит_Сопряжение комп с внешн устр_Часть30 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть31 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть32 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть33 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть34 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть35 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть36 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть37 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть38 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть39 ø2
Смит_Сопряжение комп с внешн устр_Часть3
Смит_Сопряжение комп с внешн устр_Часть40 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть41 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть42 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть43 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть44 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть45 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть46 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть47 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть48 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть49 ø2
Смит_Сопряжение комп с внешн устр_Часть4
Смит_Сопряжение комп с внешн устр_Часть50 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть51 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть52 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть53 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть54 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть55 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть56 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть57 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть58 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть59 ø2
Смит_Сопряжение комп с внешн устр_Часть5
Смит_Сопряжение комп с внешн устр_Часть60 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть61 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть62 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть63 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть64 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть65 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть66 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть67 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть68 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть69 ø2
Смит_Сопряжение комп с внешн устр_Часть6
Смит_Сопряжение комп с внешн устр_Часть70 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть71 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть72 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть73 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть74 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть75 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть76 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть77 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть78 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть79 ø2
Смит_Сопряжение комп с внешн устр_Часть7
Смит_Сопряжение комп с внешн устр_Часть80 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть81 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть82 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть83 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть84 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть85 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть86 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть87 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть88 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть89 ø2
Смит_Сопряжение комп с внешн устр_Часть8
Смит_Сопряжение комп с внешн устр_Часть90 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть91 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть92 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть93 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть94 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть95 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть96 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть97 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть98 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть99 ø2
Смит_Сопряжение комп с внешн устр_Часть9
Смит_Сопряжение комп с внешн устр_Часть100 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть101 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть102 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть103 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть104 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть105 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть106 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть107 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть108 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть109 ø2
Смит_Сопряжение комп с внешн устр_Часть10
Смит_Сопряжение комп с внешн устр_Часть110 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть111 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть112 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть113 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть114 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть115 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть116 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть117 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть118 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть119 ø2
Смит_Сопряжение комп с внешн устр_Часть11
Смит_Сопряжение комп с внешн устр_Часть120 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть121 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть122 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть123 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть124 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть125 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть126 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть127 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть128 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть129 ø2
Смит_Сопряжение комп с внешн устр_Часть12
Смит_Сопряжение комп с внешн устр_Часть130 ø2
Смит_Сопряжение комп с внешн устр_Часть13
Смит_Сопряжение комп с внешн устр_Часть131 ø2
Смит_Сопряжение комп с внешн устр_Часть13
Смит_Сопряжение комп с внешн устр_Часть132 ø2
Смит_Сопряжение комп с внешн устр_Часть13
Смит_Сопряжение комп с внешн устр_Часть133 ø2
Смит_Сопряжение комп с внешн устр_Часть13
Text
                    ';.

;-::.'

Computer
lnterfacing
George А. Smith,
В. А. (Hons), С. Eng.,

М.1.Е.Е.

Newnes

Oxford • Auckland • Boston • Johannesburg • MelЬourne • New Delhi


Джордж Смит Сопряжение компьютеров с внешними устройствами , ·!·б.-µЧ7,' Уроки реализации , , "/, .· ' Перевод с английского канд. физ.-мат. наук В. В. Матвеева под редакцией д-ра физ.-мат. наук В. М. Матвеева 1 , а~ : Москва «Мир» 2000 ·, J-.' i / ' -
УДК681.3 ББК 32.97 cso ~· ,J , ,~ \~' '· Смит Дж. CSO ,,$ ) .~ Сопряжение компьютеров с внешними устройствами. Уроки реализации: Пер. с англ. - М.: Мир, 2000. - 266 с., ил. ·'" ISBN 5-03-003371-8 Книга английского автора является практическим курсом по исполь­ зованию компьютера для управления внешними устройствами через соm­ порт, параллельный принтерный порт или параллельный программиру­ емый интерфейсный порт. Книга дает общее представление о микропроцессорных системах и выгодно отличается от других тем, что в ней содержится описание как ап­ паратных, так и программных средств. Приведенные серии программных примеров знакомят читателя с применением языка высокого уровня для ввода/вывода и управления внешними устройствами. В целях облегчения са~юстоятельного изучения предмета в книгу включено множество практических заданий и программных упражнений, в которых используются минимальный набор аппаратных средств и прос­ тые для восприятия программы. Для студентов вузов и колледжей, а также преподавателей. ББК ' "~' ·, 'IV 32.97 ! ; ( r.·:; Редакция литературы по информатшсе и lювой технике ISBN 5-03-003371-8 (рус.) ISBN О- 7506-4474-5 (авrл.) Computer Interfacing Ьу George Smith © Reed Educational & Professional Publishing Ltd (2000) © перевод на русский язык, оформление, «МИр», 2000
,, Оглавление '' ' ,, Введение 12 Часть 1. ..................... 15 Глава 1. Системы счисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Основы цифровой электроники 15 15 1.1. Прямое преобразование двоичных чисел ................... 1.1.1. Преобразование чисел из десятичной формы в двоичную 1.1.2 Преобразование чисел из двоичной формы в десятичную 1.2. Двоично-десятичный код (ДЦК) . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Шестнадцатеричные числа (hex) . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4. Числа со знаком . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1. «дополнение до 2» как способ представления отрицательных чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.2. Суммирование двоичных чисел со знаком . . . . . . . . . . . . . 1.5. Числа с плавающей точкой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.1. Примеры преобразования чисел с плавающей точкой . . . 1.5.2. Смещенные порядки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6. Представление алфавитно-цифровых символов . . . . . . . . . . . . . 1. 7. Преобразования из одной системы счисления в другую . . . . . . . 1.7.1. Перевод всех символов в прописные . . . . . . . . . . . . . . . . . . 1.7.2. Перевод символов в строчные . . . . . . . . . . . . . . . . . . . . . . . 1.7.3. Преобразование АSСП-кодов чисел от О до 9 в 4-разрядные двоичные числа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7.4. Преобразование АSСП-кодов в щестнадцатеричные числа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.8. Вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава Электронные логические элементы и регистры 16 17 17 18 19 20 21 22 23 23 25 25 25 26 26 27 27 ........... 30 2.1. Логические элементы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Логические элементы: таблицы истинности и условные графические обозначения . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2. Коммерческие логические элементы . . . . . . . . . . . . . . . . . 2.1.3. Примеры ТТЛ ИС и КМОП ИС. . . . . . . . . . . . . . . . . . . . . . 2.2. Дещифраторы адреса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2. 31 33 34 36
6 Оглавление 2.3. Устройства с тремя выходными состояниями................ 2.3.1. Буфер с тремя состояниями . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2. Управление входами статического ОЗУ . . . . . . . . . . . . . . . 2.3.3. 8-разрядные буферы с тремя состояниями. . . . . . . . . . . . . 2.3.4. 8-разрядные двунаправленные буферы с тремя состояниями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Логические схемы последовательного действия. . . . . . . . . . . . . . 2.4. l. Фиксатор (триггер-защелка) D-типа . . . . . . . . . . . . . . . . . . 2.4.2. 8-разрядный буфер с тремя состояниями . . . . . . . . . . . . . . 2.5. Шинные системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6. Упражнение для ознакомления с работой ОЗУ . . . . . . . . . . . . . . Глава 8-разрядный микропроцессор 37 37 38 39 40 42 42 43 43 45 ........................... 48 ;( ............................. ................... 3.2.1. Работа системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2. Микропроцессор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3. Постоянное запоминающее устройство (ПЗУ) . . . . . . . . . 3.2.4. Оперативное запоминающее устройство (ОЗУ) . . . . . . . . 3.2.5. Схемы синхронизации и сброса . . . . . . . . . . . . . . . . . . . . . . 3.2.6. Адресная шина . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.7. Шина данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.8. Управляющая шина . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.9. Дешифратор адреса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.10. Стек............................................. 3.3. Микропроцессор Zilog Z80 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.l. Общее описание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2. Регистр состояния . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3. Временная диаграмма микропроцессора . . . . . . . . . . . . . . 3.3.4. Команды и режимы адресации . . . . . . . . . . . . . . . . . . . . . . . 3.3.5. Примеры режимов адресации . . . . . . . . . . . . . . . . . . . . . . . . 3.3.6. Программа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.7. Прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.8. Короткая подпрограмма прерывания . . . . . . . . . . . . . . . . . 48 49 50 51 51 52 52 52 53 53 53 54 55 56 58 59 61 62 64 67 70 Часть 2. ........................ 73 Глава 4. Типы микропроцессоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. Типы микропроцессоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. l. Факторы, влияющие на конструкцию системы . . . . . . . . . 4.1.2. Скорость обработки и передачи данных . . . . . . . . . . . . . . . 73 73 74 74 3. 3.1. 3.2. \ Введение в микропроцессоры 8-разрядная микропроцессорная система Теория и программирование
Оглавление 4.1.3.Стоимостьсистемы ................................ ............................. Физический размер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Способы увеличения производительности микропроцессоров . 4.2.l. Конвейерная обработка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2. Кэширование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3. Перекрывающиеся окна регистров . . . . . . . . . . . . . . . . . . . 4.2.4. Управление микропроцессором и его синхронизация . . . Компьютер с полным набором команд (CISC)............... 4.3.l. Микропроцессор МС68000 фирмы Motorola . . . . . . . . . . Компьютер с сокращенным набором команд (RISC) . . . . . . . . . 4.4.l. Микропроцессор МС88100 фирмы Motorola . . . . . . . . . . Однокристальные микроконтроллеры . . . . . . . . . . . . . . . . . . . . . . 4.5. l. Микроконтроллер Philips 83/87С752 (8ХС752) . . . . . . . . . 4.1.4. 4.1.5. 4.2. 4.3. 4.4. 4.5. Глава 5. Средства ввода/вывода Применения микропроцессоров 5.1. ........................ 6. Структура программного обеспечения 91 92 93 96 98 101 102 ................... l 06 ..................... ............ ........................... ............................................ ............ :. . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5. Блок-схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 108 109 109 112 113 114 114 115 7. Программирование на языке Си . . . . . . . . . . . . . . . . . . . . . . . . . . 117 7.1.ВведениевязыкСи 118 119 122 123 124 Разработка программного обеспечения 6.1. 6.2. 6.3. Структурное программирование 6.4. Псевдокод (структурированный английский) Конструирование программ методом сверху вниз 6.3.1. 6.4.l. 6.4.2. 6.4.3. Глава 75 76 76 77 77 79 80 82 83 84 86 87 88 88 Системы управления и измерительная аппаратура: измеритель потока воздуха . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1. Аппаратное обеспечение . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.2. Разработка программного обеспечения . . . . . . . . . . . . . . . 5.2. Системы связи: цифровая обработка сигнала (digital signal processiпg - DSP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3. Потребительские системы: настольный компьютер . . . . . . . . . . 5.3.1. Компьютерная система . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 7 7. 2. 7.3. 7.4. Структурное программированиеДжексона (СПД)...... ............... Последовательность................................ Выбор Итерация ...................................... .............. Восемь этапов программирования на языке Си Создание программ на языке Си........................... Отладка программы 7.4.1. Типичные ...................................... .................................. ошибки
Оглавление 8 . . . . . . . . . . . . . . . . . . . . . . . . . 124 7.5.1. Упражнение «Вывод строк, функция printf()» . . . . . . . . . . 124 7.5.2. Упражнение «Вывод числа байтов, зарезервированных под переменные» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 7.5.3. Упражнение «Преобразователь числа» . . . . . . . . . . . . . . . . 126 7.5.4. Упражнение «Очистка экрана»....................... 127 7.5.5. Упражнение «Цикл for» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 7.5.6. Упражнение «Квадраты чисел»....................... 129 7.5.7. Упражнение «Запись данных в массив» . . . . . . . . . . . . . . . 129 7.5.8. Упражнение «Изменения в упражнении 7 .5. 7» . . . . . . . . . 130 7.5.9. Упражнение «Запись данных на диск» . . . . . . . . . . . . . . . . 131 7.5.10. Упражнение «Тестирование упражнения 7.5.9 . . . . . . . . 133 7.5.11. Упражнение «Загрузка данных с дискового файла» . . . . 134 7.5.12. Упражнение «Альтернативная загрузка данных с дискового файла» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 7.5.13. Упражнение «Преобразование температуры» . . . . . . . . . 138 7.5.14. Упражнение «Определение функций»................ 141 7.6. Выбранные ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 7.5. Примеры программ и упражнения ...................... 143 . ...... ... ... .... ....... ... 8.1. Последовательная передача данных . . . . . . . . . . . . . . . . . . . . . . . 8.2. Аппаратные средства последовательного интерфейса . . . . . . . . 8.3. Упражнения............................................ 8.3.1. Упражнение «Тестирование петлевой конфигурации» . . 8.3.2. Упражнение «Исследование сигналов СОМ-порта»..... 8.3.3. Упражнение «Связь между двумя компьютерами» . . . . . . 8.3.4. Упражнение «Передача текста» . . . . . . . . . . . . . . . . . . . . . . 8.4. Вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 143 146 148 148 150 151 152 152 9. Параллельный интерфейс . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 ИCintel82C55APPI .................................... 9.1.1. РРl-режим О (базовый ввод/вывод) . . . . . . . . . . . . . . . . . . . 9.1.2. Упражнение «Вывод чисел в режиме 0» . . . . . . . . . . . . . . . 9.1.3. Упражнение «Тестирование ввода в режиме 0» . . . . . . . . . 9.1.4. РРl-режим 1, стробируемый ввод/вывод . . . . . . . . . . . . . . 9.1.5. Упражнение «РРl-режим 1, тест выводаданныХ>> . . . . . . . 9.1.6. Упражнение «Тест ввода данных в режиме!» . . . . . . . . . . 9.2. Упражнения с шаговым двигателем . . . . . . . . . . . . . . . . . . . . . . . . 9.2.1. Упражнение «Управление шаговым двигателем» . . . . . . . 154 156 157 159 162 163 166 169 169 Часть 3. Упражнения по интерфейсу Глава 8. Последовательный интерфейс Глава 1 f 9.1.
Оглавление 9.2.2. Упражнение «Управление двигателем; три скорости вра- 9.2.3. Упражнение «Управление двумя щаговыми двигателями» 174 174 Цифро-аналоговый параллельный интерфейс........... 175 щения» Глава 10. 9 10.1. 10.2. ........................................... Цифро-аналоговое преобразование ....................... 175 Упражнения по преобразованию цифрового сигнала в анало- говый ................................................ 178 10.2.1.Упражнение «Тестирование цифро-аналогового преоб­ разователя» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3. Функциональный генератор (генератор сигналов специальной 178 формы)............................................... 182 182 10.3.1. Упражнение «Функциональный генератор».......... 10.3.2.Упражнение «Полный вариант функционального гене- Глава ратора» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4. Вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 186 11. Аналого-цифровой ............ 187 11.1. Аналого-цифровые преобразователи . . . . . . . . . . . . . . . . . . . . . . 11.1.1. Аналого-цифровой преобразователь с динамической компенсацией . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.2. АЦП параллельного, или мгновенного, преобразования 11.2. Упражнения по аналого-цифровому преобразованию сигнала 11.2.1. Упражнение «Тестирование АЦП» . . . . . . . . . . . . . . . . . . 11.2.2. Упражнение «Вольтметр» . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2.3. Упражнение «Двухдиапазонный вольтметр» . . . . . . . . . . 187 11.3. Глава 12. Вопросы параллельный интерфейс .............................................. Параллельный принтерный порт ........................ 188 190 191 191 197 198 199 200 12.1. Параллельный принтерный порт . . . . . . . . . . . . . . . . . . . . . . . . . 200 12.2. Упражнения по вводу/выводу данных . . . . . . . . . . . . . . . . . . . . . 201 12.2.1. Упражнение «Вывод данных через принтерный порт» . 201 12.2.2. Упражнение «Ввод/вывод данных через принтерный порт.............................................. 202 12.3. Упражнения с шаговым двигателем . . . . . . . . . . . . . . . . . . . . . . . 208 12. 3.1. Упражненuе «Шаговый двигатель; две скорости вращения в каждом направлении» . . . . . . . . . . . . . . . . . . . . . . . . . 208 12.3.2. Упражнение «Шаговый двигатель; три скорости в каждом направлении» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
10 Глава Оглавление 12.3.3. Упражнение «Два двигателя, две скорости»............ 12.4. Упражнения с функциональным генератором.............. 12.4.1. Упражнение «Функциональный генератор» . . . . . . . . . . . 12.4.2. Упражнение «Полный вариант функционального генератора» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.Упражнениясвольтметром .............................. 12.5.1. Упражнения«АЦП» ............................... 12.5.2. Упражнение «Вольтметр» . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.3. Упражнение «Двухдиапазонный вольтметр» 214 214 214 218 218 13. Дополнительные упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . 220 13.1. Теория частотомера ..................................... 13.l.l. ТриrгерШмитта .................................. 13.1.2. Двоичный счетчик . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2. Упражнения с частотомером . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13. 2.1 . Упражнения «Базовый счетчик» . . . . . . . . . . . . . . . . . . . . . 13.2.2. Упражнение «Четырехдиапазонный счетчик» . . . . . . . . . 13.2.3. Упражнение «Увеличение точности до± !Гц» . . . . . . . . 13.2.4. Упражнение «Автоматическая калибровка»........... 13.2.5. Упражнение «Входная схема счетчика». . . . . . . . . . . . . . . В,З. Последовательная передача данных . . . . . . . . . . . . . . . . . . . . . . . 13.4. Управление шаговым двигателем по линии последовательной передачи данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 221 223 225 22 5 228 229 231 231 232 211 211 211 233 13.4.1.Упражнение «Управление двумя шаговыми двигателями по 4-проводной линии последовательной передачи данных» 13.4.2. ................. . ........ .. .......... . . 234 Упражнение «Использование двухпроводного кабеля и общего провода для управления двумя шаговыми двига- телями» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 13.4.3. Упражнение «Последовательное управление тремя ша­ говыми двигателями» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 1 ;Н' ГЛава 14. Контрольно-измерительная аппаратура и тестирование . 245 14.1. Контрольно-измерительная аппаратура . . . . . . . . . . . . . . . . . . . 245 14.2. Проблемы аппаратного обеспечения . . . . . . . . . . . . . . . . . . . . . . 246 14.3. Тестирование РРI-портов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 14.3.1.Тестирование РРI-порта на правильность вывода дан- ных ............................................ 248 14. 3.2. Тестирование РРI-порта на правильность ввода данных 250 14.4. Тестирование параллельного принтерного порта . . . . . . . . . . . 252 14.4.l. Проrраммадлятеставыводаданных ................ 253
Оглавление 11 14.4.2. Программадлятеставводаданных .................. 14.5. Конструкция блоков светодиодов и переключателей . . . . . . . . 14.5.1. Блок светодиодов ................................. 14.5.2. Блок переключателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.5.3. Экономичный блок переключателей/светодиодов . . . . . 253 254 254 256 256 14.6. Устройство управления шаговым двигателем . . . . . . . . . . . . . . . 258 14.7. Проблемы программного обеспечения . . . . . . . . . . . . . . . . . . . . 259 Список литературы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Предметный указатель............................................. 262 'J. ,,,, ' 1', ", . ., ; ,l.
1 Моей жене Оливии Луизе ";, Введение Эта книга написана для того, чтобы, во-первых, дать студентам об­ щее представление о микропроцессорных системах и их использова­ нии в измерительной технике, системах управления и технике связи и, во-вторых, помочь студентам, обучающимся профессии инженера по электронике, в выполнении практических упражнений и созда­ нии проектов, включающих в себя разработку как аппаратных, так и программных средств. Описываемые в книге упражнения используют язык программи­ рования высокого уровня Си и разработаны на персональном компь­ ютере (ПК). Аппаратные средства представляют собой ряд интег­ ральных схем, которые могут быть просто вставлены в макетную пла­ ту или припаяны к монтажной плате. Приведенные в книге упражне­ ния разработаны так, чтобы при их выполнении использовался ми­ нимальный набор аппаратных средств, а программы были простыми для восприятия. Главы 8, 9, 10, 11и12 содержат основные упражнения, в которых полностью описываются как аппаратные, так и программные средст­ ва. Эти упражнения предназначены для того, чтобы научить студен­ тов практической реализации интерфейса с ПК с помощью простых программных и аппаратных средств. Все упражнения были разрабо­ таны и протестированы самим автором. Многие из них являются усовершенствованными вариантами упражнений, используемых на курсах «ВТЕС для обучения Interfacing and Electronics courses» и предназначенных студентов Suffolk College. Данные упражнения могут служить в качестве базиса для дальнейшего развития и преобразова­ ния в полномасштабные проекты. Упражнения не предъявляют высоких требований ни к памяти, ни к быстродействию процессора, вполне достаточно иметь персо­ нальный компьютер с 286-ым процессором.
Введение 13 Четырнадцать глав разбиты на три части: Часть 1. Главы с 1 по 3 носят, главным образом, справочный ха­ рактер. Часть 2. Главы с ва Часть 3. 4 по 7 образуют теоретический раздел, хотя гла­ 5 содержит и некоторые программные идеи. Главы с 8 по 14 содержат много упражнений по интер­ 8 обсуждается интерфейс с использова­ последовательного порта. В главах с 9 по 11 много фейсу. В главе нием упражнений с применением программируемого интер­ фейса с периферийными устройствами. В главе 12 по­ вторяются соответствующие упражнения, приведенные в главах с 9 по 11, но с использованием параллельного порта принтера. В некоторых случаях программное обеспечение изменено с целью иллюстрации новых идей. Глава 13 содержит группу упражнений, которые могут быть преобразованы в проекты. В главе 14 обсуж­ дается ряд вопросов, касающихся контрольно-измери­ тельной аппаратуры, методов контроля и некоторых других проблем, связанных с использованием аппарат­ ных и программных средств интерфейса. При выполнении упражнений по интерфейсу с ПК требуется не только умение разрабатывать короткие программы на языке Си, но и создавать работоспособные логические схемы. При практической ре­ ализации интерфейса с компьютером важно соблюдать следующую последовательность мер предосторожности: • проверьте электрическую схему перед ее подключением к ком­ пьютеру, •попросите какое-либо компетентное лицо (например, препо­ давателя) проверить все схемные и компьютерные соедине­ ния, • убедитесь, что компьютер ВЫКЛЮЧЕН при подключении или отключении схемы, • избегайте искривления контактов разъемов при включении их в гнезда, • убедитесь, что после включения компьютер работает нормально. Автор добросовестно изложил в книге информацию о необходи­ мых соединениях, но не может нести ответственность за нанесение
14 Введение ущерба электрическому оборудованию и вреда какому-либо лицу во время выполнения упражнений, описанных в этой книге. Автор выражает огромную благодарность Майку Тули за его под­ держку во время работы над этой книгой, а также следующим ком­ паниями, позволившим частично воспользоваться опубликованной ими информацией: lпtel Corporatioп (ИК), Ltd, Motorola Semicoпductor Products &ctor, Philips Semicoпductor !пс., Zilog !пс. ) ' j..; ',}'~, '' "' ' ~. ' :1,, .. :"· ,f-'; 'i, -
Основы цифровой электроники Глава 1 1 Системы счисления 1. 1. Прямое преобразование двоичных чисел 1.2. Двоично-десятичный код 1.3. Шестнадцатеричные числа 1.4. Числа со знаком 1.5. Числа с плавающей точкой 1.6. Представление алфавитно-цифровых символов 1. 7. Преобразования из одной системы счисления в другую 1 .8. Вопросы В этой главе приводится обзор систем счисления, используемых в цифровых компьютерах. «Строительными блоками» этих ком­ пьютеров, работающих только с двоичными сигналами, являют­ ся логические устройства с двумя состояниями. В отличие от обычных арифметических расчетов с помощью ручки и бумаги, электронная система манипулирует с двоичны­ ми числами, представленными в виде некоторого фиксирован­ ного количества двоичных разрядов (битов): чаще всего с бай­ тами вами (8 бит), словами (16 бит) или длинными (двойными) сло­ (32 бит). 1.1. Прямое преобразование ДВОИЧНЫХ чисел Каждый разряд двоичного числа имеет свой десятичный вес. Самый младший разряд (СМР) двоичного целого числа соответ­ ствует 2°, а вес каждого следующего разряда, появляющегося
Глава 16 1 Разряд 2х Разряд 2х 7 6 5 4 128 64 32 16 -1 -2 -3 3 8 2 4 1 2 о 1 -5 -6 -7 -8 0.5 0.25 0.125 0.0625 0.03125 0.015625 0.0078125 0.0039063 Рис. 1. 1. -4 Десятичные веса дво­ Рис. слева (О~ 7), 1.2. Десятичные веса двоич­ ных разрядов для чисел, меньших ичных разрядов для целых чисел. 1. увеличивается по сравнению с весом предыдуще­ го разряда в два раза (см. рис. 1.1). На рисунке 1.2 приведена таб­ лица, где представлены десятичные веса двоичных разрядов для чисел, меньших 1, ляющегося справа здесь вес каждого следующего разряда, появ­ (-1 ~ -8), уменьшается по сравнению с ве­ сом предыдущего разряда в два раза. 1 . 1. 1 . Преобразование чисел из десятичной формы в двоичную Один из методов преобразования чисел из десятичной формы в двоичную приведен ниже. Пример 1. Преобразовать 44 10 в 8-разрядное двоичное число. Метод. Из данного числа вычитать ближайший, меньший по величине, вес разряда (рис. 1.1), а затем так же поступать с каждым остатком: Разряд Вес разряда Число 7 128 6 64 5 32 4 3 2 1 о 16 в 4 2 1 44 Остаток -32 12 1 1 ~ Остаток Остаток 4 -4 1 о о Двоичное число - Оrвет: ~QC: CI 44 10 == 001011002 о о 1 - 1 1 о о
Системы счисления 17 1. 1.2. Преобразование чисел из двоичной формы в десятичную Для перевода числа из двоичной системы счисления в десятич­ ную следует сложить все веса каждого разряда исходного дво­ ичного числа, если значение этого разряда в исходном двоич­ ном числе равно Пример 1. 2. Преобразовать 10001111 2 в десятичное число. ,,;:~~"(.:"#~. Разряд 7 128 Вес разряда 6 64 5 32 4 16 1 1.2. 3 2 1 о в 4 2 1 8 1 4 1 2 1 Сумма 1 143 Двоично-десятичный код (ДДК) Альтернативный вариант использования двоичных чисел для представления десятичных чисел заключается в том, чтобы по­ ставить в соответствие каждой цифре десятичного числа (от О до 9) некоторый двоичный код. Для этого требуется не больше четырех разрядов двоичного кода. Таблица на рис. 1.3 демонст­ рирует несколько различных способов выбора 10 различных 4разрядных двоичных комбинаций. Приведен также код «2 из 5», предусматривающий защиту от ошибок 1 ; этот код уменьшает вероятность ошибок при работе ряда механических преобразо­ вателей. Комментарии к рис. 1. 8421 2. Код 3. XS3 1.3: естественный двоичный код. 2421 уменьшает величину однобитовой ошибки с 8 до 4. (код с избытком ния 3) 4 код, где вероятность появле­ разрядов равна вероятности появления О. Заметьте, что кодовое слово 0000 отсутст­ 1 в каком-либо из вует. 1 Если число единиц в полученном кодовом слове отличается от двойки, то слово отклоняется.
Глава 18 1 Код Грея Цифра 8421 2421 хsз о 0000 1 0001 0010 0011 0100 0101 0110 0111 1000 1001 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 2 3 4 5 6 7 8 9 0000 0001 0011 0010 0110 1110 1010 1011 1001 1000 Код сс2 из 5~ 11000 00011 00101 00110 01001 01010 01100 10001 10010 10100 •• --~'*-'<~°''*>,:::-».:>%:~»~»>.'-."<:':>;::,::::::::::~~::::'~.Х -~~~:O:::::=N::::i;:"<:::'::Ж':<:::>~w.;::<:;:;.""».">:•»>.>'>>~"-:->':<::0:«#."X?;.;.;.;-:,:·X-:-X.:.:.;.;.;./.;,'{~.:-Wk<<:·-@~. 1':':::i:..'-."<:..~ Рис. 1.3. Системы двоично-десятичного кодирования. 4. Код Грея ничным - это последовательность кодовых слов с еди­ кодовым расстоянием между двумя соседними слоями в последовательности 1. 5. Код «2 из 5» обнаружит одну ошибку, так как все кодовые слова должны содержать две единицы. Шестнадцатеричные числа 1 .3. (hex) Одним из простых способов наглядного представления двоич­ ных чисел является их преобразование в систему счисления с основанием 16, т. е. в так называемые шестнадцатеричные (hex) числа, каждая «цифра» которых представляет 4 бита (рис. 1.4). Для записи шестнадцатеричных чисел требуется шестнадцать символов: цифры от О до 9 используются для представления соответствующих значений от О до 9, а симво­ лы английского алфавита от А до F (строчные или прописные) соответствуют значениям десятичных чисел от 10 до 15. В таблице на рис. 1.4 приведены соотношения между десяти­ чными числами от О до 20 10 и их двоичными, шестнадцагерич- 1 Кодовым расстоянием называется число отличающихся по значению раз­ рядов в паре кодовых слов. Следующие пары кодовых слов имеют единичное ко­ довое расстояние: 0100 1100 111101010 0000 1101 101101010
:;::,.<::~~--~'<!' ~ ~~ ~ N -NN~ . N::O.'.::~~ Системы счисления 19 ~~- ДесяТИчные Двоичные Шестнад- Двоичная Двоично- с основанием с основанием цатеричные кодировка десятичный соснов.16 десsm<:ОВ код 10 2 16 10 1 ~''>«>.'"'''"""'«*-'='''««<'-<«m в 4 2 1 16 1 в 42 ~«>--=~-Ж-:«~,.., 4 2 1 {~'.'::>:;::•»»>:·>-.,,··:.:::<<V'>:·:·:·:-.'Щ>>О·:<.,._-...._ о о о о о о о о о о о о о о о о о о 1 2 о о о о 1 о 1 о о о о о о о 1 1 о 1 1 о о 2 о о о о о о 1 о 3 о о о о о о о о о о о о о о о о о о о о о з о о о 4 о о о 1 1 1 о о 1 о 1 1 1о 1 1 1 1 о 4 5 о о о о о о 6 о о о о о о о 1 1 о 1 1 1 о 7 о о о о о о о о о о о о о о 9 о о о 1 о 8 9 о о о о 1 1 1 о 1 1 2 о о о ОА о в о о о о о о о о ос о 5 о о 6 о о о о 7 8 о о з о 4 о 5 о 6 1 7 1 8 1 9 2 о 1 1 о 1 1 1 l о о 1 1 о 1 1 1 о 1 1 1 1 о о о о о о о о о 1 о о о 1 о о о 1 1 1 о о о OD о о о 1 о о О Е о о о 1 о OF о о о о о о 1 1 о 1о 1 1 о 1 1 1 о о 1 о 1 1 1 о 1 1 1 1 о о о 1 о о о о о о о о о 1 1 о о о 1 о о 1 о о о 1 1 12 13 о о о 1 о о о 1 1 1 о 1 о о 1 4 о о о :·ш'··:·:·:·:·:·'=·>=·>:·:·.-:::-:ш-:->:-:-:v:-:·:·»=····· о о о 1 о 1 1 .... :·:·:···:·.·:·:·:<·:·:-»:·~>==:=:-:-:::.;;.;.;;:,.,.,.,.:-;·»»»:O.=::::::--.·::::-:-. »J-':-:-)~@:«-»».-- Рис. 1.4. Соотношения между числами. ными и ДДК-эквивалентами. Числа в верхней части колонок указывают веса разрядов в заданной колонке. 1.4. Числа со знаком Часто возникает необходимость указывать знак числа. В отли­ чие от обычной записи чисел, когда слева от числа ставится знак + или -, в цифровой системе знак числа должен быть частью двоичного кода. Существуют несколько способов представле­ ния знака числа, один из которых описывается ниже. Основная идея заключается в том, чтобы самый старший разряд (ССР) (крайний левый) двоичного кода использовать как знаковый разряд, О в этом разряде служит для представления положитель­ нь1х чисел, 1- для отрицательных.
Глава 20 1 Пример 3. В 8-разрядной системе существует 2s (= 256) двоичных ком­ бинаций. Двоичные комбинации от 00000000 до О 1111111 представляют положительные десятичные числа от О до 127 7F), а оставшиеся дво­ 11111111 представляют от­ (в шестнадцатеричной системе от О до ичные комбинации от 10000000 до рицательные числа. Метод представления отрицательных чисел, называемый «дополнением до 1.4.1. 2», описан ниже. ссДополнение до 2)) как способ представления отрицательных чисел В этом случае кодирование отрицательных чисел осуществляет­ ся в три этапа. Нужно: l) преобразовать абсолютное десятичное значение числа в двоичное число обычным способом; 2) выполнить операцию поразрядного дополнения до 1 в по­ лученном двоичном числе, т. е. заменить в нем все нули на единицы, а единицы на нули; 3) добавить 1к СМР. Чтобы найти десятичное значение любого двоичного числа с 1в 1) ССР, нужно: дополнить двоичное число до 1, т. е. заменить нули на еди­ ницы, а единицы на нули; 2) добавить 1 СМР; 3) преобразовать полученное двоичное число в десятичное обычным способом. Двоичные Шесntадца­ теричные о 1 127 -128 -1 0000 0000 0111 1000 1111 0000 0001 llll 0000 1111 :*'<-~.«'( Рис. 1.5. Диапазон значений о о о 1 7F 8о FF """"""'"'""'''"""""""' 8-разрядных чисел со знаком.
Системы счисления В таблице на рис. 1.5 21 демонстрируется представление деся­ тичных чисел в 8-разрядной системе счисления с использовани­ ем дополнительного кода для отрицательных чисел. Пример 4. Представить -1 в 8-разрядном дополнительном двоичном коде: 1) преобразовать в двоичное число 2) дополнить до 3) добавить Пример 5. 110 = 0000 0001 1 = 11111110 = 1111 1111 = FF (hex) Ответ 1 к СМР Представить -127 в 8-разрядном двоичном коде: 1) преобразовать в двоичное число 2) ДОПОЛНИТЬ ДО 3) добавить 12710 = 1 о 111 1000 0000 = 1 к СМР 1111 = 1ООО ООО 1 = 81 (hex) Ответ Обратите внимание, что -128 10 = 1000 0000 2 (80 hex) и немо­ жет быть получено описанным выше способом, так как в 8-раз­ рядной системе не суmествует числа+ 128 с основанием Пример числа 9А: 6. Найти десятичное значение шестнадцатеричного 1) преобразовать в двоичное число 2) ДОПОЛНИТЬ ДО 3) добавить 1к 9А 16 = 1 СМР Преобразовать в десятичное число 1.4.2. 10. 100110102 = 0110 0101 = 0110 0110 = -102 10 Ответ Суммирование двоичных чисеn со знаком Пример 7. Вычислить710 + 90 10 : 1) преобразовать 7 в двоичное число 2) преобразовать 90 в двоичное число 0000 О 111 0101 1010 0110 0001 = 9710 Пример 8. Вычислить Ответ -710 - 90 10 . Эту сумму можно переписать в виде -7 + (-90), нужно: 1) преобразовать 7 в двоичное число 2) ДОПОЛНИТЬ ДО 1 0000 О 111 11111000 поэтому
Глава 22 1 3) прибавить 1 -7 = 1111 1001 _, 1111 1001 4) преобразовать 90 в двоичное число 0101 1010 5) ДОПОЛНИТЬ ДО 1 1010 0101 б) прибавить 1 Результат Конечный разряд Пример 9. -90 = 1010 0110-) 1010 1110 -9710 10011111 переноса отбрасывается 1 Вычислить 4710 + 90 10 : 1) преобразовать 4 7 в двоичное число 2) преобразовать 90 в двоичное число 00101111 0101 1010 1000 1001 = = Ошибка переполнения. Ответ Ошибка переполнения возникает в том случае, когда сумма двух положительных чисел дает отрицательный результат или когда сумма двух отрицательный чисел дает положительный ре­ зультат. 1.5. Числа с плавающей точкой Формат чисел с плавающей точкой необходим для работы с очень большими и очень малыми числами. В этом формате каж­ дое число имеет две части: мантиссу и порядок. Положительные и отрицательные числа представляются положительной или от­ рицательной мантиссой соответственно. Числа, большие еди­ ницы, представляются положительным, а меньшие единицы - отрицательным порядком. Чтобы обеспечить максимальную точность представления, двоичная точка передвигается влево и ставится перед самой старшей 1 числа, последняя становится 1в самом старшем раз­ ряде мантиссы. Если число нормализовано таким способом, то Экспонента знак Мактисса мантиссы 31 .1 Рис. 30 .................... 24 подразумевается между битами 1.6. 23 ......................... """" ... " .. " .. " ... 0 23 и 24, если число не равно нулю Формат числа с плавающей точкой.
Системы счисления отпадает необходимость сохранения этой самой старшей 1. 23 Все разряды обнуляются, если число равно нулю. Для достижения большей точности можно включить опцию удлинения мантис­ сы. На рисунке 1.6 показан формат 32-разрядного числа с плава­ ющей точкой. Мантисса нормализована и, следовательно, су­ ществует неявная (скрытая) 1 с левой стороны бита 23, за исклю­ чением того случая, когда число равно нулю. 1.5.1. Примеры преобразования чисел с плавающей точкой Пример 1 О. Преобразовать 12387 10 в число с плавающей точкой. 1. Преобразовать в шестнадцатеричное число 2. Преобразовать в двоичное число 3. Чтобы найти значение мантиссы, передвинуть двоичную = = 001100000110 0011 точку влево, расположив ее перед самой старшей ном случае на 14 разрядов 3063 hex 1 (в дан­ влево). = .11 0000 0110 0011 Значение порядка равно числу разрядов, на которое была смещена двоичная точка. В данном случае это число равно 14. 4. Преобразовать 14 в двоичное число для представления по­ рядка = 5. Знак мантиссы - 0001110 положительный. Число с плавающей точкой в формате, указанном на рис. О ООО 1.6: 1110 1000 0011 0001 1000 0000 0000 i .1 1.5.2. подразумевается Смещенные порядки В некоторых системах к порядку числа прибавляется определен­ ная константа (смещение) так, чтобы все порядки стали поло­ жительными. Это существенно упрощает процедуру сравнения порядков во время вычислений. В следующих примерах к по­ рядкам прибавляется параметр смещения, равный 63.
Глава 24 1 Пример 11. 1) двоичное Преобразовать в число с плавающей точкой: значение = 111 1ООО 2) переместить двоичную точку на 7 разрядов влево .1111000 = 7 + 63 = 70 3) порядок 4) преобразовать порядок в двоичное число 5) знак мантиссы 6) число 1000110 отрицательный = 1 с плавающей точкой 1 100 о 11 о 111 о 0000 0000 0000 0000 0000 i .1 Пример 1) подразумевается. 12. Преобразовать 0.04 10 в число с плавающей точкой: найти показатель степени с основанием щий данному числу~ 2, соответствую= log 2 (0.04) = -4.64 округлить до целого числа =-4 смещенный порядок = -4 = 59 + 63 =0111011 2) найти мантиссу путем деления числа на 2порядок = мантисса 3) преобразовать .64 в двоичное число 4) знак - 5) число положительный 02~4 = 0.64 =.10100010 =О с плавающей точкой о 011101101000100 0000 0000 0000 0000
Системы счисления 1.6. 25 Представление алфавитно-цифровых символов ASCII (American Standard Code of Iпformatioп lпterchange Американский стандартный код для обмена информацией) - это код, широко используемый для представления алфавитно­ цифровых символов, для связи между компьютерами и принте­ рами и т. д. В течение многих лет данный код использовался в телетайпной связи. Сушествует большое количество управляющих кодов, кото­ рые предоставляют возможность передающему телетайпу не­ посредственно управлять приемным устройством. Все симво­ лы закодированы с помощью 7-разрядного кода. Восьмой разряд, называемый битом четности 1 , может добавляться к каждому кодовому слову с целью обнаружения возможных ошибок при передаче. 128 кодовых слов представляют строч­ ные и прописные буквы, числа, дополнительные символы и управляющие коды. АSСII-коды приводятся в конце этой гла­ вы в таблицах на рис. 1. 7. 1.7 и 1.8. Преобразования из одной системы счисления в другую При работе с языками программирования низкого уровня 2 час­ то возникает необходимость в преобразовании, например, сим­ вола АSСП-кода в шестнадцатеричное или десятичное число и наоборот либо строчных букв в прописные и т. п. Есть много способов выполнения таких преобразований, некоторые из них описаны ниже. 1. 7 .1 . Перевод всех символов в прописные Как видно из таблицы ASCII- кодов, единственное различие между строчными и прописными буквами заключается в значе­ нии шестого разряда: логический О для верхнеого регистра и ло­ гическая 1- для нижнего. Поэтому для перевода всех символов в верхний регистр, т. е. в прописную форму, нужно выполнить 1 Если число всех единичных разрядов четно, то бит четности равен тивном случае он равен О. 2 См. гл. 3, где объясняется что такое языки низкого уровня. 1, в про­
Глава 26 1 операцию логического умножения ANDI ASCII-кoдa с двоич­ ной маской 1О11111. Пример 13. Сделать символ прописным (перевести символ в верхний регистр). Номер разряда АSСП-код буквы d 1.7.2. = 100 0100 = ASCII D = Маска AND каждой = 7654321 1100100 1011111 пары разрядов Оrвет Перевод символов в строчные В данном случае шестой разряд должен получить значение логи­ ческой 1 там, где это необходимо, путем выполнения операции логического сложения Пример 14. OR с двоичной маской 010 0000. Сделать символ строчным (перевести символ в нижний регистр). Номер разряда АSСП-код буквы Маска OR каждой 7654321 У= 1011001 = О 100000 пары разрядов = 1.7.3. 1111001 = ASCII-кoд буквы у Ответ Преобразование АSСll-кодов чисел от О до 9 в 4-разрядные двоичные числа Двоичные эквиваленты чисел от О до 9 получаются как точные 30 hex до 39 hex (см. таблицу рис. 1.8). Поэтому маска для ASCII-кoдa - 0001111, операция - логическое умножение (AND). копии четырех младших АSСII-кодов от Пример 15. Сделать символ строчным (перевести символ в нижний регистр). Номер разряда ASCII-кoд числа Маска AND 7= = 7654321 0110111 0001111 каждой пары разрядов = 0000111 = пвоичный эквивалеш 7 Ответ 1 См. гл. 2, где рассматриваются логические операции AND и OR.
Системы счисления 1. 7 .4. 27 Преобразование АSСll-кодов в шестнадцатеричные числа Преобразование в шестнадцатеричные числа немного сложнее из-за того, что шестнадцатеричный символ А не следует сразу же за 9. Поэтому для того, чтобы символы от А до F сочетались надлежащим образом с числами от 10 до 15, нужно: 1) 2) 3) перевести буквы в ПРОПИСНЫЕ (в верхний регистр); прибавить 9 к этим буквам; преобразовать в двоичные числа. Пример 16. Преобразовать ASCII-кoд буквы Ь в шестнадца- теричное число. ASCII- код Прибавить буквы Ь = 9 = Результат Маска с OF hex = 0001011 1.8. 1. 1100010 0001001 1101011 0001111 =эквивалент Ь Ответ Вопросы Сложите следующие числа, представленные в двоично- десятичном коде 8421: а) 0100 0100 + 0011 0011; б) 0010 1001+1001 1001; в) О 1О1 О 1О1 + О 111 1ООО. 2. Заполните таблицу. Десятичное а) 7 6) в) г) Двоичное Шестнадцатеричное 0000 0000 0111 0000 ООО 1 ООО 1 0000 0001 1011 е) ж) 235 428 0000 111 о 1о11 ·010 Преобразуйте точкой. 065 OED 0000 о 11 о о 111 ООО 1 0000 ООО 1 01000010 1000 :-:-:;;-:,:<,:,:~.,:<::..<'.::::::::::::::.:,:.:,:.:.:::..~:::::::::::::<·>:·>"с>:·:<«-:::<::.:;;,:.;,..°"""'-.,,,, 3. 8421 0000 0001 0111 67 д) ДДК 0.0000482 ·-~:,:-~:»::::·:~щ,..,.,.:·>:,V...'Х::!&."'*'-~:Щ.->-::>:~~ в двоичное число с плавающей .
глава 28 Двоичный код 1 Шестн. Десятич. Аббревиатура код код функции 7 6 5 4 3 2 1 Описание функции о о о о о о о о о о 1 о 1 NUL SOH Пустой символ о о о о о о о о о о о 1 о о 2 sтх Начало текста о о о о о 1 1 о 3 ЕТХ Конец текста о 4 ЕОТ Конец передачи Запрос о о о о 1о о 1о 1 1 1о о о о о 1 1 1 о о о о о о о о о о о о о о 1 2 3 4 5 6 7 о о о о о о 1 о о о ОА 0001011 0001100 0001101 0001110 о в о о о о о о 1 1 1 1 8 9 Начало заголовка 5 ENQ 6 АСК Подтвер)/\Дение приема 7 BEL BS Звонок нт Горизонтальная табуляция LF Перевод строки VT Вертикальная табуляция 8 9 10 11 Возврат FF Перевод страницы CR Возврат каретки О Е 12 13 14 so Переход к новому набору F 15 SI о с OD символов о о о 1 1 1 1 О Возврат в основной набор символов 1 1 1 о о о о 1 о о о 1 1 1 о о 1 о 12 о о 1 о о 1 1 о о 1 1 1 о о о о о о о о о о о о о 1о о 1о 1 1 1 о о о 1 о 1 1 1 о о 1 1 о о о о о 1 1 о о 1 0011010 0011011 1 1 1 1 1 о 3 4 5 6 7 1 8 19 lA 1 в 16 17 18 19 20 21 22 23 24 25 26 27 DLE Смена каналов данных DCl DC2 Управление устройством 1 Управление устройством DСЗ 2 Управление устройством 3 4 DC4 Управление устройством NAK Неподтверждение приема SYN Символ синхронизаuии ЕТВ Конец передачи блока CAN Отмена ЕМ Конец носителя SUB ESC Замена (символа) Переход к управляющей последовательности о о о о о lC lD 1 Е 1F 2 о 1111111 7F 0011100 0011101 0011110 0011111 о 1 Рис. 4. 28 29 30 31 32 127 FS Разделитель файлов GS RS Разделитель групп Разделитель записей us Разделитель элементов SP Пробел DEL Стирание 1. 7. Управляющие символы АSСП-кода. Преобразуйте -0.312 х 10-8 в двоичное число с плавающей точкой. 5. Преобразуйте в десятичное двоичное число с плавающей точкой 00000111110011001010101011110001.
двоичный Шестнад- Десятич- код цатерич- НЫЙ 7654321 ный 0100001 0100010 0100011 0100100 0100101 0100110 0100111 0101000 0101001 0101010 0101011 0101100 OLOl LOI 0101110 0101111 0110000 0110001 0110010 0110011 0110100 0110101 0110110 0110111 0111000 0111001 0111010 0111011 0111100 011! LOL 0111110 Ollllll 1000000 1000001 1000010 1000011 1000100 lOOOLOI 1000110 IOOOILI 1001000 1001001 10010[0 1001011 1001100 1001101 1001110 1001111 21 22 23 24 25 26 27 28 29 2А 2В 2С 2D 2Е 2F 30 31 32 33 34 35 36 37 38 39 ЗА 3В 3С 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 Символы # $ % & * + / о 1 2 3 4 5 6 7 8 9 < ЗD 61 3Е > 3F 62 63 40 64 41 42 43 65 @ 44 45 46 47 48 49 4А 4В 4С 4D 4Е 4F 66 67 68 69 70 71 72 73 74 75 76 77 78 79 А в с D Е F G н 1 J к L м N о Двоичный Шестнад- Десятич- код цатерич- 7654321 НЫЙ ный 1010000 1010001 1010010 1010011 1010100 1010101 1010110 1010111 1011000 , IOl !OOL 1011010 1011011 1011100 1011101 гшю 1011111 1100000 • 1100001 1100010 1100011 1100100 1100101 1100110 1100111 1101000 1101001 1101010 1101011 1101100 1101101 llOlllO llOlll l 1110000 l llOOOl 1110010 1110011 1110100 1110101 lllOl lO lllOlll 1111000 1ШООl 1111010 11110!1 1111100 1111101 1111110 ... ~~,.,_ ,;.,.,-:-;,-_,,".,.,.,.,.,.;~ Рис. 1.8. Печатные символы АSСП-кода. 50 51 52 53 54 Символы 6С 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 6D 109 т 6Е 110 n 6F 70 71 72 73 74 75 76 77 78 79 ш о 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 р 55 56 57 58 59 5А 5В 5С 5D 5Е 5F 60 6L 62 63 64 65 66 67 68 69 6А 6В 7А 7В 7С 7D 7Е р Q R s т u у w х у z [ \ ] а ь с d е f g h j k 1 q u v w х у z
Глава 2 Электронные логические элементы и регистры 2.1. Логические элементы 2.2. Дешифраторы адреса 2.3. Устройства с тремя выходными состояниями 2.4. Логические схемы последовательного действия 2.5. Шинные системы 2.6. Упражнение для ознакомления с работой ОЗУ Эта глава может служить удобным справочником по цифровым электронным устройствам, описанным в настоящей книге. 2. 1. Логические элементы В процессе работы логический элемент может находиться в од­ ном из двух логических состояний, которые определяются либо высоким и низким уровнем напряжения, либо высоким и низ­ ким уровнем тока. Эти состояния удобно представлять двоич­ ными цифрами (битами), О и 1. Чтобы описать функцию любой комбинации логических элементов, можно использовать табли­ цу двоичных чисел, называемую таблицей истинности. Логиче­ ские схемы, полученные при соединении различных логических элементов, называются комбинационными логическими схема­ ми, если в любой момент времени значения сигналов на их вы­ ходах полностью определяются значениями сигналов на их вхо­ дах в тот же момент времени. Если приводится таблица истинности, то двоичные комби­ нации входных сигналов обычно записывают в порядке их воз­ растания. Таблицы истинности вместе с двумя альтернативны­ ми условными графическими обозначениями 1 Два стандарта, английский и американский: BS - British Standarts ANSI - American National Standards Institute (BS и ANSI)'
Электронные логические элементы и регистры З1 восьми стандартных устройств приведены в разделе ческие элементы AND, OR, NAND и 2.1.1. Логи­ NOR могут иметь два, три или четыре входа. 2.1.1. Логические элементы: таблицы истинности и условные графические обозначения Логический элемент И (AND) На выходе логическая 1 только в том случае, если на ВСЕ входы подаются логические 1. Вход Выход АВ Q о о о о 1 о 1 о 1 1 о BS :Е}-а Логический элемент ИЛИ На выходе логическая ся логическая Вход Выход АВ Q о о о (OR) 1, если ХОТЯ БЫ НА ОДИН вход подает­ 1. ANSI BS :::Е}-а 1 1о 1 1 о Логический элемент НЕ (NOT), инвертор Это одновходовое устройство. Логическое состояние его выхода противоположно (комплементарно) логическому состоянию входа. Вход Выход А Q I ВS д-С}-а Альтернативное изображение д -{>-а
Глава 32 2 Логический элемент И-НЕ (NAND) На выходе логический О только в том случае, если на ВСЕ входы подается логическая Вход Выход АВ Q о о 1 1 1 1 о l 1 о о 1. ANSI BS :fla 1 Логический элемент ИЛИ-НЕ :о-а (NOR) На выходе логический О, если ХОТЯ БЫ НА ОДИН вход пода­ ется логическая Вход Выход АВ Q о о 1 о о 1 1 о 1 1 1. о о вs :@-а ANSI :D-a Логический элемент исключающее ИЛИ (XOR) На выходе логическая 1 только в том случае, если на ОДИН И ТОЛЬКО ОДИН вход подается логическая 1. Вход Выход АВ Q о о о о 1 1 о 1 1 1 1 о вs ANSI ;=:}D-a
Электронные логические элементы и регистры 33 логический элемент исключающее ИЛИ-НЕ (XNOR) На выходе логическая 1, если на ВСЕ входы подаются одинако­ вые логические сигналы. Этот элемент известен также как эле­ мент совпадения. Вход Выход АВ Q о о 1 о 1 1 о 1 1 вs ANSI о о 1 Усилитель с единичным коэффициентом усиления Логическое состояние сигналов на входе и выходе одно и то же. Вход А I < 2.1.2. Выход Q Альтернативное вs обозначение А -{>а 1 - Коммерческие логические элементы Двумя широко распространенными семействами логических интегральных схем (ИС) являются ТТЛ (транзисторно-транзи­ сторная логика) и КМОП (комплементарные МОП-структуры: металл-окисел-полупроводник). Оба семейства включают боль­ шое количество разнообразных интегральных схем, состоящих из многочисленных логических элементов, счетчиков и регист­ ров. В таблице на рис. 2.1 указаны уровни напряжений питания и логических состояний этих ИС. ТТЛ и КМОП ИС можно ис­ пользовать совместно, но в этом случае КМОП ИС должны ра­ ботать с напряжением не выше 5 В. Следует отметить, Что выпу­ скаемые логические устройства могут работать в определенном диапазоне напряжений, характерном для каждого логического состояния. Это важно помнить, так как в реальных схемах зна­ чения напряжений могут слабо варьироваться в зависимости от
34 Глава 2 км оп пл Напряжение питания Усс=5 В Диапазон напряжений логического О От Одо Диапазон напряжений логической 1 От 2,4 Vdd=oт5дo!5B От О В до 0,4 В Вдо 5В Vdd/2 Vdd/2дoVdd Рис. 2.1. Типичные уровни напряжения выпускаемых ИС. выходной нагрузки, провалов напряжения и влияния других сигналов. Примеры выпускаемых логических устройств приве­ дены в разделе 2.1.3. Типичные кодировки ТТЛ ИС начинаются с цифро-буквенной комбинации 74LS, а КМОП-микросхем - с числа 40. Ряд интегральных схем типа 74хх (например такие, как 74НС), в настоящее время изготавливаются с использованием МОП-технологии. Номер устройства следует за этим идентифи­ кационным кодом. Какие-либо буквы, стоящие перед этим но­ мером, в сочетании с ним или после него, дают информацию от­ носительно конструкции устройства. Более детальную инфор­ мацию, касающуюся выпускаемых логических интегральных схем, можнn получить либо с помощью каталогов производите­ лей, либо в рекламных проспектах. 2.1.3. Примеры ТТЛ ИС и КМОП ИС 12 4д 11 46 1 ЗА 40 З6 за 20 Земля 20 Земля 74ХХО8 18 10 2А 26 4А 46 40 ЗА Счетверенный 2-входовый логический элемент И 74ХХЗ2 18 10 2А 28 Счетверенный 2-вхоДQаый логический элемент ИЛИ
Электронные логические элементы и регистры 6А 6а 5А 35 50 74ХХО4 · Vcc 1Q 2А 2а ЗА 4А 4В 40 ЗА За Земля 'Нех-инвертор 1 74ХХОО Счетверенная 2-входовая логическая схема И-НЕ 4А 46 за ЗА зв 74ХХО2 Vdd 1А 1В 2а 2А 2В Земля 4А 4В 40 за ЗА ЭВ Счетверенная 2-входовая логическая схема ИЛИ-НЕ. 4070 1В 10 2а 2А 2В Vss 4А 46 40 ЗQ ЗА ЭВ 2А 2В Vss Счетверенный логичеС!(Ий элемент исключающее ИЛИ 4077 1в 1 1Q 2а Счетверенный логИческий элеМент ИСКlllОЧ81ОЩ88 ИЛИ-НЕ Аббревиатура «Нех» используется для указания ТОГQ, что микросхема со­ держит 6 логических элементов. нием шестнадцатеричных чисел. Не следует путать э~у аGбревцатур.у..с обозначе- · •·
36 Глава 2.2. 2 Дешифраторы адреса Дешифратор адреса является комбинационной логической схемой. На рисунке 2.2 показана таблица истинности для дешифра- тора адреса 74ХХ138 ТТЛ, который выбирает один адрес из восьми. Значок Х в таблице истинности означает незадействованные входы. ........,'<o.......'«C«o,"«ЩV:-.""·"«·>»X.,._V:,'-.''''''<'<W~,,.·.,.,._._"'"'1.;.w..'-............."«*-'<<-'.~""6:.:.;.:,>:.-.",_ ----·>'"'"'-~""'""""*""·"·"-"'"'*".,._.v,_,,,.,.,.~~"w...._"'.,,.,.._'..,.,.,""'''-'".X""'«'_...,.....,v<<·:,'«<o.! Выходы Входы ЕО El Е2 А в с QO Ql Q2 QЗ Q4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 х х х х х х 1 х х х х х х о х х х 1 1 1 о о о о о о о о о о 1 о о о о 1 1 о о о о о о 1 1 1 1 о о о 1 о о о 1 1 о о 1 1 1 1 1 1 1 1 о 1 1 1 1 1 1 о 1 1 1 1 1 l о 1 1 1 l 1 1 1 1 1 о 1 1 1 1 о 1 1 1 QS Q6 Q7 1 1 1 1 1 1 1 о 1 1 о 1 1 1 1 1 1 1 1 1 l 1 о 1 1 1 1 1 *"'°'~~~~)1."«'·::..~:,~=:::::· Рис. 2.2. Таблица истинности для ИС 74ХХ138. В отсутствие требуемых разрешающих сигналов на всех вось­ ми выходах дешифратора устанавливается логическая 1. При подаче на вход ИС двоичной комбинации в пределах от ООО до 111 вместе с подлежащими разрешающими сигналами на одном из восьми выходов устанавливается логический О. Имеются три разрешающих входа: ЕО, El, Е2. Один выход выбирается только в том случае, если на входы ЕО и El подается логический О, а на вход Е2 - логическая 1. 74 138 А Рис. 2.3. 74ХХ138. Назначение выводов ИС
Электронные логические элементы и регистры 2.3. 37 Устройства с тремя выходными состояниями В некоторых применениях, например в шинных системах, воз­ никает необходимость параллельного подключения выходов ло­ гических элементов. В этих случаях для того, чтобы избежать конфликтных ситуаций при обращении к шине 1 , важно, чтобы в любое время только один из логических элементов вырабатывал логический сигнал. Все выходы других логических элементов должны эффективно отключаться. 2.3.1. Буфер с тремя состояниями Существует несколько способов отсоединения выходов логиче­ ских элементов при помощи электроники, самый распростра­ - использование буферного выходного устрой­ ства с тремя состояниями. Третье состояние известно как состо­ ненный из них яние высокого импеданса (высокого Z), оно соответствует эф­ фективному электрическому отключению логической схемы от выходного контакта ИС. Это третье состояние контролируется сигналом, подаваемым на вывод разрешения по выходу (ОЕ). На рисунке 2.4 приведены таблица истинности и условное графи- Данные (А) ОЕ о о о о 1 ВысокийZ о 1 1 ВысокийZ Выход (Q) ~~~''"'""' Рис. 2.4. Буфер с тремя состояниями (таблица истинности и условное гра­ фическое обозначение). ческое обозначение буфера с тремя состояниями. Промышлен­ ная ТТЛ ИС зана на рис. 1 - счетверенный буфер с тремя состояниями- пока­ 2.5. Конфликтная ситуация возникает, когда два уетройства пытаются пере­ дать шине два противоположных логических сигнала в одно и то же время. Это обычно вызывает протекания через выходы обоих устройств сильного разруша­ ющего тока.
Глава 38 Vcc 40Е 2 4А 40 ЗОЕ ЗА за 74ХХ125 Рис. 2.5. Счетверенный буфер с тремя состояниями. 2.3.2. Управление входами статического ОЗУ Логическая схема статического ОЗУ на рис. 2.6 показывает ис­ пользование логических элементов и буферов с тремя состояни­ ями для ввода/вывода данных в оперативном запоминающем ус­ тройстве (ОЗУ). Кружочки у входов логических элементов ука­ зывают на то, что сигнал инвертируется на этих входах. Имеются три управляющих входа, которые соединены с внутренними логическими элементами: разрешение по выходу (ОЕ), разрешение записи Обратимся к рисунку (WE) и выбор микросхемы (CS). 2.6: АО А1 Массив памяти Адресный вход " А9 А Управляющие входы Буферы в стремя состояниями ОЕ DO----------D7 Ввод-вывод данных Рис. 2.6. Внутреннее управление статическим ОЗУ.
Электронные логические элементы и регистры Выходы Входы 39 Примечание CS WE ОЕ А в о о о Данные записываются в ОЗУ о 1 l 1 о о о Данные записываются в ОЗУ о l 1 о о 1 Данные считываются из ОЗУ 1 о о о о о о о 1 о о Никакие данные не записываются 1 l о о о 1 о о о Рис. } в ОЗУ и не считываются из ОЗУ 2. 7. Таблица истинности для управляющих входов ОЗУ. CS Подача сигнала низкого уровня на этот вход разрешает обращение к микросхеме памяти. В процессорной сис­ теме она обычно подключена к выходу дешифратора адреса. WE Для записи данных в память необходимо подать сигнал низкого уровня на этот вход. Сигнал может быть снят с управляющей линии ОЕ WR (запись) микропроцессора. Подача сигнала низкого уровня на этот вход подключа­ ет выходной буфер к шине данных. Управляющий сиг­ нал RD (чтение) от микропроцессора может быть ис­ пользован как сигнал разрешения вывода данных. На рисунке 2.7. приведена таблица истинности для управля­ ющих входов ОЗУ. Практические упражнения по записи данных в память и чте­ ния их из памяти описываются в разделе 2.3.3. 2.6. В-разрядные буферы с тремя состояниями Микросхема 74ХХ240 (рис. 2.8) - пример инвертирующего 8-разрядного буфера с тремя состояниями. ИС может приме­ няться для изолирования 8-разрядной параллельной шины дан­ ных. Обратите внимание, что имеются два контакта для подачи сигнала разрешения по выходу (ОЕ), каждый из которых соеди­ нен с группой из 4 логических элементов. Входы и выходы дан­ ных нумеруются обычным образом: от О до 7. Назначение выво­ дов этой ИС показано на рис. 2.9.
Глава 40 2 Выходы DO D1 04 DЗ D2 D5 D6 D7 ОЕ1 Входы Рис. 2.В. Логическая схема ИС 74ХХ240. 20 19 18 Vcc ОЕ2 ао 17 16 01 1 02 аз 1 13 12 1 04 as D5 7 06 D7 Земля 8 9 10 06 07 74ХХ240 ОЕ1 DO D1 D2 DЗ 04 2 з 4 5 6 Рис. 2.9. Назначение выводов ИС 74ХХ240. Горизонтальная черта над обозначением выходов указывает на то, что выходной сигнал не совпадает с входным сигналом (если на вход подается логическая 1, то на выходе будет логиче­ ский О, и наоборот). Горизонтальная черта над обозначением ОЕ указывает на то, что выход будет задействован при подаче на вход ОЕ логического О. 2.3.4. В-разрядные двунаправленные буферы с тремя состояниями ИС 74ХХ245 (рис. 2.10) - пример 8-разрядноrо двунаправленно­ го буфера с тремя состояниями. Его также называют октальным приемопередатчиком. Данная И С содержит восемь пар буферных усилителей с еди­ ничным коэффициентом усиления. Она может использоваться для управления направлением передачи потока 8-разрядной шине данных. Имеются выводы ОЕ и ление передачи данных). данных DD по (направ­
Электронные логические элементы и регистры 41 Ввод/вывод данных о 4 5 Ввод/вывод данных Рис. 2.10. Логическая схема ИС 74:ХХ245. ' 12 Vcc ОЕ ХО Х1 Х2 ХЗ 11 Х5 Х6 Х7 74ХХ245 DD УО У1 з 2 У2 УЗ У4 У5 У6 У7 Земля 5 6 7 8 9 10 Рис. 2. 11. Назначение выводов ИС 74ХХ245. Таблица истинности, представленная на рис. 2.12, показыва­ ет, как выбираются состояния выходов и направление передачи данных. ~~п;:;;;:-; Входы Выходы Примечание DD А о о о 1 Данные передаются от У к Х о 1 1 о Данные поступают от Х к У 1 1 о о о Вывод запрещен 1 о о Вывод запрещен ОЕ в Рис. 2.12. Таблица истинности микросхемы 74ХХ245.
Глава 42 2.4. 2 Логические схемы последовательного действия Выходное состояние логической схемы последоватеЛЫ-JОГО дей­ ствия зависит от предыдущего состояния (или предыдущих со­ стояний) входов и их текущего состояния. 2.4.1. Фиксатор (триггер-защелка) D-типа Фиксатор D-типа (рис. 2.13) является базовой схемой последова­ тельного действия. Эта схема с фиксацией состояния хранит один бит данных до того момента, пока на синхронизирующий вход не подается импульс, приводящий к появлению значения хранимого бита на выходе схемы. Хранимое значение бита изме­ няется при изменении сигнала на входе данных. Синхронизиру­ UQ ющий импульс иногда называют стробирующим импульсом. Вход данных Вход синхронизации Выход данных Рис. 2.13. Фиксатор D-типа. Временная диаграмма на рис. 2.14 иллюстрирует работУ этой схемы. Видно, что состояние выхода может измениться только на переднем фронте синхронизирующего сигнала в момент его перехода к низкому уровню. В некоторых устройствах это изме­ нение данных происходит на заднем фронте синхронизирующего импульса. Логическое состояние Данные Стр об Выход о Рис. 2. 14. ____, Фиксатор D-типа, временная диаграмма.
Электронные логические элементы и регистры 43 2.4.2. 8-разрядный буфер с тремя состояниями Логическая схема ИС 74ХХ374, показанная на рис. 2.15, состоит из восьми фиксаторов D-типа, имеющих выходы с тремя состо­ яниями. Такое устройство может применяться с шинной систе­ мой для ввода или вывода данных. Все фиксаторы имеют общий синхронизирующий вход. Выходы 3 5 4 7 Буферы с тремя состояниями Синхро- DO D1 D2 D4 D3 низация Рис. DS Dб D7 ОЕ 2. 16. Назначение Входы 2. 15. Логическая схема ИС 74ХХ374. 17 1 D6 Q6 05 04 12 11 04 син 74ХХЗ74 QO 2 2.5. 00 з 01 4 01 5 02 6 02 03 7 8 QЗ Земля 9 10 Рис. выводов ис 74ХХ374. Шинные системы Шинная система, представленная на рис. 2.17, обеспечивает простой способ параллельного соединения входов и выходов ус­ тройств. Управляющие сигналы используются для выбора уст­ ройства и пересылки данных. Чтобы избежать конфликтных си­ туаций при обращении к шине, следует проявлять осторожность при соединении шины с выходами устройств. Несмотря на то, что существует несколько способов безконфликтного подклю­ чения, обычно применяются выходные устройства с тремя со­ стояниями.
Глава 44 RD WR 2 Шина данных Адресная шина DO D1 D2D3 АОА1 А2АЭА4А5 --- DO АО D1 D2 А1 ПЗУ DЗ (Адрес А2 00) cs ОЕ DO D1 D2 -- DЗ АО А1 А2 ПЗУ (Адрес01) --- ,_____ DЗ 2.17. А1 А2 ОЗУ (Адрес 10) АЗ cs DO D1 D2 АО DЗ WE ОЕ Рис. АО ОЕ ~- - АЗ ...... LL, 1 АО EN А1 Дешифратор адреса 00 01 02 оз --- cs ОЕ DO D1 D2 АЗ -- MREQ А1 А2 ОЗУ (Адрес 11) -.... ,_. ,_. - АЗ cs Соединения шины простой системы организации памяти. Рисунок 2.17 иллюстрирует использование 4-разрядной ши­ ны данных и 4-разрядной адресной шины для выбора одного из четырех устройств памяти емкостью 16х4 бит. Дешифратор ад­ реса выбирает одно из четырех устройств, в зависимости от ко­ довой комбинации, подаваемой на выводы АО и Al. Дешифратор адреса только тогда выбирает устройство памя­ ти, когда на вход разрешения (EN) подается логический О. На линии WR или RD устанавливается логический О, в зависи­ мости от режима обрашения к памяти: ввод или считывание данных. На рисунке 2.18 приведена таблица истинности для де­ шифратора адреса. Общее число адресов (адресное пространство), которые мо­ гут быть выбраны в системе на рис. 2.17, составляет 26 64. Та­ ким образом, в наличии имеются адреса ячеек от О до 63. =
Электронные логические элементы и регистры 45 ~'*'"'}_»>~-- Выходы Входы EN Al АО QO Ql l l l 1 1 о о о l l l о l l l 1 l о о о о о о l о 1 l о l l l о :Х:М>»-'}'f:.~Ж·)~ Рис. l ~«N Q2 Примечание QЗ } о l l l о l l l l Ни один ю """°" не выбран Выбрано ПЗУ Выбрано ОЗУ о l Выбрано ОЗУ 2 ~ж>?д'-.-~<t=:-.%~~--т..~.:<-:-..~ 2. 18. Таблица истинности дешифратора l Выбрано ПЗУ 2 i.'№>."<:i>.~МWWll i i адреса. Пример А. Определить местоположение данных, если на ад- ресной шине (см. рис. 2.17) находится число 29io. Преобразовать 2910 в 6-разрядное двоичное число= OlllOlcмP· Таким образом, Al = 1 СМР Al =О ] А2= 1 АЗ= 1 А4 = 1 А5= 5 Дает~НОl -1310 =i В устройстве 01=ПЗУ2 (см. рис.2.18) Ответ: данные расположены по адресу 13. ПЗУ 2. Этот пример демонстрирует использование старших разря­ дов адресных линий для выбора устройства, в то время как ад­ ресные линии низкого порядка, соответствующие младшим раз­ рядам, выбирают ячейку в пределах данного устройства. Про­ граммирование на ассемблере требует от программиста знания величины диапазона разрешенных адресов, но фактический вы­ бор микросхемы памяти, как правило, не вызывает трудностей. 2.6. Упражнение для ознакомления с работой ОЗУ Цель данного упражнения, для выполнения которого использу­ ется 8-разрядное ОЗУ емкостью 2К, заключается в том, чтобы за-
46 Глава 2 58 58 1 кОм 1 кОм -WE t---+--~ о 1о 8 -ОЕ i---o 58 08 08 о I08 08 08 20 6116 АЗ 5 А2. 6 А1 7 А в DO D1 9 10 D2 11 08 08 08 08 К логическим Рис. К логическим переключателям переключателям данных адресов и семисегментному индикатору 2. 19. Упражнение 2.6. Монтажная схема. писать в 16 ячеек памяти битовые комбинации для семисегмент­ ного индикатора с целью индикации чисел от О до F. Неиспользу­ емые адресные входы микросхемы памяти должны быть заземле­ ны, иначе расположение данных в памяти будет неопределен- Число на индикаторе е -~----58 Рис. Семисеrментный код dp а Ь с d е f g о 1 1 2 l 1 1 F 10111000 о о о о о о о о о о l l l l 1 l о о 2.20. Упражнение 2.6. Семисегментные кодовые комбинации. l о
Электронные логические элементы и регистры ным. Монтажная схема приведена на рис. 47 2.19, а первые несколь­ 2.20. ко линий семисегментного кода представлены на рис. Требуемые устройства: Количество Устройства Примечание у 6118 l 2 l ОЗУ 2 Кбайт ОЗУ Макетная плата Для сборки схемы Резисторы «Утягивающие» резисторы 1 кОм Семисегментный Используется индикатор с общим анодш индикатор Резисторная матрица Токоограничивающие резисторы для 8 х 470 Ом семисегментного индикатора 2 Кнопочные выключатели Переключатели разрешения вывода 2 Блоки переключателей и разрешения записи Они описываются в гл. 14, но можно использовать любые логические переключатели Часть двоичных кодовых комбинаций для семисегментного индикатора с общим анодом приведена в таблице на рис. 2.20, подключение выводов зависит от типа используемого индика­ тора (соответствующую информацию можно найти в техниче­ ской документации производителя). В случае индикатора с об­ щим анодом включение сегмента происходит при подаче на не­ го логического О. Для обеспечения работы схемы потребуются токоограничивающие резисторы, включаемые между сегмента­ ми индикатора и выводами данных микросхемы. Последовательность операций Для записи данных в память 1. Разомкнуть переключатель ОЕ. 2. Установить данные на переключателях входов данных. 3. Установить адрес на переключателях адресов. 4. Нажать и отпустить переключатель WE. Для чтения данных 1. Замкнуть ОЕ. 2. Установить адрес на переключателях адресных входов.
Глава 3 В-разрядный микропроцессор З. 1. Введение в микропроцессоры 3.2. В-разрядная микропроцессорная система 3.3. Микропроцессор В главах Zilog ZBO 3, 4 и 5 изложены основные понятия, необходимые при изучении электронных систем, построенных на основе микро­ процессоров. Цель этой главы - обзор базисных элементов 8-разрядной микропроцессорной системы. Излагаемый мате­ риал носит в основном ознакомительный характер и уже изве­ стен тем, кто изучал микропроцессорные системы. 3. 1. Введение в микропроцессоры Микропроцессорная система имеет две различные, но взаимо­ зависимые части: рис. 3.1). программные и аппаратные средства (см. Ни одна из этих двух частей не сможет функциониро­ вать без другой. Программы, записанные в ПЗУ, можно на­ звать микропрограммным обеспечением. Программа состоит из последовательности команд (инструкций) для микропро­ цессора, хранящихся в памяти. Микропроцессор выбирает эти команды из памяти и выполняет их. Он управляет всеми пере­ сылками данных и осуществляет арифметические и логиче­ ские операции. Каждый тип микропроцессора 1 обладает своим собствен­ ным набором команд в машинных кодах, размер (длина) ко­ манды может составлять от дел 3.3.4). 1 до 5 байт двоичного кода (см. раз­ Команды, объединенные в одну «программу», в ис- 1 В данном случае слово «ТИП» может означать некоторое семейство микро­ процессоров, разработанное одним и тем же производителем.
8-разрядный микропроцессор 49 ~~~~~~~~~~~~~~~~~ Все электронное Все программы и механическое и документация оборудование Рис. 3.1. Компоненты микропроuессорной системьr. ходном виде могут быть записаны на низкоуровневом языке - языке ассемблера! или на языках высокого уровня 2 , например на Си или Паскале. Обычно при программировании на языке низ­ кого уровня используется какой-нибудь текстовый редактор и ассемблер. Результатом работы ассемблера является файл с рас­ ширением .сот, содержаший последовательность машинных кодов. Ассемблер может также создать файл с расширением .hex, который содержит машинные коды, записанные в форме АSСП-кодов, а также файл с расширением .lst, содержаший как исходную программу, записанную в текстовом виде, так и ма­ шинный код. 3.2. В-разрядная микропроцессорная система На рисунке 3.2 показана логическая блок-схема микропроцес­ сорной системы. Аппаратные средства включают собственно микропроцессор, дешифратор адреса, постоянное запоминаю­ щее устройство (ПЗУ), оперативное запоминающее устройство (ОЗУ) и параллельные регистры ввода/вывода. 1 Каждый тип микропроuессоров имеет свой собственный транслятор ма­ шинных кодов (ассемблер) и язык, представляющий собой некоторый набор символов или мнемонических образов команд, например ld а, Ь. 2 Языки высокого уровня используются при написании программ для любо­ го типа микропроцессоров, для которых имеется подходящий транслятор (см. гл. 7).
50 Глава 3 Немаскируемое Прерывание прерывание Вывод данных Обозначения: INT MREQ Прерывание Запрос памяти RD Управляющая линия чтения WR Управляющая линия записи ОЕ Разрешение по выходу cs Выбор микросхемы памяти WE Разрешение записи NMI Немаскируемое прерывание Рис. З.2. Микропроцессорная система. 3.2.1. Работа системы Регистры ввода/вывода обеспечивают взаимодействие системы с периферийным оборудованием. Они позволяют пересылать 8-разрядные слова данных в систему и обратно из системы, свя­ зывая ее с такими устройствами, как принтер, клавиатура или светоизлучающие индикаторы. Последовательность 8-разрядных команд (см. раздел 3.3.4), предварительно записанная в память, считывается микропро­ цессором с шины данных. Длина команды может составлять от 1 до 5 байт. Номинальное значение скорости обработки команд
8-раэрядный микропроцессор 51 определяется тактовой частотой. Типичная тактовая частота (частота синхронизации) 8-разрядных микропроцессоров 5до - от 20 МГц. З.2.2. Микропроцессор Более детально микропроцессор описывается в разделе 3.3, поэ­ тому здесь рассматривается только принцип его работы. После подачи сигнала reset (сброс - установка микропроцессора вис­ ходное состояние) адрес первой команды подается на адресную шину, а затем заявляются сигналы управления пересылкой дан­ ных микропроцессора: MREQ и RD. Микропроцессор выбирает байт команды из памяти через шину данных. Команда декодиру­ ется, затем процессор генерирует некоторую последователь­ ность управляющих сигналов для управления как внутренними, так и внешними операциями. Если требуются дополнительные данные для завершения команды, они выбираются из памяти. Затем команда выполняется. Этот процесс продолжается до тех пор, пока процессор (halt) или команду условного перехода не выполнит команду остановки цикла (loop). 3.2.З. Постоянное запоминающее устройство (ПЗУ) Микропрограммное обеспечение, записанное в ПЗУ, которое является энергонезависимым запоминающим устройством~, представляет собой набор машинных кодов 2 , используемых данным микропроцессором. В ПЗУ записывается программа инициализации и другая постоянно хранимая информация, необходимая для нормального функционирования микропро­ цессора. ПЗУ хранит стартовую программу начала работы, на­ зываемую программой начальной загрузки (bootstrap), или уп­ равляющую программу для инициализации системы. В специ­ ализированной системез ПЗУ может содержать всю программу работы системы. 1 Содержимое энергонезависимой памяти не будет потеряно в случае от­ ключения электроэнергии. 2 Машинный код - это набор команл микропроцессора в двоичном коде, обычно записываемый в шестнадцатеричной форме. Например, машинный код загрузки в А содержимого из В (ld а, Ь) будет записан как 78Н. 3 Специализированная система - это система, предназначенная для выпол­ нения конкретных функций.
52 Глава 3.2.4. 3 Оперативное запоминающее устройство (ОЗУ) ОЗУ является запоминающим устройством, позволяющим не только считывать данные, но и записывать их в память. ОЗУ мо­ жет быть как энергозависимым, так и энергонезависимым уст­ ройством. Этот тип памяти используется для хранения пользо­ вательских программ и данных. Небольшая часть ОЗУ исполь­ зуется в качестве стека (см. раздел 3.2.10). 3.2.5. Схемы синхронизации и сброса Для синхронизации работы всей системы у микропроцессора должен быть вход для подачи сигнала синхронизации. Этот сиг­ нал представляет собой последовательность прямоугольных им­ пульсов постоянной частоты в диапазоне напряжений от О до 5 В. Для генерации такого сигнала имеются однокристальные схемы. На входе сброса обычно поддерживается состояние ло­ гической 1. Установка логического О заставляет систему возвра­ щаться в исходное состояние. На рисунке 3.3 приведена схема, . -~ 100 кОм 5 В~ К выводу сброса , V 22нФ ,- . Нажать для сброса 1 ' \' ов Рис. З.З. Автосброс и ручной сброс. которая вынуждает микропроцессор автоматически возвра­ щаться к исходному стартовому адресу при включении схемы. Кнопка сброса позволяет выполнить ручной сброс. 3.2.6. Адресная шина Адресная шина состоит из 16 линий (проводов), обозначаемых номерами от АО до А15. По адресной шине передаются адре­ са, вырабатываемые микропроцессором. Адрес определяет
8-разрядный микропроцессор 53 ячейку памяти, из которой или в которую будут пересылаться по шине данных необходимые для работы микропроцессора данные. С помощью 16 адресных линий можно создать адрес­ ное пространство объемом 2 16, что составляет порядка 64 Кбайт. 3.2. 7. Шина данных Двунаправленная шина имеет восемь линий, обозначенных номе­ рами от DO до D7. Эта шина позволяет пересылать данные из микропроцессора в любой узел микропроцессорной системы и наоборот. Временная диаграмма пересылки данных приведена на рис. 3.10. 3.2.8. Управляющая шина Управляющая шина состоит из некоторого числа линий, часть которых передает сигналы внутрь микропроцессора, а часть из него. Семь управляющих линий показаны на рис. 3.2. - Здесь сигналы MREQ, RD и WR являются сигналами, исходящими от микропроцессора, а сигналы «Сброс», «Синхронизация», NMI и «Прерывание» (см. рис. 3.2) являются сигналами, предназна­ ченными для микропроцессора. На входе прерывания ( «Преры­ вание» или NMI) обычно поддерживается логическая 1. Появляющийся на нем логический О заставляет микропроцес­ сор временно приостанавливать выполнение текущей програм­ мы и выполнять некоторую прерыванием (см. раздел подпрограмму, вызванную этим 3.3.7). 3.2.9. Дешифратор адреса Все устройства в системе с управлением памятью могут быть вы­ браны дешифратором адреса согласно карте распределения па­ мяти, приведенной на рис. 3.4. Дешифратор выбирает одно из четырех устройств по адресным линиям Al 4 и Al 5. Эти линии подключаются к входу дешифратора адреса таким образом, что ПЗУ выбирается при подаче двоичной комбинации 00, ОЗУ - 01, ввод- 10, вывод- 11 (см. рис. 3.5).
Глава 54 0000 3 ПЗУ 1FFF 2000 ЗFFF 4000 ОЗУ SFFF 6000 8000 8001 Ввод сооо Вывод 7FFF BFFF • СОО1 Рис. 3.4. 3.2.10. Стек - Не используется Карта распределения памяти. Стек своеобразная записная книжка микропроцессора. Он используется автоматически для хранения адресов возврата в том случае, если: 1) выполняются команды call и rst; 2) обрабатываются прерывания. Содержимое регистров, используемых в подпрограммах, мо­ жет быть скопировано в стек посредством команды push и воз­ вращено оттуда с помощью команды рор (или pull). Стек является зарезервированным блоком памяти в ОЗУ, данные записываются и считываются в него по правилу «по­ следним вошел - первым вышел» (LIFO). Указатель стека хра­ нит последний адрес ячейки, в которую были записаны дан­ ные. Стек должен быть инициализирован в начале работы про­ граммы. Вершина (самый высокий адрес) стека фиксируется некото­ рым 16-разрядным адресом, загруженным в регистр указателя стека SP (см. рис. 3.7). Указатель стека получает отрицательное приращение при записи каждого байта в стеке и положительное приращение при считывании каждого байта (см. раздел 3.3.6, где можно найти пример программирования, демонстрирую-
8-разрядJ-lый микропроцессор $W-.<:t.<И}:{<-~-~~::ЖWn<of -~! W'»»X'~:«i<<>-~ 55 4><»>:>'..;«<'М-W.«-:f,1*:°<«-'Щ..;.:..-:..':.:•>»» Адресные линии 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 о о о о о о о о l 1 о о о l ПЗУ вначале о о о Адреса потом о l l ОЗУ вначале о о о о о Адреса потом о l 1 l 1 о о l о о о l 1 о о о 1 1 l l l о о l о о о о о о о о о о о о о о о о о о о о о о о о о о о о Рис. З.5. Селектор адресных линий. щий работу стека для одного сегмента программы для микро­ процессора Zilog Z80). 3.3. Микропроцессор Микропроцессор Zilog Z80 Zilog Z80 рассматривается в этом разделе как пример 8-разрядного микропроцессора. Значительная часть представленного здесь материала получена из книги Products Specification Data Book шению фирмы Zilog, Inc. Zilog и приводится благодаря разре­ Характеристики данного микропроцессора (МП), указанные в сопроводительной документации, перечислены ниже. 1. Одна из версий МП Zilog Z80 - устройство на n-канальных МОП-структурах - характеризуется низкой стоимостью и высокой производительностью. Тактовые частоты -4 МГц и 6,17 МГц. 2. Другая версия МП структурах - Zilog Z80 - устройство на КМОП­ характеризуется высокой производительно­ стью и низкой потребляемой мощностью. Тактовая часто­ та - до 20 МГц. 3. Имеется двойной набор регистров общего назначения и флаговых регистров, которые при использовании команд обмена обеспечивают приоритетный/фоновый режим ра­ боты и очень быструю обработку прерываний.
Глава 56 3 4. Имеются два 16-разрядных регистра. 5. Три режима маскируемых прерываний. Режимы О, описываются в разделе 3.3.1. 1и 2 3.3.7. Общее описание На рисунке 3.6 показана блок-схема, которая демонстрирует внутреннее устройство и основные функции микропроцессора Z80. Ввод команд и ввод/вывод данных осуществляются через щину данных. Адресные данные, полученные микропроцессо­ ром, передаются на адресную щину. Микропроцессор состоит из трех основных частей: 1) блока управления (команды поступают в регистр команд, дещифруются и затем инициируют генерацию управляю­ щих сигналов, исходящих от блока синхронизации и уп­ равления); 2) блока арифметических и логических операций; 3) регистров общего и специального назначения (рис. 3.7). В-разрядная шина данных Регистр команд +58-. Земля--. Синхронизация ... ----" Блок управления мп Синхронизация - - - - МП Адресная логика и буферы 8 системных и управляющих 5 управляющих 16-разрядная входов МП адресная щина выходов мп Рис. З.б. Блок-схема микропроцессора Zilog Z80.
8-разрядный микропроцессор ..... , ) f f 1Мультиплексор 1 команд 1 1 Дешифратор команд 1 Контроллер последовательности управляющих команд ~ 8-разрядная двунаправленная шина данных Регистр 1 57 с D Е н l 1 R прерывание ~ F (регистр состояния) регенерация Индексные регистры АЛУ (арифметика- (указатель стека) РС ( сче"Nик - логическое устройство) IXиlY SP 1· г 7 ~ 1(аккум~лятор) 11 в 1 1 команд) ...._ .....- 1 1 ' - 16-разрядная адресная шина вывода ~Синхронизаци я "сброс •. "REQ \ '' '"" н RD '" "WR . '\ Рис~ ',. 3. 7. ·•-----.1·nt ••--~NMI Внугренняя организация микропроцессора. Арифметические и логические операции выполняются с по­ мощью аккумулятора (А), арифметико-логического устройства (АЛУ) и регистра состояния (F). АЛУ является комбинационной логической схемой, выполняющей как арифметические, так и логические операции. Такие команды, как операции циклического сдвига и сдвига вправо или влево на один разряд, выполняются в сумматоре. Ре­ зультат некоторых операций, например, add (сложение) и sub (вычитание), остается в сумматоре. Регистр состояния отслежи­ вает результаты определенных операций (см. разделе 3.3.2). Регистры выбираются мультиплексором. Шесть 8-разряд­ ныхрегистров (В, С, D, Е, Н, L) могут быть использованы в про­ граммах самостоятельно (8 разрядов) или парами, как 16-раз­ Рядные регистры. Для некоторых регистров имеются специаль­ ные команды: например, регистр В применяется как счетчик цикла, а регистр HL может быть использован как указатель ад­ реса. Существуют также два регистра специального назначения: 1 (от английского interrupt refresh - регенерация). прерывание) и R (от английского
Глава 58 3 Регистры А, В, С, D, Е, Н, L и F продублированы. Регистры альтернативного набора помечаются штрихом: А', В', С', D', Е', Н', L' и F'. Передача данных между этими двумя наборами реги­ стров осуruествляется путем использовании набора команд об­ мена. Эти регистры могут применяться для увеличения быстро­ действия при обработке прерываний. 3.3.2. Регистр состояния Основное назначение регистра состояния (регистр 1) рис. 3. 7): облегчать выполнение ассемблерных команд переходов и call jump (например, команды «возврат к на чалу, если не 2) F, jp nz,start, означающей 0»); обнаруживать ошибки переполнения, возникающие при вычислениях с дополнительным кодом («дополнение до которые могут возникнуть в том случае, если склады­ 2»), ваются два больших числа одного и того же знака, или ес­ ли вычитаются два больших числа разных знаков. На рисунке 3.8 показаны назначения разрядов регистра со­ 1), или стояния. Каждый разряд устанавливается (логическая сбрасывается (логический О) во время выполнения таких ко­ манд, как add ер (ComPare - сложение), sub (SUBtract - вычитание), сравнение). Состояние разрядов показывает, ка­ (ADD - ким является результат: положительным, отрицательным, рав- Регистр состояния Разряд »»-~ Разряд 1 s 7 1 z •1• н 6 5 4 MllP/VI 3 2 N 1 1 с 1 о -».""""'·-~<-».~;-:-:·»:-<»--'<%:<-».~»:«-.·:«<<'-'""""'-'Щ«Ф:.У>>:,,ж;х·:v:·-w»:>:,х<.:.;<,-..':-,'->'~«<· Назначение Примечание разряда 7 Знак 6 4 Ноль Установить, если отрицательный, очистить, если положительный Установить, если ноль, очистить, если НЕ ноль Полуперенос Установить, если есть перенос из первых четырех разрядов, 2 Переполнение 1 Сложение/ Установить о Вычитание Установить, если есть перенос, очистить в противном случае Перенос Для внуrреннего использования очистить в противном случае Установить при переполнении дополнительного кода, очистить в противном случае S&З --..,:;,-...%-}: • - для вычитания, очистить '"*'"=~<,<~?:«<<<'»->:.-:::;:;..,,.::;:;;·:·:<-:·:<-:<-;::;.:;.<:<1'V:<·X•:•»>'4=-o: Рис. З.8. Регистр состояния (F). - для сложения ·•
8-разрядный микропроцессор ным нулю, есть ли перенос или полуперенос разряда (см. рис. 59 3.8) или произошло переполнение. Логический О указывает, что флажок не установлен или сброшен. Логическая Пример 1 указывает, что флажок установлен. 1. Флажки состояния. Таблица на рис.3.9 показывает результат выполнения коман- add a,n: ды содержимое сумматора (регистр А) добавляется к содержи­ мому ячейки памяти, которая следует сразу за кодом опера­ ции. Результат сохраняется в сумматоре. Код операции add a,n - 11000110 (Сб hex) Машин- Число в Число Результат в ный код аккумуляторе n аккумуляторЕ Сб Сб Сб Сб Сб Сб Сб 00 00 01 01 90 70 70 Рис. 0000 0000 0001 0000 0001 1111 llll llll 1000 0000 1000 0000 0111 0000 3.9. 0000 0000 0000 0000 1001 0111 0111 0000 0000 0001 0001 0000 0000 0000 0000 0000 0001 0000 0010 0000 0000 0000 0001 0000 1111 0000 1110 0000 Результаты выполнения команды В крайней слева колонке на рис. S Z Н V N С о l о о о о о о о о о о о о о о l l l о о о о о о о l о l 1 l l о о о о о о о l о о add a,n. 3.9 показан машинный код в шестнадцатеричной форме, за кодом операции сразу же следу­ ет число 3.3.3. n. Временная диаграмма микропроцессора Временная диаграмма на рис. 3.1 О отражает работу управляюшей шины, адресной шины и шины данных во время считывания и записи данных. Чтение или запись занимают по времени три пе­ риода тактовых импульсов. Полное время выполнения каждой операции составляет 150 нс, если тактовая частота равна 20 МГц. Номера пунктов в приведенном ниже анализе временной ди­ аграммы на рис. 3.10 соответствуют цифрам, отмечаюшим ха­ рактерные точки на временной диаграмме.
Глава 60 3 Т1 Т2 тз '---'-----_/ MREQ RD \.-..--_Х....___ DO- 07 о: \"--'-9____/ 1 WR Чтение Запись Рис. З.1 О. Временная диаграмма операций чтения/записи. 1. Адрес ячейки памяти, к которой обращается процессор, выдается на адресную шину. 2. Спустя половину периода тактового импульса активизи­ руются управляющие сигналы MREQ и RD. 3. Микропроцессор считывает данные на заднем фронте 4. Линии (отрицательном перепаде) тактового импульса ТЗ. MREQ и RD 1). переводятся в неактивное состояние (логическая 5. 6. Адрес ячейки памяти удаляется с адресной шины. Адрес ячейки памяти, в которую должны быть записаны данные, выдается на адресную шину. 7. Спустя половину периода тактового импульса, после уста­ новки параметров адресного сигнала на шине, активизи­ руется управляющий сигнал MREQ. Он может использо­ ваться в качестве сигнала разрешения выбора микросхемы памяти. 8. Микропроцессор выдает данные, которые должны быть записаны в память на шину данных.
8-разрядный микропроцессор 9. После 61 установки параметров сигналов на шине данных активизируется управляющий сигнал WR, который явля­ ется сигналом записи/чтения для микросхем памяти. 10.Линии WRи MREQ переводятся в неактивное состояние на половину периода тактового импульса раньше, чем будет изменена информация на адресной шине или шине данных. 3.3.4. Команды и режимы адресации Микропроцессор Z80 обладает наиболее мощным и гибким на­ бором команд среди всех наборов, применяемых в 8-разрядных микропроцессорах. Он включает в себя такую уникальную опе­ рацию, как пересылка целого блока данных для более быстрого и эффективного обмена данными памяти или между памятью и устройством ввода/вывода. Он также позволяет проводить опе­ рации на любом бите в любой ячейке памяти. Каждая команда на языке машинных кодов имеет свой соб­ ственный код, называемый кодом операции (opcode). Для испол­ нения некоторой команды может быть затребована дополни­ тельная информация. Эта дополнительная информация, назы­ ваемая операндами, может быть включена как часть байта кода операции или может находиться в одном или нескольких бай­ тах, следующих сразу же за кодом операции. Следовательно, код операции определяет операцию, которая должна быть выполне­ на над операндами, которые хранятся в регистрах микропроцес­ сора или во внешней памяти. Режим адресации точно определяет способ фактического об­ ращения к данному операнду. Различные режимы адресации используются для того, чтобы: 1) предоставить пользователю разнообразные программные средства, равления например указатели памяти, циклом, возможность счетчики для уп­ индексации данных и программной настройки (модификации адресов загрузоч­ ного модуля); 2) уменьшить число разрядов в адресном поле команды. Основные режимы адресации, используемые в 8-разрядной системе: 1) неявный (регистровый): ld а,Ь - скопировать содержимое регистра В в А,
Глава 62 2) 3 непосредственный: загрузить 8-разрядное число в регистр А, ld a,n 3) абсолютный: перейти на 16-разрядный адрес, jp nn 4) относительный: относительный переход вперед на назад на 126 адресов, jr n 5) 129 адресов или прямой: скопировать содержимое ячейки памяти ld a,(nn) - nn в регистр А, 6) косвенный ld а,(Ьс) - скопировать содержимое ячейки памяти, адрес которой записан в регистре ВС, в регистр А. n= 3.3.5. 8-разрядное число, nn = 16-разрядный адрес. Примеры режимов адресации Неявный, или регистровый, режим. Команды, которые работают исключительно с регистрами, обычно используют неявный ре­ жим адресации, называемый также регистровым режимом. Та­ кие команды, как дополнение (до 1) содержимого аккумулято­ ра, не нуждаются в дополнительной информации, так как под­ разумевается, что операнд находится в аккумуляторе. Пример 2. Дополнение аккумулятора. cpl Машинный код Если содержимое аккумулятора 3D Н = после выполнения команды С2Н 2F 001111О1 = 11000010 Непосредственный. В этом режиме за кодом операции следу­ ет одно- или двухбайтовый операнд. Пример ld a,SB 3. Машинный код ЗЕ SB Загрузить в регистр А число SBH
8-разрядный микропроцессор ld Ьс,4131 Машинный код Загрузить в регистр В 01 3141 число число 41 31 63 и в регистр С Пример4. jp 3025 Машинный код С3 25 30 Записать в регистр РС число 3025 Прямой (абсолютный). За кодом операции, который может составлять 1 или 2 байта, следуют два байта адреса, по которому должен быть записан операнд или откуда он должен быть извле­ чен. Пример 5. ld (040ВН),Ьс Машинный код Содержимое регистров ВС ED430B04 должно быть записано в память по адресу 040ВН. Косвенный. Адрес операнда предварительно загружен в пару регистров. Поэтому этой команде может соответствовать един­ ственный байт кода операции. Пример 6. ld а,(Ьс) Машинный код Данные 5СН находятся в ОА памяти по адресу 3В45Н. 3В45Н был загружен в ре­ гистры ВС. После выпол­ нения регистр А содержит 5СН. Относительный. В 8-разрядной системе относительная адре­ сация имеет 2-байтовый формат, и поэтому она обеспечивает более эффективные переходы по сравнению с абсолютной адре­ сацией. За байтом кода операции перехода следует байт косвен­ ного адреса, который отсчитывают либо вперед на мяти, либо назад на 128 127 ячеек па­ ячеек памяти от числа, находящегося в регистре РС (это адрес следующей команды). Пример 7. Адрес следующей команды jr 12Н Машинный код 18 12 lOOOH. Перед выборкой PC=lOOO После выборки РС=1002 После выполнения РС=1014 у 1'
Глава 64 3 Пример jr -20Hl Адрес следующей команды 8. Машинный код 18 - lOOOH. Перед выборкой ЕО После выборки После выполнения 3.3.6. РС = 1000 1002 РС = OFE22 РС = Программа Следующий файл <uмя.lst>, представляющий короткую про­ грамму на языке ассемблера, иллюстрирует работу указателя стека и счетчика команд. Псевдокомандаз чальный адрес программы, а «equ» «org» указывает на на­ присоединяет адреса к мет­ кам4. Чтобы выполнить команду мещает (push) call, микропроцессор сначала по­ содержимое счетчика команд (РС) в стек. Содер­ жимое счетчика команд восстанавливается после выполнения подпрограммы. Описание команды djnz n, используемой в данной програм- ме, приводится ниже. Вычесть 1 из содержимого регистра В. Если результат не ра­ вен нулю (если флажок нуля не установлен в результате тако­ го вычитания) прибавить байт, который хранится по следую­ щему адресу, к числу в счетчике команд с использованием дополнительного кода (дополнения до 2). В программе, приведенной в качестве примера, машинный код по адресу 0308Н есть lOFB. 1О FB - это команда djnz n. число, которое нужно прибавить к содержимому счет­ чика команд, чтобы перейти на адресу цикла LOOP. 1 Дополнительный код для 20Н есть ЕОН (см. гл. 1). 2 Сложение с использованием дополнительного кода 1002 = 000100000000 0010 1111 111 О 0000 + ОЕ = 1111 0000 1111 lllO 0010 = OFE2H 3 Псевдокоманды используются для того, чтобы дать ассемблерную инфор­ мацию. Они не являются частью ассемблера, предоставляемого производителем микропроцессора и предназначенного для его программирования. Разные про­ граммисты, разрабатывающие ассемблерные программы, могут использовать незначительно отличающиеся друг от друга команды. 4 При написании программ обычно удобнее использовать относительные метки для любых адресов и констант, появляющихся в программе. Это делает программу более «читабельной» и значительно упрощает ее модификацию при использовании компьютеров с разным распределением памяти.
8-разрядный микропроцессор 65 Содержимое счетчика команд в этот момент равно ОЗОАН, так как в счетчике всегда находится адрес следующей команды. Заметим, что аббревиатура означает расширение со зна­ FBH ком 1 при сложении. Поэтому + 0000 001100001010 1111111111111011 0000 001100000101 Пример 9. = 0305Н новое содержимое счетЧика Вызов подпрограммы. Следующий листинг файла, приведенный на рис. 3.11, являет­ ся примером простой программы, иллюстрирующей вызов неко­ торой подпрограммы из основной программы. Таблица трасси­ ровки, показывающая операции со стеком, приведена на рис. 3.12. Проrрамма на языке ассемблера и в машинных кодах org equ equ stack screen :лдреё инициаmпировюъ указатель стека . . - машиНнЬlй- " - Меfка - - КОМаНда- - Рис. начальный ~щрес пршраммы OFFOCH 2 ; код 0100 31 00 06 01 78 56 0103 0106 CD 00 03 start: 0109 {следующая команда} ;- " - " ... - - ... - " " " ---subrtn: С5 0300 0301 06 02 0303 ОЕ2А loop: 0305 CD ОС FF 0308 10 FB 030А Cl - 030В 1ООН бООН --- С9 ld sp, stack ld Ьс, 5678Н call subrtn - - -- " подпроrраммавыводанаэкран Примечание загрузить указатель стека загрузпгь число в ВС вызвюъ подпрограмму " push Ьс ld Ь,02 ld с, ••• calJ screen djnz loop сохранпrь содержимое ВС рор Ьс воссrановигь содержимое ВС ret возвраrnrься в основную программу загрузпгь 2 в В заrрузпrьАSСП-код2АвС напечатать• В-1, если Вне О, loop 3.11. Распечатка файла программы. 1 «Расширение со знаком». означает, что если седьмой разряд, например, 8-разрядного числа равен О, то тогда для преобразования этого числа в 16-разряд­ ное число, разряды от 8 до 15 заполняются «нулями». Аналогично, если седьмой бит 8-разрядного числа равен 1, то разряды от 8 до 15 заполняются «единицами». 2 Некоторые трансляторы требуют наличия нуля перед шестнадцатеричны­ ми числами, которые начинаются с буквенного символа (А, В, С, дЛя указания того факта, что это число, а не метка. D, Е или F),
~-==т--~ Команда вс SP РС следующий адрес ld sp, stack ld Ьс, 5678Н call subrtn (старший 0103 0106 56 78 push 0300 Ьс ld ь, 02 ld с, 2АН call screen 0301 0303 0305 02 78 02 2А (Напечатать*) FFOC 0308 0305 djnz loop 01 2А call screen (Напечатать*) FFOC 0308 djnz loop 00 2А 56 78 рор Ьс 0308 1009 '""'"-""""'~~--~'>.".-}>:·}·"'"'"»>»>:<·:,-..-:.:;,,,»,:·>:«-»»»:,..,.,. 3.12. _ Основная программа _,,..,. ,.,.....,,." •• ",.;.:.:,;;:.:,>,:<->»»:. ···~ ~-·>»:-:-;:;:,:. Данные Адрес 01 09 78 56 05FB 05FA 05FC 03 08 56 05FB 05FA 05FC 03 08 56 05FE 0600 01 _,.,,,,,.",,,.>-=_"««<»-.- Таблица трассировки для примера ...-.·.. :-:,:-:·>>:·:"""" , .. 05FF 05FE 05FD 05FC 030А ret Рис. стека 0600 байт) (младший байт) Данные - -- 9. Подпроrрамма Адрес Данные 0000 ООО 1 0000 0000 0011 0001 0000 0011 0000 0000 1100 0101 0000 ООО 1 0000 ООО 1 0000 0000 0000 0011 0000 ООО 1 0000 0110 0000 ООО 1 0000 001 О 0000 0110 0000 0011 0000 0010 0000 0010 0000 ООО 1 0000 0011 0000 0001 0000 0011 0000 0011 0000 lllO 0000 ООО 1 0000 О 100 Olll 1000 0000 001100000100 0010 1010 0000 0001 0000 0101 0101 0110 0000 0011 0000 0101 1100 1101 0000 0001 0000 0110 11001101 0000 0011 0000 OllO 0000 1100 0000 ООО 1 0000 О lll 0000 0000 0000 0011 0000 0111 lll l 1111 0000 ООО 1 0000 0000 0011 0000 OOll 0000 1000 0001 0000 0000 ООО 1 0000 0011 0000 1001 llll 1011 0000 0011 0000 1010 1100 0001 0000 0011 0000 1011 1100 1001 0000 1001 ;··. Рис. 1ООО 3. 13. '· . ..,. ~»-==т~~~:::-.:х::::<'~ Таблица трассировки для примера 9.
8-разрядный микропроцессор 67 Важно помнить, что все команды и данные хранятся в двоич­ ном коде, как видно из рис. 3.13. Для команды call требуется пять внешних операций с па­ мятью. Она выполняется микропроцессором Z80 за 17 тактовых импульсов. Если тактовая частота равна 20 МГц, то полное вре­ мя выполнения этой команды составляет 850 нс. Это время можно сравнить со временем выполнения данной команды про­ цессором 80386 фирмы Intel с тактовой частотой 33 МГц, где ко­ манда call выполняется за 12 тактовых импульсов. При указан­ ной частоте этот процессор затрачивает 12/33 х 106 (= 363,6 нс) на выполнение данной команды, т. е. в среднем в два с полови­ ной раза быстрее, чем микропроцессор 3.3. 7. Z80. Прерывания Аппаратные прерывания повышают гибкость использования микропроцессора. Они позволяют процессорной системе вы­ полнять несколько задач одновременно, например обрабаты­ вать данные и обслуживать периферийные устройства. У микропроцессора может быть несколько выводов (контак­ тов) для подачи сигналов прерываний. МП Z80 имеет два таких вывода: INT (маскируемое прерывание) и NMI (немаскируемое прерывание). Сигнал логического О на одном из этих выводов мо­ жет прервать обработку команд в любой момент времени. Преры­ вание обычно приостанавливает выполнение текущей задачи или процесса, инициирует выполнение служебной подпрограммы, а затем возвращает систему к выполнению текущей программы или процесса. В дополнение к механизмам прерываний, внешние шины микропроцессорной системы Z80 могут управляться путем установки сигнала логического О на выводе BUSRQ (BUS ReQuest - запрос шины). Запрос шины. При активизации линии BUSRQ микропроцес­ сор приостанавливает текушие операции и переводит как шину данных, так и адресную шину в состояние высокого импеданса. Управляющие сигналы, которые не могут находиться в трех со­ стояниях, переводятся в неактивное состояние. ПодтверЖдение запроса в линии Z80 осуществляется путем установки логического О на BUSAK (BUS AcKnowledge - подтверЖдение шины). Это средство используется главным образом для прямого доступа к памяти (ПДП), т. е. для непосредственной пересьшки данных между периферийными устройствами и памятью микропроцес­ сорной системы.
Глава 68 3 NMI (немаскируемое прерывание). Как видно из его названия, такое прерывание нельзя запретить. Оно будет принято микро­ процессором по завершении выполнения текущей команды программы. Если немаскируемое прерывание получено при вы­ даче запроса шины (BUSRQ), оно будет обработано после сня­ тия BUSRQ. NMI приводит к загрузке содержимого счетчика команд (ре­ гистра РС) в стек и загрузке адреса ОО66Н в счетчик. Либо пере­ ход, либо служебная подпрограмма должны быть записаны на­ чиная с этого адреса (ОО66Н). В конце служебной подпрограм­ мы должен стоять оператор retn для возврата из немаскируемо­ го прерывания. INT (маскируемое прерывание, или просто прерывание). Это прерывание можно разрешить командой дой di. Существуют три режима работы бираются с помощью команд im О, im - ei и запретить коман­ О, 1 и 2, которые вы­ 1иim2 соответственно. Подпрограммы прерываний, использующие этот режим, дол­ жны заканчиваться командой reti. Команда ei прерывания должна предшествовать команде в подпрограмме reti (см. приме­ ры 11и12). Прерывание, режим О. Z80 работает в этом режиме после im О. Микропроцессор сброса или после выполнения команды ожидает появления на шине данных или команды манды call. rst, или ко­ Обе эти команды приводят к загрузке содержимого счетчика команд в стек и затем выполнению перехода по неко­ торому адресу. Команда rst является однобайтовой командой, обеспечивающей переход по одному из восьми адресов (ООН, 08Н, lOH, 18Н, 20Н, 28Н, ЗОН, 38Н). Прерывание, режим 1. Этот режим устанавливается по ко­ манде im 1. Этот режим аналогичен режиму немаскируемого прерывания, за исключением того, что переход осуществляется по адресу 0038Н. Прерывание, режим 2 (векторное прерывание). Этот режим ус­ танавливается по команде im 2. Вектор прерывания - это адрес, поставляемый периферийным устройством, которое иницииру­ ет данное прерывание. Он используется в младшем байте указа­ теля памяти на начальный адрес подпрограммы обработки пре­ рывания. Используется косвенная адресация. 16-разрядный адрес подпрограммы прерывания образуется следующим образом:
8-разрядный микроnоцессор 69 АО> О (должен быть нулем для двухбайтового адреса); Al - А7 от периферийного устройства выдаются на линии данных; А8 -А15 из регистра 1 (который предварительно был загружен старшим байтом адреса таблицы векторов прерываний). Эта таблица может содержать до 128 16-разрядных адресов, где хранятся программы обработки прерываний. Это обеспечи­ вает 128 периферийных устройств своей собственной подпрог­ раммой прерывания при подаче на параллельный порт ?-раз­ рядного адреса. Пример 1 О. Начальный Векторная адресация. адрес таблицы векторов прерываний равен 8000Н, следовательно, в регистр 1 микропроцессора загружается число 80Н. В системе имеется четыре устройства, которым соот­ ветствуют векторные значения Вектор Номер 00, 02, 04, 06. Адрес обработчика устройства прерывания 00 АООО 2 02 АО50 3 04 A07F -06 4 Адрес АОА2 Рис. 3. 14. Адреса подпрограмм обработки прерываний. Адрес обработчика прерывания 80 00 00 80 01 АО 80 02 50 80 03 АО 80 04 7F 80 05 АО 80 06 А2 80 07 АО ~~И..:1 Рис. 3.15. Таблица векторов пре­ рываний, хранимая в памяти.
Глава 70 3 МИКРОПРОЦЕССОР <="'_ __,,,,,,,,,,,,, DO """"'"-'---""--'f ~""--~~---'fD7 Шина данных вывод Параллельный данных ввоД/вывод Адресная шина 8-разрядная шина Рис. 3. 16. МП-система в режиме векторной адресации. Информация об адресах обработчиков прерываний представ­ лена в таблице на рис. 3.14, а таблица векторов прерываний - на рис. 3.15. Схема, показывающая значения разрядов ячеек памяти и регистров для случая, когда прерывание инициировано устрой­ ством 2, 3.3.8. представлена на рис. 3.16. Короткая подпрограмма прерывания Содержимое любых регистров, используемое в подпрограммах прерываний, должно быть сначала перенесено в стек с по­ мощью команды push и извлечено оттуда в обратном порядке с помощью команды рор в конце подпрограммы. Пустые опера­ торы для немаскируемого и маскируемого режима 1 показаны ниже, за ними следует загрузочная подпрограмма главной про­ граммы. Пример Адрес 11. Подпрограмма немаскируемого прерывания. Машинный Ассемблер Комментарий push af ; только загрузить код 0066 f5 в стек регистры, используемые в подпрограмме
8-разрядный микропоцессор Адрес Машинный Ассемблер 71 Комментарий код 0067 0068 с5 push Ьс push de d5 {подпрограмма} 0080 0081 0082 0083 рор dl cl fi ed 45 de рорЬс рор af rent ;возвратиться из немас­ кируемого прерывания Пример Адрес 12. Подпрограмма прерывания режима Машинный Ассемблер 1. Комментарий код 0038 0039 f5 003А d5 push af push Ьс push de с5 {подпрограмма} 0050 0051 0052 0053 0054 dl рор с! рорЬс fi рор fЬ ei reti ed 4d de af ; снова разрешить преры­ вание ; возвратиться из преры­ вания Пример 13. Загрузочная подпрограмма главной программы. Микропроцессор Z80 после сброса возвращается к адресу 0000. Программы начинают работать с адреса 0100. Использует­ ся распределение памяти, представленное на рис. 3.4. Адрес Машинный Ассемблер Комментарий код 0000 31FF5F ld sp, 5FFFH ; инициализировать указатель стека 0003 ed 56 im 1 ; инициализировать режим прерывания 1
72 Глава Адрес 3 Машинный Ассемблер Комментарий ei jp OIOOH ; разрешить прерывание ; .rтерейти к тому адресу, с ; которого стартует основ­ ; ная программа код 0005 0006 fЬ с. 00 01 0100 " ~ ''
2 Теория и программирование Глава 4 Типы микропроцессоров . 4. 1. Типы 4.2. ·,. ~ ~ микропроцессоров Способы увеличения производител.ьности, микропроцессоров 4.3. Компьютер с полным набором команд 4.4. Компьютер с сокращенным набором команд 4.5. Однокристальные микроконтроллеры (CISC) (RISC) Главная цель данной главы заключается в том, чтобы ознако­ миться с тремя различными подходами к архитектуре микро­ процессоров: так называемыми ной архитектурами. На рисунке CISC-, RISC- и однокристаль­ 4.1 показана взаимосвязь между этими тремя подходами. МИКРОЭЛЕКТРОННЫЕ УСТРОЙСТВА 1 МИКРОПРОЦЕССОРЫ 1 1 RISC 1 CISC . 1 Однокристальный микроконтроллер Рис. 4. 1. Дерево микроэлектронных устройств. 4.1.Типымикропроцессоров RISC и CISC являются двумя альтернативными подходами к конструкции микропроцессоров. Основные особенности СISС­ архитектуры перечислены в разделе в разделе 4.4. 4.3, а RISС-архитектуры •
Глава 74 4 Системы, в состав которых входят микропроцессоры, можно разделить на: 1) 2) 3) автономные, специализированные, встроенные. Типичным примером автономной системы является персо­ нальный компьютер (ПК), описанный в гл. 5. Однокристальный микроконтроллер (раздел лезен для специализированных систем, 4.5) особенно по­ которые предназначены для конкретных приложений, например, для управления пе­ чатью, измерений потока воздуха или автоматической регистра­ ции скорости передачи данных. Встроенной системой называется система, в которой микро­ процессор является частью другой системы, например такой, как двигатель машины, самолет или система вооружения. В та­ ких системах, как правило, необходим жесткий повременной контроль работы процессора. Осушествляется он средствами языка ассемблера или же языка программирования высокого уровня АДА, специально предназначенного для этой цели. 4.1.1. Факторы, влияющие на конструкцию системы Конструкция системы зависит от того, что является главным критерием при ее создании - стоимость или быстродействие. При сравнении микропроцессорных систем обычно принима­ ются во внимание следуюшие факторы: 1) 2) 3) 4) скорость обработки и передачи данных, стоимость системы, средства ввода/вывода, физический размер. 4.1.2. Скорость обработки и передачи данных Факторы, влияюшие на скорость вычислений: 1) тактовая частота, на которой работает данный микропро­ цессор; 2) ширина системной шины данных; 3) время выполнения команд в микропроцессоре;
Типы микропроцессоров 75 4) конструкция системы; 5) выбор программных средств и методов программирова­ ния. Разработчики постоянно стремятся повысить быстродейст­ вие микропроцессорной системы. Очевидно, чем выше быстро­ действие системы, тем быстрее пользователь получит нужные ему результаты и тем точнее будут эти результаты. Тактовая частота настольных компьютеров, от которой на­ прямую зависит скорость обработки данных, в последнее деся­ тилетие увеличилась более чем в 100 раз. Создатели микропро­ цессорных систем вынуждены ограничиваться тактовыми час­ тотами, лежашими в некотором диапазоне частот, обычно опре­ деляемом производителем конкретного микропроцессора. В последние годы ширина шины данных бьша увеличена с 8 до 16, а затем до 32 бит. При более широкой шине данных уменьшается число обрашений к памяти, что снижает суммар­ ное время доступа к памяти. Время выполнения команд, тактовая частота и ширина ши­ ны данных определяются типом микропроцессора, выбранным для данной системы. Методы уменьшения времени выполнения команд, используемые изложены в разделе производителями микропроцессоров, 4.2. Оптимизация построения программ и применение опти­ мальных методов программирования могут максимального быстродействия системы. помочь достичь Например, каждая программа должна быть разработана таким образом, чтобы про­ цессор не производил ненужных вычислений во время ее вы­ полнения. Код должен быть оптимизирован, т.е. при выполне­ нии конкретной функции необходимо использовать наиболее эффективные команды. 4.1.3. Стоимость системы Следуюшие факторы будут влиять на стоимость микропроцес­ сорной системы: 1) 2) 3) 4) 5) стоимость компонентов, число интегральных схем, ширина адресной шины, ширина шины данных, тип памяти. ,;,
Глава 76 4 Стоимость отдельных компонентов микропроцессорной си­ стемы будет, естественно, зависеть от рыночной цены на мо­ мент производства этой системы. Вообще, самые последние разработки тех или иных устройств стоят значительно дороже аналогичных устройств, находящихся в продаже в течение не­ скольких лет. Число интегральных схем (ИС) будет влиять на общую сто­ имость, причем помимо стоимости самих ИС должны учиты­ ваться затраты на плату, межсоединения ИС и тестирование. С этой точки зрения однокристальный микроконтроллер (раз­ 4.5) имеет преимущество над микропроцессорными систе­ дел мами. Вообще говоря, чем шире адресная шина или шина дан­ ных, тем дороже система. Если не возникает необходимости в использовании всех возможностей адресации памяти, ширину адресной шины можно ум~ньшить. Однако здесь нужно при­ нять во внимание во1можность дальнейшего усовершенствова­ ния системы. Если снижение стоимости системы является бо­ лее важным, чем ее быстродействие, то можно выбрать процес­ сор, который будет работать с шиной данных, ширина которой равна половине разрядности выводимых данных, т. е. 16-раз­ рядный процессор может быть использован в системе с 8-раз­ рядной шиной данных. Кристаллы памяти с меньшим временем доступа к памяти обычно дороже, поэтому увеличение быстродействия приводит к увеличению ее стоимости. 4. 1.4. Средства ввода/вывода Микропроцессоры обычно имеют два вида средств ввода: па­ раллельную шину данных и линии прерывания. Единственным средством вывода является параллельная шина данных. Все дру­ гие средства ввода/вывода должны быть конструктивной частью системы и могут включать как параллельные, так и последова­ тельные порты. В то же время однокристальный микроконтрол­ лер будет иметь параллельные, последовательные и, возможно, аналоговые средства ввода и вывода. 4.1.5. Физический размер Физический размер модуля в большой степени определяется ко­ личеством необходимых контактов, что в свою очередь зависит от ширины шин. Требуемое число соединений определяетсл
Типы микропроцессоров 77 суммой соединений для адресной шины, шины данных и управ­ ляющей шины, а также линий электропитания. На некоторых микросхемах соединения являются мультиплексными, т. е. многофункциональными. 4.2. Способы увеличения производительности ',._J _. f микропроцессоров В этом разделе обсуждаются некоторые способы увеличения производительности микропроцессоров. При описании каждого способа излагается только принцип его реализации. Осуществ­ ление этих способов на практике может быть довольно сложным. Ниже изложены следующие способы улучшения производи­ тельности микропроцессоров: 4.2.1); 1) конвейерная обработка (раздел 2) 3) 4) перекрытие окон регистров (раздел кэширование (раздел ,,,.,, 4.2.2); 4.2.3); управление и синхронизация микропроцессора (раздел 4.2.4). 4.2. 1. Конвейерная обработка Конвейерная обработка - это способ увеличения скорости об­ работки команд путем разделения задания на некоторое число сегментов, выполняемых параллельно. Каждый сегмент, обыч­ но состоящий из комбинационной логической схемы, отделен от других сегментов регистром. Конвейерная обработка обычно относится к командам и арифметическим операциям. Арифме­ тический конвейер демонстрируется в примере 2. Конвейер команд считывает последовательные команды из памяти, в то время как ранее прочитанные команды уже обраба­ тьшаются в других сегментах. Это приводит к перекрытию по времени командных фaзfetch (выборка) и execute (исполнение), что позволяет исполнять одну команду за один тактовый им­ пульс (см. пример Пример 1). 1 . Конвейерная обработка команды. На рисунке 4.2 показан конвейер команд из пяти сегментов. Если каждый сегмент занимает по времени один тактовый цикл,
Глава 4 78 СЕГМЕНТ ВЫПОЛНЯЕМЫЕ КОМАНДЫ ПРОЦЕСС lл 1 Команда выборки 2 Считывание/дешифрация з АЛУ 4 Считывание операндов 5 Сохранение результата в с о Е А в с о Е А в с о Е А в с о Е •. А} в с о 2 Рис. 4.2. з EI 4 5 6 7 8 9 Тактовые циклы Использование 5-сегментного конвейера для обработки пяти ко­ манд А, В, С, D и Е. то процессор фактически работает со скоростью обработки од­ ной команды за один цикл. Пример 2. Арифметический конвейер. Этот пример иллюстрирует 3-сегментную систему, использу­ ющую для вычисления выражения Ai * Bi + Ci for i = 1, 2, 3, ... , 9 Синхронизация Ai Ci Bi Сегмент 1 ввод ] Сегмент2 УМНОЖЕНИЕ Сумматор СегментЗ СЛОЖЕНИЕ и вывод Rб Результат Рис. 4.З;'Конвейер арифметических вычислений.
Типы микропроцессоров Сегмент номер тактового Сегмент2 1 79 СегментЗ t-----------1--------t------RS R4 RЗ R1 R2 импульса R6 А! В! С! 2 А2 В2 С2 з АЗ ВЗ СЗ А2 В2 С2 Al * В!+ С! 4 5 6 7 8 9 10 11 А4 В4 С4 АЗ* ВЗ сз А2 * А5 В5 С5 А4 * В4 С4 Аз* вз +сз Аб Вб Сб А5 А4 Аб * В5 * Вб С5 А7 В7 С7 Сб А5 А8 В8 С8 А7 В7 С7 А6 А9 В9 С9 АВ В8 С8 А7*В7+С7 В9 С9 AS • А9 * Рис. А9 4.4. * * * * * • * В2+С2 В4+С4 В5+С5 Вб+С6 вs+cs В9+С9 Таблица содержимого регистров. регистры и комбинационную логику. Рисунок 4.3 демонстриру­ ет, как эти операции разбиваются на три сегмента. Результат вы­ числений каждого сегмента сохраняется в регистре и затем на следующем тактовом импульсе передается в следующий сег­ мент. Операции в сегментах следующие: 1 (Ввод) Ai~Rl, Сегмент 2 (Умножение) Rl * R2 ~ R4, Сегмент 3 (Сложение) (R4+R5) ~ Rб Сегмент Таблица на рис. 4.4 ш~R2, RЗ ~ Ci~Rз R5 показывает содержимое регистров после каждого тактового импульса. Три задания, которые выполняют­ ся девять раз (27 отдельных операций), выполняются в итоге за 11 тактовых циклов. В этом примере 27 заданий выполняются за 11 тактовых цик­ 2,45 раза (27/11 = 2,45). Те­ лов, что дает увеличение скорости в оретически максимальная скорость использования конвейера УБеличивается случае - пропорционально числу сегментов, в данном в три раза. 4.2.2. Кэширование Логические операции в микропроцессоре обычно выполняют­ ся быстрее, чем обращение к оперативной памяти, поэтому скорость вычислений ограничена, главным образом, временем
Глава 80 4 доступа к оперативной памяти. Для того, чтобы преодолеть этот барьер, используется специальная высокоскоростная память, называемая кэш-памятью, или просто кэшем. Кэш-память уве­ личивает скорость вычислений, обеспечивая более высокую скорость доступа микропроцессора к текушим программам и данным. Скорость доступа к кэш-памяти может превышать скорость доступа к оперативной памяти почти в семь раз. Кэш может быть или частью микропроцессора, или отдельным, но непосредственно связанным с микропроцессором, устройст­ вом. Кэш применяется для хранения сегментов программ, вы­ полняемых в данный момент времени, а также для часто запра­ шиваемых микропроцессором данных для текущих вычисле­ ний. Важно отметить, что конструкция кэш-памяти должна быть такой, чтобы поиск необходимой информации внутри нее осуществлялся с высокой эффективностью, ведь поиск не­ обходимо производить всякий раз, как только происходит об­ ращение к памяти. Примером может служить микропроцессор 68030 фирмы имеющий встроенный кэш команд размером 256 байт Motorola, и встроенный кэш данных такого же объема. И тот и другой кэш являются кэш-памятью с прямым отображением. Это означает, что каждое слово памяти имеет строго определенное местополо­ жение внутри кэша. Кэш-память с прямым отображением фак­ тически является уменьшенной копией оперативной памяти, поскольку очень близка к последней по своей организации. 4.2.3. Перекрывающиеся окна регистров При работе с подпрограммами, вызываемыми из основной про­ граммы, часто возникает необходимость передавать из нее чис­ ловые значения либо в главную программу, либо в другие под­ программы, работающие совместно с ней. Это можно осущест­ вить путем выделения для этой цели блока оперативной памяти. Однако, чтобы избежать необходимости обращения к оператив­ ной памяти, процессоры можно сконструировать с достаточно большим количеством регистров, и некоторые из них могут ис­ пользоваться для передачи переменных из одной подпрограммы в другую. Подобная организация известна как перекрывающие­ ся окна регистров. На рисунке чающего 4.5 показана организация файла регистров, вклю­ 74 регистра, которые разбиты на три группы. Имеются
Типы микропроцессоров R42 R43 в с В&С R41 '-------i Рис. 10 4.5. R47 81 R57 Перекрывающиеся окна регистров. глобальных регистров, четыре группы по 10 локальных реги­ стров и четыре группы по шесть регистров, которые являются обшими для двух локальных групп. Такая конфигурация регистров очень удобна с точки зрения требований языков программирования высокого уровня, таких как Си и Паскаль, поскольку: 1) глобальные регистры предусмотрены для глобальных пе­ ременных; 2) локальные регистры предусмотрены для локальных пере­ менных; 3) регистры обшего назначения используются для обмена параметрами и результатами без обрашения к оператив­ ной памяти. Обшее количество регистров для каждого окна (так называе­ мый размер окна) определяется выражением: GLOBAL (рис. 4.5). + LOCAL + 2*COMMON = 10 + 10 + 6*2 = 32
Главв 82 4.2.4. 4 Управление микропроцессором и его синхронизация Импульсы, вырабатываемые генератором тактовых импульсов, поступают на бистабильные мультивибраторы и регистры, включая и регистры в блоке управления. Однако содержимое регистров изменяет свое состояние только при условии получе­ ния сигнала разрешения от блока управления. Существуют два основных способа организации управления: аппаратное и мик­ ропрограммное. Микропрограммное управление При микропрограммном управлении микропрограмма хранит­ ся в ПЗУ. Основная схема работы показана на рис. 4.6. Некото­ рая внешняя команда вызывает некоторую последовательность микрокоманд из ПЗУ. Внешний Генератор вход последовательности Управляющий адресный регистр Управляющий Управля­ ющее ПЗУ Уравляющий выход регистр данных Следующая адресная информация Рис. 4.6. Организация микропрограммного управления. Каждая микрокоманда пересылается в управляющий регистр данных, который обеспечивает как внутренние, так и внешние управляющие сигналы. Микропрограммное управление обычно используется в процессорах, где применяется архитектура со сложными ко­ мандами. Аппаратное управление При аппаратном управлении используется комбинационная ло­ гическая схема, работающая с синхронизирующими импульса­ ми, поступающими от последовательного счетчика. Такое уп­ равление имеет преимущество в быстродействии, но лучше под­ ходит для работы с простыми командами фиксированной длины (рис. 4.7).
83 Типы микропроцессоров Код операции Адрес, регистр или операция ввода/вывода О 12 11 14 Биты 1= О для режима прямой адресации 1= 1 для режима косвенной адресации Рис. 4. 7. Типичная команда фиксированной длины. Приращение Очистка Синхронизация Регистр команд 4-разрядный счетчик 1 дешифратор 4 Х 16, вырабатывающий 16 о последовательных сигналов Т1 ТО 15 1 07 00 А11 А1 АО УПРАВЛЯЮЩАЯ ЛОГИЧЕСКАЯ СХЕМА Управляющие выходы Рис. 4.8. Пример аппаратного управления. Аппаратная система управления, показанная на рис. 4.8, де­ шифрирует микропроцессорные команды фиксированной дли­ ны и вырабатывает управляющие сигналы. Формат данных ко­ манд представляет собой три поля, первое из которых отобража­ ет режим адресации, второе - код операции, третье - адрес. 4.3. Компьютер с полным набором команд (CISC) При создании набора команд для компьютера необходимо учи­ тывать не только конструкции машинного языка, но и требова­ ния, предъявляемые языками программирования высокого Уровня. Один из способов повышения общей производительно­ сти компьютера заключается в использовании сложных команд
Глава 84 4 на уровне машинных кодов с тем, чтобы упростить трансляцию с языков высокого уровня. Наиболее важными характеристиками СISС-процессоров являются: 1) 2) большое число команд, обычно до 250; команды, которые предназначены для выполнения специализированных заданий и используются довольно редко; 3) как правило, от 5 до 20 различных адресных режимов; 4) форматы с переменной длиной команды; 5) 6) команды, которые управляют операндами в памяти; специализированные команды, которые предназначены для выполнения некоторых процедур высокоуровневых языков и позволяют сократить машинный код; 7) выполнение команд микрокода. В качестве примера СISС-микропроцессоров в следующем разделе приводятся основные характеристики микропроцессо­ ра МС68000. 4.3.1. Микропроцессор МС68000 фирмы (©фирмы Motorola Motorola) Характеристики микропроцессора М С68000 фирмы 1. Motorola: 32-разрядная внутренняя шина данных и 32-разрядные регистры. 2. 16-разрядная внешняя шина данных. Старший (от D8 до (от DO до D7) байты шины данных имеют отдельные стробирующие сигнальные линии, UDS и LDS соответственно, что упрощает управление 8-разрядными D 15) и младший устройствами. 3. 4. 24-разрядная адресная шина (от АО до А23), обеспечиваю­ щая возможность адресации 224 (16 Мбайт) или 4М слов. Логическое состояние линии АО, которая нужна лишь для байтовой операции, определяет состояние линий UDS и LDS. LDS = 1, если АО= 1, и UDS = 1, если АО= О. Разделение регистров на восемь регистров данных и семь адресных регистров памяти.
Типы микропроцессоров 85 Возможность синхронной и асинхронной передачи по шине 5. данных 1 . Синхронная шинная передача применяется в си­ стемах, содержащих, например, устройства серии 6800, которые не имеют асинхронного режима. 6. 7. Выполнение команд микрокода. Наличие двух режимов работы режима диспетчера, - - режима пользователя и выбираемых функциональными кодами на управляющих линиях FCO, FCl и FC2. Режим диспетчера является привилегированным уровнем работы и используется, например, при работе с операционными системами. В этом режиме доступны некоторые специаль­ ные команды и регистры. 8. 9. Управление памятью ввода/вывода. Многие команды могут манипулировать байтами, слова­ ми или длинными словами2, на что можно указывать при­ соединением сокращений соответственно «.В», «.L» к «.W» и мнемонике операции. 10. Команды ассемблера имеют общий формат, обратный то­ му, который принят в микропроцессоре Z80: операция <исходный операнд>, <конечный операнд> 11.14 режимов адресации: прямая регистровая, косвенная ре­ гистровая, абсолютная, относительная по счетчику ко­ манд, непосредственная и неявная. 1 Синхронной называется такая передача данных, при которой генератор синхронизирующих импульсов контролирует операции пересылок данных и все передачи занимают по времени определенное число тактов. Асинхронной называется передача данных, при которой период передачи заканчивается при полуqении специального сигнала уведомления (в случае микропроцессора 68000 данный сигнал называется DTACK). Такой тип передачи позволяет ВI<лючать в состав системы устройства с щироким диапазоном значений време­ ни доступа. 2 Байт= 8 бит, слово= 16 бит, длинное слово= 32 бит.
Глава 86 4 ar-~~~~~!!'!"""'",.,..,._..,.~ Адресная Vcc шинаА1-А23 Земля Шина данных 00-015 Управление асинхронной Состояние шиной процессора Управление Е [ пери~ерийными VMA устроиствами VPA BERR Управление системной [ RESE HALT Обозначения сигнальных линий Е Разрешение VMA Действительный адрес FCx пользователя памяти BERR R/W LDS ОТАСК или состояние диспетчера Ошибка шины Чтение/Запись Строб младшего байта IPL.x Управление прерываниями VPA Действительный адрес данных AS Строб адреса UOS BR BG Строб старшего байта данных Запрос шины Предоставление шины периферийного устройства Подтверждение передачи данных BGACK Функциональные коды для Подтверждение предоставления шины Рис. 4.9. Сигналы ввода/вывода микропроцессора 68000. 4.4. Компьютер с сокращенным набором команд (RISC) Идея RISС-архитектуры - попытаться уменьшить время ис­ полнения команд (добиться исполнения одной операции за один такт) путем упрошения набора команд. Наиболее важные характеристики микропроцессора с RISС-архитектурой: 1) простой формат, относительно небольшое количество ко­ манд, 2) относительно небольшое количество адресных режимов, а
Типы микропроцессоров 87 именно: регистровая адресация, непосредственная и от­ носительная, 3) относительно большое количество регистров, что способ­ ствует обработке операций внутри пространства регист­ ров микропроцессора, 4) 5) перекрывающиеся окна регистров, обращения к памяти, ограниченные только загрузкой и записью команд, 6) выполнение одной команды за один такт с использовани­ ем конвейеризации, 7) аппаратное, а не микропрограммное управление. 4.4.1. Микропроцессор МС88100 фирмы (©фирмы Motorola) Микропроцессор МС88100 фирмы Motorola Motorola имеет следующие характеристики: 1) 2) 32-разрядные регистры, шина данных и адресная шина, 32-разрядные регистры общего назначения, АДРЕСКОДЛ ДАННЫЕ код ЧТЕНИЕ/ЗАПИСЬ ДАННЫХ БЛОКИРОВКА ШИНЫ ДАННЫХ КОДОВЫЙ ОТВЕТ СИНХРОНИЗАЦИЯ РАЗРЕШЕНИЕ ФАЗОВОЙ БЛОКИРОВКИ ПРЕРЫВАНИЕ РАЗРЕШЕНИЕ ПРОВЕРКИ ШИНЫ Рис. 4. 1 О. Сигналы ввода/вывода микропроцессора МС88100.
Глава 88 4 3) раздельные порты памяти данных и команд, 4) конвейерная загрузка и запись, 5) 51 команда, эффективное выполнение за один такт путем использования конвейерной обработки, 6) 4-байтовые команды фиксированной длины, 7) режимы «диспетчера» и «пользователя». 4.5. Однокристальные микроконтроллеры Все рассмотренные до сих пор процессоры сконструированы для работы в многочиповых (многокристальных) системах со многими микросхемами, и они не могут работать без внешней памяти. Однокристальный микроконтроллер, помимо регист­ ров, арифметико-логического устройства и всего остального, что содержится в микропроцессоре, содержит также ОЗУ и ПЗУ и, возможно, аналого-цифровой преобразователь (АЦП)I и тай­ мер. Примером такого процессора является рассматриваемый ни­ же микроконтроллер Philips 83/87С752 (8ХС752). 4.5. 1. Микроконтроллер (©фирм Philips 83/87С752 (8ХС752) Philips Semiconductors и Signetics) Микроконтроллер 8ХС752 - это однокристальный, 8-разряд­ ный КМОП-микроконтроллер 2 . Основные характеристики дан­ ной ИС перечислены ниже, а сигналы ввода/вывода показаны на рис. 4.11. Это устройство имеет 28-штырьковый корпус, при­ чем многие контакты являются многофункциональными (пред­ назначены для выполнения 2-3 функций). Пример применения микроконтроллера 8ХС752 рассматри­ вается в гл. 5, где можно найти дополнительную информацию о данной ИС. Основные характеристики микроконтроллера 8ХС7 52 следу­ ющие: 1 АЦП рассматриваются в гл. 2 ник. 11. КМОП - комплемеН'l'арные структурьi'Тиitа металл-окисел-nолупровод­
_______________ Т_и_п_ымикропроцессоров 89 Vdd Vss Аналоговое AVcc входное Внешний кристалл 2-Кбайт СБРОС ПЗУ/СППЗУ Рис. 1. 4.11. Сигналы ввода/вывода микроконтроллера 8ХС752. Двадцать одна линия ввода/вывода, использующая три порта (О, 2. 1 и 3). Встроенный на кристалле генератор тактовых импуль­ сов с допустимыми частотами от 3,5 МГц до 16 МГц. Тактовые импульсы могут исходить и с внешнего крис­ талла. 3. Встроенная на кристалле память состоит из: • программируемой памяти объемом 2К х 8 бит ПЗУ (83С752) или СППЗУI (87С752); • • памяти данных объемом 64 х 8 бит ОЗУ; специального регистра функций объемом 128 байт. 4. 5 каналов 8-разрядного АЦП. Преобразование А в D зани­ мает по времени 40 машинных циклов ( 40 мкс с частотой 2 МГц). 1 СППЗУ - стираемое. программируемое постоянное запоминающее уст­ ройство (кристалл с СППЗУ обычно используется для разработок прiшоже­ ний).
Глава 90 4 16-разрядный автоматический перезагружаемый генера­ 5. тор тактовых импульсов. 6. I2C 1 - последовательная шина ввода/вывода. Позволяет работать в качестве главного (slave) (master) или подчиненного устройства на небольшом сегменте сети. 7. 8-разрядный вывод широтно-импульсной модуляции. 8. Семь фиксированных приоритетных линий прерывания. ! 1 J2C - Philips. специальная взаимо-интеrрируемая схемотехника
.,,,,w.,,_........,..........,.....,.........,...........,........,......,...,......,....,....,......,.....,..........,....,....,.......,...., глава 5 Применения 'f), микропроцессоров 5.1. Системы управления и измерительная аппаратура: измеритель потока воздуха 5.2. Системы связи: цифровая обработка сигнала 5.3. Потребительские системы: настольный компьютер В этой главе рассматриваются три применения микропроцессо­ ров, относящиеся к трем различным областям электроники. В разделе 5.1 рассматривается использование микроконтрол­ лера для измерения потока воздуха и, в определенных преде­ лах, для управления этим потоком. Эта электронная система была выбрана потому, что ее легко изучать и она интересна с точки зрения разработки отдельного проекта. Требования к аппаратным средствам здесь минимальны, и всю систему можно собрать на монтажной плате. Хотя программирование системы следовало бы проводить на языке встроенного ассем­ блера используемого микроконтроллера, производители ре­ комендуют создавать программное обеспечение на языке Си. К сожалению, для этого необходим специальный компилятор языка Си. В разделе 5.2 описывается метод цифровой обработки сигна­ лов, применяемый в технике связи. Для тех, кто хотел бы приоб­ рести дополнительный опыт в области обработки цифровых сигналов, здесь открывается возможность создания интересно­ го проекта. В последующих главах в большинстве практических упраж­ нений предполагается использование персонального компью­ тера, поэтому в разделе 5.3 описываются основные характери­ стики персонального компьютера общего назначения.
Глава 92 5. 1. 5 Системы управления и измерительная аппаратура: измеритель потока воздуха (по документации с разрешения Applications Note AN429 фирм Philips Semiconductors и Signetics) Приведенная здесь информация взята из документации Philips Semiconductors Microcontroller Products Applications N ote AN429. В этой документации описывается недорогое устройст­ во для измерения потока воздуха на основе микроконтроллера Philips 83/87С7521. В конструкцию измерителя потока воздуха включены датчики, которые позволяют этому микроконтролле­ ру измерять три параметра: скорость воздуха, давление и темпе­ ратуру. Используемое программное обеспечение корректирует величину измеренного потока воздуха с учетом температуры и относительного давления, исходя из замеряемого потока возду­ ха. Панель управления измерителя потока должна выглядеть так, как показано на рис. 5.1. 7 -сегментные " Поток 1 1 1 1 1 1 1 1 ~ Температура воздуха ~ Давление индикаторы . СВЕТОДНОдЫ Заданное значение 0 Установка заданного значения Рис. 5. 1. Панель управления измерителя потока воздуха. 1 Микроконтроллер 83/87С752 рассматривался в гл. 4. !,
Применения микропроцессоров 5.1.1. 93 Аппаратное обеспечение На рисунке 5.2 приведена таблица, иллюстрирующая работу па­ :нели управления. Установка заданного значения позволяет вы­ бирать определенное значение потока, при достижении которо­ го можно подать аварийный сигнал или выполнить какое-либо другое действие. С помощью программных средств установку заданного значения потока можно использовать для индикации достижения слишком высокого, слишком низкого или задан­ ного значения потока. Конкретная величина заданного значения потока устанавли­ вается путем поворота с помощью отвертки специального винта на передней панели. На рисунке 5.3 показана схема индикации измерителя потока воздуха. СИД Измеряемая величина Переключатель Поток воздуха Поток воздуха в кубических фугах за минугу (CFM) Нет Температура Температура воздуха в градусах Цельсия Дамение Давление воздуха в фунтах на квадратный дюйм SWI SW2 Заданное значение Высокий или низкий аварийный уровень потока SWЗ Рис. 5.2. Описание панели управления. Рисунок 5.3 иллюстрирует один из примеров схемы мульти­ плексной индикации, в которой есть четыре элемента - три се­ мисегментных индикатора и, как одно целое, четыре отдельных светодиода (Поток, Температура, Давление, Заданное значе­ ние). Светодиоды (СИД) соединены между собой таким обра­ зом, что образуют один элемент индикации. Эти четыре элемента подключены к одной общей 8-разряд­ ной шине данных, выводимой из порта 3 микропроцессора че­ рез сильноточные формирователи и токоограничивающие ре­ зисторы. Четыре элемента индикации мультиплексируются (поочередно включаются) с использованием сигналов порта О микропроцессора, который поочередно замыкает общий катод каждого индикатора на землю через полевой транзистор, когда данные для соответствующего элемента находятся на выводах порта 3. Принципиальная схема всей системы показана на рис. 5.4. В таблице на рис. 5.5 приведены сигналы, посылаемые к
Глава 94 5 р g е d с ь а Светодиоды t-l----+-----+-----"---411'";~~;~] Мультиплекси­ Нf----i----"-------41t-- х 0.1 н---..__ ________...._ рующие входы Х1.0 !--'"------------+- х 10.0 Земля Рис. 5.3. Принципиальная схема индикации измерителя потока воздуха. Vdd Р3.7 РЗ.6 Р1.7 РЗ.5 P1.6t----~ РЗ.4 РЗ.3 P1.4t-------------+-.---I ~:; Р3.0 Р1.51-----------' :~:~t=:-rп;::::;:;:;;;:z::::::===:r;::;;a;;; Р1.1 Р1.О РО.О '-'--~РО.1 1------tP0.2 РО.3 1-----+--~РО.4 AVCC V Ref Заданное I100нФ значение Земля Земля Земля Рис. ПАНЕЛ!>Уf\РАВЛЕНИ\1 8ХС752 10кОм 5.4. )(ТАL 1 )(ТАL2 AVSS vss RST Внешн~~ схема 12 датчик Датчик давлениj] •емперJ] МГц нvсс 10мкФ Принципиальная схема измерителя потока воздуха.
Применения микропроцессоров Порт Порт 1.3 высокий низкий высокий низкий Рис. 5.5. 1.4 Нажатая Измеряемая клавиша величина ВЫСОКИЙ ВЫСОКИЙ НИЗКИЙ НИЗКИЙ Нет Поток воздуха SWl SW2 Температура Давление воздуха swз Заданное значение 95 Таблица переключений. выводам 1.3 и 1.4 микропроцессора при нажатии кнопок на панели. В таблице на рис. 5.6 показаны конфигурация порта 1 и поступающие на него входные сигналы. Порт1 Вывод К ф Величина (контакт) он игурация 1.0 АЦП, вход О Примечание Датчик Система измеряет давление воздуха давления относительно атмосферного давления. Датчик давления КР 1ООА вьmодит разницу воздуха напряжений, которая затем усиливается для получения некоторого значения в диапазоне между Vcc и Vdd. Он калибруется с помощью резистора 1.1 АЦП, вход 12 АЦП, вход2 1 Заданное Заданное значение значение регулируемое с помощью резистора - Rl. это напряжение, R2. Температу- Датчик температуры обеспечивает ра воздуха некоторое абсолютное напряжение, пропорциональное температуре. В схему датчика включен усилитель, который устанавливает разность AVss иAVdd. Выходное напряжение датчика калибруется с помошью резистора RЗ. потенuиа,1ов между 1.3 Логичесюф 14 вход 1.5 Логический вход Кнопочны1 Три переключателя выбирают одно переклю- из четырех логических условий, чатели как показано в таблиuе на рис. Поток воздуха Измерение скорости воздуха выполняется воздушно-турбинным тахометром, 5.5. подключаемый через оmрон. l.б Логический Релейный Реле можно использовать для подачи выход контроль сигна,1а тревоги или для выполнения какого-либо иного действия ,;<------------·-··· с целью защиты оборудования. ~ ''''"%X:<<<<>.<;:W,n>:-~O·>i<'·:..~~l;1.~=<m=='<:<<<<':W:::=. .. Р11с. 5.6. Входные сигналы порта 1.
Глава 96 5.1.2. 5 Разработка программного обеспечения Программное обеспечение для измерителя потока воздуха поч­ ти полностью написано на языке высокого уровня Си с исполь­ зованием специального программного пакета поддержки разра­ боток. Программа состоит из основной программы, функции и четырех подпрограмм обработки прерываний. Блок­ схема функции main() показана на рис. 5.7. main(), ВКЛЮЧЕНИЕ СБРОС ПИТАНИЯ 1, Инициализировать переменную Считать числовое значение потока воздуха Считать числовое Показать О О.О значение температуры Считать числовое значение давления Скорректировать поток воздуха с учетом температуры и давления Показать температуру Показать заданное значение Показать ЕЕЕ Сбросить флаг UPDATE '------+ Показать поток воздуха Рис. 5. 7. Измеритель потока воздуха, блок-схема основной программы.
Применения микропроцессоров 97 Отображаемая информация определяется состоянием кла­ виш на панели управления и флагом NOFLOW (нет потока). Ес­ ли величина потока воздуха превышает 30 куб. фут/мин (CFM), на индикаторе высвечивается ошибка (ЕЕЕ). Прерывания обрабатывают четыре подпрограммы: INT 3 Multiplex() выполняет регенерацию индикаторов; INT 6 ReadSwitch() указывает, была ли нажата клавиша; INT О CalcCFM() вычисляет поток воздуха; INT 1 Overflow() указывает на переполнение. /NT З Multip/ex() Работает независимо. Таймер нии INT 3 приблизительно 1 генерирует прерывание по ли­ кажцую миллисекунду. Это исполь­ зуется для «Карусельного» мультиплексирования четырех свето­ диодных индикаторных элементов путем поочередного задейст­ вования выводов РО.О, РО.1, РО.2 и РО.4 соответственно, что обеспечивает регенерацию кажцого индикаторного элемента приблизительно кажцые 4 мс. INT 6 ReadSwitch() Предварительное пересчетное устройство с широтно-импульс­ ной модуляцией сконфигурировано для периодической генера­ ции через кажцые 10,3 мс прерывания по линии INТ прерываний устанавливается флаг UPDATE 6. После 32 (обновить), вызы­ вающий переключение на чтение вводимых данных и обновле­ ние информации на индикаторе кажцые 330 мс. INT О Ca/cCFM() Скорость воздуха определяется временным интервалом между прерываниями по линии INТ О, которые связаны с таймером О. Таймер О хронирует младшие 16 разрядов 24-разрядного регист­ ра с частотой lМГц. Таким образом, этот регистр хранит время в микросекундах. INT 1 Overf/ow() Если временной интервал, определяемый прерыванием по ли­ ! liии INТ О, слишком велик, что приводит к сильному возраста­ liию старших 8 разрядов регистра таймера О, то устанавливается
98 Глава флаг NOFLOW 5 (нет потока). В этом случае на индикаторе вьr­ свечивается значение 5.2. 00.0. Системы связи: цифровая обработка сигнала (digital signal processing - DSP) В этом разделе описывается использование микропроцессоров для обработки сигналов~. Для цифровой обработки сигналов можно использовать специальные интегральные схемы, обеспе­ чивающие достаточно высокое быстродействие, однако для большей гибкости предпочтительно применять специализиро­ ванные DSР-микропроцессоры. Все операции над сигналами должны выполняться в реальном масштабе времени, поэтому од­ ним из наиболее важных требований, предъявляемых к таким микропроцессорам, является наличие встроенных аппаратных функций умножения и деления. Для поддержки высокого быст­ родействия современные ИС цифровой обработки сигналов имеют встроенную память в виде ПЗУ, ОЗУ и кэша. Они могут, кроме того, иметь как параллельные, так и последовательные порты. Такие специализированные ИС выпускаются фирмой Texas Instruments, которая также выпускает специальный комп­ лект для макетирования «DSP Starter Кits» в помощь разработ- Амплитуда '1 Несущая Рис. ция L..._i.;.;.;;,;,;..~i.::;....;;;~1-- Частота 5.8. Амплитудная модуля­ - амплитудно-частотная диаграмма. Амплитуда Рис. 5.9. Однополосная модУ- ляция - амплитудно-частотная ""-. 1 •--......~-Б-.П.;....~----- Частота диаграмма. 1 Обработка сигнала налов связи. - это техника селекции, фильтрации и усиления сиг­
Применения микропроцессоров ОБП­ 99 Фильтр Смеситель вход 1 нижних частот Демодулированный сигнал Гетеродин полосовой Цифровой фильтр процессор Фильтр Смеситель О нижних частот Рис. 5.10. Демодулятор однополосных сигналов фазового типа. чику систем цифровой обработки сигналов. Для иллюстрации возможностей использования цифровой обработки сигналов на рис. 5.10 показана блок-схема однополосного АМ-приемника для приема амплитудно-модулированных~ сигналов в одной боко­ вой полосе (ОБП)2, а на рис. 5.11 изображена блок-схема еще од­ ного варианта приемника, где цифровая обработка использует­ ся для фильтрации сигналов. ОБП­ вход Фильтр Смеситель 1 нижних частот Демодулированный сигнал Гетеродин Полосовой фильтр Цифровой процессор Фильтр Смеситель Q нижних частот Рис. 5. 11. Приемник однополосных сигналов с DSР-филътром. С"\ 1 Амплитудная модуляция - это способ передачи информационных сигна­ лов, при котором предназначенная для передачи информация используется для изменения амплитуды несущей волны. Несущая - это синусоидальная волна постоянной амплитуды. Частота несущей должна быть неизменной и значитель­ но более высокой, чем наивысщая частота модуляции. 2 При базовой амплитудной модуляции возникают две боковые полосы и несу­ щая (рис. 5.8). Эта система хороща для простых приемников сигналов, но она Крайне расточительна, если принять во внимание требуемую мощность приемни­ ков и передатчиков и разделение каналов. Поскольку обе боковые полосы несут одну и ту же информацию, то на самом деле достаточно передавать лищь одну из них. При использовании модуляции с одной боковой полосой вьщеляется либо НИЖняя боковая полоса (НБП), либо верхняя боковая полоса (ВБП), см. рис. 5.9.
100 Глава 5 Вход радиосигнала Аналоговый выход Цифровой ЦАП..._. __ процессор Петля коррекции lliL:::mEBBBBBBZ!JEI Рис. 5.12. Функциональная схема DSР-приемника. Согласно рис. 5.10, после предварительной селекции в поло­ совом фильтре (ПФ), принимаемый сигнал разветвляется и по­ дается на I- и Q-смесители 1 . Синусоидальный сигнал с гетеро­ дина (Г) непосредственно подается на вход смесителя I и с фазо­ вым сдвигом+ 90° на вход смесителя Q. Сигналы звуковых час­ тот с выходов смесителей после усиления подаются на схемы преобразования Гильберта (НТN-фильтры). Когда с этих пре­ образователей два сигнала поступают на суммирующую схему L, сдвиг фаз, внесенный смесителями и фильтрами, приводит к исчезновению одной боковой полосы и увеличению мощности сигнала в другой. И наконец, демодулированный сигнал прохо­ дит через фильтр нижних частот (ФНЧ) и усиливается. Схема на рис. 5.11 является модификацией схемы на рис. 5.10, вместо схем фильтрации и суммирования используется цифро­ вой процессор сигналов. На рисунке 5.12 представлены основные элементы DSР-при­ емника. В схеме на рис. 5.12 после селекции входного сигнала I- и Q- сигналы направляются к аналого-цифровым преобразователям (АЦП)2. АЦП, которые включают схемы выборки и храненияЗ, про1 I и Q вообще используются для указания синфазных и квад­ - сдвиг по фазе на 90°) каналов соответственно. Фаза Q на+ 90°, либо на - 90°. Обозначения ратурных (квадратура отстоит от I либо 2 Аналоговый сигнал может представлять собой простую синусоидальную волну или сложную волну, состоящую из многих синусоидальных компонент. Аналоговые сигналы могут иметь любое значение между их максимальными и минимальными значениями. Типы АЦП рассматриваются в гл. 11. 3 При оцифровке изменяющегося со временем аналогового сигнала необхо­ димо хранить выборку в течение периода преобразования.
Применения микропроцессоров 101 изводят выборку аналогового сигнала с частотой, по меньшей мере в два раза превышающей наивысшую частоту входного сигнала 1 . Частота синхронизации при преобразовании зависит как от типа АЦП, так и от разрядности выходного сигнала. Ана­ логовый выходной сигнал получается с помощью цифро-анало­ гового преобразователя (ЦАП)2. Схема цифровой фильтрации обрабатывает цифровые экви­ валенты выборок, взятых через равные промежугки времени. Эти выборки представляют мгновенные значения аналогового входного сигнала. Основная идея большинства способов цифро­ вой фильтрации заключается в усреднении последовательных выборок, которые затем взвешиваютсяз для реализации требуе­ мых характеристик фильтра. Хотя этот DSР-вариант однополос­ ного демодулятора является более сложным по сравнению с его аналоговым эквивалентом, он обладает двумя важными преиму­ ществами: путем изменения программного обеспечения можно реа­ 1) лизовать демодуляцию сигналов при других способах мо­ дуляции; можно реализовать такие технические характеристики фильтров, которые либо труднодостижимы, либо вообще невозможны при использовании обычной аналоговой 2) схемы. 5.3. Потребительские системы: настольный компьютер Настольные компьютеры с высокими эксплуатационнь1ми ха­ рактеристиками, предназначенные как для домашнего исполь­ зования, так и для коммерческой деятельности, стали доступны с начала 80-х годов. 1 Это необходимо для предотвращения эффекта «Наложения спектров» (по­ явление ложных низкочастотных составляющих в спектре дискретизированно­ rо сигнала), что является некоторым видом искажения, вносимого при оциф­ ровке сигнала. 2 См. гл. 10, 3 где объясняется, что такое ЦАП. Взвещивание - это процесс умножения некоторой величины на заданный Множитель.
102 Глава5 Персональный компьютер (ПК) относится к классу на­ стольных компьютеров, разработанных фирмой IBM. За по­ следние 20 лет персональные компьютеры постоянно совер­ шенствовались, следуя за все более новыми и более совершен­ ными разработками микропроuессоров фирмы lntel. Попу­ лярность персональных компьютеров обусловлена тремя фак­ торами: 1) рекламой - как самих персональных компьютеров, так и неотделимых от них операционных систем фирмы Microsoft, 2) 3) очень широким выбором прикладных программ, архитектурой аппаратного обеспечения, мноrократно уве­ личивающей rибкость этоrо устройства общеrо назначе­ ния, что позволяет пользователю выбирать из большоrо набора модулей подходящие сменяемые схемные платы в соответствии со своими интересами и финансовыми воз­ можностями. При выборе компьютера для лаборатории прикладной электроники пункт 3 был одним из главных факторов появле­ ния у автора интереса к персональным компьютерам. К пла­ там1, непосредственно вставляемым в разъемы (слоты) мате­ ринской платы ПК, относятся проrраммируемый параллель­ ный интерфейс ввода/вывода 2 , интерфейс для подключения устройств со средней скоростью передачи данных (накопители на rибких дисках и т. д.), транспьютеры (сверхбольшие интеr­ рированные схемы, содержащие микропроцессор, средства межпроцессорной связи, собственную оперативную память и средства доступа к внешней памяти) и средства подключения к сети (сетевые платы). 5.3.1. Компьютерная система Uифровые компоненты настольных компьютеров обладают сходной структурой. Аппаратные модули компьютера располо­ жены вблизи конкретного микропроцессора и связаны с ним 1· Платы - это печатные платы, укомплектованные наборами микросхем и внешними соединителями. 2 См. гл. 9, где рассматривается параллельный интерфейс.
Применения микропроцессоров 103 Последовательный порт Клавиатура Рис. 5.13. Монитор Порт Параллельный принтера порт Порты персонального компьютера. посредством системы шин. На рисунке 5.14 показаны общие компоненты компьютерной системы, а задняя панель типично­ го ПК показана на рис. 5.13. В персональном компьютере большинство важных компо­ нентов, включая микропроцессор, ПЗУ и ОЗУ, находятся на ма­ теринской плате. Щелевые разъемы (торцевые соединители) 1 также установлены на материнской плате: они обеспечивают соединения с шиной управления, адресной шиной и шиной данных. В щелевые разъемы можно вставить самые разнообраз­ ные платы. При включении компьютер первым делом начнет считывать команды загрузки, записанные в ПЗУ. Затем он загружает в опе­ ративную память операционную систему, которая обычно хра­ нится на жестком диске. Последним шагом в процессе загрузки компьютера будет загрузка прикладной программы с жесткого, гибкого или компакт-диска (CD). Как правило, в ПК имеется, по меньшей мере, один парал­ лельный принтерный порт и один последовательный порт. Параллельный принтерный порт можно использовать для вы­ сокоскоростной передачи данных с другого компьютера. По- 1 Щелевые разъемы, используемые на материнской плате, часто называют слотами (slots).
' ·. l'Vll\Al,:H'll\AI J't-'·..., .·:_:-. 1.1 1 1 1 Сброс сброса А D ) Микропроцессорный модуль !JСхема Регистры клавиатуры с c~"""'"PJ ) Т Сброс ~ri Системный Синхронизация Адресная Шина шина данных Драйвер генератор монитора тактовых Шина импульсов управления !L- 1 АПрвсная шина JU 11 D А IГ 11 Шина.т:1нных ;>. ~ - 11 . 7 )1 А с ;>.' 7 D 1 с А Шинаvn А 7 1 с А D и/или D А А с D ОЗУ ПЗУ диск диск 7 11 ~'1 • 17 Гибкий Жесткий авления :> 7 ;>. ' CD 7 ' 1 7 А • с "'' 1 D • ,/. А Параллельныйпринтерный порт ~ ,~ ~ 1 1 7 1 7 \.. ~ с 1 с ;>. • 7 1 D А Последовательный порт " 1 ') й 1 r Рис. Принтер копии 5.14. Функциональная схема настольного компьютера. Периферийное устройство
Применения микропроцессоров 105 следовательный порт, часто называемый «СОМ-портом», ис­ пользуется для связи с периферийными устройствами 1 , на­ пример с модемом или плоттером. Можно использовать прин­ тер, принимающий данные или в последовательной 2 , или па­ раллельной формез . 1. 1.' ! ,! 1 Периферийные устройства - любые вспомогательные устройства, подсо­ единенные к компьютеру. 2 Последовательная передача данных обсуждается в гл. 3 Параллельная передача данных обсуждается в гл. 9. 8.
Глава 6 Структура программного Ьбеспечени~ 6. 1. Разработка программного обеспечения 6.2. Конструирование программ методом сверху вниз 6.3. Структурное программирование 6.4. Псевдокод 6.5. Блок-схемы В этой главе рассматриваются основные принципы создания программного обеспечения. Ее цель - дать читателю общее представление о структуре программных средств перед тем, как он приступит к работе над программным кодом. Главный «Видимый» результат какого-либо программного проекта - работающая программа, поэтому зачастую хочется немедленно приступить к написанию кода, особенно если речь идет о программах небольших размеров. К сожалению, обычно это приводит к плохо структурированным программам, с кото­ рыми довольно трудно работать. Если вы поддались искушению сразу же приступить к написанию кода (как, я думаю, делает большинство из вас), неплохо было бы вначале бросить ретро­ спективный взгляд на само проектирование. Таким образом вы можете проверить, насколько ваша программа отвечает основ­ ным принципам построения программных средств. Применяя такой подход систематически, на ранней стадии разработки программного обеспечения приходится тратить много времени. Программный код при этом появляется не так быстро, и польза от подобной методики не всегда очевидна. Од­ нако следует помнить, что различные методы построения про­ граммных средств разработаны, исходя из принципов, которые были выведены после долгого опыта успешной работы как от­ дельных программистов, так и компаний по разработке про­ граммных средств. Создание программ не является отдельным направлением в естественных науках, суть заключается в· том,
Структура программного обеспечения 107 чтобы использовать некий метод, который позволит получать хорошо написанные, «Читабельные» программы. Разработка программного обеспечения 6.1. Помимо вышесказанного, структурное программирование (вклю­ чая хорошо написанную документацию) предпочтительнее по следующим причинам: 1. Если необходима помощь при отладке программы, то го­ раздо удобнее работать со структурированной программой. 2. Большие проекты требуют включения в них объектных модулей, разрабатываемых или созданных ранее незави­ симо друг от друга, что неизбежно приводит к необходи­ мости разбиения какого-либо проекта на несколько от­ дельно взятых частей. 3. Программное обеспечение часто эксплуатируется не его создателями, а совершенно другими людьми, и им необ­ ходимо понимать структуру программы. Один из способов организации разработки программного про­ дукта заключается в том, чтобы разбить его на несколько частей, каждая из которых решает определенную задачу или представляет собой фазу развития одного и того же процесса. Следующие пять Фаза Анализ Примечание Цель состоит в том, чтобы добиться Результат Документация ясного понимания предназначения по техническим системы и концепций, требованиям лежащих в ее основе. Проектирование Определяет способ достижения требуемых характеристик. Структурная схема или программа на псевдо-языке. Реализация Кодирование проекта программы Программный код на языке программирования. Тестирование подсистем Тестирование и отладка функций Работающие функции Тестирование законченной системы в целом, а при необходимости также Работающая Отладка функций Тестирование системы Отладка Документация система аппаратных и программных средств. Рис. 6.1. Подзадачи разработки программного продукта. ' l
Главв 108 6 фаз, учитывающих требования заказчика и интересы пользовате­ ля (рис. 6.1), позволяют добиться работающей системы/проекта'. На каждой фазе решается конкретная задача. Конечный результат каждой фазы является основой для начала следующей. 6.2. Конструирование программ методом сверху вниз Смысл любого процесса типа «сверху-вниз» (или от сложного к простому) заключается в том, чтобы начать с общей идеи (или устройства), а затем последовательно разбирать ее на все мень­ шие и меньшие части. Такой подход к конструированию про­ граммы обеспечивает систематический анализ программного задания. На рисунке 6.2 ленная в виде дерева, показана структурная схема, представ­ 1 де компоненты нижнего ряда являются составными частями компонента верхнего ряда. Преобразовать температуру Выбрать Ввести Преобра- Вывести преобразование температуру зовать результат 1.i Напечатать Выбрать меню ОПЦИЮ Рис. 6.2. Вычислить Вычислить Вычислить (выразить) (выразить) (выразить) FиКдляС Си К для Си Fдля К F Структурная схема примера А. Пример А. Структурная схема температурного преобразова­ теля. Нарисовать структурную схему программы, целью которой является преобразование температур между шкалами Цельсия, Фаренгейта и Кельвина. '~ j '. 1 Под системой понимается весь комплекс предпринятых действий, вJОПОчая и взаимодействие с аппаратными средствами. - Прим. перев. 1.
1-' 1 Структура программного обеспечения 109 б.З. Структурное программирование Правила структурного программирования: 1. Модули программы должны быть не очень большими, а их назначение 2. - легким для понимания. Модули программы должны иметь лишь одну точку входа в начале каждого модуля и одну точку выхода в конце. 3. Программы должны использовать комбинации компо­ ·1. нентов только трех простых типовых конструкций: • последовательности: две операции или много опера­ ций, следующих по очереди одна за другой, ' • ' • выбора: выбор одной составной части из двух или более возможных, итерации: повтор одной или нескольких операций при определенном условии. 6.3. 1. Структурное программирование Джексона (СПД) Техника структурного программирования Джексона основана на 4-х типах компонентов, перечисленных ниже. 1. Элементарный - не имеющий никаких подразбиений на составляющие компоненты. 2. Последовательность - два или более компонентов, следу­ ющие последовательно друг за другом. 3. Выбор - один компонент, выбираемый из некоторого чис­ ла альтернатив. 4. Итерация - один компонент, повторяемый ноль раз или больше. Каждый компонент типа последовательности, выбора или итерации может быть, в свою очередь, компонентом последова­ тельности, выбора и итерации, и, таким образом, может быть сформирована структура любой степени сложности.
11 О Глава 6 Элементарный Элементарные операции включают в себя следующее: Инициализация Открыть файлы Программа, программируемые порты ввода/вывода Программное завершение Закрыть файлы Выход в систему (в операционную среду) Ввод/Вывод Ввод данных из файлов или с клавиа­ туры Вывод данных на экран или принтер Счет Арифметическая или логическая операции Последовательность На рисунке 6.3 показана некая последовательность АВС, разде­ ленная на три отдельные части. д в с 1 1 д Рис. 6.3. 1 1 в с Последовательность. Выбор Компонент выбора показывает, что можно сделать выбор лишь в том случае, если из нескольких альтернатив должен быть вы­ бран один единственный компонент. Небольшой кружок в д в с 1 1 1 д Рис. 6.4. о Выбор. в 1 о с о
Структура программного обеспечения 111 квадратах во втором ряду показывает, что АБС является компо­ н:ентом выбора, и что должен быть отобран один из трех предло­ женных компонентов (рис. 6.4.). Итерация Итерация состоит из одного компонента, который повторяется ноль раз или больше. Диаграмма (рис. 6.5) показывает процесс А с повторяющимся процессом В. Звездочка указывает на то, что процесс В должен быть повторен ноль раз или больше. А 1 * в Рис. 6.5. Итерация. Пример Б. СПД-схема. На рисунке 6.6 структурная схема примера А модифицирова­ на с тем, чтобы учесть правила структурного программирования Джексона (СПД). Применение правил приведено в таблице на рис. 6.7. . '· ,~,, ' Преобразовать температуру '· ' 1 Напечатать 1 меню 1 Выбрать *1 1Вычисли~ь ОПЦИЮ 1 1 1 Опция С ~ 0 о о Опция F Опция К 1 1 J зовать ' 1 1 о Рис. 6.6. СПД-схема. Преобра- Ввести температуру 1 о Вычислить о вычислить Вычислить и вывести и вывести и вывести Fи К для С СиКдляF СиFдляК
Глава6 112 Название Компонент Разложение на части компонента Преобразовать Последовательность температуру трех компонентов Напечатать меню Выбрать опцию Вычислить Элементарный компонент, Нет Напечатать меню вывод на экран Выбрать опцию Вычислить Выбор из трех компонентов Опция С ОпцияF Опция К Итерация и последовательность двух компонентов Ввести температуру Преобразовать Нет Ввести Элементарный компонент, температуру ввод с клавиатуры Преобразовать Выбор из трех компонентов FиКдляС СиКдляF СиFдляК Вычислить Элементарный компонент, Нет ивьmести вывод результата вычислений на экран Рис. 6.7. 6.4. Краткое изложение СПД-схемы. Псевдокод (структурированный английский) Псевдокод, иногда называемый структурированным англий­ ским, является полезным средством в процессе разработки программы и может использоваться при следующих обстоя­ тельствах: 1) как промежуточный шаг между процессами построения программы в диаграммах и на языке команд; 2) 3) непосредственно для описания алгоритма счета; в документации программы для описания ее логики с ис­ пользованием формальной записи. Перевод проекта программы, написанной в псевдокодах, на язык высокого уровня, такого как Си, является относительно про-
Структура программного обеспечения 113 стой процедурой. Соглашения, принятые в языке Си, использу­ ются в последующих компонентах. Запись не только выбора, но и итерации может зависеть от типа выражения. Операторы отношения, логические операторы и операторы побитовых операций перечисляются ниже. Все они могут применяться в выражениях. Каждый из них сравнивает величину х с величиной у, например х > у. Операторы отношения < <= => > != меньше меньше или равно больше или равно больше не равно равно Операторы побитовых операций & побитовая операция И 1 побитовая операция ИЛИ л << >> (AND) (OR) побитовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) сдвиг влево сдвиг вправо дополнение до 1 (отрицание') Логические операторы Это те операторы, результатом вычисления крторых может быть либо О (ложь), либо && И(AND) 11 ИЛИ 1 (истина): (OR) 6.4.1. Последовательность Последовательные компоненты могут представлять собой либо элементарные строки кодов, либо целые функции. Функции оп­ ределяют в начале программы, когда дают им имена. 1 - заменяет единицы на нули и наоборот.
Глава 114 6.4.2. 6 Выбор Определенный компонент выбирается из двух или более частей. Могут применяться две формы выбора: С помощью оператора 1. if else. Заметьте: e/se является нео­ бязательным параметром. if (выражение) оператор 1 else оператор 2 С помощью операторов 2. switch switch и case (выражение) { case значение case значение case значение case значение 6.4.3. 1 : оператор 1 .с,.' 2 : оператор 2 3 : оператор 3 n : оператор n Итерация Существуют две альтернативы: 1. Для неопределенного числа итераций используется опе­ ратор 1 whR• while (выражонио) оператор ] Пример итерации, которая выполняется всегда while (1) ]
Структура программного обеспечения 115 Для определенного числа итераций используется опера­ 2. тор for for (начальное значение; конечное значение+ 1; значение шага) оператор Если i - вторена 1 11 определенная переменная и итерация должна быть по­ раз от О до 1О, оператор for будет иметь следующий вид for(i=O;i<ll;i++) Пример В. Псевдокод. Данный пример является одним из вариантов псевдокода СПД-схем с рис. 6.6: main компонент print выбрать опцию input выбор С, F или К switch(выбop) { case С case F case К : CalcCon(l) : CalcCon(2) : CalcCon(З) } СаlсСоn(переменная) /* Вычислить переменную преобразования= 1, 2 или 3 */. рrint{Вычисление Fи input температура switсЬ(переменная) { case 1 case 2 case 3 К} рrint{Вычисление С и К} рrint{Вычисление С и F} } }whilе(температура !=выходная величина) 6.5. Блок-схемы Блок-схемы являются полезным вспомогательным средством дЛя описания того, как работает конкретная программа. Схема в
116 Главаб НАЧАЛО Ввод выбора С, Fили К Вычислить и напечатать F и К для С Вычислить и напечатать С и К для F Вычислить и наnеча-rа1ь С и F для К КОНЕЦ Рис. 6.8. Блок-схема примера А. виде диаграммы особенно хорошо подчеркивает логику про­ граммы, процесс счета и управления программой. Блок-схема совершенно не зависит от выбранных языков программирова­ ния, она полезна при написании программы и на машинных ко­ дах, и на языках высокого уровня. Пример Г. Блок-схема. На рисунке 6.8 показана блок-схема для примера преобразо­ вания температуры. Полный текст программы на языке Си мож­ но найти в гл. 7.
Глава 7 Программирование на языке Си 7. 1 . Введение в язык Си · 7.2. Восемь этапов программирования на языке Си·. 7.3. Создание программ на языке Си 7 .4. Отладка программы 7 .5. Примеры программ и упражнения 7 .6. Выбранные ответы Основные понятия и упражнения, изложенные в данной книге, предназначены для студентов инженерных специальностей, по­ этому язык программирования, используемый при работе над этими упражнениями, должен отвечать определенным требова­ ниям: быть пригодным для инженерного дела, общепризнан­ ным и профессиональным. Язык Си был впервые создан в Bell Laboratory в начале 70-х годов, успешно развивался в течение 80-х и на сегодняшний день стал самым распространенным язы­ ком программирования. Существует большое количество книг разного уровня сложности, посвященных этому языку, и чита­ телю отнюдь не помешало бы изучение в процессе обучения ка­ кой-либо специальной книги по данной тематике. В главе 7 приводится информация, необходимая читателю при работе над упражнениями, предлагаемыми в последующих главах. Перед началом работы необходимо сделать два важных заме­ чания, касающихся программных файлов: 1. Всегда сохраняйте исходный и исполняемый файл каждой программы, над которой вы работаете. 2. Когда у вас со временем появится большое количество программ, важно помнить, что записывать имена про­ грамм следует таким образом, чтобы по ним можно бьшо легко определить их назначение (имен программ, совпа- 1
Глава 118 7 дающих с именами пользователей, или таких как «рrоg_имя», следует избегать). Имена программ могут со- держать максимум восемь символов 7. 1. (DOS). , ,• Введение в язык Си Высокоуровневые языки, например такие, как Си, компилиру­ ют выполняемый файл, который написан в двоичных машин­ ных кодах и специально для микропроцессора, который эти ко­ ды понимает. Для того, чтобы написать программу на языке Си, вы должны обладать подходящим программным обеспечением, надлежащим образом установленным на вашем компьютере. В комплект программ обычно входят текстовый редактор, биб­ лиотечные файлы, компилятор, компоновщик, файлы помощи и примеры программ. Термин переносимость означает, что программа, написанная на одной системе, будет работать и на другой системе с таким же микропроцессором. Программы на языке Си в целом более портативны по сравнению с программами, написанными на других языках. Если изменение программ необходимо, то в ка­ чественно написанной программе достаточно будет изменить лишь несколько строчек кода в ее начале. Компиляторы языка Си, как правило, доступны на многих системах и функциони­ руют как на 8-разрядных микропроцессорах, так и на супер­ компьютерах. Язык программирования Си - это язык, ориентированный на программистов, он дает возможность обращаться непосред­ ственно (напрямую) к аппаратным средствам и позволяет рабо­ тать с отдельными битами в памяти. Он обладает большим коли­ чеством операторов, что позволяет записывать выражения в ко­ роткой форме. Такие задачи, как, например, преобразование данных из одного формата в другой, в языке Си записываются проще, чем в ряде других языков программирования. В Си так­ же имеется в наличии большая библиотека полезных функций, которые удовлетворяют потребностям широкого круга програм­ мистов. Наконец, есть возможность поработать с файлом помощи. Не­ плохо было бы заглянуть в файл помощи всякий раз, когда вы сталкиваетесь с незнакомой функцией. Файл помощи даст вам ссьшки на файлы, необходимые при работе с конкретной функ­ цией.
Программирование на языке Си 7.2. 119 Восемь этапов программирования на языке Си ;iJnaп 1. Определение цели проr:раммы (rребования пользователя) Вам необходимо сделать следующее: 1. Описать в общих чертах, что вы хотите, чтобы делала ваша программа? 2. Решить, какие начальные данные необходимы для вашей программы? 3. Точно определить все возможные операции с числами или текстом. 4. Этап Установить, какую конечную информацию вы хотели бы получить в результате работы своей программы. 2. Построение проr:раммы Используйте один из методов построения своей программы, описанный в гл. 6. Этап 3. Запись кода Здесь речь идет о процессе перевода идеи программы на язык Си. Любой текстовой редактор используется для создания того, что носит название файла исходного кода (файл, содержащий текст программы). Данный файл исполняет роль «отображе­ ния» вашей программы действий, изложенной на языке Си. Пример исходного файла приведен на листинге 7.3.1. Коммен­ тарии в нем приводятся внутри скобок /* ... */, например /* Комментарии */. Вложенные комментарии не разрешены. Все функции приводятся в начале программы (за исключением выражения main()) и являются ее частью. Все переменные дол­ жны быть задекларированы либо перед строкой main(), если nриведенные переменные доступнь1 для всех функций про­ граммы (в этом случае они называются «глобальными» пере­ менными global), либо в начале каждой функции (тогда они но­ сят название локальных переменных local). Тип данных - int (дВуХбайтовое целое число), char (символьное), float (четырех­ байтовое вещественное) и т. д. - должен быть определен зара­ l:!ее.
Глава 120 7 На этом этапе программа получает имя с расширением «.с». Например, программа, приведенная на листинге иметь название Этап 4. 7.3.1, могла бы ascii.c. Компилирование Работа компилятора заключается в переводе исходного файла в последовательность машинных двоичных кодов. Различные микропроцессоры понимают различные машинные коды, поэ­ тому компилятор должен преобразовать исходный файл в ма­ шинный язык конкретного микропроцессора. Результат работы - файл, записываемый в памяти с расширением obj, например, когда программа Ascii.c, приведенная на листин­ ге 7.3.1, преобразуется компилятором, она получит название ascii.obj. компилятора Этап 5. Компоновка (сборка) Если программа бьша скомпилирована без ошибок, то компо­ новщик создает при работе выполняемый файл. Вообще у компоновщика три назначения: 1) собрать необходимый загрузочный программный код для системы, в которой он будет исполняться, 2) собрать вместе библиотечные файлы в окончательном ва­ рианте программы, 3) собрать воедино любые другие файлы, написанные ранее (и предназначенные для данного проекта). Если все нужные файлы представлены, компоновщик со­ здаст файл с расширением .ехе (на листинге 7.3.1 это файл ascii.exe). Этап 6. Работа программы Запустить на исполнение программу можно путем простого на­ бора имени программы в командной строке (для листинга надо набрать «ascii»). 7.3.1 Для некоторых программ, например для тех, которые требуют наличия входных данных из какого-либо файла, целесообразно было бы сначала создать файл с конт­ рольными данными, предназначенными для тестирования ра­ ботающей программы.
Программирование на языке Си ;i.._man 7. 121 Тестирование и отладка программы важно убедиться в том, что программа делает именно то, что вам нужно и для чего она предназначена. Ниже приводится список контрольных вопросов: 1. Обрабатывает ли программа весь диапазон входных дан­ ных подобающим образом? 2. 3. Как реагирует программа на наличие неверных данных? Соответствует ли конечный результат работы программы ее назначению? 4. Нормально ли функционирует работающая программа в компьютере? 5. Будет ли работать программа многократно? 6. Влияет ли она на какое-либо другое программное обеспе­ чение в операционной среде, включая и саму операцион­ ную среду? Этап 8. Сохранение и изменение программы Когда программы начинают работать, часто появляется необхо­ димость провести некоторые изменения с целью решить ряд не­ ожиданно возникших проблем: 1) для устранения ошибок, появляющихся в результате вво­ да непроверенных данных, 2) для включения в программу другой функции или особен­ ности, 3) для использования программы в другой системе (напри­ мер, в другой операционной среде). Для того, чтобы программой можно было легко управлять (имеется в виду ее изменение или устранение ряда ошибок), важно, чтобы она была хорошо задокументирована (т. е. содер­ жала бы не только команды на языке Си, но и включала в себя подробные комментарии).
122 7 .З. Глава 7 Создание программ на языке Си Ознакомьтесь с листингом 1. 7.3.1. Программа начинается с комментария, вложенного в скобки /* ". */. Здесь содержится информация об имени программы, ее назначении и каких-либо других деталях, имеющих отношение к делу, например дате создания про­ граммы или имени автора. Комментарий игнорируется компилятором; его цель дать тому, кто будет ее про­ - сматривать, общее представление о программе. 2. Затем следуют заголовки внешних файлов, необходимых при работе программы. Каждому заголовку файла пред­ шествует директива #include. Все внешние файлы связаны с программой. 3. В этом простом примере далее следует функция main(). Все программы должны содержать main(); слово void впе­ реди указывает на то, что в конце функции main() не оста­ нется никаких переменных (т. е. данная функция не воз­ вратит никаких значений). 4. В следующей строке после функции main() стоит откры­ вающая фигурная скобка {. Все функции должны обладать фигурной открывающей и закрывающей скобками {}. Хорошим стилем программирования считается писать операторы языка Си, заключенные внутри фигурных скобок с отступом - это улучшает «читабельность» про­ грамм. 5. После открывающей скобки любые локальные перемен­ ные должны быть задекларированы. Локальные перемен­ ные - это те переменные, которые используются в фун­ кции, в которой они задекларированы. Следовательно, выражение int character определяет переменную целого типа, называемую символом 6. Оператор (character). printf() пересылает текст, ки, на экран. Заметьте, что значок заключенный в кавыч­ \n переводит курсор эк­ рана на новую строку. 7. Оператор getch() ожидает ввода начального значения с клавиатуры и сохраняет его в памяти под именем acter». «char-
• Программирование на языке Си Оператор 8. 123 printf() в предпоследней строке выводит текст, заключенный в кавычки, на экран, подставляет начальное значение «character» в спецификации %с и АSСП-код это­ го символа в спецификации %i. Наконец, заканчивается программа закрывающейся фигур­ 9. ной скобкой} функции main(). /*ascii.c Проrрамма вывода значения АSСП-кода введенного символа*/ #include <stdio.h> /*описание внешнего файла для оператора printf() */ void main() . { int character; printf('\n Введите символ."); character = getch(); printf("\n АSСП-код символа %с есть %i",character,character); Листинг 7 .4. 7.3.1 ascii.c. Отладка программы Отладка программы - это процесс поиска и исправления оши­ бок в программе. Существуют три главных момента, когда эти ошибки могут проявиться: 1) когда компилируется (и создается объектный файл 2) когда собирается (и создается выполняемый файл .ехе), 3) когда программа работает. мы .obj), Компилятор окажет вам помощь при компиляции програм­ (1), если вы будете читать сообщения об ошибках достаточ­ но внимательно. Есть две главные причины того, что компиля­ тор не в состоянии закончить свою работу: обнаружение либо синтаксической ошибки, либо ошибочно набранного символа при вводе. Синтаксическая ошибка появляется, если не соблюдены Правила языка Си. На рисунке 7 .1 приведен список типичных ошибок, сообще­ »ия о которых могут появиться в листинге 7.3.1. Заметьте, что Некоторые ошибки вызывают несколько сообщений.
Глава 124 7 .4.1. 7 Типичные ошибки Строка Сообщение об ошибке Ошибка или результат void main(); Точка с запятой после оператора main() Нужно объявить идентификатор in t character Нет точки с запятой после character Ошибка синтаксиса объявления переменных printf(\n Введите символ. ") Отсугствуют кавычки перед Недопустимый символ\ Неопределяемый символ 'n Введиrе• Отсутствует вызов функции ) Незаконченная строка \n Прописная С Character = getchO; Неопределенный символ в начале character. Система учитывает регистр. printf("ASCII-кoд символа % с есть i % \n, i % вмtrто % i Это приведет к ошибке при выполнении проrраммы, вместо АSСП-кода будет напечатано i % character, character); printf("ASCII-кoд сим Вторая метка вола % с есть i % \n", символа отсугствует Это приведет к ошибке при выполнении проrраммы, вместо АSСП-кода будет напечатан О character); Рис. 7.1. Типичные ошибки. Примеры программ и упражнения 7 .5. Следующий набор программ представляет множество дополни­ тельных функций и процедур. 7.5.1. Упражнение «Вывод строк, функция priпtf()» Функция printf() может быть использована как для печати строк, так и для вывода значений переменных. Листинг и экран выво­ да показаны ниже. Замечания: 1. Переменная MILES определена 2. Переменная YARDS определена 3. Переменная, названная «km», (define) как число 26. (define) как число 385. объявлена в качестве пере­ менной вещественного типа (т. е. как число с плавающей точкой). Под нее отводится 4 байта памяти.
Программирование на языке Си 4. 125 %=символ формата. 5. %f напечатает число с плавающей точкой в десятичном формате. /*string.c Вывод строк*/ #include <stdio.h> #define MILES 26 #define YARDS 385 void main() { float km; /* Объявление переменной, км */ km = 1.609*(MILES+YARDSjl760.0); /*Вычислить в км*/ printf('\n Марафон - это %fкилометров \n \n", km); Листинг 7 .5. 1. string.c. Марафон Рис. 7.2. - это Экран вывода листинга 42.185970 километров 7.5.1 Вопросы: А. В каком формате мы получим ответ, используя специфи­ кацию %е? Б. Размер поля вывода и количество цифр после десятичной точки определяются путем подстановки некоторого числа между значками % и f. Что получится в результате, если мы установим спецификацию %4.2f? 7 .5.2. Упражнение «Вывод числа байтов, зарезервированных под переменные» Эта программа использует функцию языка Си sizeof(). Цель - показать число байтов, зарезервированных под различные типы переменных. Скомпилируйте и запустите эту программу. Лис­ тинг и окно вывода приведены ниже.
1 Глава 126 /*size.c 7 Эта программа выводит число байтов, выделяемых системой под различные типы переменных */ ·, #include<stdio.h> void main() { printf("\n"); printf("HAПEЧATATЬ РАЗМЕР В БАЙТАХ\n"); printf("char %d/n'', sizeof( char) ); printf("int %d/n", sizeof(int)); printf("long %d/n", sizeof(long)); printf("float %d/n'', sizeof(float)); printf("douЫe %d/n", sizeof( douЫe)); Листинг 7 .5.2. size.c. НАПЕЧАТАТЬ РАЗМЕР В БАЙТАХ char int long float douЫe Рис. 7.3. Экран вывода листинга 1 2 4 4 8 7.5.2. ,' f ,,,..... 7.5.3. Упражнение «Преобразователь числа» Преобразовать десятичное число в шестнадцатеричное или нао­ борот. Следует сделать следующие замечания: 1. Функция scanf() обеспечивает ввод с клавиатуры. Дейст­ вие этого оператора заканчивается с вводом сигнала воз­ врата каретки (CR). Спецификация %d заставляет функ­ цию scanf() считывать десятичное число. Амперсенд (&)пе­ ред идентификатором переменной необходим при ис­ пользовании этой функции для ввода числа. 2. Спеuификация %Х вынуждает функцию scanf() считывать шестнадцатеричное число, а функция priпtf() выводит его на экран.
Программирование на языке Си 127 /* number.c Использует функцию sсапf()для ввода данных*/ #include<stdio.h> void main() { ,. int datain; рriпtf("Введите десятичное целое число"); scanf("%d» ,&datain); printf("\n%dдecятичнoe = %Х шестнадцатеричное \n\n",datain,datain); printf('\n\nBвeдитe шестнадцатеричное число"); scanf("%X",&datain); printf('\n%X шестнадцатеричное = %d десятичное \n\n" ,datain,datain); Листинг 7.5.З. number.c. Введите десятичное целое число 25 25 десятичное= 19 шестнадцатеричное Введите шестнадцатеричное число а4 А4 шестнадцатеричное= 164 десятичное Рис. 7.4. Окно вывода листинга На рисунке 7.4 7.5.3. показано окно вывода при соответствующих значениях введенных чисел: десятичное число 25 шестнадцатеричное число а4 7 .5.4. Упражнение «Очистка экрана» Часто возникает потребность во время работы программы очи­ стить экран. Этого можно достичь несколькими путями в зави­ симости от системы или версии языка Си, с которой вы работа­ ете. Ниже приведеньr три варианта очистки экрана, используйте их по очереди в предыдущей программе. 1. После директивы #include<stdio.h> вставьте директиву #include<stdlib.h> и, если нужно очистить экран, вставьте оператор system("cls"). 2. Если хотите очистить printf("\ 033 [2J"). экран, вставьте оператор
128 3. Глава 7 После директивы #include<stdio.h> вставьте новую дирек­ тиву #include<conio.h> и, если нужно очистить экран, вставьте оператор clrsrc(). 7.5.5. Упражнение «Цикл for» Это упражнение по повторению какого-либо преобразования (итерация). Такую возможность предоставляет нам цикл Окно вывода показано на рис. 7. 5, а листинг дан ниже. for. Обратите внимание на следующее: 1. В функции • идентификатор f or: i инициализирован (т. е. i получил началь­ ное значение переменной, в данном случае оно равно • максимальная величина она меньше 11; • шаг цикла установлен, в данном случае оператор начает i 1); установлена, в данном случае i++ оз- i = i + 1. Элементы программы между скобками будут выполняться вплоть до 10, включая само число 10. 2. Двойка между значками %и d обеспечивает поле вывода длиной в два разряда. /*for.c Итерация с #include<stdio. h> #include<stdlib.h> void main() использованием цикла for* / { int i; float f = 1; /* Инициализирует переменную 'f' М устанавливает ее начальное значение, равное 1*/' system(" cls"); for(i = l;i<ll;i++) /*Итерация*/ { f= f*i; printf("/n%2d факториал= %.Of',i,f); Листинг 7.5.5. for.c.
Программирование на языке Си 129 1 факториал = 1 2 факториал = 2 3 факториал = 6 4 факториал = 24 5 факториал = 120 6 факториал= 720 7 факториал = 5040 8 факториал = 40320 9 факториал = 362880 1О факториал= 3628800 Рис. 7.5. 7.5.6. Окно вывода листинга 7.5.5. Упражнение «Квадраты чисел» А. Напишите программу, которая печатает квадраты чисел ОТ 1ДО20. Б. Напишите программу, которая позволяет ввести число пи напечатать число n2 . Эта программа должна повторять процесс пять раз, прежде чем закончить свою работу. 7. 5. 7. Упражнение «Запись данных в массив» На рисунке 7.6 представлена структурная схема этого упражне­ ния. В листинге показано, как записать данные в массив. В дан­ ном случае массив называется data и обозначение [21] указыва­ ет на то, что 20 целых чисел могут быть сохранены в памяти от местоположения data[O] до data[l9]. Позиция под номером [20] зарезервирована для символа конца массива, который простав­ ляется там автоматически. Отметьте следующее: 1) %х указывает на ввод или печать числа в шестнадцатерич­ ном формате, 2) \t означает табуляцию, Запись данных Напечатать команды Ввести и записать данные * Напечатать записанные данные Рис. 7.6. Структурнаясхемадлялистинга 7.5.7. *
Глава 130 3) 7 необходимо очистить входной буфер с помощью функции ffiush(), иначе функция scanfO будет неправильно воспри­ нимать введенное число, если оно не шестнадцатеричное. /*store.c Записать данные в массив*/ #include<stdio.h> #include<stdlib.h> void main() { int i; int data[21]; /*Объявить массив, который может вместить 20 целых чисел в ячейках памяти от О до 19 */ system("cls"); printf("\n Введите 20 шестнадцатеричных чисел, нажимайте <Enter> после каждого введенного числа\n\n"); for(i = O;i < 20; i++) { printf("%2d" ,i+ 1); /*Напечатать данные под номерами от 1до20 */ scanf("%X"&data[i]); /*Записать данные под номером i */ ffiush(stdin); /*Освободить входной буфер*/ } printf("\n\n\n Ввод данных завершен\n"); or(i = О; i < 20; i++) /* Повторное чтение данных*/ printf("\n%d\t%x" ,i + l,data[i]); Листинг 7.5.7. store.c. 7.5.8. Упражнение «Изменения в упражнении 7.5.7» А. Измените программу с учетом ввода чисел и их печати в десятичном виде. Б. Найдите разницу между использованием спецификаций %х и %Х в функции printf().
Программирование на языке Си 7.5.9. 131 Упражнение «Запись данных на диск» На рисунке 7. 7 приведена структурная схема для этого упражне­ аия. Отметьте следующие моменты: 1. Этот листинг разбит на функции: main(), Dataln() и DiscStore(). 2. При написании базовых функций языка Си всегда ис­ пользуются строчные буквы. Соглашение об использова­ нии как строчных, так и прописных букв при написании имен функций программы удобно с точки зрения повы­ шения «читабельности» программы (по имени функции можно судить о ее предназначении). Это также гарантиру­ ет отсутствие конфликтов между выбранными именами функций и ключевыми словами языка Си. 3. Изменение числа TOTAL в начале программы необходи­ мо для того, чтобы изменить число вводимых байтов. 4. Идентификатор filename - функции поэтому ее нужно передать другим функ­ mainO, это локальная переменная циям, чтобы они могли с ней работать. 5. Эта программа использует условный оператор в форме функции 6. if(). Когда файл открывается, автоматически появляется некое число, называемое handle. В данном случае это число будет записано под именем переменной fd. Данное число всегда Записать данные на диск ;· Напечатать команды, ввести имя файла * Ввести и записать Записать данные на диск данные в массив Открыть файл Записать данные в файл Подтверждение о записи данных в Файл Рис. 7.7. Структурная схема листинга 7.5.9. Сообщение 0 об ошибке
132 Глава /*discstor.c 7 Ввести данные в массив, назвать файл, открыть его на ди­ ске и записать данные на диск #include<stdio.h> #include<dos.h> #include<io.h> #include<sys\stat.h> #define ТОТAL 20 /* */ Определить функцию открытия /*Определить /* */ S_IWRITE */ Изменить число байтов путем изменения числа после ТОТAL */ /* Определить глобальный массив */ char data[TOTAL+ 1]; /* Определить функции */ void Dataln(char[l4]); void DiscStore(char[l4]); void main() { char filename[l4]; /*Записывает имя файла*/ data[TOTAL + 1) ='/О'; printf("\nBвoд данных и их запись в массив\n"); Dataln(filename) DiscStore(filename) /* Вызывает Dataln и передает имя файла*/ /* Вызывает DiscStore и передает имя файла*/ void Dataln( char filename[ 14]) { int i; system("cls"); printf("\n Введите %i два шестнадцатеричных числа\n\n" ,TOTAL); for(i =О; i < TOTAL; i++) /*Итерация*/ { printf("%2d",i + 1); scanf("%X" ,&data[i]); ffiush(stdin); printf("\n\nBвeдитe имя дискового файла"); " , ,. scanf("%s" ,filename ); void DiscStore( char filename[ 14 ]) { int fd,bytes =О; fd = creat(filename,S_IWRITE); Листинг 7.5.9. discstor.c. /*Создать или открыть файл*/
Программирование на языке Си if(fd = = -1) 133 /*Выбор*/ printf("\nHeльзя создать файл: else bytes = write(fd,data,TOTAL); %s",filename); /*Записать в файл данных fd из массива TOTAL байтов */ if(bytes = = -1) printf("Hикaкиe байты не пишутся в файл: %s'',filename); else printf("\n %d записано в close(fd); Листинг файл: %s",bytes,filename); 7.5.9. (Продолжение) используется, когда происходит обращение к файлу. Если оно равно -1, то это будет означать появление ошибки, по­ этому в программе оно сравнивается с метьте, что если вы напишете (fd = -1), чать, что вы присвоили переменной 7.5.1 О. -1 (fd == -1). За­ то это будет озна­ fd значение -1. Упражнение «Тестирование упражнения 7.5.9» А. Проверьте, правильно ли записаны данные в дисковом файле. 1. 2. Запустите программу. Введите последовательность шестнадцатеричных чисел, представляющих «читабельные», легко узнаваемые 4е 4f 51 52 53 54 АSСП-коды, такие как: 41 42 43 44 45 46 47 48 49 3. Воспользуйтесь командой 4а 4Ь 4с 4d DOS typefilename для показа со­ держимого файла. Если бьmи использованы данные, по­ казанные выше, то вы должны увидеть на экране следую­ щее: ABCD EFG HIJKLMN О PQ RST Б. Используйте диск только для чтения с целью получения сообщения об ошибке «Нельзя создать файл»
134 Глава 7.5.11. 7 Упражнение «Загрузка данных с дискового файла» На рисунке 7. 8 приведена структурная схема ддя данного лис­ тинга. Отметьте следующее: 1. 2. Функция DiscLoad() возвращает действительное число байтов, загруженных в память. Только одна переменная может быть возвращена из функции. Сначала должна быть исполнена программа discstor с тем, чтобы появился файл, открытый ддя чтения. 3. 4. В строке read() число байтов в файле впервые определяет­ ся при помощи функции filelength(). Когда печатаются данные, любые двоичные числа с еди­ ницей в самом старшем разряде должны принимать отри­ цательные значения. Для того, чтобы сохранить отрица­ тельный знак, все свободные разряды в левой стороне за­ полняются единицами, и поэтому будут напечатаны с пре­ обладанием символов FF. '·.· / Загрузить ,, данные с диска Напечатать Загрузить данные команды, из дискового ввести имя файла файла ·- Открыть файл Напечатать данные Прочитать данные из файла 1 Подтвердить О чтение данных из файла Сообщение О об ошибке ,-, Рис. 7.8. Структурная схема для листинга 7.5.11.
135 Программирование на языке Си /*discload.c Загрузить данные с дискового файла */ /*Требуется мя функций printf() и scanf() */ #include<stdio.h> /*Требуется мя функции system()*/ #include<stdlib.h> /*Требуется мя функций open() и read()* / #include<io.h> /*Чтобы определить S_IREAD */ #include<sys\stat.h> int DiscLoad(char[14]); /*Объявление функций*/ void PrintData(int); char data[ 100]; /* Массив байтов */ void main() { int bytes,i; cl1ar filename[ 14]; system("cls"); printf("\nЗaгpyзитe данные с дискового файла\n"); printf("\nBвeдитe название дискового файла>"); scanf( «%s» ,filename ); bytes = DoscLoad(filename); PrintData(bytes); /*Вызов функции DistlrЬad"() _,' : */ '; int DiscLoad( char filename[ 14]) { int fd,bytes = О; fd = open(filename,S_IREAD); if(fd = = -1) printf("\nHeльзя открыть файл: %s\n",filenarne); else { read(fd,data,(bytes = filelength(fd)) ); printf("\n%d байтов загружено из %s\n", bytes filename); } )\;! -, "., , close(fd); return bytes; · ·· /* Число прочитанных байтов из файла будеТ передано обратно в главную программу*/ void PrintData(int bytes) { int i; for(i =О; i < bytes; i++) /*Напечатать данные*/ printf("\n%2d %4Х", i + l ,data[i]); Листинг 7 .5.11. discload.c.
136 Глава 7.5.12. 7 Упражнение «Альтернативная загрузка данных с дискового файла» Ниже приводится альтернативный листинг загрузки данных с дискового файла, в котором используется ввод из командной строки. Заметьте следующее: 1. Аргументы командной строки - int argc и char *argv[] позволяют воспринимать данные, которые требует про­ грамма, при помощи последовательности строк символов, разделенных пробелами, вслед за именем самой програм­ мы. argc записывает число строк, название программы идет в первой строке. *argv - указатель адреса массива. Таблица, приведенная на рисунке 7.9 и создаваемая в про­ цессе работы программы, содержит адрес каждой команд­ ной строки. Каждая строка затем последовательно запи­ сывается в память. 2. argv[l], адрес имени дискового файла, передается ции DiscLoad() из главной программы main(). функ­ Пример А. int argc и char *argv[]. Если в каталоге EXERCISE программа выполняется путем ввода из командной строки discld2 <datafile>, то программа создает таблицу, такую как на рис. 7.9, в которой приведены адреса каждой строки. Затем появляется следующая таблица (рис. 7.10), в которой записываются эти строки. Адрес Содержимое FFD6 FFD8 FFFFЗ FFDC Рис. 7.9. Строкиа,zфесовко­ мандной строки. Массив строк argv[] Адрес Строка [О] FFDC c:\exerc1se\d1skld2.exe Рис. [1] FFFЗ data.file ненflые в адресах, данных в 7 .1 О. Строки, сохра­ таблице рис. 7.9.
Программирование на языке Си 137 /*discld2.c Загрузить данные с дискового файла. Ввести имя файла с командной строки */ #include<stdio.h> /* Требуется для функций printf() и scanf() */ #include<stdlib.h> /*Требуется для system()* / /*Требуется для функций open() и read()*/ #include<io.h> /*Чтобы определить S_IREAD */ #include<sys\stat.h> /* Объявление функций */ int DiscLoad( char filename[ 14]) ; void PrintData(int); char data[IOO]; /* Массив байтов */ void main(int argc, char *argv[]) { int bytes,i; if(argc < 2) /*Убедиться в том, что имя дискового файла было введено */ printf("\nBвeдme имя файла после discld2 \n"); exit(l); . 1, system("cls"); printf("\nЗaгpyзитe данные с дискового файла bytes = DiscLoad(argv[l]); PrintData(bytes); /*Вызов функции \n"); DiscLoad() */ int DiscLoad(char filename[l4]) { int fd,bytes = О; fd = open(filename,S_IREAD); if(fd = = -1) ' printf("\n Нельзя открыть файл: %s\n",fllename); else i: read(fd,data(bytes = filelength(fd))); . , ' printf("\n%d байтов загружено из %s\n",Ьytes,filenam~); close(fd); Листинг 7 .5.12. discld2.c.
Глава 138 7 /* Число прочитанных байтов из return bytes; файла будет передано обратно в главную программу */ void PrintData(mt bytes) { ' .J int i; for(i = О; i < bytes; i++) /* Напечатать даннЬl~ • /,, . printf("\n%2d %4Х", i + l,data[i)); Листинг 7.5.13. 7 .5.12. (Продолжение) Упражнение «Преобразование температуры» Одним из способов представления пользователям возможно­ сти выбрать какой-либо из нескольких вариантов является ме­ ню. Следующая программа демонстрирует этот способ органи­ зации интерактивного взаимодействия пользователя и маши­ ны. Листинг для этого упражнения можно найти на структур­ ной схеме рис. 6.6, но чтобы не искать эту схему в книге, мы Преобразовать 1 температуру ' ~: 1 1 Напечатать Выбрать* меню опцию 1 1 с Опция С 1 Вычисли~ь fi; _ t '< 1 1 Опция Fcll Опция К с' 1 Ввести температуру Преобразовать' 1 1 Рис. 7.11. ВычислитьС ВычислитьС ВычислитьС и вывести и вывести и вывести Fи К для С Си К для СиFдляК Повторение СПД-схемы, приведенной в гл. 6. F
Программирование на языке Си для удобства повторяем ее снова (рис. 7.11). 139 Отметьте для себя следующее: 1. Остановимся на операторе menu=toupper(getch()). Про­ грамма сначала жцет ввода символа с клавиатуры, и если он не с верхнего регистра, то введенный символ будет пе- /*tempconv.c Преобразователь шкал температур */ #include < stdio.h> /* Требуется для функции getch() */ /* Требуется для строковой функции #include < string.h> toupper() */ /* Преобразовать С в F и К */ void Celsius(float); /* Преобразовать F в С и К*/ void Fahrenheit(float); /* Преобразовать К в С и F */ void Kelvin(float); int CalcTemp(char); void main() . { char menu = 'Х'; system("cls"); /*Напечатать меню .......................................................................... */ printf("\n\n\n\n Преобразование Шкал Температур\n\n"); printf("\n Введите С для F и К"); printf("\n F для С и К"); printf("\n К для К и F"); printf("\n Q для выхода \n"); /* Выбрать опцию ............................................................................. */ while(menu ! ='С' & menu ! = 'F' & menu ! = 'К' /* Итерация до выбора С, F или К */ menu = toupper(getch()); /* Получает символ с клавиатуры и переводит его на верхний регистр, если это необходимо if(menu = ='Q') exit(l ); Листинг7.5.13. tempconv.c. */
Глава? 140 while(CalcTemp(menu) = = !); int CalcTemp( char menu) { float temp; int r = 1; system(" cls"); printf(''\nBвeдитe %с температуру и нажмите scanf("%f' ,&temp); switch(menu) <Enter> ... ",menu); " /* Выбрать функцию */ { case 'С' case 'F' case 'К' : Celsius(temp); break; : Fahrenheit(temp); break; : Kelvin(temp); ' ' ! printf("\n\n Нажмите Q для выхода или любую другую клавишу для продолжения \n"); if(toupper(getchO) = = 'Q') r= О; return r; void Celsius(float temp) { printf("\n\n %.2foC = %.2foF и %.2fК\n",temp, temp*9/5 + 32,temp + 273); ,. J , ' ~ -_ } void Fahrenheit(float temp) { //"Пустая" функция void Kelvin(float temp) { //"Пустая" функция Листинг 7 .5. 13. (Продолжение) t,, .•
Программирование на языке Си 141 реведен на верхний регистр и затем записан в качестве пе­ ременной меню. Функции switch(), case и break используются вместе для выбора некоторого действия в зависимости от символа, приведенного в меню. Команда break выполняется после каждого выбора за исключением последнего, в противном случае все выбранные опции будут задействованы в конце функции switch(). Функции Kelvin() и Fahrenheit() в данном листинге явля­ ются «пустыми» функциями, удобными для тестирования меню с большим количеством опций. Отладку такой про­ граммы делать легче: можно написать одну функцию и тут же ее проверить, а остальные сделать «пустыми», т. е. про­ сто не определять их. <1. 11 - альтернативный способ задания комментария на од­ ной строке. 7 .5. 14. Упражнение «Определение функций» Напишите функции 7.6. 1. Fahrenheit() и Выбранные ответы Ответ 7.5.1 А. Марафон равен 4.218597е 2. Ответ + 01 километров. 7.5.1 Б. Марафон равен 3. Kelvin(). Ответ7.5.6 А. Листинг 7.6.1 42.19 километров.
142 Глава 7 /* square5.c выдает квадраты пяти чисел */ #include < stdio.h> void main() { int number, si; printf("\03 3[2J"); for(i = 1; i < 6; i++) { printf("Bвeдитe целое число< 180"); scanf("%d" ,&number); printf("\n Квадрат %3d = %3d\n\n", numb~,:;"~~ber*nuniber); Листинг 7 .6.1. square5.c. ; )·.~'·.;! J' '1 •. ,,
з Упражнения по интерфейсу Глава 8 ·)<''i . Последовательный и·н+ерфейс ' .. j:. '. 8. 1 . Последовательная передача .q.анных 8.2. Аппаратные средства ; . ~ последовательного интерфейса ' 8.3. 8.4. ; ; ·~, • i Упражнения Вопросы ВНИМАНИЕ! Все последующие главы этой книги содержат прак­ тические упражнения, включающие в себя процедуру подключения к компьютеру внешних устройств. Крайне важно, чтобы соедине­ ния компьютера с любыми схемами были предварительно провере­ ны компетентным лицом. Информация и соединительные схемы в книге изложены автором вполне добросовестно, но он не может быть ответственным за уmерб, причиненный оборудованию и, хотя это крайне маловероятно, за уmерб здоровью любому лицу, выпол­ няющему данные упражнения. Эта глава знакомит читателя с последовательной передачей данных, в ней приводятся простые упражнения по использова­ нию СОМ-портов. В. 1 . Последовательная передача данных При последовательной передаче данных биты, образующие коды символов, пересылаются по очереди один за другим по единственному проводнику, возвратным проводом является земля. Персональные компьютеры (ПК) часто имеют два ком­ муникационных порта (обычно называемых СОМ-портами). Именно эти порты используются для асинхронной последова-
Глава 144 8 ASCll-кoд Символ Бит четности А о а 1 в о ь с 1 1 с о 100 0001 110 0001 100 0010 110 0010 100 0011 110 0011 Рис. 8. 1 • АSСП~код с контролем четно­ сти единиц. тельной передачи данных путем посылки и получения АSСП­ кода. Этот протокол передачи данных известен как стандарт RS232Cl. На рисунке 8.2 показано, как выглядит передаваемый сигнал при пересьmке символа «R». Каждому символу предшествует стартовый бит (логический О), и передача символа заканчивает­ ся стоповым битом (логическая 1). Может также использоваться контрольный бит четности 2 , который передается перед стопо­ вым битом. Длина стопового битаз может составлять 1, 1.5 или 2 обычных бита. Число изменений состояния канала передачи данных в се­ кунду называется скоростью передачи в бодах. В системе с дву­ мя возможными состояниями скорость передачи в бодах равна числу битов, передаваемых за секунду (бит/с). При пересылке данных меЖду компьютерами (или между компьютером и периферийным устройством) оба компьютера должны работать в одном и том же режиме4 так, чтобы во время 1 Несмотря на то, что термин RS232 все еще в обиходе, на самом деле он был заменен в 1987 году на термин EIA-232-D. Здесь ЕIАявляется аббревиатурой от Electronic Industries Association (Ассоциация электронной иНдустрии) (USA). D-версия данного протокола ставит эту спецификацию в один ряд с протокола­ ми ССIТТ V.24, V.28 и IS021 l0. 2 Добавление бита четности является простым методом обнаружения оши­ бок при передаче данных. Один дополнительный разряд прибавляется для того, чтобы можно было сделать четным или нечетным полное количество единИl! или нулей в передаваемой последовательности битов (см. рис. 8.1). Одна ошиб­ ка изменит число единиц или нулей с четного числа на нечетное или наоборот, и таким образом ощибка будет обнаружена. 3 Стоповый бит переменной длины бьш необходим для работы с некоторы­ ми сравнительно медленными механическими системами. 4 Режим - это термин, используемый для указания способа программиро­ вания: схемы приемника/передатчика.
Последовательный интерфейс Номер бита Старто- О 2 3 Битовая 0 0 о о вый бит последовательность +10 в Бит четности Стоповый бит 1 1 R СМР о -10 6 о ASCll-кoд для 1 1 5 4 145 о о о о 1 1 в <J Рис. 8.2. Сигнал стандарта RS232 при передаче символа «R», передачи какого-либо символа тактовый генератор на принима­ ющем компьютере работал на той же частоте, что и на передаю­ щем компьютере. Такая система является асинхронной, так как минимальное число символов, передаваемых в секунду, опреде­ ляется скоростью работы передатчика, т. е. передатчик может сделать паузу любой длительности между символами. Во время любых пауз линия находится в состоянии логической 11, поэто­ му естественно в качестве стартового бита при передаче исполь­ зовать логический О. Один из наиболее распространенных способов пересылки би­ тов в системе асинхронной передачи данных показан на рис. 8.2. Здесь логический О представлен уровнем напряжения, превыша­ ющим +З В (обычно +10 В), алогическая 1 - уровнем напряже­ ния, меньшим -3 В (обычно -10 В). Нулевое напряжение указы- < А>< а ><В>< Ь ><С>< с > 110100010101000011111111100100001011100100011110110000111011000110111111 Рис. 8.3. Передача строки символов. 1 Это состояние известно как «состояние покоя». Логические состояния Можно указывать и в терминах телетайпной связи, т. е. логическая 1 = mark (то­ I<овая посылка) и логический О = space (короткая пауза).
Глава 146 8 mode СОМ.)117'ud,plrity,da\st~bits,~ Номер порта 1, 2, з или 4___./' ) "Последовательный порт Скорость передачи данных 600, 1200, 2400 и т.д. 1 или 2 стоповых бита 7 или В битов данных N - без бита четности, Е - проверка на четность, - проверка на нечетность О Пример Рис. Напечатайте> mode com1:9600,n,8,1,р. 8.4. Режям командной строки MS-DOS. вает на неработающую систему или разрыв на линии. Символ в 7-разрядной системе АSСП-кода есть 1010010 (52 «R» в шестнадца­ теричной системе). СМР кода, перед которым находится логиче­ ский О (стартовый бит), посьmается первым. Битовая последова­ тельность заканчивается необязательным битом четности и, на­ конец, стоповым битом. На рисунке 8.3 показан код для некото­ рой строки последовательных символов. Режим работы ИС приемника/передатчика может быть запрограммирован путем использования: 1) пакета программ; 2) режима командной строки 3) некоторой команды в Си-программе. 8.2. MS-DOS (рис. 8.4); Аппаратные средства последовательного интерфейса Специальные ИС, называемые универсальными асинхронными приемопередатчиками (universal asynchronous receiver\transmitters - UART)l, преобразуют данные из параллельного (ТТЛ) формата, получаемого от шины данных микропроцессора, в последовательный (RS232). Эти устройства можно рассматри­ вать как устройства с двумя внутренними секциями: преобра­ зователем параллельного формата в последовательный, назы­ ваемым передатчиком, и преобразователем последовательно- 1 Эти ИС называют также асинхронными коммуникационными адаптерам!I или асинхронными коммуникационными элементами.
Последовательный интерфейс 147 го формата в параллельный, называемым приемником. Пере­ датчик подставляет бит четности, стартовый и стоповый биты. Приемник проверяет формат и четность полученных данных. Приемник и передатчик могут работать одновременно, такой способ передачи называются «полным дуплексом» 1 . Скорости передачи и приема данных контролируются внут­ ренним или внешним генератором тактовых импульсов, работа­ ющим на частоте, кратной скорости передачи данных. Внутрен­ ний регистр состояния, который хранит «флажки» состояний приема, передачи и ошибок, может быть прочитан программ­ ным способом. Стандартным соединителем является 25-штырьковый разъем D-типа (штепсельная часть). Однако в некоторых случаях при­ меняется 9-штырьковый разъем, который пригоден для соеди- n-~-экран Передаваемые данные (дополнительный канал)-+.-<) Синхронизация передатчика ---u Принимаемые данные (дополнительный канал) ---о Синхронизация приемника -+.-0' Локальная петлевая конфигурация -+.-о Запрос передатчика -+.-с (дополнительный канал) Готовность терминала (Выход) --НН)2() Указатель качества/ Удаленная петлевая конфигурация --N-Cl2 o---t-- Передаваемые данные (Выход) ~--t--Принимаемые данные (Вход) о-~-Запрос передатчика (Выход) n-......i-Cбpoc передатчика (Вход) n--8-1-Готовность модема (Вход) ~--t-- «Земля• сигнала 8 о--+-t--Указатель несущей 9 O-+-ir-- Зарезервировано для тестирования Указатель вызовов --+11н:122 Переключатель скорости передачи данных --N-Cl23 Синхронизация передатчика ---<ll4 Режим тестирования --+-1-c12:s Зарезервировано для тестирования 11 о-++--Без назначения несущей 12 n-~-Указатель (дополнительный канал) 13,o-+-ir--Cбpoc передатчика (дополнительный канал) Рис. 1 8.5. Назначение контактов СОМ-порта. Передача только в одном направлении называется симплексной связью. Передача в обоих направлениях, но не в одно и то же время, называется полудуп­ лексной связью.
Глава 148 8 1 0--------0 1 Экран Передаваемые данные Принимаемые данные Запрос переда,тчика Сброс передатчика Готовность модема 07 --~ 8 ----~ 20 Рис. «Земr~я» сиrнапа Указатель несущей Готовность терминала 8.6. Линии интерфейса RS232. нения наиболее часто используемых управляющих линий. На­ значение выводов 25-штырькового разъема показано на рисун­ ке 8.5. Наиболее часто используемые выводы отмечены на ри­ сунке полужирным шрифтом. Многие соединительные кабели требуют того, чтобы вы­ вод 2 был взаимозаменяем с выводом 3, а вывод 4 - с выводом 5. На рисунке 8.6 показана внутренняя конфигурация типично­ го кабеля. Как правило, производители периферийных уст­ ройств либо указывают для них разводку контактов соедини­ тельного кабеля, либо предоставляют покупателю подходя­ щий кабель. 8.3. Упражнения В начале работы следует проверить адрес последовательного порта используемого компьютера. Типичные адреса СОМ-пор­ тов ПК для пересылки и получения данных приведены ниже: 1 последовательный порт: ЗF8 hex 2 последовательный порт: 2F8 hex 8.3.1. Упражнение «Тестирование петлевой конфигурации>> Необходимо отослать некий символ с вывода «ПередаваемЬiе данные» (вывод 2) данные» (вывод 3) того же порта. Для этого теста нужен лишь и получить его на выводе «Принимаемьrе
Последовательный интерфейс Рис. Оборудование для упражнения 8.7. 149 8.3.1. один компьютер. Вывод выводом 2 «Передаваемые данные» соединен 3 «Принимаемые данные» того же самого порта. с Существует несколько наборов соединений, поставляемых производителями оборудования. Один из них приведен на рис. 8.7, и вместе с 25-жильным кабелем он подходит для уп­ ражнений как в этой главе, так и в гл. 12. Структурная схема программного обеспечения к этому уп­ ражнению показана на рис. 8.8. Тестировать последовательный порт Напечатать меню Получить или * отослать символ Ввести символ,Q Напечатать отослать его символ, к порту полученный из порта о Выйти из программы о и возвратиться в систему Рис. 8.8. Структурная схема к упражнению 8.3.1. /*seriall .c Тестирование последовательного порта*/ #include<stdio.h> #include<conio.h> int Address = Ox3f8; /*Адрес порта СОМ 1, заменить на Ox2f8, используется порт СОМ2 */ Void main() { .1'11tстинг8.З.1. seria\1.c. если
150 Глава 8 printf("\033[2J"); /* Очистка экрана*/ printf("\n Передача данных через последовательный printf("\n R для получения данных"); printf("\n S для отсьшки данных»); printf("\n Q для выхода из программы\n"); while (1) { switch(toupper(getch())) case 'S': printf("\n порт"); Введите символ с клШJиатуры для его пересылки"); outp(Address,getch()); printf("\nS, R, Q?"); break; printf("\n Полученный символ> printf("\nS, R, Q?"); break; exit(l); case'R': case 'Q': . %с" ,iвp(Address)); } ffiush(stdin); . Листинг '·. 8.3.1. (Продолжение) t Тестирование 1. 2. 3. 8.3. 1. Соедините выводы 2 и 3 СОМ-порта. S, а затем введите Нажмите на клавиатуре Нажмите R: тот же самый символ. символ должен быть получен rra экране. 4. Отсоедините выводы 2 и 3. При нажатии R на экране дол­ жен быть получен другой символ. 8.3.2. Упражнение «Исследование сигналов СОМ-порта» Для выполнения этого упражнения потребуется запоминаюшf!й осциллограф. Выполните следующее: ·
Последовательный интерфейс 1. Соедините вход запоминающего осциллографа с линией контакт том 2. 151 2 - контакт 3, 7 СОМ-порта. а «землю» осциллографа с контак­ Установите осциллограф в режиме ждущей развертки, за­ пускаемой при отсылке символа с клавиатуры. Вход дол­ жен быть установлен на прием сигнала постоянного тока; чувствительность 3. на деление. Используйте программу, разработанную для упражне­ ния 4. - 5В 8.3.1, чтобы вывести символ. Отрегулируйте развертку осциллографа таким образом, чтобы символ из 1О битов был виден целиком. Параметры установки горизонтальной развертки будут зависеть от скорости передачи данных в бодах. 5. Скопируйте не менее шести разверток сигналов строчных и прописных символов. Используйте различные скорости передачи данных, биты данных, стоповые биты и биты четности. 6. Отметьте уровни напряжений, соответствующие сигналам логической 1 и логического О. 7. Измерьте период для каждого бита и для символа. Соотне­ сите это со скоростью передачи данных, измеряемой в бо­ дах. 8. Переведите формы сигнала на двоичный «язык» и пока­ жите, что они являются прообразами АSСП-кодов нажа­ тых клавиш. 8.3.3. Упражнение «Связь между двумя компьютерами» Цель данного упражнения - пересылка символов между двумя компьютерами. Таким образом, для выполнения упражнения нужен второй компьютер. Соедините СОМ-порты двух компь­ ютеров друг с другом, как показано на рис. 8.9. Вывод 2 одного 3 другого. компьютера должен быть соединен с выводом 1. Убедитесь в том, что оба компьютера работают в одном и том же режиме. 2. Запустите программу к упражнению ютерах. 8.3.1 на обоих компь­
152 Глава 8 8.9. 8.3.3. Рис. ния 3. Соединения для упражне­ Отошлите символ с одного компьютера и получите его на другом. Система должна одинаково работать в обоих на­ правлениях (полудуплекс). 4. Используйте режим командной строки MS-DOS для изме­ нения режима работы на обоих компьютерах. Выясните, что произойдет в том случае, когда компьютеры будут ра­ ботать с разными скоростями передачи данных или будут передавать символы с разным количеством разрядов дан­ ных. 8.3.4. Упражнение «Передача текста» Разработайте программу (листинг 8.3.1) так, чтобы можно было передать по линии связи строку из 20 символов. Главная проблема при пересылке текста через СОМ-порт заключается в том, что необходимо указать передающему компьютеру ин­ формацию о том, что отосланный им символ принят и прочи­ тан. Это достигается квитированием установления связи по управляющим линиями или, если желательно сохранить трех­ проводную систему, приемник может послать сигнал под­ тверждения приема, когда символ будет прочитан. Альтерна­ тивным способом может быть пересылка текста в виде пакета с предварительно согласованным числом символов из файла. 8.4. 1. 2. Вопросы Почему каждому символу предшествует стартовый бит? Приведите два важных преимущества использования напряжений противоположной полярности для переда­ чи логических состояний, а не обычных ТТЛ-уровней 5 и о в. 3. Какое логическое состояние передается между символами? ,.
Последовательный интерфейс 4. 153 За какое время будет передан 7-разрядный символ с до­ полнительным битом четности при скорости передачи 1000 бод? 5. Каким образом принимающее устройство узнает о том, что передающее устройство не подключено, если исполь­ зуется трехпроводная система, в которой соединены вы­ воды 2, 3 и 7? ,, '
Глава 9 Параллельный интерфейс 9. 1. ИС 9.2. Упражнения с шаговым двигателем lntel 82С55А PPI При выполнении упражнений, приведенных ниже в главах 10 и 11, 9, используется плата в ПК, содержащая ИС программи­ руемого параллельного интерфейса (pгogrammaЫe parallel interface - PPI) Intel 8255. Информация, касающаяся работы ИС 8255 PPI, получена из сопроводительной документации к этой микросхеме и печатается здесь по разрешению фирмы Intel Corporation (UK) Ltd. Аппаратные средства, используемые в этих упражнениях, описаны в гл. 14. Блок светодиодов показан на рис. 9.16 в конце этой главы. Параллельная передача данных - это такая система переда­ чи, в которой каждый бит двоичного слова передается по своему собственному проводу (одиночной линии). Таким образом, для передачи 16-разрядных слов потребуется 16 проводников. Один дополнительный провод необходим в качестве общего провода, или провода заземления. В некоторых кабелях с целью уменьше­ ния интерференции импульсов, проходящих по соседним про­ водам, каждый провод образует скрученную пару с проводом за­ земления. 9. 1. ИС lntel 82С55А PPI Платы с ИС 8255 PPI выпускаются несколькими производите­ лями. Такая плата является ценным дополнением к персональ­ ному компьютеру, используемому для сопряжения различных устройств с ПК, так как она значительно проще в использова­ нии по сравнению с последовательным (СОМ) портом и облада­ ет значительно большими возможностями по сравнению с па­ раллельным принтерным портом.
Параллельный интерфейс Порт Адрес Адрес (hex) (hex) Пример А 300 в 301 с 302 Управление 303 155 Реальный К сожалению, для РРI-плат нет стандарта, определяющего все соединения и адреса, поэтому и назначение контактов, и ад­ реса приведены только в качестве примера. Свободные проме­ жутки в таблицах на рис. 9.1 и рис. 9.2 предназначены для адре­ сов и номеров контактов конкретной платы пользователя, и их следует заполнить самостоятельно. Соответствующая информа­ ция приводится производителем платы в сопроводительной до­ кументации. Адреса, указанные в программах, также носят лишь иллюстративный характер и, возможно, их нужно будет изменить. Для программируемого параллельного интерфейса требуется последовательность из четырех адресов. Самый млад~~<<<<~~:::::m:;;:~::,;:::;:;;::;;:~:,:,:,:,~:;:,;:m~~;;::~ Номер разряда 7 6 5 4 3 2 1 о Порт А 30 31 32 33 34 35 36 37 3 4 5 6 7 8 9 10 22 23 24 25 26 27 28 29 Пример Реальный 1 Порт В Пример Реальный 1 Порт С Пример Реальный Земля Пример Реальный 21 CJ ~w::,,.,,.,,.,.,.,,.,,.,;:.:~~.,.~=·>»=·=·=·=-' Рис. 9.2. Типичная разводка контактов РРl-платы.
156 Глава 9 ший адрес называется базовым адресом (Ьаsе). На остальные три адреса ссьmаются как на base +1, base +2 и base +3. Обычно на самой плате предусмотрена некоторая форма выбора адреса. Следует позаботиться лишь о том, чтобы выбранный адрес не был задействован другим приложением, например сетевым ин­ терфейсом. Рассматриваемая ИС PPI имеет три 8-разрядных порта, ко­ торые могут быть сконфигурированы несколькими способами, описываемыми ниже. СуШествует три режима работы (режим О, режим 1 и режим Записанное в управляющем регистре 3). PPI 8-разрядное слово конфигурирует режим и направление потока данных для каждого порта. Это управляющее слово включается в программу перед любыми другими командами. Выходные напряжения соответствуют стандартным ТТЛ­ уровням (О В для логического О и 5 В для логической 1). В приведенных ниже упражнениях используется ме О. Включены некоторьrе детали работы PPI PPI в режи­ 1 мя в режиме иллюстрации метода квитирования установления связи при пе­ редачи данных. Режим 2, соответствующий полудуплексной пе­ редаче через порт А, описываться не будет. На рисунке 9.1 приведена таблица, в которой указаны типич­ ные шестнадцатеричные адреса, используемые в плате парал­ лельного ввода/вывода на основе ИС 8255 PPI. На рисунке 9.2 приведена таблица типичной разводки кон­ тактов 37-жильного кабеля для 24 разрядов и заземления. В не­ которых случаях возможно использование шины питания 5 В, но для экспериментов лучше использовать внешний источник питания. Убедитесь в том, что все общие провода соединены между собой! 9.1.1. РРl-режим О (базовый ввод/вывод) Этот режим обеспечивает простые операции ввода/вывода дан­ ных для портов А, В и С. Порт С разделен на два 4-разрядных порта (разряды с О по 3 и с 4 по 7). Другие особенности этого ре­ жима таковы: 1) все порты устанавливаются на ввод данных после сброса; 2) выходные сигналы фиксируются; 3) порты очищаются, когда в управляющий регистр писывается информация. PPI за­
Параллельный интерфейс 157 Управляющее слово для режима О Номер 7 разряда ~од 1 6 5 4 3 2 1 о о о А сн о в CL А=порт А А =О для ввода, 1 для В= порт В В =О для ввода, 1 для вывода CL = = СН порт С разряды О - З порт С разрядь1 4- 7 CL =О для ввода, 1 для вывода вывода СН =О для ввода, 1 для вывода L} /г Рис. 9.3. Управляющее слово для режима О. '~ L ~ Пример управляющего слова для режима О Сконфигурируйте PPI для ввода данных из порта А, вывода в порт В и ввода из порта С. Бит О= 1 (замените CL на 1) 1 =О (замените В на О) Бит 3 = 1 (замените СН на 1) Бит 4 = 1 (замените А на 1) Управляющее слово 10011001=99 Нех. Бит 9. 1.2. Упражнение «Вывод чисел в режиме Цель данного упражнения - 0» показать правильность работы си­ стемы вывода при пересылке двоичных чисел к порту В. На ри­ сунке 9.4 приведена схема аппаратных соединений, а ниже - программа на языке Си. Рис. сид 9.4. Тест вывода данных в режиме О. Обозначение: БП - блок питания
158 Глава 9 Структура программного обеспечения для теста вывода данных в режиме О Сконфигурировать режим О, PPI, порты А и С для ввода данных, порт В для r~ывода данных. Напечатать команды пока не конец (while not end) { Ввести два шестнадцатеричных символа с клавиатуры. Вывести двоичное чисел в порт В. Выход (exit) /*output.c Вывод данных в порт В. Порт В должен быть соединен с блоком светодиодов */ #include < dos.h > #include < stdio.h > /*Требуется для функции scanf() */ int Output(); /*Название для функции, используемой в программе*/ int Control = ОхЗОЗ; /*Адрес управляющего регистра*/ int B_ Address = ОхЗО 1; /* Базовый адрес + 1 */ int config = Ох99 /* 99 hex конфигурирует порт следующим образом: порт А для ввода порт В для вывода порт CL для ввода порт СИ для ввода */ void main() { int menu; outp(Control,config); /* /* Определение внутренней переменной Конфигурирование */ PPI */ printf("\n\n\n\tBЫBOД ДАННЫХ В ПОРТ В"); printf("\n\n\tHaжмитe НЕшестнадцатеричный символ для выхода из программы"); while(Output()); /* Продолжать, пока функция будет равна О exit( 1); } Листинг 9.1.2. output.c. */ · output не
Параллельный интерфейс int Output() { int data,x; printf("\n\n\t Введите некоторое ЧИСЛО, нажмите 159 ШЕСТНАДЦАТЕРИЧНОЕ <ENTER>"); ffiush(stdin); /* Освободить буфер клавиатуры*/ х = scanf("%2X",&data); /*Получить данные от клавиатуры*/ outp(B_Address,data); /*Отослать данные в порт*/ retumx; /* х равен О для НЕшестнадцатеричноrо числа*/ Листинг 9.1.2. (Продолжение) 9.1.3. Упражнение в режиме 0» «Тестирование ввода Цель данного упражнения , :, протестировать систему ввода - данных. Приведенная программа сканирует порт А и показы­ вает логические состояния переключателей, подключенных к порту А. На рисунке 9.5 показаны соединения с PPI, мые для выполнения данного упражнения Компьютер . . о о 1 1 2 2 з з ; Блок переклю- чателей ' ; ; Портд 4 4 5 5 6 6 ;:; ; С. - +5В ,___ Земля ._.. ~ Разрешение •'/ Р.,.с. 9.5. Тест ввода данных в режиме О. '.'] 1" ;i· ... ~П5В Земля Земля ,;(\ ---- - Vcc 7 7 iJ " Переключате!iь Контакт Разряд PPI ;; ; .. необходи­ . м,d Земля i
160 Глава 9 Структура программного обеспечения для теста ввода данных в режиме О Сконфигурировать PPI порт А для ввода данных, порты В и С для вывода данных. Напечатать кома~щы и битовый заголовок. Пока не нажата клавиша Ввести с порта А и напечатать результат на экране Выход '. (exit) В листинге 9.1.3 на рис. 9.6 приведена таблица трассировки для сегмента программы, заключенного внутри прямоугольни­ ка. Этот сегмент предназначен для того, чтобы показать, как /*input.c Ввод данных из параллельного порта А Порт А соединен с блоком переключателей #include < dos.h > #include < stdio.h > int lnput(); int A_Address = Ох300; int Control = Ох303; int Config = Ох99; */ . ·, · /* Адрес порта А */ /* Адрес управляющего регистра*! /* Конфигурация: · порт А для ввода порт В для вывода порт CL для ввода порт СН для ввода void main() */ ,, { outp(Control,Config); /*Конфигурирование PPI */ clrscr(); printf("\n\n\n\t ВВОД ДАННЫХ ИЗ ПОРТА А"); printf("\n\n Нажмите любую клавишу для выхода из программы"); printf("\033[ 15;5Н Бит 7 6 5 4 3 2 1 О"); · printf("\033[ 16;5Н Положение"); · · -, о while(!lnput()); /*Продолжать, пока функция InputO не выведет 1 */ exit( 1); } int lnput(); { int data,i; Листинг 9.1.З. input.c.
Параллельный интерфейс data = inp(A_Address); printf("\033[ 16; 12Н"); for(i = 7;i -1 ;i--) printf(" %lx",(data>>i)&l); /* /* Ввод данных из порта В /* Сдвиг данных на 161 */ Позиционирование курсора*/ i разрядов и затем объединение по AND с 1 */ printf(" = % 2х", data); return kЬhit(); Листинг 9.1.3. (Продолжение) воспроизводятся на экране «логические» положения переклю­ чателей, подключенных к порту А. data = inp(A_Address); printf("\033[ 16; 12Н"); for(i = 7; i >-l;i--) printf(" %lx",(data >> i)&l); Ввод данных из порта В /* /* */ Позиционирование курсора Сдвиг данных на /* i */ разрядов и затем объединение по AND с Двоичные данные 7 data data >> i (data >> i)&l 1100 0101 xxxxxxxl 1 Примечание Число от переключателей Сдвиг данных вправо Поразрядное объединение по AND с 1 Напечататъ одну шестнадцатеричную цифру 1 printf("lx",(data >> i)&l) 6 data >> i (data>>i)&l printf("lx",(data >> i)&l) 5 data >> i (data>>i)&l printf("lx",(data >> i)&l) 4 data >> i (data >> i)&l printf("lx",(data >> i)&l) Экран О/Р 7654321 О 1 */ xxxxxxll 1 Повторить для i= 6 Повторитъ для i Повторить для i= 4 1 xxxxxl!O = 5 о о xxxl 100 о о Итерация продолжается, пока """' :<:'~ i не будет равно О ~- Рис. 9.6. Таблица трассировки ДТIЯ выделенного сегмента листинга 9.1.3.
Глава 162 9 9. 1.4. РРl-режим 1, стробируемый ввод/вывод Программируемый параллельный интерфейс в режиме 1 обес­ печивает возможность пересылки данных к портам или из пор­ тов А или В в сочетании со стробирующими сигналами или сиг­ налами квитирования (сигналами процедуры установления свя­ зи). Особенности режима 1 следующие: 1) два 8-разрядных порта (А и В); 2) порт С используется для управления портами А и В; 3) два последних порта могут быть портами ввода или вы­ вода; 4) входные и выходные сигналы фиксируются; 5) возможна организация прерываний по линиям СО и СЗ. Управляющее слово для режима Номер 7 разряда 5 о Код Рис. 6 1 9.7. 4 3 А А 2 l 1 о в в А=nортА А= О для вывода, В =порт В В =О для вывода, 1 для ввода Управляющее слово режима 1. Пример управляющего слова для режима для ввода 1 Запрограммируем порт А для ввода данных и В для вывода. Управляющее слово = 1О111100 = ВС hex Квитирование установления связи В режиме 1 порт С используется для сигналов квитирования, ис­ пользуемых в процедуре установления связи для передачи дан­ ных. Квитирование установления связи - это протокол, кото­ рый определяет процедуру сообщения инициатором пересылки данных о том, что данные готовы для передачи, и получателем данных о том, что он их получил. Управляющие сигналы квити­ рования для вывода данных указаны в таблице на рис. временная диаграмма приведена на рис. 9.9. 9.8; их
• Параллельный интерфейс . ,_.,...._.;.,:·».~, вывод Данные Метка ._, --~,,...,.~ 163 :i Примечание/Действие Порт В Портд С7 OBF CI Этот ВЫХОДНОЙ сигнал переходит в состояние НИЗКОГО уровня после записи выводимых данных в порт Он возвращается в состояние ВЫСОКОГО уровня, когда дСК переходит к НИЗКОМУ уровню. С2 Сб АСК Периферийное устройство устанвливает НИЗКИЙ уровень на этом выводе после приема данных. OBF = Выходной буфер заполнен дек= Подтверждение Рис. 9.8. Сигналы квитирования для вывода данных в режиме 1. Данные записаны в порт i К периферийному устройству отС1 /С7 OBF 1' о \--·/ А · Устанавливается . сигналом АСК v От периферийноrа · устройства к citcti дек ' Данные Рис. 9.9. в режиме о ___х~-- Временная диаграмма сигналов квитирования для вывода данных 1. 9.1.5. Упражнение «РРl-режим 1, тест вывода данных» Тест вывода данных в режиме 1: структурная схема и работа На рисунке 9.11 представлена структурная схема программно­ го обеспечения для данного упражнения. Аппаратное обеспе­ чение показано на рис. 9.10. Обратите внимание, что для этого Упражнения нужен блок переключателей и второй блок свето­ диодов.
Глава9 164 illl1lL.... КОМПЬЮТЕР Кон так~ Разряд ---о о 1 1 2 2 PPI з з Блок ...•.. 5 -55 7 7 5 1 Vcc ~ ~ - о -о 1 2 ГL з 4 Порт С 5 '•' з )( - '-- 5 С. 9.10. БлОkперек- лючателей 4 --, Рис. 1 5 ..____ 7 -Vcc Земля . Разрешение Тествыводаданныхврежиме Блок сид -4 -5 -5 7 Vcc -~ 'з;;; Земля -з о 7 .... 2 Переключатель 2 Замля .-- 1 1\ 5 :'' : ·-·=·=··-· р 1"5 вlземляl -~ ~ Земля Контакт Разряд PPI 1:)11 ;;t сид 4 4 Порт В -- сид - ~ Земля 1. При выполнении программы происходят следующие события: 1) запрашивается ввод шестнадцатеричного числа с клавиа­ туры; 2) если контрольный переключатель на линии С2 установ­ лен на логическую 1, программа выведет на экран сообще­ ние: «Ожидание логического О на С2»; 3) если на линии С2 установлен логический О, данные будуr отосланы к порту В, включится контрольный СИД на ли­ нии Cl;
Параллельный интерфейс РРl-режим 165 1, тест вывода для порта В Вывести шестнадцатеричное и комнады число в порт В шестнадцатеричное число с клавиатуры ' логическую 1 * Напечатать заголовок Ввести ' Ввести Вывести состояние С2 число в порт В 1 Ожидать * логический О на С2 Рис. 9. 11. 1. 1 на С2»; когда переключатель на линии С2 переводится на состоя­ ние логической 6) * затем программа выведет сообщение «Ожидание логиче­ ской 5) наС2 Структурная схема программного обеспечения для теста вывода данных в режиме 4) Ожидать Вывести число в порт В 1, выключается контрольный СИД; повторение всех этапов, начиная с шага /*outmodel.c 1. Вывод данных из порта В с сигналами квитирования. Порт В должен быть подключен к блоку светодиодов, один све­ тодиод должен быть подключен к чатель к С2. */ #include < dos.h > #include < stdio.h> int Output(); int Control = ОхЗОЗ; i11t B_Address = ОхЗО 1; int C_Address = Ох302; int config = ОхВС Cl и один логический переклю­ /* Требуется для функции scanf() */ /* Имя функции, используемой в nроrрамме */ /* Адрес управляющего регистра*/ /* Адрес base + 1 */ /*Адрес base + 2 */ /* ВС конфигурирует порты следующим образом: порт А для ввода, порт В для вывода*/ void main() { Листинг 9.1.5. outmodel.c.
166 Глава9 int menu; clrscr(); outp(Control,config); /* Определение переменной целого типа /* Конфигурирование */ PPI */ printf("\n\n\n\tBЫBOД ДАННЫХ ИЗ ПОРТА В"); printf("\n\n\n\tHaжмитe НЕшестнадцатеричный символ для выхода из программы"); printf("\n\nBвeдитe логический О на С2"); while (Output()); /*Продолжать, пока функция будет равна О output не */ exit(l ); } int Output(); { int data,x, k = 2; printf("\033[ 16; l Н Введите шестнадцатеричное число, нажмите <ENTER>"); ffiush(stdin); /* Очистка буфера клавиатуры */ х = scanf("%2X" ,&data); /* Получение данных с клавиатуры */ do outp(B_Address,data); /*Отсылка данных в порт*/ k = inp(C_Address) & 2; printf("\033[18; lH Данные отослали импульс логической l на С2 для подтверждения приема"); while (k ! =О); printf("\033[18; lH СИД, подключенный к Cl, мигает, когда С2 возвращается к логическому О"); printf("\033[16;1H retum х; "); /* х равен О для НЕшестнадцатеричного числа*/ Листинг 9.1~5. (Продолжение) 9.1 .6. Упражнение «Тест ввода данных в режиме 1» Сигналы квитирования для ввода данных указаны в таблиuе на рис. 9.12; их временная диаграмма приведена на рис. 9.13.
Параллельный интерфейс .,,,_..,..,. »: ..."'-'У" Данные Метка вход Порт А 167 ~ Примечание/Действие Порт В С2 С4 Сигнал НИЗКОГО уровня на этом входе от периферийного STB устройства загружает данные во входной регистр. cs Cl Сигнал ВЫСОКОГО уровня на ВЫХОДЕ уведомляет, IBF что данные загружены во входной регистр. Переходит в состояние НИЗКОГО уровня после считывания данных. Стробирующий входной сигнал STB = IBF =Входной буфер заполнен Рис. 9.12. Сигналы квитирования для ввода данных в режиме 1. Аппаратные соединения для данного упражнения аналогич­ ны соединениям для теста вывода данных в режиме 1, за исклю­ чением следующих: 1) соединение с 2) соединение с С2 переносится на С4; 3) блок переключателей подключается к порту А. Cl переносится на С5; Данные посылаются в порт ' От периферийного устройства к С2/С4 (переключатель) STB Кпериферийному устройству от С 1/С5 1 (СИД) IBF О 1' ' ' О f)o--: ---t:/· -----------....... ---.J/ \...__ t ,, --xr--'------,.--'C ' Данные 1' Новые t Данные считываются из порта данные Рис. 9. 1 З. Временная диаграмма сигналов квитирования для ввода данных В режиме 1.
168 Глава 9 Программное обеспечение для этого упражнения приведено в листинге 9.1.6. В этом листинге объясняется также принцип работы программы. По существу, на С4 должен быть установлен логический О перед вводом данных с порта А. /*inmode 1.с Программа теста ввода данных из порта А с сигналами */ /* квитирования 1*/ /* Ввод данных из порта А Порт А должен быть подключен к блоку*/ /* переключателей*/ /* Сид должен быть подключен к С5, а логический переключатель -* / /*к С4*/ #include<dos.h> #include<stdio.h> /*Требуется для функции scanf() */ int lnput(); /*Имя функции, используемой в программе*/ int Control = Ох303; /*Адрес управляющего регистра*/ int A_ Address = Ох301; /* Адрес base + 1 */ int B_Address = Ох300; /*Базовый адрес (base)*/ int C_Address = Ох302; /* А.1рес base + 2 */ /* ВС конфигурирует порт следующим образом: int config = ОхВС; порт А для ввода порт В для вывода порта С4 для квитирования ввода порт С5 для квитирования вывода */ void main() { clrscrO; outp(Control,config); /*Конфигурирование PPI */ printf("\n\n\n\tBBOД ДАННЫХ ИЗ ПОРТА А"); printf("\n\n\tHaжмитe <Enter> для ввода данных и любую друrую клавишу для выхода из программы"); printf("\033 [ 12; 1НВведите двоичное число в порт А"); printf("\nПoдaйтe импульс логического О на С4 ... СИД на С5 должен включиться"); printf("\nHaжмитe <Enter> для ввода данных"); ... СИД на С5 должен выключиться"); printf("\nИз порта А while (lnput()); exit(l); Листинг /*Повтор цикла, пока не будет возвращен О*/ 9.1.6. inmodel.c.
Параллельный интерфейс 169 int lnput(); { int k, r = 1; if(getch() = = 13) printf("033[18;1H Данные: else r =О; %ОХ", inp(A_Address)); retum r; Листинг 9.2. 9.1.6. (Продолжение) Упражнения с шаговым двигателем Этот раздел содержит три упражнения, включающие в себя разра­ ботку программ для управления скорости и направления вращения шагового двигателя. Двигатель, подключенный к порту В, управля­ ется двоичными переключателями, подключенными к порту А. 9.2. 1. Упражнение 1. «Управление шаговым двигателем» Разработайте программу, которая будет управлять шаго­ вым двигателем, т. е. позволит задавать две скорости вра­ щения по часовой стрелке, две скорости вращения против часовой стрелки и обеспечит возможность остановки дви­ гателя (см. структурную схему на рис. 9.14). Управление шаговым двигателем Напечатать Выбрать скорость* заголовок и направление и команды вращения о Остановить двигатель Медленное0 Быстрое вращение вращение вращение по часовой по часовой против часовой против часовой стрелке стрелке стрелки стрелки о Быстрое о Медленное u вращение Рис. 9. 14. Структурная схема программного обеспечения для управления !Uаrовым двигателем.
Глава 170 9 · ·. КОМПЬЮТЕР к~нтакт Разряд о --- 2 PPI з Порт А БП58 Переключаю, о , 4 , Блок пере· 2 ключателей - 5 -- 7 Контакт Разря1 ............... з ............. 5 6 7 с Земля ~ 9 Разрешение о , - ----- сид 1--- о ....,____ 2 з Порт В 4+5 вlземляl 4 6 PPI ... 1 Блок 2 сид з 11 4 5 12 1з 14 \ 4 5 Шаговый 6 -----· двигатель 7 Vcc .. Земля 1 j Земго 6 ··.. 1 lL -~ '3;; Зс1.щя 7 vcc ~ 1 Рис. 2. 9.15. Аппаратные средства для управления шаговым двигателем. Аппаратные соединения выполните по схеме, показанной на рис. 3. 9.15. Отрегулируйте задержки в программе таким образом, что­ бы в быстром и медленном режимах работы шаговый дви­ гатель вращался плавно. Обратите внимание, что первая задержка для каждой последовательности сделана более короткой с учетом компьютерного времени возврата из цикла. Если программньrй код, управляющий вращением двигателя, будет передаваться слишком быстро, то двига­ тель начнет вибрировать.
Параллельный интерфейс 171 Структура программного обеспечения для упражнения 9.2. 1. Инициализировать РРI-режим О, порт А для ввода данных и порт В для вывода. Напечатать команды. Все переключатели установить к логическому О для остановки мотора. Переключатели установить к логической 1 для реализации операций в соответствии с приведенной ниже таблицей. Переключатель Режим (в состоянии логической Десятичное значение 1) Остановка о о Медленное вращение по часовой стрелке Быстрое вращение 2 по часовой стрелке Быстрое вращение 2 4 против часовой стрелки Медленное вращение 3 8 против часовой стрелки пока не кончится (while not end) { ввод режима с порта А вывод числовой последовательности для одного поворота шагового двигателя. Последовательность чисел для вращения двигателя по часовой стрелке: выход 3, 6, 12, 9. (exit) '1,;
172 Глава /*motor.c 9 Программа управления шаговым двигателем. Скорость и направление вращения двигателя поступают из порта А Порты с АО по АЗ подключаются к блоку переключателей. Числовая последова­ тельность для управления шаговым двигателем выводится в порт В. Порты с ВО по ВЗ подключаются к блоку светодиодов и двигателю.*/ #include<dos.h> #include<stdio.h> int A_Address = ОхЗОО; int B_Address = Ох301; int Control = ОхЗОЗ; int Config = Ох99; /* /* /* /* Адрес порта А Адрес порта В */ */ Управляющий адрес порт В на вывод int Input(); void Rotate(int,int); int clockwise = О; int anticlock = 1; int slow = 1ООО; /* */ Конфигурация, порт А на ввод, */ Эти две скорости могут быть подстроены в соответствии int fas = 100; /* */ с быстродействием компьютера. Чем больше число, тем медленнее двигатель */ void main() { outp(Control,Config); clrscr(); printf("\n\n\n\t\tYПPABЛEHИE ШАГОВЫМ ДВИГАТЕЛЕМ»); printf("\n\n\tYпpaвлeниe двигателем с помощью блока переключателей"); printf("\n\tEcли все переключатели установлены в положение логического О, то"); рriпtf("двигатель остановится"); printf("\n\tHaжмитe любую клавишу для выхода из программы"); printf("\n\n\t\tPEЖИM ПЕРЕКЛЮЧЕНИЯ"); printf("\n\t\t О медленное вращение по часовой стрелке"); printf("\n\t\t 1 быстрое вращение по часовой стрелке"); printf("\n\t\t 2 быстрое вращение против часовой стрелки"); printf("\n\t\t 3 медленное вращение против часовой стрелки"); Листинг 9.2. 1. motor.c.
Параллельный интерфейс 173 while(!lnput()); exit( 1); int lnput; { printf("%i", inp(A_Address)); switch(inp(A_Address) & OxOF) { case 1: case 2: case 4: case 8: default: Rotate(slow ,clockwise ); break; Rotate(fast,clockwise); break; Rotate(fast,anticlock); break; Rotate(slow,anticlock); break; printf("\033[20;10H Двигатель ~овился"); } retum kЬhit(); void Rotate(int speed, int direction) { int i; int data[2)[4] = {3,6, 12,9, /*Код для вращения по часовой стрелке*/ 9,12,6,3}; /*Код для вращения против часовой стрелки*/ delay(speed * 5/1 О); printf("\033[20; 1ОН for(i =О; "); i < 4; i++) { outp(B_Address,data[direction][i]); /* delay(speed); } Листинг 9.2.1. (Продолжение) Оrсылка кода к мотору*/
174 Глава9 9.2.2. Упражнение «Управление двигателем; три скорости вращения» Измените программное обеспечение упражнения 9.2.1 таким образом, чтобы можно было задавать низкую, среднюю и высо­ кую скорость вращения двигателя в каждом направлении. 9.2.3. Упражнение «Управление двумя шаговыми двигателями» Подключите еще один шаговый двигатель к неиспользованным выводам порта В и измените программное обеспечение для уп­ равления работой двух шаговых двигателей с помощью одного набора переключателей. Рис. 9. 16. Блок светодиодов.
глава 1о Цифро-аналоговый параллельный интерфейс 10. 1. Цифро-аналоговое преобразование 10.2. Упражнения по преобразованию цифрового сигнала в аналоговый 10.3. Функциональный генератор 10.4. Вопросы В главах 10 и 11 рассматривается использование РРI-порта, ко­ торый обсуждался в гл. 9, для преобразования сигналов из циф­ ровой формы в аналоговую (гл. цифровую (гл. 10.1. 1О) и из аналоговой формы в 11 ). Цифро-аналоговое преобразование Цифро-аналоговый преобразователь (UАП) вырабатывает вы­ ходное напряжение, величина которого пропорциональна дво­ ичному сигналу (числу), подаваемому на вход преобразователя. Существует большое количество ИС, использующих различ­ нь1е методы для выполнения цифро-аналогового преобразова­ ния. Для иллюстрации этого процесса ниже приводится описа­ ние метода 4-рюрядного R-2R лестничного преобразования (рис. 10.1). Обратимся к рис. 10.1. Здесь Vs является опорным напряже­ нием, обычно снимаемым с эталонного источника постоянного Тока, питающего R-2R-cxeмy. Сопротивление лестничной схе­ М:ь1, нагружающей источник Vs, постоянно, и его величина Обычно лежит в диапазоне от 1 до 5 кОм, поэтому ток от источ­ ника Vs должен быть постоянным. Положение каждого аналого­ вого переключателя устанавливается в соответствии с двоичным
Глава 176 10 R R R Подается,е мещение 4-разрядный регистр СМР ~--- 4-разрядный ----~ 1---О_У_ Земля Земля двоичный вход Рис. 10.1. R-2R ЦАП. сигналом на выходах регистра. Логический О, полученный от этого регистра, замыкает соответствующий переключатель на «Землю», а логическая 1 обеспечивает его переключение на вход операционного усшщтеля (ОУ). В силу очень высокого коэффициента усиления операцион­ ного усилителя между его инвертирующим (-) и неинвертирую­ щим (+)входами существует только очень малая разность потенциалов. В этом случае говорят, что инвертирующий вход опера­ ционного усилителя виртуально заземлен. Таким образом, ток, потребляемый R-2R-схемой, не изменяется при изменении по­ ложений аналоговых переключателей. Ток l, потребляемый от источника Vs, в каждом узле 1 R-2R-цепи разбивается на два равных по величине тока. Таким образом, ток, протекающий через переключатели А, В, С и D, будет равен соответственно 0.5 l, 0.25 l, 0.125 I и 0.0625 I. В таблице на рис. 10.2 указана взаимосвя:зь между положе­ ниями переключателей, током, протекающим через каждый пе­ реключатель, током на входе операционного усилителя и вы~ ходным напряжением, создаваемым на резисторе обратной связи Rf. При расчете выходного напряжения предполагается, 1 Узел электрической цепи означает точку соединения двух или более комnо­ нентов этой uепи. '
Доля полного тока Положение переключателей ABCD (1), Ток на входе (+) ОУ протекающего через переключатели А в с D Полныйl о о о о о.о О.О о.о о.о о.о о о о l О.О о.о о.о 0.0625 о о О.О О.О О.О 0.125 0.125 о.о о l о 1 1 О.О о о l о о 1 о 1 1 1 о 1 1 l О.О 0.25 0.25 0.25 0.25 о о о О.О о о 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.06251 0.1251 0.18751 0.251 0.31251 0.3751 0.43751 0.51 0.56251 0.6251 0.68751 0.751 0.81251 0.8751 0.93751 о о о l l l l l 1 1 l о о l 1 о l l l о о 1 о 1 l l о l l l Рис. О.О О.О о.о 0.0625 о.о о.о О.О 0.0625 0.125 0.125 О.О О.О О.О О.О о.о 0.0625 О.О 0.125 0.125 0.0625 о.о о.о О.О 0.0625 0.125 0.125 0.0625 О.О 0.25 0.25 0.25 0.25 10.2 Таблица тестовых напряжений. 0.0625 о.о о.о Выходное напряжение (1( + )) Rf о.о -· -0.625 -l.25 -l.875 -2.5 -3.125 -3.75 -4.375 -5.0 -5.625 -6.25 -6.875 -1.5 -8.125 -8.75 -9.375 ~ ~~;.»-
Глава 178 что 10 Rf = 2 кОм и I = 5 мА. Как видно из таблиuы на рис. 10.5, при положительном опорном напряжении величина выходного сигнала будет изменяться от О В к отрицательным значениям. Выходной сигнал можно сделать симметричным относительно О В путем подачи некоторого тока смещения, равного точке, указанной на рис. -0.5 I, в 10.1. Одно из важных требований, предъявляемых к схемам цифро-аналогового преобразования, ность схемы определяется тем, - линейность. Линей­ насколько точно величина аналогового сигнала соответствует подаваемым на вход дво­ ичным числам. В идеальном цифро-аналоговом преобразо­ вателе выходное напряжение должно уменьшаться ступенча­ тым образом равными шагами при увеличении значений двоичного входного сигнала, как это видно из таблицы на рис. 10.2. 10.2. Упражнения по преобразованию цифрового сигнала в аналоговый При выполнении всех упражнений, приведенных в гл. 12, применяется ИС ZN425, 10, 11 и представляющая собой ЦАП/ АЦП, но можно использовать и любые другие аналогичные интег­ ральные схемы. Для некоторых современных ИС потребуется меньшее число компонентов в АЦП-схемах, описываемых в гл. 11 и 12. 10.2.1. Упражнение «Тестирование цифро-аналогового преобразователя» Uель данного упражнения - создание интерфейсной схемы цифро-аналогового преобразования и присоединения ее к РРI­ порту компьютера. Приведены как логическая схема цифро­ аналогового интерфейса (рис. 10.3), так и листинг программы. Аппаратные и программные средства следует разрабатывать и тестировать отдельно. Назначение выводов используемых ИС показано на рис. 10.4. Схема тестирования UАП с использованием источника пи­ тания с выходными напряжениями +5 В, О В и -5 В и блока пе­ реключателей показана на рис. 10.5.
+58 . СМР в в '' Аналоговый Выбор о 'выход д Vs in Vs out Земля -5 220нФ в Земля Рис. 10.3. Логическая схема ЦАП. В-разрядный ЦАП/АЦП ZN 425 ОУ741 1 s out 15 2 ЦАП/АЦП Vs in 15 3 Сброс О/Р 14 4 Синхро- Бит7 13 5 Бит О Бит5 12 6 Бит 1 Бит5 11 Примечание 7 Бит 2 Бит4 10 в Vcc Бит 3 9 На выводе 2 должен быть логический О для ЦАП и логическая 1 для АЦП 8 i.,· низация (+) VP ОС+ 7 3 (-)VP О/Р 6 4 DC- 7 вид сверху Vs О/Р - внутренний источникдля R-2R-цепи аналоговый выход Рис. 10.4. Назначение выводов ИС. ' ; ЦАО•·.· Разряды о ·~--- ------41 2 t------t 3 эло 4 t----.i 5 t----.i 5 7 t-----r-~емля 1 ..... Вольтметр или 1 ---~------..J' БП +5 -5 л 1 1+5 о -51 ..___v1 1 1.....__~~~-t---' Рис. 10.5. Схема тестирования UАП.
180 Глава 10 Тестирование схемы По возможности протестируйте аппаратные средства интерфей­ са, прежде чем подключать их к компьютеру. На рисунке 10.5 приведена схема тестирования ЦАП. Для тестирования ЦАП: 1) после тщательной проверки схемы подключите источник питания (+5 В, Земля, -5 В); 2) подсоедините вход к набору двоичных переключателей; 3) подсоедините выход к вольтметру или ЭЛО; 4) удостоверьтесь, что значения аналогового сигнала на вы­ ходе прямо пропорциональны вводимым двоичным чис­ лам; проверьте весь диапазон чисел от О до 11111111. Структура программного обеспечения Инициализировать PPI -порт В на вывод данных Напечатать команды пока не нажата клавиша на клавиатуре цикл по i ( for(i = О; i < 256; i++) ) вывод выход i в порт В (exit) .. ·::. Тестирование программного обеспечения 1. Будем считать, что листинг 10.2.1 успешно скомпилиро­ ван. Протестируйте программное обеспечение пугем под­ ключения блока светодиодов к РРI-порту В. Удосто­ верьтесь, что при исполнении программы выходной сиг­ нал рассчитывается в диапазоне от О до 2. 11111111. Теперь подключите ЦАП к компьютеру и проверьте пра­ вильность работы системы.
Цифро-аналоговый параллельный интерфейс /*dacl.c 181 Выходной сигнал в данной программе рассчитывается в диапазоне от О до 255 в двоичном формате. При этом напряжение выходного сигнала, вырабатываемого ЦАП, должно уменьшаться пошаговым образом, начиная с О В и достигая через максимального отрицательного значения. 255 шагов Протестируйте про­ граммный выход с помощью блока светодиодов, подключенного к РРl-порту В. Наконец, протестируйте ЦАП, подключенный к порту В*/ #include < conio.h > #include < stdio.h > #include < dos.h > int B_Address = ОхЗОl int Control = ОхЗОЗ; int Config = Ох90; void main() /* Для функции kbhit() */ /* Для функции printf() */ /* Для функции outp() */ /* Изменить, если это необходимо */ /*Управляющий адрес для РРI-вывода */ /* Конфигурация PPI */ { int i; outp(Control,Config); /*Конфигурирование PPI */ printf("\n\n\tПPOTECTИPOBATЬ ВЫХОДНОЙ СИГНАЛ ЦАП"); printf("\n\n\tHaжмитe любую клавишу для выхода из программы\n"); while(l) { for(i =О; i <256; i++) { outp(B_Address,i); delay(50); /*Только для тестирования с помощью блока светодиодов printf("%i\t", i); if (kЬhit()) exit(l ); } Листинг 10.2.1. dacl.c. */ /*Только для тестирования*/
Глава 182 10 Функциональный генератор 10.3. (генератор сигналов специальной формы) Упражнения этого раздела иллюстрируют использование мик­ ропроцессора для генерирования периодических сигналов спе­ циальной формы. Частота этих сигналов будет ограничена ско­ ростью обработки данных. 10.3.1. Упражнение «Функциональный генератор» Данное упражнение демонстрирует генерацию с помощью ком­ пьютера одного из наиболее простых сигналов специальной формы. Электронно-лучевой осциллограф (ЭЛО) подключен к выходу схемы, используемой в упражнении 10.2.1. Модифици­ рованный листинг приведен ниже. Показан лишь листинг для ступенчатой функции. Сигнал такой формы появляется на эк­ ране ЭЛ О в пилообразном виде, если его рассматривать при большой скорости развертки. Для сигналов прямоугольной, си­ нусоидальной и треугольной форм предусмотрены соответст­ венно функции Squarewave(), Sinewave() и Triangular() соответ­ ственно, указанные на листинге как «пустые» операторы. Функциональный генератор Сконфигурировать Выбрать форму PPI сигнала Напечатать меню о о Ступенчатый сигнал Рис. 10.3.1 10.6. и Меандр о Синусоида о Сигнал треугольной формы Структурная схема программного обеспечения к упражнениям 10.3.2. /*dac2.c Функциональный генератор*/ #include < string.h > /*Для строковой функции toupper() */ #include < conio.h > /* Для функции kbhit() */ #include < stdio.h > /*Для функций printf(), getch() */ #include < dos.h > /*Для функции outp() */ #include < math.h > /* Для функции sin() */ Листинг 10.3.1. dac2.c.
Цифро-аналоговый параллельный интерфейс iпt B_Address = Ох301; int Control = Ох303; int Config = Ох90; void Staircase(); void Squarewave(); void Sinewave(); void Triangular(); voidmain(); { charmenu; outp( Control, Config); while(menu ! = 'Q') 183 /* Адрес порта В */ /* Управляющий регистр PPI */ /* Конфигурация PPI */ /* Определение ступенчатой функции*/ /* Конфигурирование PPI */ /* Печать меню на экране */ { clrscr(); printf("\033(21\n\n\t\tBЫXOДHOЙ СИГНАЛ СПЕЦИАJIЬНОЙ ФОРМЫ ОТ ЦАП\n"); printf("\n\tT для sTaircase (ступенчатый сигнал)"); printf("\n\tS для Squarewave (меандр)"); printf("«\n\tl для slnewave (синусоида)"); printf("\n\tRдля tRiangularwave (сигнал треугольной формы)"); printf('\n\tQ для выхода из программы\n"); /* ввод символа и его перевод в верхний регистр; переключение на выбранную функцию*/ switch(toupper(getch())) { '. case 'r: '\_/ 1 ~ case 'S': case '1': case 'R': case 'Q': Staircase(); break; Squarewave(); break; Sinewave(); break; Triangular(); break; exit(l); ;\ ' " . ! / Листинг 10.3.1. (Продолжение) ~·. < ;~ ·. ~~
184 Глава 10 void Staircase() { int i; clrscr(); printf("Haжмитe любую клавишу для возврата в МЕНЮ"); while(JkЬhit()) { =О; i < 256; i++) outp(B_Address,i); for(i void Squarewave() { /*пустой оператор*/ } void Sinewave() { /*пустой оператор */ } void Triangular() { /* пустой оператор */ } Листинг 10.3. 1. (Продолжение) Тестирование упражнения 1. 10.3.1 В результате работы программы для данного упражнения на экране осциллографа, подключенного к выходу ЦАП, будет воспроизводиться сигнал ступенчатой формы с 256 ступеньками. В отличие от выходного сигнала R-2R-цепи (рис. 10.2), данный выходной сигнал будет увеличиваться начиная с нуля в положительную сторону. 2. Проверьте линейность системы. Все ступеньки должнЬI быть одинаковыми. 10.3.2. Упражнение «Полный вариант функционального генератора» Заполните пустые операторы листинга 10.3.1. Листинг 10.З.2 демонстрирует один из способов генерации синусоиды. Что-
Цифро-аналоговый параллельный интерфейс 185 бы успешно скомпилировать и запустить данную программу, в наЧало листинга 10.3.1 должны быть добавленьI следующие строки: #include<math.h> и #define pi 3.14. При выполнении этой программы и наблюдении выходного сигнала на экране осциллографа между появлением каждой синусоиды может наблюдаться короткая пауза. Это связано с тем, что компью­ теру требуется некоторое время на инициализацию нового цикла. Структура функции Sinewave() Вычислить значения синуса для одного цикла. Хранить эти значения в некотором массиве ; '. пока не нажата клавиша на клавиатуре вывод последовательности чисел из массива. #include<math.h> #define pi 3.14 void Sinewave() /* Требуется для функции sin() */ { douЫe sine[256]; /* Определение массива из 255 */ чисел с мавающей точкой int i; printf("\nHaжмитe любую клавишу для возврата в МЕНЮ"); for(i =О; i < 256; i++) sine[i] = 128*(1 + sin(2*pi*i/256)); /* Загрузка значений sin в массив •/ while(!kЬhit()) { for(i =О; i < 256; i++) outp(B _Address,sine[i]); Листинг 10.3.2.
186 Глава 10.4. 1. 10 Вопросы Обратимся к рис. 10.1. Для V = 5 В, R = 5 кОм и макси­ мального напряжения V = 10 В при подаче на вход двоич­ ного числа 1111 а) величину 2. определите: Rf, б) V0 для двоичного числа 0001 на входе, в) V0 для двоичного числа 1ООО на входе. Тот же вопрос, что и в пунктах б) и в) вопроса для выходного напряжения от+ 3. Тот же вопрос, что и 10.4.1, 10.4.1, 5 до -5 В. но для 8-разрядного ЦАП. 1 1. < ·\', но
Глава 11 Аналого-цифровой параллельный интерфейс i.• i'· 11.1 . Аналого-цифровые преобразователи 11.2. Упражнения по аналого-цифровому преобразованию сигнала 11.3. Вопросы Эта глава описывает аналогово-цифровое преобразование сиг­ нала через PPI порт, который рассматривался в гл. 9. ·(, 11 . 1 . Аналого-цифровые преобразователи Назначение аналого-цифрового преобразователя (АЦП) за­ ключается в том, чтобы поставить в соответствие дискретным уровням напряжения аналогового сигнала некоторые двоичные числа (оцифровать аналоговый сигнал). В электронной системе длина 1 двоичных чисел должна быть точно определена. Длина числа может, например, составлять 4, 8, 12 или 16 бит (разря­ дов). Большинство выпускаемых в настояшее время преобразо­ вателей являются 8- или 12-разрядными. При использовании восьми бит максимальное число уровней напряжения (называ­ емых уровнями квантования), которым можно поставить в соот­ ветствие двоичные числа, будет равно 2 = 256. Если предполо­ жить, что максимальная величина входного напряжения будет равна 2 В, то мы получим интервал квантования2 2/256 = 7.843 мВ. Когда аналоговый сигнал по своей величине точно не попадает ни на один из уровней квантования, появляется ошибка кван­ тования. 1 «Длиной» некоторого числа или кода называют число разрядов этого чис­ ла или кода. 2 Число интервалов равно числу уровней минус один уровень.
188 Глава11 В продаже имеется большое количество ИС АЦП, которые осуществляют аналого-цифровое преобразование различны­ ми способами. Вообще, чем выше быстродействие преобразо­ вателя, тем он дороже. В этой главе будет идти речь лишь об аналого-цифровом преобразовании сигналов постоянного то­ ка или сигналов очень низких частот. Для многих АЦП при преобразовании сигналов переменного тока необходимо ис­ пользовать некоторый тип схемы выборки и хранения. Эта схема, обычно состоящая из небольшого конденсатора с под­ ходящей схемой коммутации, хранит мгновенное значение аналогового напряжения (выборку) в то время, когда происхо­ дит преобразование выборки в двоичное число. В следующих разделах будут рассмотрены два метода аналого-цифрового преобразования. 11.1 .1. Аналого-цифровой преобразователь с динамической компенсацией Блок-схема аналогово-цифрового преобразователя с динамиче­ ской компенсацией показана на рис. 11.1. Схема работает следующим образом: 1. Аналоговый сигнал подается на аналоговый вход. 2. Активизируется линия «начало преобразования• (сброс счетчика). 3. Счетчик начинает считать от нуля.·' ·" 4. ЦАП преобразует двоичный выходной ; · сигнал счетчика в аналоговый сигнал. 5. Компаратор сравнивает выходной сигнал ЦАП с аналого­ вым входным сигналом. Если второй больше первого, компаратор со своего выхода останавливает счетчик с по­ мощью управляющей логической схемы. 6. Управляющая логическая схема разрешает запись в вы­ ходной регистр и тем самым обеспечивает загрузку выход­ ного сигнала счетчика в этот регистр. 7. Активизируется линия «конец преобразования». Главный недостаток АЦП с динамической компенсацией за­ ключается в относительно больших затратах времени на преоб-
Аналого-цифровой параллельный интерфейс . 189 Компаратор i Цифроаналоговый преобразователь Регистр Цифровой выход Генератор синхронизирующих импульсов Управляющая Двоичный счетчик - - - - логическая схема Запуск преобразования - - - - - - - - - - Преобразование завершено • - - - - - - - - - - - ' Рис. 11 . 1 . АЦП с динамической компенсацией. разование входных сигналов большой амплитуды. Это обуслов­ лено тем фактом, что сигнал ЦАП должен пилообразно возра­ стать, начиная с нуля. Максимальная скорость преобразования ограничена временем, затрачиваемым на установление выход­ ного сигнала ЦАП после каждого приращения выходного сиг­ нала счетчика. Время преобразования для АЦП с динамической компен­ сацией пропорционально тактовой частоте и числу уровней квантования, на которые разбивается аналоговый сигнал. 8-разрядный АЦП имеет 256 уровней квантования. Время преобразования должно оцениваться для преобразования максимального входного сигнала. Для аналого-цифрового преобразования максимального входного сигнала потребуется 256 тактовых импульсов. Если используемая тактовая частота Равна 1 МГц, то длительность каждого тактового импульса со­ ставит 1 мкс. Время преобразования в этом случае будет равно 256 мкс. На рисунке 11.2 показана временная диаграмма для 4-раз­ Рядного АЦП с динамической компенсацией. На этой диаграм-
Глава 190 11 Тактовые ! . 1 Аналоговь~1й~QWL.:;.;~~.:..:i;..;..~.;..;;..;;,.;~~.;;.;~~~.;;.;;..:..:..;;..;;..;;~I=:=::::::::;:; 1ООО - - - ,.. т - ,_ - - ' - - -' - - -• - - - '- - - " - - ' - - входной сигнал 1-:- -- ~ ---: ---:- --:- -- ~ -~~~~ .- _-_- ~ -!-- ~ _- _- -:------:-- ----~---_- ~ - 0111 - - - ~ Выходной сигнал ЦАП 1 r -·- - -• - - • - - 0100 - - -,0011 - - - ,_ т - ,_ - 001 о . - - ~ -; - ~ - - 0001 . - - • _, 0000 l - - ' . __ Выходной сигнал " компаратора Рис. 11.2. Временная диаграмма 4-разрядного АЦП с динамической ком­ пенсацией. ме аналоговый входной сигнал создает двоичный выходной сиг­ нал 1001 (9 в десятичной системе). 11.1.2. АЦП параллельного, или мгновенного,· преобразования Использование блока компараторов - альтернативный и на­ много более быстрый способ преобразования аналоговых сиг­ налов в двоичные коды. Этот более дорогой способ, поскольку он требует использования отдельного компаратора для каждого уровня квантования. На рисунке 11.3 приведена логическая схема 3-разрядного аналого-цифрового преобразователя мгно­ венного действия. Все выходы компараторов с опорными на­ пряжениями ниже уровня входного сигнала изменят свое со­ стояние. Затем комбинационная логическая схема преобразуе'f выходные сигналы компараторов в 3-разрядные двоичные ко­ ды. На рисунке 11.4 приведена таблица истинности данной ло­ гической схемы.
Аналого-цифровой параллельный интерфейс с Ь 191 а 3-разрядный цифровой выход Рис. 11.3. 3-разрядный АЦП параллельного преобразования.· Входы Выходы ABCDEFG а Ь с 0000000 о о о о о о 1 000001 000011 о о о 1 1 о о 1 о о о о о о l l 1 1 1 о о .i 1 1 о 1 1 о о о 1 1 1 о Рис. 11.4. Таблица истинности для логи­ ческой схемы АЦП параллельного преоб­ разования. 11.2. Упражнения по аналого-цифровому преобразованию сигнала В упражнениях в данной главе в качестве АЦП используется И С ZN425E. 11.2.1. Упражнение «Тестирование АЦП» Цель данного упражнения - сконструировать АЦП-плату на основе ИС АЦП с динамической компенсацией, работающую через PPI. Приведен листинг программы и схема аппаратных
Глава11 192 Разряд о ------llr. с о р б С _ tкОм ,___ _ _ _ _ _ _ . ------1 . 1 ·--------- 2------1 , Выходы: З • к светодиодам , 4 ------1 : или PPl-nopry А: : ------1 t---------,..Синхронизация L--------17------1 Земля--Состояние Диод Рис. 11 .5. Схема АЦП с динамической компенсацией. соединений. Если тактовый сигнал вырабатывается программ­ ным способом, то можно спроектировать такую систему, для ко­ торой потребуется лишь три управляющих соединения с компь­ ютером (сброс, синхронизация, состояние). Двоичный выход­ ной сигнал будет равен числу тактовых импульсов, поступаю­ щих с компьютера. При использовании АЦП, в котором цифровой выходной сигнал не пропорционален числу тактовых импульсов, цифро­ вой выходной сигнал нужно будет считывать в параллельньrй порт компьютера. Программное и аппаратное обеспечение может разрабатьI­ ваться и тестироваться отдельно друг от друга. На рисунке 11.5 показана логическая схема, работающая следующим образом: 1. Сбрасывается счетчик и запускается генератор тактовь~х импульсов. 2. Сигнал на выходе О/Р АЦП пилообразно увеличивается на одну ступеньку с приходом каждого тактовоrо импульса. 3. Когда величина сигнала на выходе О/Р «переходит» через уровень приложенного аналогового входного сигнала, вы­ ход компаратора изменяет свое состояние. 4. Сигнал состояния преобразования используется для оста­ новки генератора тактовых сигналов. 5. Считывается двоичный выходной сигнал АЦП.
Аналого-цифровой параллельный интерфейс Компоненты, используемые в схеме на рис. 11.5 193 перечисле­ ны ниже. Количество Наименование Примечание АЦПZN425Е Такой же, как в гл. Компаратор Назначение контактов то же 531 1О самое, что и в ОУ 741 ИС Резисторы 2 47 кОм может замещать ис 741 531 R2, используемый для уста­ новки динамического диапа­ зона, имеет стартовую величи­ ну 47 кОм Резистор 1 кОм Конденсатор 220 нФ Небольшой кремниевый Он не позволяет выходному диод сигналу опускаться ниже О Вольт Тестирование схемы Соединения для тестирования показаны на рис. 11.6 и перечис­ лены ниже: 1) блок светодиодов - 2) источник постоянного тока с регулируемым выходным напряжением от О до 10 В - к аналоговому входу; 3) логический переключатель 4) СИД или вольтметр 5) низкочастотный генератор тактовых импульсов к двоичному выходу АдП; - - ко входу сброса; к выходу состояния; - к синх­ ронизирующему входу. Операции: 1) 2) установите величину входного напряжения 10 В; переключатель сброса установите в состояние логическо­ го О, а затем в состояние лоmческой 1, на выходе состояния 1); должен установиться высокий уровень (логическая
Глава 194 11 Источник питания +5 о -5 58 сид Блок сид 1----...1двоичный ов Состояние t::==::I выход АЦП-плата Сброс Аналоговый вход Логический 58 переключатель Синхронизация 08 БП постоянного тока Низкочастот­ ный генератор с регулируемым тактовых напряжением 08 0-108 импульсов 8 08 +58 Земля Рис. 11.б. Схемные соединения при тестировании. 3) запустите генератор тактовых импульсов; светодиоды в блоке светодиодов должны отображать процесс счета, на­ чиная с О; 4) когда выход состояния переходит на низкий уровень (ло­ гический 0), генератор тактовых импульсов прекращает работу; 5) повторите операции, начиная с пункта 2, регулируя сопро­ R2 до тех пор, пока счетчик не досчита­ напряжении 10 В на аналоговом входе); тивление резистора ет до 6) 250 (при проверьте правильность счета при подаче более низкого напряжения. Структура программы для упражнения Определить RESET = О, МАRК = 3, SPACE STATE Инициализировать PPI Напечатать команды пока не нажата клавиша на клавиатуре { RESET Ожидать логический О на входе состояния выполнять 11.2.1 = 1, вводиМое состояние
Аналого-цифровой параллельный интерфейс 195 МАRК Подсчет приращения Тест на максимальное число ' i SPACE Короткая задержка }пока STATE не равно О напечатать Показание на Двоичном входе /*adctest.c Тестирование АЦП, #include <conio.h> #include <stdio.h> #include <dos.h> подключенного к РРI-плате */ kbhit() */ функций printf(), getch() */ функции outp() */ /*Для функции /*Для /*Для /*СБРОС ГЕНЕРАТОРА ТАКТОВЫХ ИМПУЛЬСОВ*/ #define RESET outp(Ox302,0) /* СО к О, Cl к О*/ #define МARKoutp(Ox302,3) /*СО к 1, Cl к 1 */ #define SPACE outp(Ox302,1) /*СО к 1, Cl к О*/ #define STATE (inp(Ox302) & 16) /*Вводит состояние на С4 и маску только для бита 4* / /*Адрес РРI-порта А*/ int A_Address = ОхЗОО int Control = ОхЗОЗ; /*Адрес управляющего РРIрегистра */ int Config = Ох9А; /*А на ввод, В на ввод, CL на вывод, СН на ввод */ void main() { int count; outp(Control,Config); clrscr(); printf("\n\n Тест АЦП"); printf("\n\n Нажмите любую клавишу для выхода их программы"); while(!kЬhit()) ' RESET; count =О; pintf("\033[14;10H Ожиданиелоrическоrо О на вхоnе сосrояния"); ~ ' { Листинг 11.2.1. adctest.c.
Глава 196 11 if(kЬhit()) exit(l); }while(STATE ! =О); printf("\033[14; lOH Состояние= О Посылка тактового импульса"); do МАRК; if(++count > 255) printf("\033[ 16; lOH Превышен уровень максимального входно­ го сигнала"); else SPACE; delay(50); print("*"); ;•Для тестирования программы•; } }while(STATE ==О); printf("\033[16;10H Показание= %d ",inp(A_Address)); } Листинг 11.2.1. (Продолжение) Тестирование программного обеспечения упражнения 11.2.1 ·, 1. Подключите логический переключатель к входу состоЯНИI С4. 2. Подключите СИД к выходу сброса СО. 3. Подключите СИДк выходу синхронизации 4. Переключите вход состояния к уровню логической 5. Cl. 1. Запустите программу. Светодиоды сброса и синхронизации должны быть погашены. На экране должно появиться сооб~ щение «Ожидание логического О на входе состояния». 6. Переключите вход состояния к логическому О. 7. Сид сброса должен включиться.
Аналого-цифровой параллельный интерфейс 197 8. СИД синхронизации должен периодически переключаться (из состояния ВКЛЮЧЕНО в состояние ВЫКЛЮЧЕНО). Экран должен показывать сообщение «На входе состоя­ ния логический О. Пересьmка синхронизирующего им­ пульса». 9. Переключите вход состояния к логической все операции, начиная с пункта 6. 10. На экране 1. Повторите должно высвечиваться число, считанное с бло­ ка переключателей, подключенного к порту А. Тестирование системы 1. Реализуйте следующие соединения между платой АЦП и РРI-портом: Сброс- к СО Синхронизация Состояние - Cl к С4 Двоичный выход 2. к - к порту А Убедитесь, что источник постоянного тока с регулируемым напряжением соединен с аналоговым входом и запустите программу. 3. Изменение величины постоянного напряжения на этом вхо­ де от О до 1О В должно приводить к пропорциональному изменению величины двоичного числа на выходе. Со­ ставьте таблицу, занесите в нее числа, отображаемые на экране 0,5 при изменении входного напряжения с шагом В. Нарисуйте график зависимости величин выводимых чисел от входного напряжения. 11.2.2. Упражнение «Вольтметр» В данном упражнении в интерфейсную схему включены аппа­ ратные средства, которые использовались для упражнения 11. 2.1. Вольтметр предназначен для индикации напряжений от О до 10 В и должен иметь высокое входное сопротивление (свыше 1 МОм). В листинге 11.2.1 необходимо сделать небольшое изме­ нение для того, чтобы на экране появлялось сообщение «Пере­ грузка», когда счетчик досчитает до 251.
Глава 198 11 Земля - - - - - - - . - - - - - - L ов Рис. Схема с высоким входным сопротивлением. 11. 7. Один из способов обеспечения высокого входного сопротив­ - использование простой буферной схемы на основе опе­ рационного усилителя типа показанной на рис. 11. 7. В такой ления схеме операционный усилитель должен питаться от двухполяр­ ного источника постоянного тока +/-12 В. Кроме того, нужно обеспечить возможность регулировки сопротивления резистора R2 для того, чтобы напряжению величиной 10 В соответствова­ ло число 250. 11.2.3. Упражнение «Двухдиапазонный вольтметр» Это упражнение можно рассматривать как проект. Его цель состоит в добавлении в вольтметр еще одного диапазона изме­ рений (от О до 1 В). Выбор диапазона должен осуществляться либо автоматически, либо с клавиатуры компьютера. Обрати­ те внимание, что для этого потребуется еще одна управляю­ щая линия. На рисунке 11.8 показана структурная схема двух­ диапазонного вольтметра, а рис. 11.9 иллюстрирует один из способов изменения коэффициента усиления операционного усилителя. Сигнальный ВХОД Входной буфер и выбор диапазона Рис. 11.8. Плата АЦП 1---=""""'=-a--t Параллельный вход/выход ._..,,,..---:J·'----f компьютера Структурная схема двухдиапазонного вольтметра.
Аналого-цифровой параллельный интерфейс высокоомный вход._ 199 _ __ >-----..--...---•К аналоговому входу АЦП R R !О кОм Земля----~----.--_._ _ _ __ ов Рис. 11.9. Схема с высоким входным сопротивлением. Для изменения коэффициента усиления, определяемого со­ отношением величин резисторов в схеме, и следовательно, для выбора того или иного диапазона можно использовать аналого­ вый переключатель или реле. Коэффициент усиления по напря­ жению для схемы на рис. 11.9 определяется выражением: Gv = (10 + R)/10, где R- 11.3. сопротивление одного из резисторов в кОм. Вопросы Частота синхронизации для 8-разрядного АЦП с динамической компенсацией равна 2 МГц, а максимальная величина входного сигнала -5 В. Определите: 1. Время преобразования сигнала величиной 5 В. 2. Время преобразования сигнала величиной 1 В. 3. Ошибку квантования в процентах от 1 В, если сигнал ве­ личиной 1 В не соответствует точно уровню квантования . .F
"""""",........,.......,............................................................................................................... Глава 12 Параллельный принтерный порт 12. 1. Параллельный принтерный порт 12.2. Упражнения по вводу/выводу данных 12.3. Упражнения с шаговым двигателем 12.4. Упражнения с функциональным генератором 12.5. Упражнения с вольтметром Упражнения, описанные в предыдущих главах, повторяются в этой главе, но уже с использованием параллельного принтерно­ го порта. 12. 1. Параллельный принтерный порт Преимущества использования принтерного порта: 1) нет необходимости в приобретении дополнительных карт для компьютера; 2) назначение контактов является стандартным для всех пер­ сональных компьютеров. Недостатки: 1) принтер должен отключаться от компьютера при проведе­ нии экспериментов; 2) параллельный принтерный порт менее гибок в работе и предоставляет для использования меньшее число разрядов. Параллельный принтерный порт - это 25-контактная гнез­ довая часть разъема D-типа. Имеются три адреса, связанные с этим портом (base, base + 1, base + 2). Фактический базовый ад­ рес (base) можно найти в сопроводительных документах к ком­ пьютеру или из программы тестирования компьютера. Обычные базовые адреса Данный порт имеет 8 - 378 hex или ЗВС hex. разрядов вывода данных и несколько разрядов для линий управления. Некоторые из последних ис-
Параллельный принтерный порт 201 Разряд о Разряд Разряд 1 2 ', <.) Разряд З Разряд Разряд Разряд 4 5 6 АдресЬаsе Разряд Разряд Разряд Разряд Разряд 7 6 5 4 Адрес Ьевв +1 \· -," Разряд Рис. Назначение контактов принтерного порта. 12. 1. пользуются только для вывода управляющей информации, не­ которые - для ввода, и некоторые могут быть запрограммиро­ ваны как для ввода, так и для вывода. В качестве логических уровней используются ТТЛ-уровни напряжения (О и 5 В), как и для PPI. Наиболее удобные входы и выходы используются для выполнения упражнений, приведенных в настоящей книге, при этом еще довольно много выводов (контактов) остаются неза­ действованными. По базовому адресу вывода «располагаются» контакты со второго по восьмой с самым младшим разрядом на контакте 2. Имеется 5 битов ввода по адресу контактов для этих разрядов показана на рис. 12.2. Упражнения 12.2.1. base + 1, 12.1. разводка по вводу/выводу данных Упражнение «Вывод данных через принтерный порт» Это повторение упражнения 9.1.2. Цель данного упражнения - показать, что система вывода работает правильно, путем пере­ сылки двоичных чисел по базовому адресу принтерного порта. Аппаратные соединения показаны на рис. 12.2.
202 Глава 12 Компьюте Параллельный принтерный Рис. 2 5 з 6 4 7 5 8 6 9 7 Подключение блока светодиодов к принтерному порту. 12.2. 12.2.2. 4 Упражнение ((Ввод/вывод данных через принтерный порт» Данное упражнение проверяет как ввод, так и вывод данных. Двоичные числа считываются с блока переключателей, соеди­ ненного с контактами base + 1 принтерного порта. Выводи­ мые данные отображаются так же, как в предыдущем упраж­ нении. Дополнительные аппаратные соединения показаны на рис. 12.3. Рис. 12.З. Подключение блока переключателей к принтерному порту.
Параллельный принтерный порт /*outprint.c Вывод данных на принтерный порт. Контакты соединены с блоком светодиодов #include < dos.h > #include < stdio.h > #include < conio.h > int Out_Address == ОхЗЬс; void main() /* 203 2-9 */ Базовый адрес принтерного порта */ { int data,eпor = 1; c)rscr(); printf("\033[5;5H Введите две шестнадцатеричные цифры"); printf("\033[7;5H Любую другую буквенную клавишу для выхода из программы"); printf("\033[8;5H и нажмите <Enter>"); printf("\033[20;5H Адрес %0X",Out_Address); do printf("\033[5;37H "); gotoxy(ЗS,5); ffiush(stdin); епоr = scanf("%2X'',&data); /* Данные с клавиатуры */ outp(Out_Address,data); /* Пересьшка данных к порту'*! while(eпor Листинг ! =О); 12.2.1. outprint.c. Этот программный листинг выглядит более сложно по сравнению с обычным, и в него включены несколько новых технических приемов. Структурная схема программы показа­ на на рис. 12.4. Скомпилируйте и запустите эту программу. Входные сигналы, выдаваемые блоком переключателей, будут отображаться на экране. Обратите внимание, что бит 7 инвер­ тирован. Трассировочная таблица для раздела листинга, за­ I<Люченного внутри прямоугольника, показана на рис. Обращаясь к трассировочной таблице (рис. nрограммы, которая заключена в листинге 12.5) 12.5. той части 12.2.2 внутри прямо­ Уrольника, мы видим, что для ввода двух шестнадцатеричных
Глава 204 12 Ввод/вывод через принтерный порт * Напечатать меню Выб ать кцию Напечатать меню Выбрать функцию Напечатать информацию Напечатать информацию Ввести из порта Сканировать* Напечатать Напечатать порти ждать номера вводимые изменения разрядов биты Ввести с клавиатуры и вывести в по Ввести два шестнадцате­ ричных символа * * т Вывести в порт и проверить их истинность Рис. ния 12.4. Структурная схема программного обеспечения для упражне­ 12.2.2. чисел без использования клавиши <Enter> getch() используется дважды с функцией for(). Проверяется правильность ввода шестнадцатеричных чисел, и затем введенные числа преобразу­ ются в двоичные. Два числа, введенные с клавиатуры, объеди­ няются для формирования 8-разрядного двоичного кода. /*inoutptr.c Ввод с базового адреса параллельного принтерного пор­ та. Выводимые данные по адресу base + 1. Порт ввода должен быть подключен к блоку переключателей. Порт вывода должен быть под­ ключен к блоку светодиодов.*/ #include <dos.h> #include <stdio.h> #include <string.h> #include <conio.h> .1 void lnput(); void Output(); int Out_Address = ОхЗЬс; /* Листинг 12.2.2. inoutptr.c. '' /'' < Вставить базовый адрес принтерного порта*/
?h%% Команда в листинге ввод Данные k hex Действитель- я;mi:i:'l':~'й'IЬW: ptr ныйадрес l:o/~:r ptr-valid m«w ~:>И- <<4*i hex (valid) о for (i= 1; i>-1; i++) k = toupper(getchO) ptr = strchr(valid,k) data = (ptr-valid) < < 4*i data=data+ for (i = 1; i > -1; i++ k = toupper(getchO) ptr = strchr(valid,k) data=data+ 1 " '2' '2' FFD8 FFDA 2 20 в в 20 о ., 'Ь' 'В' FFD8 FFEЗ 28 Примечание: Действительный адрес будет выводиться во время работы программы. Рис. 12.5. Трассировочная таблица для раздела листинга 12.2.2, заключенного внутри прямоугольника.
Глава 206 12 int In_Address = Ox3bd; void main() /*Вставить базовый адрес плюс 1 */ { int menu; while (1) { clrscr(); printf("\033[5;5H ВВОД ДАННЫХ/ ВЫВОД"); printf("\033[7;5H Ввод с принтерного порта (нажмите <1>) %3x",In_Address"); printf("\033[8;5H Вывод в принтерный порт (нажмите <О>) %3х", Out_Address"); priпtf("\033[9;5H Выход (нажмите <Q>)"); menu = toupper(getcb()); switch(menu); { case '1': case 'О': case 'Q': Input(); break; Output(); break; exit(l); } void lnput() { int data,change,i; clrscr(); printf("\033[5;5H Нажмите любую клавишу для выхода в главное меню"); printf("\033[7;5H Соединения с 25-контактным принтерным портом О-типа"); printf("\033[8;5H Контакт 15 FAULT =бит 3 "); printf("\033[9;5H Контакт 13 SLCT = бит 4 "); printf("\033[10;5H Контакт 12 РЕ= бит 5 "); printf("\033[11;5H Контакт 10 ACKNLG =бит 6 "); printf("\033[12;5H Контакт 11 BUSY= бит7 (инвертирован)"); printf("\033[20; lOH Адрес %0X",In_Address); while( 1) { Листинг 12.2.2. (Продолжение)
Параллельный принтерный порт 207 do { change = inp(ln_Address); if(khhit()) return; }while(change == data); data = change; printf("\033[13;5H Ввод данных= %2x",data); printf("\033[15;5H Биты 7 6 5 4 3 "); printf("\033[16;5H Состояние"); for(i = 7;i>2; i--) printf(" %1x",(data»i)&l); void Output(} { int i,data; char valid[l 7] ="0123456789AВCDEF"; char k, *ptr; clrscr(}; printf("\033[5;5H Введите две шестнадцатеричные цифры"); printf("\033[7;5H Нажмите любую другую клавишу для выхода в МЕНЮ"); printf("\033[20;5H Адрес %ОХ hex",Out_Address); while( 1) /* Установка непрерывного цикла */ { data =О; printf("\033[ 10;37Н"); gotoxy(35,5); for(i = 1; i > -1; i--) /* { Ввод шестнадцатеричного символа*/ k = (toupper(getch()); if((ptr = strchr(valid,k)) ==О) return; /* Возврат в меню, если введенный символ недействителен */ data = data + (ptr-valid)< <(i*4); /* См. таблицу трассировки ниже */ outp(Out_Address,data); /* Листинг 12.2.2. (Продолжение) Пересылка данных в порт*/
Глава 208 12 12.З. Упражнения с шаговым двигателем Данные упражнения являются повторением упражнений с ша­ говым двигателем, описанных в гл. 12.3.1. 9. Упражнение «Шаговый двигатель; две скорости вращения в каждом направлении» Цель данного упражнения - разработка программы на языке Си для управления скоростью и направлением вращения шаго­ вого двигателя. Двигатель и четыре переключателя из блока пе­ реключателей подключены к принтерному порту (см.рис. Структура программы показана на рис. 9.14. Компьютер 1 Base Параллельный принтерный 4 2 5 з 6 4 7 5 в 6 9 7 Шаговый порт rКОКТАКТ АЗ о 2 Base + 1 15 з 13 4 12 5 10 6 7 Переключатель о 2 4 5 6 Рис. 12.6. Аппаратное обеспечение к упражнению 12.3.1. 12.6).
Параллельный принтерный порт 209 Время задержки в программе должно подстраиваться таким образом, чтобы двигатель в быстром и медленном режимах ра­ боты вращался плавно. Первая задержка для каждой последова­ тельности делается более короткой с учетом компьютерного времени для возврата из цикла. Если программный код управле­ ния двигателем будет пересьmаться слишком быстро, двигатель начнет вибрировать. /* motorptr.c Управление двигателем. Скорость и направление вра­ щения двигателя управляются через принтерный порт. Контакты 13, 12 такты 15, и 10 должны быть соединены с блоком переключателей. Кон­ 2, 3, 4 и 5 должны быть соединены с блоком светодиодов и дви­ гателем.*/ #iпclude <dos.h> #include <stdio.h> #include <string.h> #include <conio.h> int Out_Address = ОхЗЬс; /* Базовый адрес принтерного порта */ int In_Address = ОхЗЬd; /* Базовый адрес + 1 */ int clockwise =О; int anticlockwise = 1; int slow = 100; /* Эти две скорости устанавливаются в зависимости от быстродействия */ /* компьютера; чем больше число, тем int fast = 10; медленнее двигатель*/ void Rotate(int,int); void main() { int К= 1; clrscr(); printf("\033[5;5H УПРАВЛЕНИЕ ШАГОВЫМ ДВИГАТЕЛЕМ"); printf("\033[6;5H Управление двигателем с помощью блока переключателей"); printf("\033[7;5H Если все переключатели установлены на логический О, "); printf("тo двигатель остановится"); printf("\033[9;5H НАЖМИТЕ ЛЮБУЮ КЛАВИШУ ДЛЯ ВЫХОДА ИЗ ПРОГРАММЫ"); printf("\033[11;5H Листинг 12.3.1. БИТЧИСЛО РЕЖИМ"); motorptr.c.
210 Глава12 pгintf("\033[12;5H О 1 медленное вращение по часовой стрелке"); 1 2 быстрое вращение по часовой стрелке"); pгintf("\033[14;5H 2 4 быстрое вращение против часовой стрелки"); printf("\033[15;5H 3 8 медленное вращение против часовой стрелки"); printf("\033[ 17;5Н Введенное число="); do { /* Ввод и сдвиг на 3 разряда вправо */ К= ((inp(ln_Address)»3) & OxOF); pгintf("\033[17;22H %\i ",К); switch(K) { Rotate(slow,clockwise); case 1 pгintf("\033[13;5H Ьгеаk; case 2 Rotate( fast,clockwise); case 4 Rotate( fast,anticlockwise); Ьгеаk; Ьгеаk; case 8 Rotate(slow ,antic\ockwise); Ьгеаk; default pгintf("\03 3 [20; 1ОН Двигатель остановлен"); } } while(!kbhit()); с)гsсг(); void Rotate(int speed,int direction) { int i; int data[2][4] = {3,6,12,9, /*Код для вращения по часовой стрелке*/ 9,12,6,3}; /*Код для вращения против часовой стрелки*/ delay(speed*9/1 О); pгintf("\033[20;10H ..... "" .... "); foг(i =О; i < 4; i ++) { outp(Out_Address,data[ direction][i]); /* Пересылка кода к двигателю */ . ,;• deJay(speed); Листинг 12.3.1. (Продолжение)
Параллельный принтерный порт 211 Упражнение «Шаговый двигатель; 12.3.2. три скорости в каждом направлении» Измените программное обеспечение таким образом, чтобы можно было задавать три скорости вращения двигателя (низ­ кую, среднюю и высокую) в каждом направлении. Один из спо­ собов использование одного переключателя для выбора на­ - правления и трех других - для выбора скорости. Упражнение «Два двигателя, две скорости» 12.3.3. Модифицируйте первоначальную систему для управления рабо­ той двух шаговых двигателей с использованием одного набора четырех переключателей. Упражнения с функциональным 12.4. генератором 12.4.1. Упражнение «Функциональный генератор» Это повторение упражнения 10.3, использующего принтерный порт. Uель данного упражнения - создание схемы цифро-ана­ логового интерфейса и ее подключение к параллельному прин­ терному порту персонального компьютера. Структура програм­ много обеспечения и тестирование для данного упражнения полностью описаны в гл. 1О, поэтому здесь будут приведены 12.7) и листинг программы. только логическая схема (рис. Компьютер КОНТАКТ РАЗРЯд 2 ---- t---11' з 4 5 6 7 8 9 О/Р ------1 : Буферный~ 1 усилитель t-------t(+) Выбо : 1 1 1 Аналоговый Vsin Vs out :выход 1 1 1 +58 Земля Рис. 12.7. Логическая схема ЦАП к упражнению 12.4.1.
212 Глава 12 В приведенной схеме используется ИС ЦАП/АЦП уже отмечалось выше, аппаратные и ZN425E. программные Как средства нужно разрабатывать и тестировать отдельно друг от друга. Для выполнения данного упражнения потребуется источник питания с выходными напряжениями +5, О и -5 В. В дополне­ ние к компонентам системы, показанным в логической схеме на рис. 12.7, параллельно входам можно подключить блок светоди­ одов для получения дополнительной информации. Информа­ ция о назначении контактов используемой ИС имеется в гл. 10. /* wformptr.c Генератор сигнала волновой формы*/ #include <string.h> #include <conio.h> #include <stdio.h> #include <dos.h> #include <math.h> int Out_Address = Ох3Ьс; void Staircase(); void Squarewave(); void Sinewave(); void Triangular(}; void main(} /* Для /* Для строковой функции toupper() */ kbhit() */ /*Для функций printf(), getch() */ /*Для функции outp() */ /* Для функции sin() */ /* Базовый адрес принтерного порта*/ /* Определение функций*/ функции { while( 1) /* Напечатать меню на экране */ { clrscr(); printf("\033[2J\n\n\t\t СИГНАЛ СПЕЦИАЛЬНОЙ ФОРМЫ ОТЦАП\n"); priпtf("\n\t Т дЛЯ sTaircase (ступенчатый сигнал)"); printf("\n\t S дЛя Squarewave (меандр)"); printf("\n\t 1 дЛя slnewave (синусоида) "); printf("\n\t RдЛя tRianguJarwave (сигнал треугольной printf("\n\t Q дЛЯ выхода из программы\п"); switch(toupper(getch())) { Листинг 12.4. 1. wformptr.c. формы)");
Параллельный принтерный порт case 'Т 213 Staircase(); break; Squarewave(); break; Sinewave(); break; Triangular(); break; exit( 1); case 'S' case '1' case 'R' case 'Q' void Staircase() { int i; clrscr(); рriпtf("Нажмите любую клавишу до возврата в МЕНЮ"); while(!kbhit()); { for(i =О; i <256; i++) { outp(Out_Address,i); /* ТолькодлЯ целей тестированJШ */ delay(SO); void Squarewave() { /* Пустой оператор*/ } void Sinewave() { /* Пустой оператор */ } void Triangular() { /* Пустой оператор */ } Листинг 12.4.1. (Продолжение)
Глава 214 12 Упражнение ((Полный вариант 12.4.2. функционального генератора» Заполните пустые операторы листинга 12.4.1. Листинг 10.3.2 ил­ люстрирует один из способов формирования синусоиды. Для ус­ пешной компиляции и запуска этой программы необходимо до­ бавить в начале листинга 12.4.1 строку «#define pi 3.14». При вы­ полнении этой программы и наблюдении выходного сигнала на экране осциллографа между появлениями отдельных синусоид может наблюдаться короткая пауза. Это связано с тем, что компь­ ютеру требуется некоторое время на инициализацию нового цик­ ла. 12.5. Упражнения с вольтметром 12.5.1. Упражнение ((АЦП» Упражнения с вольтметром уже описывались в гл. 11 с вводом данных через PPI. Данные упражнения могут быть выполнены с использованием принтерного порта только в том случае, если выходной сигнал АUП пропорционален числу поданных такто­ вых импульсов, как это имеет место в АUП с динамической компенсацией, о котором шла речь в гл. 11. Uель данного уп­ ражнения заключается в создании платы АUП с использовани­ ем ИС АUП с динамической компенсацией. Между компьюте­ ром и платой потребуется ввести лишь три сигнальные линии: синхронизацию, сброс и состояние. Двоичное число, представля­ ющее аналоговый входной сигнал, равно числу тактовых им+5В Разряд г--;-; ~ 1 :1 "- :s:g: 1 Е!:~ ~ g ф 1 1 - а3 е 1L _ _ _ _ j о 1 кОм 2-4--- 1 1 1 з 1 1 1 Соединения -4--__. 1 1 4 5 1------1 Сб ос -----i 1 1 1---------_.;;.;'""""'~-КОНТаКТ 2: ·1--------,...-------1<.онтакт Синхронизация 6 -4--__. 7 принтерного порта -----i 31 1 1 1 1 1 1 +5В Состояние 1 ~~----контакт 1 10 ~-----.....1 Диод 220нФ Рис. 12.8. Схема АUП с динамической компенсаuией.
Параллельный принтерный порт 215 Определить переменные и константы Послать тактовый Сброс * Напечатать напряжение импульс Ожидать состояние О Рис. ния Выйти из программы при нажатии клавиши Послать Протестировать SPACE дnя числа тактовых импульсов> Напечатать тактовый импульс Выйти из 250 Послать программы MARK при нажатии клавиши 12.9. Структурная схема программного обеспечения для упражне­ 12.5.1. пульсов, подсчитываемых и вьщаваемых компьютером. Прин­ ципиальная схема платы показана на рис. 12.8, структурная схе­ ма программного обеспечения - на рис. 12.9, а программа - в листинге 12.5.1. Все схемные компоненты те же самые, что и компоненты АЦП-платы, описанной в гл. 11. Схема должна быть протестирована так, как описано ниже, а затем ее следует подключить к компьютеру. Схема на рис. 1) 12.8 функционирует следующим образом: после сброса выходной сигнал ИС ZN425 будет увеличи­ ваться ступенчатым образом на одну ступеньку с каждым тактовым импульсом; 2) когда сигнал на выходе О/Р АЦП превысит приложенный аналоговый входной сигнал, выходной сигнал компаратора изменит свое логическое состояние; 3) сигнал состояния преобразования изменит свое состояние и вынудит компьютер приостановить пересьmку тактовых импульсов; 4) значение сигнала на двоичном выходе АЦП будет равно числу поданных тактовых импульсов. Тестирование схемы Выпошште следующие подключения: 1) блок светодиодов - к двоичному выходу АЦП; 2) источник постоянного тока с регулируемым напряжением от О до 1О В - к аналоговому входу;
216 Глава12 3) логический переключатель - ко входу сброса; 4) 5) СИД - к выходу состояния; низкочастотный генератор тактовых импульсов - ко вхо­ ду синхронизации. Операции: 1) установите величину входного напряжения 10 В; 2) переключатель сброса установите в состояние логическо­ го О, а затем в состояние логической l; 3) запустите генератор тактовых имцульсов; 4) выход состояния должен переключиться в состояние высо­ кого уровня; 5) светодиоды в блоке светодиодов должны начать индика­ цию счета, начиная с нуля; 6) если выход состояния переходит в состояние низкого уров­ ня, остановите генератор тактовых импульсов; 7) повторите операции, начиная с пункта тивление резистора ет до /*adc2ptr.c 250 R2 до 2, регулируя сопро­ тех пор, пока счетчик не досчита­ (при напряжении 10 В на аналоговом входе); Основная проrрамма для работы с вольтметром */ /*Соединения с принтерным портом, линией сброса (контакт 2), ли­ 10) */ /*Для строковой функции toupper() */ /*Для функции kbhit() */ /*Для функций printf(), getch() */ /*Для функции outp() */ (inp(ln_Address) & 64) outp(Out_Address,O); outp(Out_Address,l); outp(Out_Address,3); нией синхронизации (контакт #include <string.h> #include <conio.h> #include <stdio.h> #include <dos.h> #define STATUS #define RESET #define SPACE #define МАRК int Out_Address = Ох3Ьс; int In_Address = Ox3bd; void main() { Листинг 12.5.1. adc2ptr.c. 3), линией состояния (контакт /*Адрес принтерного порта вывода*/ /*Адрес принтерного порта ввода*/
Параллельный принтерный порт 217 int clock; priпtf("\033[2J\n\n\tTECTИPOBAHИE АЦП\n"); printf("\n\tCБPOC (RESET) с контакта 2 "); (CLOCK) с контакта 3 "); (STATUS) на контакт 10 "); рriпtf("\n\tСИНХРОНИЗАЦИЯ printf(''\n\tCOCTOЯHИE while(l) { clock =О; RESET; printf("\033[ 10; lOH Ожидание перехода сигнала СОСТОЯНИЕ в состояние низкого уровня"); do if (kbhit()) exit(l); }while(STATUS ! =О); printf("\033[10;10H Пересьшка тактовых импульсов до тех пор, пока сигнал СОСТОЯНИЕ не перейдет в состояние высокого уровня"); do { SPACE; printf("\033[ 14; lOH "); if (clock + + >250) { printf("\033[16;10H ПЕРЕ nол НЕ НИ E\n"); clock =О; } MARK; priпtf("\033[ 14; lOH %i" ,clock); /*Только для целей тестирования if(kbhit()) exit(l); }while(STATUS ==О); printf("\033[16;10H Данн~е = %i Листинг 12.5.1. (Продолжение) ",clock); */
Глава12 218 8) проверьте правильность счета при подаче на аналоговый вход более низкого напряжения. 12.5.2. Упражнение «Вольтметр)) В данном упражнении в интерфейсную схему включены аппарат­ ные средства, которые использовались для упражнения 12.5.1. Вольтметр предназначен для индикации напряжений от О до 1О В и должен иметь высокое входное сопротивление (свыше 1 МОм). Вместо числа подсчитанных тактовых импульсов на экран должно выводиться значение напряжения. Земля - - - - - - - . . - - - - - - L ов Рис. 12. 1 О. Схема с высоким входным сопротивлением. Один из способов обеспечения высокого входного сопротивле­ ния - использование простой буферной схемы на основе опера­ ционного усилителя типа показанной на рис. 12.10. В такой схе­ ме операционный усилитель должен питаться от двух.полярного источника постоянного тока+/- 12.5.3. 12 В. · Упражнение «Двухдиапазонный вольтметр» Это упражнение можно рассматривать как проект. Его цель со­ стоит в добавлении в вольтметр еще одного диапазона измере­ ний (от О до 1 В). Выбор диапазона должен осуществляться либо _ _ _с"'-6=0"<с.__.Контакт 2 Сигнальный вход АЦП-плата Рис. 12. 11. Синхронизация Контакт 3 __ с..;..ос'-т_оя_н_ие...__.Контакт 10 Блок-схема двухдиапазонного вольтметра.
Параллельный принтерный порт 219 автоматически, либо с клавиатуры компьютера. Обратите вни­ мание, что для этого потребуется еще одна управляющая линия. Структурная схема двухдиапазонного вольтметра показана на рис. 12.11. Роль входного буфера с высоким входным сопротивлением и переключателя диапазонов может выполнять операционный усилитель. Для изменения коэффициента усиления, определяе­ мого соотношением величин резисторов в схеме, и, следова­ тельно, для выбора того или иного диапазона можно использо­ вать аналоговый переключатель или реле (см. гл. 11). п \'. ..
"""'"""""""""'"""_,............................................................................................................... Глава 13 Дополнительные упражнения 13.1.Теориячастотомера 13.2. Упражнения с частотомером 13.3. Последовательная передача данных 13.4. Управление шаговым двигателем по линии последовательной передачи данных В этой главе описываются два упражнения, которые могут быть развиты в интересные проекты. Каждому из них предшествует краткое теоретическое введение. 13.1. Теория частотомера Частотомер - это электронная схема, которая подсчитывает число периодов сигнала, вырабатываемого некоторым источни­ ком переменного тока за определенный промежуток времени. Базовый интерфейс (рис. 13.1) состоит из триггера Шмитта, формирующего прямоугольные импульсы из входного сигнала, логического элемента, пропускающего этот сигнал в течение за­ данного промежутка времени, и двоичного счетчика, осуществ­ ляющего подсчет циклов сигнала. Триггер Шмитта и логиче­ ский элемент объединены в одной ИС. Все эти устройства опи­ сываются ниже. Счет начинается с момента подачи сигнала сброса, который устанавливает (сбрасывает) счетчик в нулевое состояние. Затем стробирующий управляющий сигнал ввода открывает логиче­ ский элемент. Это дает возможность прямоугольным импульсам с триггера Шмитта проходить на вход синхронизации (тактовый вход) счетчика. Время счета импульсов определяется программ­ ным образом. По истечении некоторого промежутка времени, необходимого для установки~ выходного сигнала счетчика, счи- 1 Процесс подсчета каждого импульса занимает некоторое время, связанное с последовательным изменением состояний внутри счетчика.
Дополнительные упражнения ' Сигнальный Триггер Шмипа вход Рис. 13.1. Логический элемент И-НЕ 221 Двоичный счетчик Принцип работы счетчика. тывается информация с выхода счетчика. Длительность времен­ ного интервала, в течение которого осуществляется подсчет им­ пульсов, должна быть варьируемой для обеспечения возможно­ сти калибровки системы с целью индикации правильного зна­ чения частоты. 13.1 .1. Триггер Шмитта Триггер Шмитта по своей сути является устройством сопряже­ ния аналогового входа с цифровой схемой. Эта схема формирует прямоугольные импульсы из входного сигнала таким образом, чтобы времена нарастания и спада сигнала (см. рис. 13.2) обес­ печивали возможность использования этого сигнала в цифро­ вой логической схеме. Аналоговые сигналы могут обладать бес­ численным количеством уровней напряжений или тока в диапа­ зоне от их максимального до минимального значений, тогда как цифровые сигналы имеют лишь два 1 дискретных уровня. Сигна­ лы, не обладающие малым временем нарастания и спада, не пригодны в качестве входных сигналов для логических схем по следующим причинам: 1) ТТЛ-устройства имеют тенденцию перехода в неустойчи­ вое состояние при изменении уровня выходного сигнала, что приводит к возникновению так называемого эффекта дребезга после такого изменения. 1 В некоторых системах связи цифровые сигналы имеют несколько дискрет­ ных уровней.
Глава 222 13 Сокращения: Т1 - время, затраченное на воз­ растание амплитуды с до J;;;;;;..;;;;.....)Время 10% 90% максимальной величины. Т2 - время, затраченное на спад амплитуды с 90% до 10% максимальной величины. Рис. 13.2. 2) КМ ОП-устройства имеют тенденцию к перегреву при од­ новременном переключении полевых транзисторов, нахо­ дящихся в состояниях логического О и логической 1. Главная особенность работы триггера Шмитта заключается в том, что его передаточная характеристика содержит петлю гис­ терезиса, показанную на рис. 13.3. Из этого рисунка видно, что входной сигнал должен возрасти до 1,6 В, прежде чем выходной сигнал перейдет из состояния логической 1 в состояние логиче­ ского О. Входной сигнал должен уменьшиться до величины 0,8 В, прежде чем выходной сигнал возвратится обратно в состо­ яние логической 1. Поэтому, если входной сигнал изменяется медленно, то не возникает никакой неустойчивости, возможной 4.0 3.6 CIJ ... ... ., ... ·7' 7 3.2 а) :s: :i: 2.8 ПетлЯ гистереЗиса' ф ~ "'i:: 2.4 :i: 2.0 Q. С\! ф о :i: § ~ CIJ . ... "'- ..' i..i · .. 1.6 . . Выводы ИС 74хх13 1.2 . . 0.8 .. , 0.4 о .. -.... ,. ' ,... 0.4 0.8 1.2 1.6 2.0 2.4 2.8 3.2 З.8 Входное напряжение, В Рис. 1 З.З. Типичная передаточная характеристика триггера Шмитrа.
Дополнительные упражнения 223 4.0 З.6 -.......;,·. са З.2 а) ~ 2.8 ~ 15. 2.4 t=a :i: Q) 2.0 о ~ 1.6 ~ 1.2 о.в 0.4 О ОА ОЕ 12 1В 2~ 2А 2Е 32 ЭВ Входное напряжение, В Рис. 13.4. Типичная передаточная характеристика (вход/выход) стандартного логического элемента И-НЕ. , при однопороговом переключении. Типичной ИС рассматрива­ емого типа является ИС 74хх13 с двумя 4-входовыми логически­ ми элементами И-НЕ, включающими в себя схемы триггеров Шмитта. При использовании логического элемента И- НЕ, если на все четыре входа подается логическая 1, то на выходе устанавлива­ ется логический О, при всех других возможных входных комби - нациях на выходе устанавливается логическая на рис. 13.4 приводится 1. Для сравнения типичная передаточная характеристика стандартного логического элемента И- НЕ. 13.1.2. Двоичный счетчик Двоичные счетчики строятся на основе бистабильных логиче­ ских элементов или транзисторных схем. Бистабильные мульти­ вибраторы, или триггеры, имеют два устойчивых выходных со­ стояния - логический О и логическую 1. Выходное состояние бистабильного мультивибратора можно изменить одним из сле­ дующих четырех способов изменения состояния на входе (в за­ висимости от схемотехнической реализации мультивибратора):
Глава 224 13 Входной сигнал Стробирующий сигнал Входной сигнал ---; счетчика Рис. 13.5. Временная диаграмма двоичного счетчика со сквозным пере­ носом. 1) изменением состояния от О к 2) изменением состояния от 3) отрицательным перепадом уровня сигнала; 4) положительным перепадом уровня сигнала. На рисунке цесса 1; 1 к О; 13.5 иллюстрируется временная диаграмма про­ подсчета девяти циклов входного сигнала двоичным счетчиком. В конце временного интервала счета импульсов получаем следующие значения разрядов на выходе счетчика: разряд О - логическая 1, разряды 1 и 2 - логический О, разряд 3 логическая 1, что в результате дает двоичное число 1001, или 9 в десятичной системе счисления. Измеренная частота зависит от периода стробирующего сигнала. Хотя существует несколько вариантов схемотехнической ре­ ализации двоичного счетчика, в упражнениях будут использо- Кас эд Выходы Каскэд2 1 Каск а Вход Синхр. Триггер Рис. 13.6. Синхр. Триггер а Синхр. Триггер Трехкаскадный двоичный счетчик со сквозным переносом. З
Дополнительные упражнения 225 14 11 1 09 Сброс Синхр. 01 012 013 014 06 05 07 04 Vss 2345678 Рис. 1З.7. Логическая схема и назначение выводов счетчика 4020. ваться только схемы, известные как счетчики со сквозным пере­ носом. Счетчик со сквозным переносом - это схема, в которой выход одного бистабильного мультивибратора (триггера) непос­ редственно подключен ко входу следующего за ним мультивиб­ ратора, как показано на рис. 13.6. Выходная частота бистабиль­ ного мультивибратора равна половине входной частоты. КМОП ИС 4020 является подходящей ИС для следующих упражнений. Эта схема представляет собой 14-каскадный дво­ ичный счетчик со сквозным переносом, имеющий входы синх­ ронизации и сброса. Сигнал на выходе каждого каскада изменя­ ет состояние на отрицательном перепаде уровня сигнала на вхо­ де этого каскада. Логическая диаграмма счетчию1 показана на рис. 13. 7. Десяти­ чное значение каждого разряда равно 2N , где N - номер каскада. Обратите внимание, что выходы каскадов 13.2. 2 и 3 недоступны. Упражнения с частотомером В следующих упражнениях для измерения частоты используется ис 4020. 13.2.1. Упражнения «Базовый счетчик» Цель данного упражнения заключается в разработке платы со­ пряжения частотомера и сопутствующего программного обес­ печения для персонального компьютера с использованием РРI­ порта. Счетчик будет измерять и отображать на экране монито[ i t.
226 Глава 13 . . - - - - - - - - - - - - - - - - - - - - - - С1 Строб Сигнальный вход л 1/2 4020 Синхр. 4 5 Выходы 6 7 8 СО Сброс ( Q) 9 10 8ыходза С4 диапазон 74LS1З ~=========== А Счет 7 ] АО Земля - - - - - - - - - - - - - - - - - - - - - - - Земля Рис. 13.8. Логическая схема частотомера. ра соответствующие частоты. Амплитуда входного сигнала дол­ жна лежать в интервале от 2 до 5 В (см. рис.13.8). Логическую схему можно собрать или на макетной, или на печатной плате. Рекомендуется всегда проверять работу аппаратных средств, прежде чем присоединять их к компьютеру. На рисунке 13.9 по­ казана испытательная установка. Генератор сигналов подстра­ ивается для вывода подходящей частоты. Два переключателя логических состояний используются для подачи стробирующе­ го сигнала и сигнала сброса. Светодиоды будут выдавать ин­ формацию о работе счетчика. Для индикации переполнения также следует использовать один светодиод. Чтобы гарантиро- БП 58 Блок светодиодов Земля Источник сигнала 58 Блок переключателей Земля Рис. 13.9. Установка для испытания частотомера. 5 8 Земля
Дополнительные упражнения 227 вать надежную работу триггера Шмитта, минимальное значение амплитуды измеряемого сигналы должно быть ное значение 2 В, а максималь­ - 5 В. Как видно из рис. 13.8, на котором изображена логическая схема счетчика, при получении логической 1 на все выходы счетчика от АО до А7 число сосчитанных циклов будет равно сумме всех степеней двойки от 24 до 211 • Поэтому максимальное сосчитанное число будет равно 16 + 32 + 64 + 128 + 256 + 512 + 1024 + 2048 = 4080 Показание счетчика (сосчитанное число) увеличивается на 1 при подсчете каждых новых 16 циклов, поступающих на вход счетчика. Чтобы получить правильное число входных циклов, программа умножает сосчитанное число на 16, а затем прибав­ ляет 8, что обеспечивает точность± 8 циклов. Измеренная час­ тота будет зависеть от времени, в течение которого входной ло­ гический элемент был открыт для счета. Прежде чем считывать показание счетчика, нужно выждать короткий промежуток вре­ мени (несколько миллисекунд) после запирания логического элемента. Это обеспечивает гарантию того, что все сквозные пе­ реносы завершены. Структура программного обеспечения для упражнения 13.2.1. Инициализировать Порт А используется для ввода показаний PPI, счетчика Порт С: бит 1 используется для очистки счетчика Порт С:бит О используется для стробиро­ вания Порт С: бит 4 получает флажок переполне­ ния Номер разряда Управляющее слово 7 6 5 4 3 2 1 о О А Сн О в CL о о 1 1 о 1 О= о Напечатать команды Напечатать ЧАСТОТА в фиксированной позиции на экране пока нет ввода с клавиатуры 9Ahex
228 Глава 13 Сбросить счетчик и закрыть логический элемент Ждать 1 мс Открыть входной логический элемент Ждать 1 мс Закрыть входной логический элемент Проверить флажок переполнения Прочитать счетчик= n Рассчитать циклы= ((n*lб) + 8) Рассчитать частоту= циклы*lООО/t Напечатать сосчитанное число и частоту Очистить счетчик {СО в состояние логического О} } ВЫХОД ( exit) 13.2.2. Упражнение «Четырехдиапазонный счетчик» Измеряемый частотный диапазон можно изменять путем изме­ нения счетного интервала и умножения входного сигнала с порта А на надлежащий множитель. Модифицируйте програм­ мное обеспечение для обеспечения измерения частоты в четы­ рех различных диапазонах, выбираемых посредством меню. Меню должно также включать пункт автоматического выбора, соответствующий автоматическому программному выбору час­ тотного диапазона. Автоматический выбор будет работать быстрее, если счетчик сначала «проверяет» самый верхний диа­ пазон, а затем «спускается вниз» в следующий диапазон, если сосчитанное число ниже некоторого заданного значения. Аль- Диапазоны счетчика Диапазон 1 2 3 4 Полоса частот (Гц) 8 32 64 128 - 4088 - 16352 - 32704 - 65 408 Рис. 1З.1 О. Диапазоны частотомера. Точность(± Гц) 8 32 64 128
Дополнительные упражнения 229 тернативным вариантом является первоначальная «Проверка» самого низкочастотного диапазона и затем переход к следую­ щему диапазону, если обнаружен сигнал переполнения для дан- ' ноrо диапазона. 13.2.3. Упражнение «Увеличение точности до± Используйте 4-разрядный счетчик, например ИС 1 Гц» 74LS93, для получения двоичных ступеней (каскадов), отсутствующих в счетчике ИС 4020. Как порт А, так и порт В используются для ввода 14-разрядного числа, что дает возможность счета от О до 32767. Если порт А используется для 8 младших разрядов, /*counter.c Эта программа посылает сигнал сброса счетчика от Cl, стробирующий сигнал от СО и вводит показания счетчика через порт А. Время задержки ПоТРебует подСТРойки в зависимости от бысТРо­ действия компьютера. #include <dos.h> #include <stdio.h> #include <math.h> #include <conio.h> #define RESET 2 #define OPEN 1 #define CLOSE О #define OVER 16 */ Cl к логической 1 */ 1, Cl к логическому О*/ /*СО к логическому О, Cl к логическому О*/ /* Используется для проверки наличия логи­ ческой 1 на С4* / int Count(void); int A_Address = ОхЗОО; int C_Address = Ох302; int Control = ОхЗОЗ; int Config = Ох9А; /*СО к логическому О, /*СО к логической /* /* /* /* Задать адрес*/ Задать адрес */ Задать адрес */ Задать конфигурацию: порт А на ввод, порт В на ввод, порт СН на ввод*/ void main() { Листинг 13.2.1. counter.c. CL на вывод, порт
Глава 230 13 outp( Control, Config); outp( C_Address, О); clrscr(); printf("\033[3;5H ЧАСТОТОМЕР. Нажмите любую клавишу мя выхода из программы"); while(!Count()); exit(l ); int Count() { /* int t = 100; Изменить t для изменения час­ тотного диапазона*/ float frequ,n; printf("\033[5;5H "); outp(C_Address,RESET); delay(l); /* Пауза 1 мс */ outp(C_Address,OPEN); delay(t); /* Пауза t мс*/ outp(C_Address,CLOSE); if(inp(C_Address) && OVER) printf("\033(16; lOH Переполнение "); else n = inp(A_Address); fregu=( (n* 16)+8)*( 1000/t); printf("\033[16;10H ЧИСЛО ИМПУЛЬСОВ %4.ОfЧАСТОТА %8.2f +/-8 Гц»,n,frequ); return kЬhit(); Листинг а порт В 1 З.2.1. - для (Продолжение) 6 старших разрядов, то сосчитанное число будет равно count = inp(A_Address) + (inp(B_Address) & ОхЗF) * 512 Обратите внимание, что шестнадцатеричное число ЗF мас­ кирует два неиспользуемых разряда порта В.
Дополнительные упражнения 231 .-~~~~~~~~~~---.С1Строб СО Сброс Сброс1----- 4020 . Синхр . гнальный вход 5 6 7 Выходы 8 9 (Q) 10 11 12 13 14 1/2 74LS13 В5 ~======== во L::::=========== А7 L-..::::================ А4 Сброс _ _ __. Синхр. Выходы (Q) 1 2 З 4 .___ _ дз АО Земля - - - - - - - - - - - - - - - . - · - - - - - Земля Рис. 1 З.11. 13.2.4. Логическая схема счетчика. Упражнение «Автоматическая калибровка» Усовершенствуйте программу таким образом, чтобы компьютер подстраивал время задержки при выборе режима калибровки и подаче сигнала известной частоты. Нет никакой необходимости в калибровке программного обеспечения каЖдый раз, когда оно используется. Калибровка в основном понадобится при инстал­ ляции, поэтому время задержки необходимо записать в файл, чтобы его можно было считывать в процессе работы программы, например при появлении меню на экране. А возможное новое время задержки могло бы быть записано в этот файл при калиб­ ровке счетчика. 13.2.5. Упражнение «Входная схема счетчика» Разработайте такую входную схему, чтобы интерфейсная плата могла работать в широком диапазоне значений амплитуды вход­ ного напряжения (от О, 1 В до 10 В), а также имела входной им­ педанс, сравнимый с импедансом типичного электронно- луче­ вого осциллографа (ЭЛО) (lМОм с параллельно включенной емкостью 30 пФ). Данное упражнение требует от читателя пони­ мания принципов работы аналоговых схем. Входная схема счет­ чика должна удовлетворять следующим техническим требова­ flиям:
232 Глава 13 470ом _ _" t - - . . , . - - - К триггеру Шмитта -sв 22ком Диод, препятствующий появлению отрицательного напряжения на выходе 1мом Земля 1кОм _ _....__ _ _ _ _ __.__ _ _ _ _ ....__~ Рис. 1З.12. Входная схема частотомера. 1) иметь высокий входной импеданс, эквивалентный рези­ стору с сопротивлением конденсатором емкостью 1 МОм, 30 пФ; который шунтируется 2) включать усилитель с коэффициентом усиления 3) включать схему ограничения, не позволяющую амплитуде сигнала превысить величину +5 В. Схему на основе операционного усилителя (рис. 20; 13.12) мож­ но принять за базовую. Однако она имеет два недостатка: 1) требуется двухполярный источник питания± 5 В; 2) граничная частота схемы, зависящая от типа выбранного операционного усилителя, может быть слишком низкой. 13.3. Последовательная передача данных В главе 8 описывался последовательный вывод данных из компьютера с использованием СОМ-порта. Этот способ пере­ дачи данных очень удобен для работы со многими вспомога­ тельными устройствами, но в то же время он имеет ограниче­ ния в силу того, что сигнал передается в формате АSСП-кода. Для многих приложений пересылка данных в двоичном коде является более быстрой и более удобной. Кроме того, она по­ зволяет экспериментатору структурировать свой собственный поток данных. Существуют несколько способов последова­ тельной пересылки двоичных данных, два из которых изложе­ ны ниже.
Дополнительные упражнения 1. 233 Данные могут пересылаться в пакетах с кодом заголовка в начале пакета. Заголовок может включать в себя такую ин­ формацию, как длина пакета, кому он посылается и конт­ рольную информацию для обнаружения ошибок при пе­ редаче. 2. Для целей управления код может быть послан в виде не­ больших пакетов фиксированной длины. Конечно, можно просто вставить в компьютер некоторую плату, предназначенную специально для пересылки двоичного кода. Однако единственное средство, обычно доступное для · экспериментатора, разрядов это использование одного или нескольких параллельного принтерного порта компьютера или РРI-порта. Первый шаг состоит в определении типа используемых дан­ . ных. Если речь идет просто о пересылке чисел, то можно ис­ пользовать двоично-десятичный код 8421 Пример А. Переслать десятичное число (см. гл. 1). 345 10 в формате дво­ ично-десятичного кода с использованием нулевого разряда ·принтерного порта или РРI-порта. Преобразовать 345 в двоичное число 001101000101смР Поместить данные в файл и послать их, используя оператор цикла for(): int Out_Address =адрес РРI-порта или принтерного порта int i; int data[13]={101000101100}; for(i =О; i <13; i++) outp(Out_Address,i) Если используется любой другой разряд порта, то состояние логической 1 представляется числом 2N. Следовательно, при использовании третьего разряда 23 = 8 и передаваемая последова­ тельность в этом файле выглядела бы как {808000808800}. 13.4. Управление шаговым двигателем по линии последовательной передачи данных В следующих упражнениях двоичные данные используются для контроля скорости и направления вращения шаговых двигате-
Глава 234 13 лей. В первом упражнении используется 4-проводное соедине­ ние, обеспечивающее наиболее простую аппаратную реализа­ цию интерфейса. 13.4.1. Упражнение <(Управление двумя шаговыми двигателями по 4-проводной линии последовательной передачи данных» Цель данного упражнения заключается в управлении скоростью и направлением врашения двух шаговых двигателей по последо­ вательной линии передачи данных. Необходимо собрать не­ большую интерфейсную схему последовательно-параллельного преобразования и разработать программу на языке Си. Можно использовать либо РРI-порт, либо принтерный порт. Описание системы Блок-схема аппаратной реализации интерфейса показана на рис. 13.13. Здесь 4 провода, соединенные с компьютером, пред­ назначены для выполнения функций синхронизации, сброса, передачи данных, обшего провода. Синхронизаци~ Сдвиг регистра t-------------1~ Сброс --+---t t-------------1~ Данные 74LS164 Выходы ао 01 02 аз 04 t--+--t 4-разрядный регистр Логическая 1 74 Входы данных LS 175 Синхр. as ав 01 Схема задержки св :,~ОДКJ1ЮЧИТе (~nортуАмя .----+-+---4 с(!/:)ТJ1~ВОГ0 'ifeыa Рис. 13. 13. Структурная схема системы последовательного управления шаговым двигателем.
Дополнительные упражнения 235 Регистр сдвига использует сигналы синхронизации, сброса и анных для преобразования поступающего кода из последова­ ельной формы в параллельную. Регистр данных хранит этот код, пока следующее кодовое слово пересылается и преобразу­ ется. Каждый преобразователь кода изменяет данные из двухразрядного в четырехразрядный формат, необходимый для ра­ . боты двигателей. Управление шаговым двигателем Для управления скоростью и направлением вращения шагово­ го двигателя необходимо подводить к нему постоянно повто­ ряюшуюся последовательность из четырех 4-разрядных двоич­ ных чисел. Для передачи 4 различных чисел нужны лишь два разряда (см. рис. 13.15). Необходимо также отослать один стар­ товый бит, указываюший регистру сдвига на конец слова дан­ . ных. Таким образом, каждое слово щшных будет состоять из 5 бит, как это показано на рис. 13.14" иллюстрирующем пере­ и сылку комбинации 00 к двигателю А и комбинации 1О к двига­ телю В. Как показано на рис. 13.14, сигнал данных пересылается по проводу дттых на вход данных регистра сдвига. Во время пере­ дачи данных на входе сброса регистра сдвига удерживается уро­ вень логической 1 (через провод сброса), а по проводнику сию:­ . рон.изации передаются пять тактовых импульсов. Биты данных сдвигаются в регистре сдвига до тех пор, пока стартовый бит не достигает выхода Q4. Сигнал с этого выхода проходит через схему задержки и затем используется для выбор­ ки (стробирования) сигналов с выходов регистра сдвига Q2 QO, Ql, и QЗ в регистр данных. Две пары сигналов с выходов регист­ ра данных снимаются для двух схем преобразователей кода, ко­ торые вырабатывают 4-разрядный код, необходимый для управ­ ления двигателями. Сигнал синхронизации '----'--Рис. 13.14. Сигнал данных Временная диаграмма типичного сигнала данных.
Глава 236 13 Аппаратное обеспечение Преобразователи кода. Преобразователи кода переводят 2-раз­ рядные коды в 4-разрядные, необходимые для управления дви­ гателями. Последовательность чисел, требующаяся для управле­ ния одним двигателем, следующая: 3, 6, 12, 9 (в таблице истин­ ности на рис. 13.15 эти числа представлены в двоичной систе­ ме). Дополнительной логической схемы может не понадобить­ ся, если входные сигналы в таблице истинности переставить так, как это показано на рис. 13.16. -~-;;;.~~~~ Выходы Входы А в о о а ь о о о 1 о 1 1 о о о с d 1 о о о :,с,;:=.'*'*:,,~"«* Рис. 13.15. ~:111':'9""~~~ ~ ~ w:: .,,,. С'О' ~':<if~ Выходы Входы А в а ь о о о о 1 о о 1 1 1 о о о о о --'«~<:<~:-,, Рис. с d о ~~ 13.16. Из таблицы истинности на этом рисунке видно, что: 1) колонка выхода а совпадает с колонкой входа А; 2) колонка выхода Ь совпадает с колонкой входа В; 3) колонка выхода с инвертирована по отношению к колон­ ке выхода А; 4) колонка выхода d инвертирована по отношению к колон­ ке выхода В. Следовательно, на самом деле никаких логических опера­ ций выполнять не нужно, поскольку в регистре данных имеют­ ся как прямые, так и инверсные (инвертированные) выходы (рис.13.17). Схема задержки. Простым способом обеспечения задержки сигнала на короткое время является использование двух логи­ ческих элементов, показанных на рис. 13.18. В данном случае удобно использовать два логических элемента, входящих в со­ став ИС 74LS14. Данная ИС включает шесть триггеров Шмитrа (рис. 13.19); еще три логических элемента можно использовать
Дополнительные упражнения 237 выводы регистра Соединения данных с двигателем •• •• аа !' "!l Q1 01 QQ Рис. А в А Соединения пре­ 13.17. Вход Выход в Рис. 13. 18. Схе~а задержки. образователя данных. Vcc А6 06 AS 05 А4 аз 74LS14 А1 Рис. д2. 01 02 АЗ 03 Земл~ 13.19. Назначение контактов ИС 74LS14. в качестве входных буферов к интерфейсной схеме, если воз­ никнет необходимость работы на некотором удалении от ком­ пьютера. Регистры сдвига. Регистр сдвига состоит из нескольких кас­ кадно соединенных одноразрядных ячеек памяти. В регистрах сдвига можно использовать самые разнообразные схемы с двумя состояниям, лишь бы они бьши соединены таким образом, что- Вывод параллельных данных данных а D а D т Син св D а т Син св а D т Син св Синхронизация Сброс ,'Рис. 13.20. Логическая схема 4-разрядного регистра сдвига. ,, т Син св
Глава 238 13 Vcc 12 13 11 07 06 10 05 Q4 СВ Сокращения: СР DSA - Данные А DSB -Данные В (не используется) СВ - Сброс ведущего при установке 74LS164 DSA OSB 00 01 02 аз Земля логического О СР Рис. 1 З.21. - Вход синхронизации Назначение контактов регистра сдвига. бы на каждом тактовом импульсе данные продвигались в реги­ стре на одну ячейку вправо или влево. Четыре D-триггера, опи­ санные в гл. 2, показаны на рис. 13.20 в схеме, представляющей собой последовательно загружаемый и параллельно выгружае­ мый регистр сдвига. Регистры сдвига могут сдвигать данные как вправо, так и влево, либо могут быть двунаправленными. Другими типичны­ ми применениями регистров сдвига являются: 1) параллельно-последовательное преобразование данных, 2) умножение или деление двоичных чисел на степени двойки, 3) кольцевое перемещение двоичных слов (обычно для уп­ равления щаговыми двигателями). ИС 74LS164 - это 8-разрядный регистр сдвига, сдвигающий данные вправо на каждом тактовом импульсе. Назначение вы­ водов этой ИС показано на рис. 13.21. Регистр данных. Регистр данных может состоять либо из 4, либо из 8 триггеров D-типа, объединенных в одной ИС. ИС, используемая в данном упражнении, щqrючает 4 тригге­ ра как с прямыми (Q), так и с инверсными (Q) выходами. Ре­ гистр данных на рис. 13.22 - это ИС 74LS175, которая хранит данные до того момента, пока следующее слово данных не будет получено из регистра сдвига. 16 vcc аз аз СВ 00 00 оз 02 02 ао СР 74LS175 Рис. 1З.22. 00 01 01 01 Земля Назначение контактов регистра данных.
Дополнительные упражнения 239 Двоичная комбинация 00 01 11 10 а ь 23 23 23 67 67 67 67 Рис. 23 1 З.23. Таблица чисел при пере­ даче бита. Программное обеспечение. Разработайте программный код, который будет осуществлять пересылку трех сигналов, показан­ ных на рис. 13.14. Запишите 2-разрядный код для представления каждого бита, предназначенного для вывода. Синхронизирующий сигнал в разряде О ской 1, вывод - импульс логиче­ - 01. Сигнал сброса в разряде ки данных, вывод - 22. 1- Сигнал данных в разряде либо логической 1, вывод логическая 1 во 2 может быть - 00 или 44. время пересыл­ либо логическим О, Теперь объедините три выходных сигнала для передачи синхронизация синхронизация + + сброс +данные О = сброс +данные 1= 23 67 Последовательность битовых пар (аЬ), необходимая для вра­ щения двигателя по часовой стрелке согласно рис. 13.16 следую­ щая: 00, 01, 11, 10. Файл чисел, необходимый для пересылки лю­ бой битовой пары, приведен в таблице на рис. 13.23. Последовательное управление двигателем Входные данные для двигателя А: Входные данные для двигателя В: скорость и скорость и направление направление вращения вращения * * Выход из Двигатель А: Двигатель В: программное программное при нажатии управление управление клавиши программы Рис. 1 З.24. Структурная схема программного обеспечения к упражне­ нию 13.4.1.
240 Глава 13 Для вращения против часовой стрелки последовательность битовых пар обращается. На рисунке 13.24 приведена структур­ ная схема программы для данного упражнения, а сама програм­ ма приводится в листинге 13.4.1. Тестирование системы Используемые аппаратные средства можно протестировать пу­ тем присоединения логических переключателей таким образом, чтобы они действовали как имитаторы сигналов синхрониза­ ции, сброса и данных. Если вводятся правильные сигналы, их прохождение через регистр сдвига можно проконтролировать с помощью логического пробника. Петлевое тестирование пол­ ной системы можно провести путем подключения выводов ре­ гистра данных к компьютерному РРI-порту А. Выходные сигна­ лы регистра данных затем считываются после каждой посылки кодовой последовательности. 13.4.2. Упражнение <(Использование двухпроводного кабеля и общего провода для управления двумя шаговыми двигателями» Эта модификация предьщущего упражнения удаляет линию синхронизации из системы, поэтому возникает необходимость в генерации синхронизирующих сигналов самим интерфейсом. R Тактовые л л импульсы ~ Триггер Шмитта 74LS1З Земля Вход запуска Примечания R может лежать в диапазоне от 1 ком до 4 С должно быть больше, чем 100 нФ Рис. 13.25. кОм Схема генератора тактовых импульсов.
Дополнительные упражнения Одна из возможных схем показана на рис. 13.25. 241 Нужно будет подстроить частоту этого генератора, чтобы обеспечить его син­ хронизацию с передаваемым кодом в течение пяти тактовых им­ пульсов во время передачи. Для обеспечения синхронизации необходимо перезапускать генератор тактовых импульсов с по­ сылкой каждого нового кодового слова. Это можно сделать пу­ тем подключения входа разрешения генератора к линии сброса. Поскольку отпадает необходимость в передаче тактового им­ пульса, следует изменить СW-файл (листинг 13.4.1) в программе к данному упражнению. 13.4.3. Упражнение «Последовательное управление тремя шаговыми двигателями» Это упражнение предполагает включение в состав аппаратных средств дополнительного шагового двигателя С (никаких других дополнительных компонентов не требуется). Нужно добавить еше одну программную последовательность для двигателя С. Передаваемое кодовое слово будет теперь 7-разрядным. /*serialmt.c Программа для последовательного управления двумя ша­ говыми двигателями*/ #include <stdio.h> #include <string.h> #include <dos.h> void Start(); int Rotate(int); /*Адрес управляющего регистра*/ int Control = ОхЗОЗ; int Out_Address = ОхЗО 1; /* Базовый адрес+ 1 */ /* 99 hex конфигурирует порты следующим int Config = Ох98; образом: порт А - ввод, порт В - вывод, порт CL - вывод, порт СН - ввод */ /* Это число управляет скоростью вывода int hold = !; данных*/ void main() { int motorA,motorB; int sequenceA =О, counterA =О; int sequenceB =О, counterB = О; Листинг 13.4.1. serialmt.c.
Глава 242 13 char Adir ='F'; cliar Bdir ='F'; outp( Control, Config); printf("\033[2JCкopocть двигателей определяется некоторым числом. Чем\n"); printf("бoльшe число, тем медленнее двигатель. Положительные числа\n"); рrintf("вызывают врашение двигателя по часовой стрелке, а отри­ цательные\n"); printf("чиcлa - против часовой стрелки.\n\n"); printf("Haжмитe любую клавишу для выхода из программы при ра- ботаюшем двигателе.\n"); printf("\nBвeдитe число для двигателя А"); scanf("%i",&motorA); if (motorA < О) { motorA= motorA* - 1; Adir='R'; printf("\nBвeдитe число для двигателя В"); scanf("%i",&motorB); if(motorB <О) { motorB = motorB* - 1; Bdir ='R'; } do Start(); if (counterA ==О) { sequenceA ++; counterA = motorA; } if (sequenceA > 3) sequenceA = О; counterA - - ; Листинг 13.4.1. (Продолжение) /* /* Сброс и стартовый бит Управление мотором А */ */
Дополнительные упражнения 243 if (Adir ==' F') /* Пересылка битовой пары к двигателю А*/ Rotate(sequenceA); else Rotate(3-sequenceA); /* Управление двигателем В */ if (counterB == О) { sequenceB++; counterB = motorB; } if(sequenceB > 3) sequenceB = О; counterB--; if (Bdir == 'F') /* Пересьmка битовой пары к двигателю В*/ Rotate(sequenceB); else Rotate(3-sequenceB); }while(!kЬhit()); exit( 1); void Start() { static int start[3] = {0,6,7}; int i; for(i =О; i < 3; i++) { delay(hold); outp(Out_Address,start[i)); int Rotate(int sequence) { static int CW[4][4] = {2,3,2,3, 3,2,6,7, 6,7,6,7 6,7,2,3}; int i; Листинг 13.4.1. (Продолжение) /*о о*/ /*о 1 */ /* 1 1 */ /* 1 о*/
244 Глава 13 for(i =О; i < 4; i++) { delay(hold); outp(Out_Address,CW[sequence][i]); return; Листинг 13.4.1. (Продолжение)
, Глава 14 Контрольно-измерительная . аппаратура • 14. 1 . и тестирование Контрольно-измерительная аппаратура 14.2. Проблемы аппаратного обеспечения 14.3. Тестирование РРl-портов 14.4. Тестирование параллельного принтерного порта 14.5. Конструкция блоков светодиодов и переключателей 14.6. Устройство управления шаговым двигателем 14. 7. Проблемы программного обеспечения Эта глава содержит описание контрольно-измерительной аппа­ ратуры, необходимой для проведения экспериментов. Здесь рассматриваются также методы тестирования, способы обнару­ жения неисправностей и их устранения, конструктивные осо­ бенности блоков светодиодов и переключателей, используемых для различных экспериментов. Шаговые двигатели, продаваемь1е для учебных целей, обь1ч­ но выпускаются в комплекте с интегральной схемой управления двигателем, смонтированной на одном с ним основании. Одна­ ко для полноты картины в разделе 14.6 рассматривается под­ ключение коммерческого шагового мотора к отдельной управ­ ляющей ИС. 14.1.Контрольно-измерительная аппаратура Источник питания. Хотя все необходимь1е напряжения можно получить от компьютера, такая «экономия» на отдельном источ­ -ике питания может привести к печальным последствиям - до-
Глава 246 14 статочно одного короткого замыкания, чтобы вывести из строя компьютер. Для питания экспериментальных схем следует ис­ пользовать источник питания с выходными напряжениями и± 12 ± 5В В. Немаловажно, если в источнике питания будет преду­ смотрена индикация выходного напряжения и защита от корот­ кого замыкания. Источник питания с регулируемым выходным напряжением от О до 10 В также будет полезен. Логический пробник. Логический пробник - недорогое и весьма полезное устройство для проверки логических состоя­ ний. Однако, если логический пробник отсутствует, то его впол­ не может заменить обычный вольтметр. Мультиметр (универсальный измерительный прибор). Важный контрольно-измерительный прибор для обнаружения неисп­ равностей. Поскольку он необходим только для считывания на­ пряжений постоянного тока до 12 В и обнаружения разрывов в электрических цепях, достаточно иметь простейший мульти­ метр. Некоторые считают, что аналоговый мультиметр более удобен, чем цифровой. Электронно-лучевой осциллограф (ЭЛО). Этот контрольно-из­ мерительный прибор нужен главным образом для проверки формы сравнительно низкочастотных сигналов при выполне­ нии упражнений с использованием цифро-аналогового преоб­ разователя, поэтому и здесь ничего сверхсложного от прибора не потребуется. Генератор сигналов. Для эксперимента со счетчиком нужен лишь простой генератор сигналов. Запоминающий осциллограф. Этот дорогой прибор требуется для выполнения упражнения с последовательным портом в гл. 8. По­ скольку нужно измерять лишь сравнительно низкие частоты, сле­ дует остановить свой выбор на наиболее дешевом запоминающем осциллографе, удовл~творяющим всем остальным требованиям. 14.2. Проблемы аппаратного обеспечения В этом разделе описываются некоторые типичные проблемы и их решения. 1. Перед подачей напряжения на электрическу~о схему вся­ кий раз дважды проверьте все соединения. По возможно­ сти пригласите еще кого-нибудь для проверки. 2. Соблюдайте осторожность при подключении много­ штырьковых электрических вилок и розеток к компьюте-
Контрольно-измерительная аппаратура и тестирование 247 ру. Всегда следите за тем, чтобы вилочная и розеточная ча­ сти разъема вставлялись друг в друга по прямой линии. При небрежном выполнении соединения очень легко ис­ кривить штырьки, что может привести к коротким замы­ каниям. 3. Удостоверьтесь, что все заземляющие соединения выпол­ нены надлежащим образом. «Земля» источника питания должна быть соединена с «Землей» компьютера. Точно так же клеммы заземления на блоках переключателей, свето­ диодов и контрольно-измерительных приборах должны быть соединены с общим проводом заземления, подклю­ ченным к «Земле» источника питания. 4. При первом включении схемы убедитесь, что интеграль­ ные схемы не становятся слишком горячими. При появле­ нии дыма немедленно выключите схему. 5. Используйте вольтметр для проверки того, что источник постоянного тока соединен со всеми устройствами, к ко­ торым он должен быть подключен. 6. По возможности удостоверьтесь в том, что внешние уст­ ройства и схемы работают надлежащим образом еще пе­ ред подключением их к компьютеру. 7. Подключите блоки переключателей к блокам светодиодов и убедитесь в том, что все переключатели и все светодио­ ды работают нормально. 8. Если источник питания имеет ограничитель выходного тока, проверьте правильность установки уровня ограни­ чения. Он должен работать как эффективный ограничи­ тель тока, но не должен вызывать уменьшения выходного напряжения. 9. Соблюдайте осторожность, когда вынимаете интеграль­ ные схемы из плат или держателей. Лучше всего делать это с помощью маленькой отвертки ПРИ ВЫКЛЮЧЕННОМ ИСТОЧНИКЕ ПИТАНИЯ. 14.З. Тестирование РРl-портов Для того, чтобы протестировать порты на правильность ввода и вывода данных, лучше всего использовать самые простые аппа­ ратные и программные средства. С учетом этого в следующих
248 Глава 14 разделах приведены только самые простые базовые программы. Простейший способ создания соединений с отдельными выво­ дами портов - использование модуля, аналогичного тому, сни­ мок которого был приведен в гл. 8, и который выпускается про­ изводителями электронного оборудования. 14.3.1. Тестирование РРl-порта на правильность вывода данных На рисунке 14.1. показана схема соединений для выполнения теста вывода данных и листинг 14.3.1, обеспечивающий все возможные рабочие условия. Запустите эту программу три раза с тремя различными значениями переменной test, как это указа­ но в листинге. test = О выключает все светодиоды test = FF включает все светодиоды test = 55 включает дополнительные светодиоды. /*ppitestl.c Установка логического О на всех выходах*/ #include <dos.h> /*Требуется для outp() */ #include <stdio.h> /*Требуется для printf() */ /*Проверьте правильность этих адресов для int Control = Ох303; вашего компьютера */ int A_Address = Ох300; int B_Address = Ох301; int C_Address = Ох302; int config = Ох80; /* Установка всех портов на вывод данных*/ int test =О; /* test =О, или Ох55, или OxFF*/ void main() { outp( Control,config); outp(A_Address,test); outp(B_Address,test); outp(C_Address,test); printf("\n Выводы %ОХ к PPI \n",test); Листинг 14.З.1. ppitestl.c.
Контрольно-измерительная аппаратура и тестирование 249 Компьютер о 1 2 з РРl-порт /\. 4 4 5 Логический пробник 6 1 РРl-порт С 2 3 4 5 6 Рис. Источник питания 14. 1. Схема аппаратных соединений для выполнения теста вывода данных с помощью программируемого параллельного интерфейса (PPI).
250 Гnава 14.3.2. 14 Тестирование РРl-порта на правильность ввода данных Аппаратное обеспечение для этого теста включает в себя блок переключателей, описанный в разделе показана на рис. 14.2. 14.5. Схема подключений Перед началом теста проверьте сигналы на выходах блока переключателей. /*ppitest2.c Ввод данных с РРI-портов */ /*Требуется для outp() */ #include <dos.h> #include <stdio.h> /* Требуется для printf() */ /*Требуется для gotoxy() */ #include <conio.h> int Coпtrol = Ох303; /* Проверьте правильность этих адресов для вашего компьютера */ int A_Address = Ох300; int B_Address = Ох301; int C_Address = Ох302; int config = Ох9В; /* Установка всех портов на ввод данных */ void main() { int У, i; outp( Control,config); printf("\n Ввод с РРl-портов. Нажмите лtобую клавишу для выхода из программы \n"); printf("\n ПОРТ А ПОРТ В ПОРТ С"); printf("\n 7 6 5 4 3 2 1 О 7 6 5 4 3 2 1 О 16 5 4 3 2 1 O\n"); Y=wherey(); while(!kЬhit()) gotoxy( 1, У); for(i = 7; i >-1; i--) printf("%i ",((inp(A_Address) >>i)&l)); printf(""); for(i = 7; i >-1; i--) printf("%i'',((inp(B_Address) >> i)&l)); printf(""); for(i = 7; i >-1; i--) printf("%i",((inp(C_Address) >> i)&l)); Листинг 14.3.2. ppitest2.c. ·~
Контрольно-измерительная аппаратура и тестирование 251 --------- . JX lldp КОНТАКl РАЗРЯД ,.. ,.." о " 1 ? ",.. ,.." 2 3 } ..... ,' ,.." "... ,.." ",.. 4 РР!-порт А .. 5 6 7 < KOHTAKl ",.. о 3 4 Q с: >< ф r' 5 6 " 6 7 " 7 "... " "" 1 ',.( о а. с: ф LO с Vcc Земля Земля r--. Разрешение 1 <•• •. "" 2 "",.. ..." " "" 5 6 "" 7 Рис. - ( РАЗРЯД г :т ... 3 4 ... ф ro о явш. с: ... "... ... 5 РРl-порт С ф 2 3 4 jfj ;::;:: 1 ,.." 2 КОНТАКl ·········· о ",.. 1 РРl-порт В Переключатель РАЗРЯД i. Земл " " Источник ~ll~ия 1 ов '/ 58 k ' 14.2. Схема аппаратных соединений для выполнения теста ввода дан­ ных с помощью программируемого параллельного интерфейса (PPI).
252 Глава 14 Подсоедините блок переключателей к каждому порту пооче­ редно, запустите программу ppitest2.c для каждого порта, пора­ ботайте поочередно с каждым отдельным переключателем бло­ ка, проверьте, что каждый бит может быть сброшен в состояние логического О и установлен в состояние логической 14.4. 1. Тестирование параллельного принтерного порта Подключите принтерный порт так, рис. 14.3, запустите программу ными значениями переменной тем запустите программу как это показано на ptrtestl три test, раза с тремя различ­ как указано в листинге. За­ ptrtest2 и проверьте правильность вво­ да данных, используя блок переключателей (см. рис. 14.3). Переключатель о 1 1 4 2 2 5 з з 6 4· 4 7 5 5 >S ф с; ф f- 8 6 6 9 7 7 Земля ~ :т Q с; :.: :.: ф о а. с; ф 11.1 t: Vcc Земля Разрешение 1 2 Base + 1 Рис. 14.3. 15 Логический пробник з 13 4 12 5 10 6 Соединения для тестирования принтерного порта.
Контрольно-измерительная аппаратура и тестирование 14.4.1. 253 Программа для теста вывода данных /*ptrtestl.c Вывод О на принтерный порт*/ #include <dos.h> #inc\ude <stdio.h> /* Базовый адрес принтерного порта */ int Out_Address = Ох3Ьс; int test =О; /* test =О, или ОХ55 или OXFF* / void main() { outp(Out_Address,test); printf("Bывoд %ОХ на принтерный пopт",test); Листинг 14.4.1. ptrtestl.c. 14.4.2. Программа для теста ввода даимых /*ptrtestl .с Ввод данных с принтерного порта*/ #inc\ude <dos.h> #inc\ude <stdio.h> #include <conio.h> int In_Address = Ох3Ьd; /* Базовый адрес + 1 */ void main() { int data,i,Y; printf("\n Ввод с принтера. Нажмите любую клавишу для выхода из программы"); printf("\n Ввод с контакта 11 инвертирован\n\n\n"); printf("\n Выводы (контакты) 11 1О 12 13 15"); printf("\n Биты 7 6 5 4 3\n"); Y=wherey(); while(!kЬhit()) { data = inp(ln_Address); gotoxy(9,Y); for(i = 7, i > 2; i --) printf("%i ",(data > > i)&l); Листинг 14.4.2. ptrtest2.c.
Глава 254 14.5. 14 Конструкция блоков светодиодов и переключателей Двумя полезными устройствами, необходимыми для выполне­ ния многих упражнений, являются блок светодиодов (СИД) для использования в качестве выходного 8-разрядного индикатора и блок переключателей для «питания» входов. Конкретные при­ меры этих устройств приводятся в следующих подразделах. Аль­ тернативный подход заключается в использовании комбиниро­ ванного блока индикаторов и переключателей, как это описы­ вается в разделе 14.5.1. 14.5.3. Блок светодиодов В своей основе блок светодиодов состоит из восьми входных клемм и восьми светодиодов. Однако между этими клеммами и светодиодами необходимо включение некоторого буфера, что­ бы блок не нагружал 1 схему, к которой он подключен. Сущест­ вуют две альтернативные схемы. На рисунке 14.4 показан свето­ диод с буферным логическим элементом. Для блока потребует­ ся восемь подобных схем. Вход +58 j Логическая 1 включает СИД Рис. 14.4. 1 Включение светодиода через буферный логический элемент И-НЕ. Это наиболее предпочтительный способ включения светоди­ ода через буферный логический элемент И-НЕ ПЛ-семейства. Яркость свечения светодиода зависит от прямого тока, который может изменяться в диапазоне от 1 мА до 40 мА. Обычная ТТЛ­ схема может принимать 2 ток величиной 16 мА в состоянии логи- 1 «Нагрузка» в этом смысле вызывает потребление дополнительного тока с выходов нагружаемой схемы, что может привести к нарушению ее работы. 2 «Принимать» в данном контексте означает пропускать или проводить (ток) без опасности повреждения микросхемы.
17 18 16 15 14 13 12 5 6 7 2ВОЗА 2 з 4 11 Земля 9 в Октальный вход Примечания Логическая 1 включает светодиоды R = 220 Ом Рис. 14.5. 8-разрядный формирователь для блока светодиодов. ческого О. Эта величина определяет минимальное сопротивле­ ние резистора R = 220 Ом. Компоненты, необходимые для светодиодов с буферными логическими элементами И -НЕ: Наименование Количество счетверенные, 2-входовые логические элементы И- НЕ Резисторы 220 Ом Светодиоды Клеммы Монтажная или печатная схема 7400, 2 8 8 10 На рисунке 14.5 показаны восемь светодиодов, подключен­ ных к 8-разрядному формирователю Дарлинггона с общим эмиттером (ULN2803A). Компоненты, необходимые для формирователя Дарлинrгона (рис. 14.5): Количество 1 8 8 10 Наименование Формирователь Дарлинrгона 2830А Резисторы 220 Ом Светодиоды Клеммы Монтажная или печатная схема
Глава 256 14.5.2. 14 Блок переключателей Подходящая схема блока переключателей показана на рис. 14.6. В ней используется ИС 74LS245 (разводку контактов см. в гл. 2). Для расширения функциональных возможностей блока пере­ ключателей схема дополнена выводом (клеммой) для подачи сигнала разрешения. Этот вывод должен быть соединен с «зем­ лей», если он не используется. R Входные контакты 74LS245 Выходные контакты +58 Выходные клеммы Разрешение Земля Примечания При замыкании переключателя на выходе логический О R = 1 кОм Рис. 14.6. Схема блока переключателей. Компоненты, (рис. 14.6): Количество для блока переключателей Наименование ИС 74LS245 Резисторы 1 кОм Однополюсные переключатели Клеммы Монтажная или печатная схема 1 8 8 12 14.5.3. необходимые Экономичный блок переключателей/светодиодов На рисунке 14.8 показана схема «экономичного» варианта блока пе­ реключателей, использующая 8-разрядный переключатель с двух­ рядным расположением выводов. Светодиоды включены в схему
Контрольно-измерительная аппаратура и тестирование Рис. 257 14. 7. Блок переключателей/светодиодов. о Входные/выходные клеммы Примечания ''~"§' СИД А включается при выборе светодиодов R1=1 кОм R2 = 270 Ом Рис. 14.8. Комбинированный блок переключателей/светодиодов.
Глава 258 14 таким образом, чтобы обеспечивать индикаuию как вводимых, так и выводимых сигналов. В приведенной э,1ектрической схеме свето­ диод А загорается, когда переключатели находятся в выключенном состоянии. Снимок этого блока приведен на рис. 14.6. 14.7. Устройство управления шаговым двигателем Шаговые двигатели, продаваемые для учебных целей, обычно выпускаются в комплекте с интегральной схемой управления Рис. 14.9. Коммерческий шаго­ вый двигатель. •,:\ 'f' БитЗ Бит2 58 о ,~ Vss D4 J1 , F. 04 54 1 <; sэ аз DЭ EN2 2 01 S1 Земля з1 4 5 6 S2 7 02 D2 Vss в1 9 10 '~О 2 А L.293E EN1 01 1 1 ,, 1J 12 ,1 Земля - э в 4 в Шаговый двигател ь 1 08 58 Бит 1 Бито Рис. 14.1 О. Шаговый двигатель и ИС управления двигателем.
Контрольно-измерительная аппаратура и тестирование 259 двигателем (драйвером), смонтированной на одном с ним осно­ вании. Если используется отдельный коммерческий шаговый двигатель, его можно подключить к ИС управления шаговым двигателем L283E по схеме, показанной на рис. 14.10. Детальное описание соединений должно быть приведено в сопроводитель­ ной документации к шаговому двигателю. 14. 7. Проблемы программного обеспечения Последний раздел имеет отношение к проблемам исполняемого программного обеспечения. Очевидно, что конкретная про­ грамма должна быть успешно скомпилирована с целью получе­ ния исполняемого файла (имя.ехе). Важно соблюдать меры предосторожности при работе со сво­ ими программами. Используйте по меньшей мере два диска: один для разработки программы и другой для ее резервирова­ ния, на втором следует хранить законченную работу. А не то можно получить разрыв сердца, если будет поврежден единст­ венный диск, на котором хранятся все ваши программы, и с не­ го не удастся прочитать записанную туда информацию. Не за­ бывайте, что диски - очень «деликатные» устройства и должны всегда переноситься в коробках. Ниже перечислены те моменты, на которые следует обратить особое внимание в том случае, когда возникают какие-либо проблемы с функционированием интерфейса. 1. Если не удается передать данные с использованием неко­ торой аппаратной реализации интерфейса, то первое, что приходит в голову, это реализовать данный интерфейс с другим компьютером. ОСТЕРЕГАЙТЕСЬ ПОДОБНОЙ ПРАКТИКИ! Испорченный интерфейс может повредить все имеющиеся компьютеры. Однако неплохой идеей яв­ ляется проверка и замена соединительных кабелей. 2. Если при выводе данных через порт получается не та ин­ формация, printf() которая ожидается, замените оператор на оператор outp() и посмотрите, что появится на экране. 3. Если при вводе данных через порт получается не та ин­ формация, которая ожидается, замените оператор на inp() getch() и посмотрите, как вводятся данные с терминала.
260 4. Глава 14 Большинство компиляторов позволяют работать в режиме пошаговой проверки, т. е. исполнять программный код по одной команде за один раз. Это полезный режим для об­ наружения точки «зависания» программы. При этом мож­ но также отслеживать значения переменных. 5. И вновь следует подчеркнуть, что отсутствие заземления может привести к необычным результатам. Иногда только некоторые специфические состояния схемы будут казать­ ся необычными, например появление логического О или логической 1 на всех входах.
мш: 1 !! >.::i.*iit.~~..........................................._ _ _ _ _ _ _ _ _ _ _ _ __ Список литературы Вlack, Ulysses D. (1989) Data Networks. Prentice Hall Coleman, Derek (1994) Object-oriented Development. Prentice Hall Dewar, R. В. К. and Smosna, М. (1990) Microprocessors: А Programmer's View. McGraw-Hill Mano, М. М. (1993) Computer Systems Architecture. Prentice Hall Mitchell (1986) 32-Ыt Microprocessors. Collins Waite, Mitchell and Prata, Stephen (1990) New С Primer Plus. Howard W. Sams & Со. Waites, Nick and Кnot, Geoffrey (1990) А Level, ВТЕС and First Degree Computing. Business Education PuЫisher Ltd Whitworth, Ian R. (1984) 16-blt Microprocessors. Collins Wilkinson (1987) Digital Design Systems. Prentice Hall Zaks, Rodnay (1982) Programming the Z80. Sybex Литература, выпущенная производителями (1993) 80C51-Based 8-Bit Microcontrollers. North American Philips Corporation (1998) TMS329 DSP Product Overview. Texas Instruments (1995) Z80 Microprocessor Family. Zilog (1987) Microsoft MS-DOS User's Guide and User's Reference. Microsoft Corporation. Дополнительно рекомендованная литература па русском языке Данкан Р. Профессиональная работа в MS-DOS: М.: Мир, 1992 2001 Джамса К. Учимся программировать на языке С++: М.: Мир,
Предметный указатель # include 122 ОЕ \п О/Р 122 37-39, 50 179, 192, 215 А052 РС64 ANSI 30 PPI 154, 156-169 РРl-порт 247-252 printf() 123 Q 32 RD 39, 44, 50, 60 read() 134 FR 178 RISC 73, 86-88 sizeoj{) 125 АSСП-код 25-29 Base 156, 200, 201 вs 30 BUSAK67 BUSRQ 67 св 238 СР 238 cs 38, 39, 50 scan/126 CISC 73, 83-86 SP 53, 67 сот-порт 103, 143, 147, 148-152 void 122 DO 53 "Vsl75 DD40 WE 38, 39, 50 define 124 WR39, 50 DSР-микропроцессоры 98 ЕО 36 EN44 fjlush() 130 for getch () 122 hex 18 НТN-фильтры INT 50, 67, 68 int character 122 1/Р 226 main () 122 MREQ 50,60 NMI 50, 67,68 Адрес базовый 1.· 156, 200, 201 , 69-70 адресация векторная АЛУ57 АМ99 амперсант 126 аналого-цифровой преобразова­ тель 88, 100, 187-199 арифметико-логическое устрой­ ство АЦП 57 88, 100, 187-199
Предметный указатель Байт 85 индикация мультиплексная бит стартовый 144, 147 - стоповый 144, 147 - четности 25, 144, 147 блок переключателей 256-258 - светодиодов 54, 254, 256 бод 144 БП 157, 254 буфер с тремя состояниями 37-40 - - - счетверенный 37 - - - 8-разрядный 39, 40, 43 - - - - двунаправленный 40 ВБП99 вольтметр 197-199, 214-219 вход разрешения 44 - виртуально заземленный 176. выбор микросхемы 38 ис 263 93 33, 76, 98 Карта распределения памяти 54 152, 162, 163, 167 кмоп 33-35, 222 код операции 61 - двоично-десятичный 17 - машинный 51 - семисегментный 47 компилирование 120 компоновка 120 кэширование 79, 80 квитирование кэш-память с прямым отображе­ нием 80 Логическая 1 145 145 логический О Генератор функциональный 182- 186, 211-214 Мантисса меню Двигатель шаговый 169-174, 208-211, 233-244? 258 22, 23 138 микроконтроллер ный однокристаль­ 76, 88-90 микропрограммное обеспечение ДДК17 дешифратор адреса 36, 44, 53 дополнение до 2 20, 21 доступ к памяти прямой 67 дуплекс полный 14 7 49,51 микропроцессор 48, 55, 73-105 99 - широтно-импульсная 90, 97 модуляция амплитудная МП55 Запись 39 Запрос шины 67 Направление передачи данных 40 НБП99 Измеритель потока воздуха импульс стробирующий - тактовый 92 Обеспечение микропрограммное 42 49,51 77 индикатор семисегментный 46, 47 оборудование периферийное 50
Предметный указатель 264 ·~~~~~~~~~~~~~~~~~ приемник ОБП99 обработка конвейерная - 98 ОЗУ 38, 45, 52, 53 окна регистров перекрывающие­ прямое преобразование двоичных 80 операнд чисел 61 оперативное ройство запоминающее уст­ - 146, 147 данных последователь- 143, 232 асинхронная 85 85 параллельная 154 синхронная 119, 122 локальные 119, 122 переносимость 118 петля гистерезиса 222 ПЗУ 51, 53 платьr 102, 103 подтверждение шины регистры спецназначения 67 полный дуплекс 14 7 152 порт сот- 103, 143, 147, 148, 150-152 - последовательный 103 - принтерный 103, 200-244, 252, 253 порядок 22, 23 порядки смещенные 23, 24 полудуплекс постоянное ройство запоминающее уст- 51, 53 преобразователь цифро-аналого- 57 144, 156 - диспетчера 85, 88 - пользователя 85, 88 режимы адресации 61-64, 85 резистор обратной связи 178 режим Сброс 51, 52 237 сегмент 77 св сигнал синхронизации - выбора мик)осхемы - записи вый 101, 175 67-72 - маскируемое 67, 68 - немаскируемое 50, 67, 68, 70 прерьrвание 37 по записи 38, 39 расширение .с 120 -.com49 - .ехе 120 - .hex49 - .lst 49 - .obj 120 регистр 176 - верхний 25 - НИЖНИЙ 25 - состояния 57, 58 - управляющий 156 - переменные глобальные - 100 Разрешение по выходу передатчик передача 15-17 112 псевдокод ПФ 38, 45, 52, 53 IЩП67 ная 40 51 производительность МП 77-83 пространство адресное 44 программа начальной загрузки сигналов ся 147 приемопередатчик октальный 77 52 38 направления передачи данных 40 39 стробирующий управляющий 42,220
Предметный указатель - чтения 39, 44 93, 254 сид - - символы алфавитно-цифровые система асинхронная - шинная слово усилитель операционный 176, устройство арифметико-логиче­ ское - 85 154 57 периферийное 105 постоянное запоминающее 15 49, 51,53 состояние высокого импеданса - оперативное запоминающее 38, 45,52,53 37,67 - 82 187 198, 218 43 управляющее СМР 25 145 85 -длинное - микропрограммное уровни квантования 265 логическое - 30 соединения мультиплексные с тремя выходными состояния­ ми 77 37 - 41 спд СР 109-112 238 средства аппаратные - программные 48, 49, 146 Файл выполняемый 48 ССР19 стек 54 структурное программирование Джексона сумматор 109-112 57 счетчик команд - 64 со сквозным переносом считывание 44 схема интегральная - логическая действия 225 33, 76, 98 последовательного 42 - синхронизации т 225, 237 52 таблица истинности - триггер - 30-41 65, 66 Шмитrа 220-223 трассировки защелка42 тrл 33-35, 221 Указатель стека управление 53, 64 микропроцессором аппаратное 82 - исходного кода 123 119 объектный 123 118 регистров 80 помощи с расширением .com 49 120 с расширением .hex 49 с расширением .lst 49 фиксатор D-типа 42 фильтр 100 фильтрация цифровая 101 ФНЧ 100 формат команд МС 68000 85 функция языка СИ# include 122 - - - \п 122 - - - define 124 - с расширением .ехе - -for - getch () 122 - int character 122 -main () 122 - - - printf() 123 - - - scanj126 функции пустые 141
266 ЦАП Предметный указатель Шина адресная 101, 175 цифрово-аналоговый преобразо­ ватель 101, 175 52, 75 - данных 53, 74, 75 - - параллельная 76 - управляющая 53 шинная система 43 Частота тактовая 51, 74 220, 225-232, числа двоичные 15-17 - с плавающей точкой 22-24 - со знаком 19-22 - шестнадцатеричные 18, 19 частотомер • Элементы логические эло 182 Язык ассемблера 49 30-35
. i , Учебное издание Джордж Смит Сопряжение компьютеров с внешними устройствами Уроки реализации Зав. редакцией Т. Г. Хохлова Ведущий редактор Н. М. Савина Художник В. П. Григорьев Художественный редактор Н. В. Зотова Технический редактор Е. В. Денюкова Оригинал-макет подготовлен Е. В. Денюковой Лицензия ЛР № 010174 от 20.05.97г. Подписано к печати 20.10.2000г. Формат 60 х 90/16. NewtonC. Печать офсетная. Объем 8,50 бум. л. Усл.-печ. л. 17,00. Уч.-изд. л. 14,37. Изд. № 6/9734. Тираж 5000 экз. Заказ 6853 Бумага офсетная. Гарнитура Издательство «Мир» Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 129820, Москва, 1-й Рижский пер., 2 Диапозитивы изготовлены в издательстве «Мир» Отпечатано в Производственно-издательском комбинате ВИНИТИ, 140010, г. Люберuы, Московской обл., Октябрьский пр-т, Тел. 554-21-86 403.