1.
Установить значение линии RS
2.
Установить линию R/W = 1
3.
Установить линию Е = 1
4.
Считать значение байта данных с
линий шины DB0...DB7
5.
Установить линию Е = 0
6.
Установить линию R/W = 0
|
Рисунок 9 – Временная диаграмма операции
записи
Рисунок 10 – Временная диаграмма операции
чтения
Схема стабилизатора
напряжения
Стабилизатор напряжения
построен на микросхеме LM7805.
Данная микросхема является линейным стабилизатором напряжения. Напряжение
стабилизации 5V. На рисунке 11 приведена схема
включения стабилизатора.
Рисунок 11 – Схема подключения
стабилизатора к микроконтроллеру.
3.
Проектирование
программного обеспечения микропроцессора
3.1 Проектирование модуля
инициализации микроконтроллера
Для инициализации данного
устройства необходимо выделить память для глобальных переменных, и провести
инициализацию портов, таймеров и последовательного интерфейса.
3.2 Проектирование
процедур обработки прерываний
Данное устройство не
требует написания программы с обработкой прерываний. В связи с тем что по
заданию необходима очень маленькая скорость обмена по RS232 и быстродействии LCD индикатора и контроллера достаточно для уверенного
приема данных.
3.3 Проектирование
процедур обработки информации
В микроконтроллер встроен
последовательный коммуникационный интерфейс (USART) который обеспечивает
совместимость по формату кадра с интерфейсом RS232. Согласование уровней описано выше.
3.4 Проектирование
процедур вывода информации
Вывод данных производится
на LCD индикатор. Управление индикатором
осуществляется по трем сигнальным и восьми информационным линиям связи. Индикация
заключается в записи кодов символов в соответствующие ячейки памяти LCD индикатора.
3.5 Проектирование
процедуры Main()
Процедура Main это главная процедура программы с
которой начинается выполнение. В данной процедуре необходимо вызвать процедуру
инициализации, а затем необходимо перейти в бесконечный цикл опроса датчика,
измерения и дешифрации величин, отображение данных выполняется по прерываниям
таймера. На рисунке 12 приведен общий алгоритм работы устройства.
Рисунок 12 – Общий
алгоритм работы устройства
4.
Листинг программы
#include <msp430F135.h>
void vLCD_Silence(void);/*Состояние выводов "по
умолчанию"*/
void vLCD_Init(void);/*Инициализация дисплея*/
void vLCD_Clear();/*Очистка
дисплея*/
void vLCD_RetLeft();/*Перемещение
курсора в левую позицию*/
void vLCD_EntryModeSet(char ID,char SH);/*Установка направления сдвига
курсора
(ID=0/1 - влево/вправо) и разрешение сдвига дисплея (SH=1) при записи в DDRAM*/
void vLCD_OnOff(char D,char CB);/*Включает модуль (D=1) и выбирает тип курсора (см.
даташит)*/
void vLCD_CurDispShift(char SC,char RL);/*Выполнияет сдвиг дисплея или
курсора
(SC=0/1 - курсор/дисплей, RL=0/1 - влево/вправо)*/
void vLCD_FuncSet(char DL,char _N,char _F);/*Устанавливает
разрядность интерфейса
(DL=0/1 - 4/8 бита), режим развертки строк (_N=0/1 - одна строка/две строки)
и размер символа (_F=0/1 - 5х8/5х10)*/
void vLCD_SetAddr(char ADD);/*Установка адреса для последующих операций и выбор
области DDRAM*/
void vLCD_WriteData(char DATA);/*Запись данных в активную область*/
void
vLCD_Delay(char a);/*Задержка на 0/1 - 40 мкс/1.95 мс */
/*Команды(0)/Данные(1)*/
void vRS(char
set)
{
if(set)
P3OUT|=0x80;
else
P3OUT&=~0x80;
}
/*Синхронизация*/
void vEN(char
set)
if(set)
P3OUT|=0x40;
else
P3OUT&=~0x40;
_NOP();
}
/*Запись в индикатор
RS - команды(0)/данные(1); Data - тело команды/данных*/
void
vLCD_Write(char RS, char Data)
{
vRS(RS);
_NOP();
//_NOP();
P1OUT&=Data|0x0f;//Запись старшей тетрады.
vEN(1);
_NOP();
//_NOP();
vEN(0);
_NOP();
//_NOP();
P1OUT&=~0xf0;
P1OUT|=(Data<<4)&~0x0f;//Запись
младшей тетрады.
_NOP();
//_NOP();
vEN(1);
_NOP();
//_NOP();
vEN(0);
_NOP();
//_NOP();
P1OUT|=0xf0;//Устанавливает
на выводах состояние "по умолчанию".
_NOP();
//_NOP();
}
/*Состояние выводов
"по умолчанию"*/
void
vLCD_Silence(void)
{
vEN(0);
vRS(0);
P1OUT=0xf0;
}
/*Инициализация дисплея*/
void
vLCD_Init(void)
{
for(char
i=0;i<21;i++)
vLCD_Delay(1);//задержка на 40 мс.
vRS(0);
_NOP();
P1OUT&=0x30|0x0f;//Запись старшей тетрады.
vEN(1);
_NOP();
vEN(0);
_NOP();
P1OUT|=0xf0;//Устанавливает
на выводах состояние "по умолчанию".
_NOP();
for(char
i=0;i<3;i++)
vLCD_Delay(1);//задержка на 4.1 мс.
vLCD_FuncSet(0,0,0);//4-х разрядная шина, развертка 1 строк,
символ 5х8.
vLCD_FuncSet(0,1,0);//4-х разрядная шина, развертка 1 строк,
символ 5х8.
vLCD_OnOff(1,0);//Вкл. модуля, выкл. курсора.
vLCD_Clear();//Очистка DDRAM.
vLCD_EntryModeSet(1,0);//Сдвиг курсора вправо, сдвиг
дисплея запрещен.
}
/*Очистка дисплея*/
void vLCD_Clear()
{
vLCD_Write(0,0x01);
vLCD_Delay(1);
}
/*Перемещение курсора в
левую позицию*/
{
vLCD_Write(0,0x02);
vLCD_Delay(1);
}
/*Установка направления
сдвига курсора (ID=0/1 -
влево/вправо)
и разрешение сдвига
дисплея (SH=1) при записи в DDRAM*/
void
vLCD_EntryModeSet(char ID,char SH)
{
char
Data=0x04+(ID<<1)+SH;
vLCD_Write(0,Data);
vLCD_Delay(0);
}
/*Включает модуль (D=1) и выбирает тип курсора (см.
даташит)*/
void
vLCD_OnOff(char D,char CB)
{
char
Data=0x08+(D<<2)+CB;
vLCD_Write(0,Data);
vLCD_Delay(0);
}
/*Выполнияет сдвиг
дисплея или курсора (SC=0/1
- курсор/дисплей,
RL=0/1 - влево/вправо)*/
void vLCD_CurDispShift(char SC,char RL)
{
char
Data=0x10+(SC<<3)+(RL<<2);
vLCD_Write(0,Data);
vLCD_Delay(1);
}
/*Устанавливает
разрядность интерфейса (DL=0/1
- 4/8 бита), режим развертки bстрок
(N=0/1 - одна строка/две строки) и
размер символа (F=0/1 -
5х8/5х10)*/
void
vLCD_FuncSet(char DL,char _N,char _F)
{
char
Data=0x20+(DL<<4)+(_N<<3)+(_F<<2);
vLCD_Write(0,Data);
vLCD_Delay(0);
}
/*Установка адреса для последующих
операций и выбор области DDRAM*/
void
vLCD_SetAddr(char ADD)
{
ADD+=0x80;
vLCD_Write(0,ADD);
vLCD_Delay(0);
}
/*Запись данных в
активную область*/
void
vLCD_WriteData(char DATA)
{
vLCD_Write(1,DATA);
vLCD_Delay(0);
}
/*Задержка на
0/1 - 40 мкс/1.95 мс */
void
vLCD_Delay(char a)
{
IFG1&=~WDTIFG;//Сбросили очередной флаг прерывания...
//Запуск Собаки с
очисткой.
if(a)
WDTCTL=0x5A00 | 0x1f;//TMSEL,SSEL,WDIS.1,WDIS.0
- период 1.95 мс.
else
WDTCTL=0x5A00
| 0x1b;//TMSEL,WDIS.1,WDIS.0 0 - период 12.8 мкс.
char z=1;
if(!a)z=4;
for(char
i=0;i<z;i++)
{
while(!(IFG1&WDTIFG))
_NOP();//пока нет прерывания от Собаки - висим.
IFG1&=~WDTIFG;//Сбросили очередной флаг прерывания...
}
//Остановка Собаки.
WDTCTL=0x5A00 | 0x93;//HOLD,TMSEL,WDIS.1,WDIS.0
}
/*Вывод строки c позиции line,column
до конца строки. Если фактическая длинна строки больше, строка переписывается с
начальной позиции.
Начало строки: line - номер строки сверху (0-3),
column - позиция первого символа в строке, string - строка символов*/
unsigned char string[])
{
//Для корректной работы
следует установить следующий режим:
//vLCD_EntryModeSet(1,0);//Сдвиг курсора вправо, сдвиг
дисплея запрещен.
unsigned char
ADD=line,ColumnCounter=column;
/*Вычисляем
ардес в DDRAM*/
switch(ADD)
{
case 3:
ADD=0x54;
break;
case 2:
ADD=0x14;
break;
case 1:
ADD=0x40;
case 0:
break;
default:
ADD=0x00;
}
if(column>19)
column=0;
ADD+=column;
vLCD_SetAddr(ADD);//Установка
адреса.
for(char i=0;;i++)//Запись
строки (бесконечный цикл).
{
if(string[i]=='\0')//Если
обнаружен симовл конца строки - выход из цикла.
return;
else
{
vLCD_WriteData(string[i]);
if(++ColumnCounter>19)//Если достигнут физический
конец строки,
{
vLCD_SetAddr(ADD);//продолжаем
запись с начальной позиции.
ColumnCounter=column;
}
}
}
_NOP();
}
Заключение
В данном курсовом проекте
было разработано удаленное устройство индикации.
Использование внешнего
кварцевого генератора обеспечивает высокую стабильность работы
последовательного коммуникационного интерфейса (USART).
В ходе проектирования
устройства были рассмотрены основные принципы построения устройств на
микроконтроллерах MSP430 от Texas
Instruments. А так же изучены аппаратные возможности данных микроконтроллеров.
Научились по описаниям
работы или временным диаграммам функционирования устройств составлять алгоритмы
тех или иных блоков программ.
В целом по разработанному
курсовому проекту можно заметить, что использование микроконтроллеров MSP430 позволяет строить недорогие и
производительные микроконтроллерные системы не использую внешнее периферийное
оборудование (аналоговый компаратор, аппаратный тайме и др.).