– Генератор с внешним резонатором;
– Генератор с внутренней RC-цепочкой;
Наиболее предпочтительным в данном блоке является генератор с внешним резонатором т. к. он позволяет задавать любую тактовую частоту, которая зависит только от кварцевого резонатора, на которой может работать микроконтроллер. Это стабильный генератор с точной выдержкой частоты генерации.
Использование внешнего генератора требует наличия дополнительной аппаратуры.
Генератор с внутренний и внешний RC-цепочкой не гарантирует стабильность частоты.
На рисунке 2.2 приведена схема включения тактового генератора.
Рисунок 2.2 – Схема включения тактового генератора с внешним резонатором.
2.3Схема сброса
На рисунке 2.3 приведена аппаратная схема сброса по включению питания. Данная схема необходима для первичной инициализации аппаратуры микроконтроллера.
Рисунок 2.3 – Аппаратная схема сброса по включению.
2.4 Схема подключения цифрового термометра
Для подключения цифрового термометра используется три порта ввода/вывод. На рисунке 2.4 приведена схема включения термометра.
Рисунок 2.4 – Схема включения термометра
Функциональная схема приведена на рисунке 2.5
Рисунок 2.5 – Функциональная схема DS1620.
2.5 Схема подключения ЖКИ
ЖКИ подключен к микроконтроллеру AT90S1200 с помощью 8-ми разрядной шиной.
Рисунок 2.6 – Схема подключения ЖКИ.
Алфавитно-цифровые ЖКИ - модули представляют собой недорогое и удобное решение, позволяющее сэкономить время и ресурсы при разработке новых изделий, при этом обеспечивают отображение большого объема информации при хорошей различимости и низком энергопотреблении. Возможность оснащения ЖКИ - модулей задней подсветкой позволяет эксплуатировать их в условиях с пониженной или нулевой освещенностью, а исполнение с расширенным диапазоном температур (-20°С...+70°С) в сложных эксплуатационных условиях, в том числе в переносной, полевой и даже, иногда, в бортовой аппаратуре.
В соответствии с временной диаграммой в исходном состоянии сигнал Е = 0, сигнал R/W = 0, значение сигнала RS - произвольное, шина данных DBO...DB7 в состоянии высокого импеданса (НI). Такое состояние управляющих сигналов (E и R/W) должно поддерживаться все время в промежутках между операциями обмена с ЖКИ-модулем. Шина данных в эти моменты в принципе свободна, и может использоваться в мультиплексном режиме для каких-либо других целей, например, для сканирования матрицы клавиатуры. Естественно, необходимо позаботиться об исключении конфликтов на шине данных в момент совершения операций обмена с ЖКИ-модулем.
Последовательности действий, которые необходимо выполнять управляющей системе при совершении операций записи и чтения для 8-ми разрядной шины приведены соответственно в таблицах 1, 2. Для нормальной работы ЖКИ необходимо сформировать временные диаграммы приведенные на рисунках 2. 7 и 2.8
Таблица 1. Операции записи для 8-ми разрядной шины
Установить значение линии RS
Вывести значение байта данных на линии шины DB0...DB7
Установить линию Е = 1
Установить линию У = 0
Установить линии шины DB0...DB7 = HI
Таблица 2. Операции чтения для 8-ми разрядной шины
Установить линию R/W = 1
Считать значение байта данных с линий шины DB0...DB7
Установить линию Е = 0
Установить линию R/W = 0
2.6 Схема стабилизатора напряжения
Стабилизатор напряжения построен на микросхеме фирмы LM7805. Напряжение стабилизации 5V. На рисунке 2.9 приведена схема включения стабилизатора.
Рисунок 2.9 – Схема включения стабилизатора.
Особенностью данного стабилизатора является большой разброс напряжений подаваемых на вход, простая схема включения, большие токи нагрузки.
3. Проектирование программного обеспечения микроконтроллера
3.1 Разработка алгоритма программы
Рисунок 3.1 – Алгоритм функционирования цифрового термометра.
3.2 Проектирование процедур управления периферийными устройствами
Разрабатываемое устройство выполняет следующие операции:
a. Запрос текущей температуры
b. Обработка полученной информации.
#define ENABLE_BIT_DEFINITIONS
#include <tiny2313.h>
#include "ctype.h"
#include "stdlib.h"
#define PrescalerTmr0 4 // timer0 counts clk/256
// OscFrq 7342800 osc frequency in Hz
// OscPeriod 1/OscFrq * 1000000000 = 136.1878 osc Period in ns
//Tmr0ClkPeriod = OscPeriod*256 = 34864.07 Timer0 Clk Period in ns
//Tmr0_Interval = 1000000 timer0 overflow interval in ns (1ms=1000000ns)
//Tmr0_Ticks = Tmr0_Interval/Tmr0ClkPeriod = 28,68 timer0 steps for 1 ms delay
#define Tmr0_Reload 256 - 29 // timer0 Reload value for 1 ms
#define TOIE0 0
//==CircularBuffer
#define CircBufLen 32
unsigned char CircBuf[CircBufLen];
unsigned char CircBufHead = 0;
unsigned char CircBufTail = 0;
//==GlobalVariables
unsigned int Var2 = 0;
//==Declare external functions
void DisplayInit(void); // Инициализация индикатора
void SendDataToDisplay(unsigned char Data, unsigned char Mode);
//==Declare internal functionsunsigned char CircBufGet(void);
void CircBufPut (unsigned char data);
//==VirtualTimerVariables
unsigned char Tmr0Flag = 0;
unsigned char TmrCnt[2];
unsigned char TmrPreLoad[2];
unsigned char TmrFlag[2]={0,0};
//0 - timer disabled
//0x01 - timer is started and counting, not reloadable
//0x81 - counting, reloadable
//0x02 - ready, stopped
//0x83 - ready, reloaded, counting
3.3 Проектирование процедуры инициализации аппаратуры микроконтроллера
Процедура инициализации производит настройку: портов ввода/вывода, периферийных аппаратных устройств, а так же внешних устройств которые требуют инициализации.
//== Port Initialisation ===============
void Init(void)
{
DDRD = 0xf0; //PD3-PD0 as input
PORTD = 0xff; //Turn ON PullUP for PortB pins
DDRB = 0xff; //Port B pins as output
PORTB = 0x00;
}
//== Virtual Timer Initialisation ==========
void InitTimers(void)
//=================================
char TimeDelay_us(char x) //near 1us time delay
char i,j,k,n;
j=1;
for (i=0;i<x;i++)
k=j+1;
n=k-j;
return n;
//== Circular Buffer Write =====================
void CircBufPut (unsigned char data)
unsigned char tmphead;
tmphead = CircBufHead + 1;
if (tmphead>=CircBufLen)
tmphead=0;
CircBuf[tmphead] = data;
CircBufHead = tmphead;
//== Circular Buffer Read ==========
unsigned char CircBufGet(void)
unsigned char tmptail;
if (CircBufHead != CircBufTail)
tmptail=CircBufTail+1;
if (tmptail>=CircBufLen)
tmptail=0;
CircBufTail = tmptail;
return CircBuf[tmptail];
else
return 0;
3.4 Инициализация цифрового термометра DS1620
char DS1620Init(void)
TimeDelay_us(20);
void DS1620WriteBit(char Value)
void DS1620WriteByte(char data)
char loop, CurrentBit;
for (loop = 0; loop < 8; loop++) // Loop to write each bit in the byte, LS-bit first
CurrentBit = data & 0x01;
DS1620WriteBit(CurrentBit);
data >>= 1; // shift the data byte for the next bit
char DS1620ReadBit(void)
DDRD
//==
char DS1620ReadByte(void)
char loop, result=0, CurrentBit;
for (loop = 0; loop < 8; loop++)
result >>= 1; // shift the result right to get it ready for the next bit
CurrentBit = DS1620ReadBit();
if (CurrentBit != 0) // if result is one, then set MS bit
return result;
3.5 Инициализация и настройка ЖКИ
/*
#define LCD_E PORTC_Bit4
#define LCD_RW PORTC_Bit5
#define LCD_RS PORTC_Bit6
#define LCD_DATA PORTC
#define LCD_PIN PINC
#define LCD_DDR DDRC
*/
#define E PORTD.2
#define WR PORTD.1
#define RS PORTD.0
#define LCD_DATA PORTD
#define LCD_PIN PIND
#define LCD_DDR DDRD
#define CLRBIT(ADDR, BIT) (ADDR |= (1<<BIT))
#define SETBIT(ADDR, BIT) (ADDR &= ~(1<<BIT))
char ini_cmd[]={0x03,0x03,0x03,0x02,0x02,0x0d,0x00,0x0d,0x00,0x01,0x00,0x06};
//==================================
void Delay(int i) // программная задержка
while(--i>0x00);
//===============================
void SendDataToDisplay(unsigned char Data, unsigned char Mode)
//PORTB - 8bit Data
/*PORTD - PD0 - RS
PD1 - RW
PD2 - E */
CLRBIT(PORTD,E);
if (Mode)
SETBIT(PORTD,RS);
CLRBIT(PORTD,RS);
PORTB = Data;
CLRBIT(PORTD,WR);
SETBIT(PORTD,E);
Delay(4);
//========================
void DisplayInit(void)
Delay(30);
SendDataToDisplay(0x30,1); //режим работы дисплея – ширина шины данных 8 бит
Delay(5);
SendDataToDisplay(0x30,1);
Delay(1);
SendDataToDisplay(0x38,1); // шина данных 8 бит
//размер развертки 2 строки
//размер матр. Символов – 5х10
SendDataToDisplay(0x08,1); //выкл. Наличие изображения
SendDataToDisplay(1,1); //очистка экрана
SendDataToDisplay(0x6,1); //счетчик адреса настроить на увеличение
SendDataToDisplay(0xC,1); //вкл. изображение
unsigned char ReadDatafromDisplay(unsigned char Mode)
3.6 Проектирование процедуры Main()
Процедура Main(), является основной исполняемой процедурой из которой начинается выполнение программы. Поэтому все действии нужно выполнять в этой процедуре.
В начале процедуры необходимо разместить вызовы процедур инициализации.
Опрос термометра производим постоянно в бесконечном цикле.
В остальное время отображение температуры на ЖК-индикаторе.
//== Main Procedure
void main(void)
int Cels1;
char Cels,Ready;
// unsigned int x;
Init();
InitTimers();
DisplayInit(); // lcd.c is needed!
while (1)
//--Virtual timer0 is used for LCD display--
if ((TmrFlag[0] & 0x02) != 0)
TmrFlag[0] &= ~(0x02);
unsigned char data;
data=CircBufGet();
while (data != 0)
SendDataToDisplay(data,0); // lcd.c is needed!
//--Virtual timer1 is used to read a keypad--
if ((TmrFlag[1] & 0x02) != 0)
TmrFlag[1] &= ~(0x02);
//Запустить измерение
DS1620Init();
DS1620WriteByte(0xee); //начать преобразование
//проверить готовность измерения
Ready = 0;
while (!Ready)
DS1620WriteByte(0xac); //read status
Cels = DS1620ReadByte();
if(Cels & 0x80)
Ready = 1;
//прочесть результат измерения
DS1620WriteByte(0xaa); //read temperature
Cels1 = (int) Cels;
CircBufPut(Cels1);
//==Timer0 Interrupt Routine
interrupt [TIM0_OVF] void TIMER0_OVF_interrupt(void)
unsigned char i;
TCNT0=Tmr0_Reload;
for (i=0;i<2;i++)
if((TmrFlag[i] & 0x01) != 0) // If counting bit set - serve this timer!
if(TmrCnt[i]==0) // If counter is empry - serve this overflow!
TmrFlag[i] |= 0x02; // Set timer overflow bit
if(TmrFlag[i] & 0x80) // If Reload bit is set - reload this timer!
TmrCnt[i]=TmrPreLoad[i]; // Reload counter
TmrFlag[i] &= ~0x01; // Clear counting bit
TmrCnt[i]--;
4. Рекомендации по разработке программных и аппаратных диагностических средств для проверки работоспособности устройства
Данное устройство должно осуществлять измерение температуры. Для проверки рекомендуется использовать термостат.
Датчик термометра (DS1620) необходимо поместить в термостат и установить температуру активной зоны 20 °С. Произвести замер температуры по индикатору. Далее аналогичные действия произвести для температур 75°С и 125°С. Если показания отличаются от заданных то произвести расчет погрешности и внести корректировку в программу обработки температуры.
5. Проектирование печатной платы устройства
В пакет OrCAD входит программа Layout. Она позволяет производить разводку печатных плат, как в автоматическом режиме, так и в ручном.
Произведем разводку печатной платы нашего устройства. Для этого мы создадим схему в OrCADe.
Перед разводкой платы необходимо чтобы:
– не было «висячих» проводов;
– все выводы выходящие с платы подключены к разъемам.
В данной схеме не установлен выходной разъем на все исходящие выводы, в связи с тем, что данная схема является частью одного устройства и другие элементы не указаны на схеме.
В результате моделирования мы получили плату, приведенную в приложении Б. Ее следует изготовить из фольгированного стеклотекстолита толщиной 1…1.5 мм. Все отверстия на плате должны быть металлизированы.
Заключение
В данном курсовом проекте произведено проектирование цифрового термометра с возможностью отображения температуры на ЖК индикаторе. Данное устройство обладает высокой скоростью измерения, широким диапазоном измерения температуры.
Также имеет малые габариты, вес, и обладает низким энергопотреблением.
Страницы: 1, 2