русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2015-08-31; просмотров: 1345; Нарушение авторских прав


Для отображения символьной информации (буквенно-цифровой) часто используются знакосинтезирующие индикаторы – светодиодные или жидкокристаллические. Семисегментный индикатор, как говорит его название, состоит из семи элементов индикации (сегментов), включающихся и выключающихся по отдельности. Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр. На 7-сегментном индикаторе отображают также некоторые буквы. Основные сегменты индикатора обозначаются буквами от A до G; восьмой сегмент — десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел – буквой H. Для подключения индикаторов используют передачу данных в последовательном коде.

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

Задание на лабораторную:

1. Написать, отладить и протестировать программу приема одного символа из последовательного порта. Для каждого принятого символа записывать в последовательный порт:

· количество принятых байт в буфере приемника,

· принятый символ,

· десятичный ASCII-код символа,

· шестнадцатиричный ASCII-код символа.

Передаваемая в порт информация должна сопровождаться поясняющими надписями.

int incomingByte = 0; // переменная для хранения полученного байта

 

void setup() {

Serial.begin(9600); // устанавливаем последовательное соединение

}

 

 

void loop() {

if (Serial.available() > 0) { //если есть доступные данные

// считываем байт

incomingByte = Serial.read();

Serial.print("Byte count: ");



Serial.println(Serial.available()+1, DEC);

// отсылаем то, что получили

Serial.print("I received: ");

Serial.write(incomingByte);

Serial.println("");

Serial.println(incomingByte, DEC); //десятичный код

Serial.println(incomingByte, HEX);

 

}

}

 


 

2. Написать, отладить и протестировать программу отображения на светодиодном 7-сегментном индикаторе последовательно 20 символов – цифр от 0 до 9 и их же в комбинации с десятичной точкой в бесконечном цикле. Смена символа должна сопровождаться изменением свечения красного и зеленого светодиодов.

 

#define RED RED_LED

#define GREEN GREEN_LED

int i=0;

int dg[20] =

{

252, //0 11111100

96, //1 01100000

218, //2 11011010

242, //3 11110010

102, //4 01100110

182, //5 10110110

190, //6 10111110

224, //7 11100000

254, //8 11111100

246, //9 11110110

//1 //dp 00000001

 

253, //0 11111100

97, //1 01100000

219, //2 11011010

243, //3 11110010

103, //4 01100110

183, //5 10110110

191, //6 10111110

225, //7 11100000

255, //8 11111100

247, //9 11110110

//1 //dp 00000001

};

void setup()

{

pinMode(RED, OUTPUT);

pinMode(GREEN, OUTPUT);

pinMode(11, OUTPUT);

pinMode(12, OUTPUT);

}

void blink()

{

digitalWrite (RED, HIGH);

digitalWrite (GREEN, LOW);

delay (500);

digitalWrite (RED, LOW);

digitalWrite (GREEN, HIGH);

delay (500);

}

void loop()

{

blink();

shiftOut(12, 11, LSBFIRST, dg[i]);

delay(1000);

i++;

if (i==20) i=0;

}


 

3. Написать, отладить и протестировать программу измерения температуры с помощью встроенного в микроконтроллер датчика. Программа должны работать по алгоритму демонстрационной программы, приведенному в разделе 3.3, и выдавать в COM-порт значения метки времени, текущего измерения температуры, среднего значения температуры по 5 измерениям в градусах Цельсия, Кельвина и Фаренгейта. Кроме того, на светодиодный 7-сегментный индикатор должны последовательно выдаваться значения разрядов десятков и единиц градусов Цельсия.

 

#define NUMBER 5 // константа – размер массива

int dg[20] =

{

252, //0 11111100

96, //1 01100000

218, //2 11011010

242, //3 11110010

102, //4 01100110

182, //5 10110110

190, //6 10111110

224, //7 11100000

254, //8 11111100

246, //9 11110110

//1 //dp 00000001

 

253, //0 11111100

97, //1 01100000

219, //2 11011010

243, //3 11110010

103, //4 01100110

183, //5 10110110

191, //6 10111110

225, //7 11100000

255, //8 11111100

247, //9 11110110

//1 //dp 00000001

};

int numberLED=0;

int ledState = HIGH; // статус светодиодов

uint8_t i = 0; // целочисленная переменная, представленная без знака в 1 байте

uint32_t average = 0; // беззнаковое целое в 4 байтах – накопленная сумма,

// среднее значение

uint32_t values[NUMBER]; // массив измеренных значений

uint8_t j = 0; // счетчик элементов массива

boolean flag = false; // признак необходимости печатать среднее значение

 

void setup() {

pinMode(11, OUTPUT);

pinMode(12, OUTPUT);

 

pinMode(RED_LED, OUTPUT);

pinMode(GREEN_LED, OUTPUT);

analogReference(INTERNAL1V5); // величина опорного напряжения 1.5В

analogRead(TEMPSENSOR); // первое чтение датчика обычно с ошибкой

 

Serial.begin(9600);

pinMode(PUSH2, INPUT_PULLUP);

digitalWrite(RED_LED, HIGH);

digitalWrite(GREEN_LED, LOW);

 

Serial.print("\n\n\n*** MSP430 Thermometer \n");

Serial.print("Press PUSH2 to end\n");

Serial.print("instant\taverage\n"); // 1 колонка – измерение, 2 колонка – ср. значение

 

for (j=0; j<NUMBER; j++) values[j]=0; // обнуление элементов массива

average = 0; // обнуление суммы

j=0;

}

 

// процедура печати целого числа как десятичного с 1 десятичным разрядом

void printDec(uint32_t ui) { // ui умножено на 10

Serial.print(ui/10, DEC); // целая часть

Serial.print(".");

Serial.print(ui%10, DEC); // дробная часть – остаток от деления на 10

}

 

void loop() {

ledState = !ledState; // инверсия статуса светодиодов

 

// LEDs: green = готовность; red = измерение

 

digitalWrite(flag ? GREEN_LED : RED_LED, ledState);

// если flag == true, то GREEN_LED устанавливается в состояние RED_LED,

// иначе в состояние ledState

if (i == 10) { // 9 тактов измерений по 100 мс пропускаются, измерение через 1 с

i = 0;

 

// формула для расчета результата измерения и накопление суммы

average -= values[j]; // вычесть из суммы предыдущее значение

values[j] = ((uint32_t)analogRead(TEMPSENSOR)*27069 - 18169625) *10 >> 16;

average += values[j]; // сложить с суммой новое значением

 

// Печать измерения

Serial.print("Current t");

printDec(values[j]);

if(numberLED==0)

{

shiftOut(12, 11, LSBFIRST, dg[values[j]/100]);

numberLED=1;

}

else

{

shiftOut(12, 11, LSBFIRST, dg[values[j]/10%10+10]);

numberLED=0;

}

Serial.print(" C, ");

printDec(values[j]+2732);

Serial.print(" K, ");

printDec(values[j]*1.8+320);

Serial.print(" F\t");

 

// печать среднего значения

if (flag)

{

Serial.print("Average t=");

printDec(average/NUMBER);

Serial.print(" C, ");

printDec(average/NUMBER+2732);

Serial.print(" K, ");

printDec(average/NUMBER*1.8+320);

Serial.print(" F\t");

 

}

Serial.print("\n");

 

j++; // инкремент индекса массива

if (j==NUMBER) flag=true; // когда массив 4 измерений заполнен, можно печатать // средние значения

j %= NUMBER; // j принимает значение остатка от деления на 4

}

 

// проверка кнопки и прекращение измерений

if (digitalRead(PUSH2)==LOW) {

Serial.print("\n\n*** End \n");

Serial.end();

while(true); // бесконечный цикл

}

delay(100); // задержка 100 мс – длительность такта

 

i++; // инкремент счетчика тактов

}

 

 

 

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



<== предыдущая лекция | следующая лекция ==>
Встроенный датчик температуры | Логические функции и булева алгебра


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.601 сек.