3.4 Процедура индикации

Выводит на на 4х разрядный 7-ми сегментный индикатор количество совершенных отгрузок. Индикатор подключен к порту В микроконтроллера. Управление разрядами индикатора осуществляется через порт D.

В процедуре используются 3 функции.

Первая Bin2BCD_4Digit выполняет преобразование числа отгрузок, представленных в двоичном виде, в BCD число и поразрядно заносит его в массив BufBCD:

void Bin2BCD_4Digit (unsigned int data)

{

unsigned char i;

for(i=0;i<4;i++)

{

BufBCD[i] = data % 10;

data /= 10;

}

Вторая функция Bin2Seg_4Digit преобразовывает полученное BCD число в семисегментный эквивалент (путем вызова функции Bin2Seg) и заносит результаты в массив BufSeg. Семисегментные эквиваленты представлены в виде заранее определенных значений

#define Dig0 SegA + SegB + SegC + SegD + SegE + SegF + 0

#define Dig1 0 + SegB + SegC + 0 + 0 + 0 + 0

#define Dig2 SegA + SegB + 0 + SegD + SegE + 0 + SegG

#define Dig3 SegA + SegB + SegC + SegD + 0 + 0 + SegG

#define Dig4 0 + SegB + SegC + 0 + 0 + SegF + SegG

#define Dig5 SegA + 0 + SegC + SegD + 0 + SegF + SegG

#define Dig6 SegA + 0 + SegC + SegD + SegE + SegF + SegG

#define Dig7 SegA + SegB + SegC + 0 + 0 + 0 + 0

#define Dig8 SegA + SegB + SegC + SegD + SegE + SegF + SegG

#define Dig9 SegA + SegB + SegC + SegD + 0 + SegF + SegG

#define DigMinus 0 + 0 + 0 + 0 + SegЕ + 0 + 0

unsigned char Bin2Seg (unsigned char data)

{

switch(data)

{

case 0: return Dig0;

case 1: return Dig1;

case 2: return Dig2;

case 3: return Dig3;

case 4: return Dig4;

case 5: return Dig5;

case 6: return Dig6;

case 7: return Dig7;

case 8: return Dig8;

default: return Dig9;

}

}

//== Convert 4 digits from BinBuf[] into SegBuf[] ==========

void Bin2Seg_4Digit (void)

{

unsigned char i;

for(i=0;i<4;i++)

{

BufSeg[3-i] = Bin2Seg(BufBCD[i]);

}

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

void Ind (void)

{

unsigned char i;

for(i=0;i<4;i++)

{

PositionPort = AllDigitsOFF;

SymbolPort = BufSeg(i);

PositionPort = DigitNmb(i)

}


4. Листинг программы

Файл ind.h

//== Include files =================================

#include <mega16.h>

#define PortBMask 0xFF

//== Common declarations ============================

#define SymbolPort PORTB

#define SegA 1 // aa

#define SegB 2 // f b

#define SegC 4 // f b

#define SegD 8 // gg

#define SegE 16 // e c

#define SegF 32 // e c

#define SegG 64 // dd

#define Dig0 SegA + SegB + SegC + SegD + SegE + SegF + 0

#define Dig1 0 + SegB + SegC + 0 + 0 + 0 + 0

#define Dig2 SegA + SegB + 0 + SegD + SegE + 0 + SegG

#define Dig3 SegA + SegB + SegC + SegD + 0 + 0 + SegG

#define Dig4 0 + SegB + SegC + 0 + 0 + SegF + SegG

#define Dig5 SegA + 0 + SegC + SegD + 0 + SegF + SegG

#define Dig6 SegA + 0 + SegC + SegD + SegE + SegF + SegG

#define Dig7 SegA + SegB + SegC + 0 + 0 + 0 + 0

#define Dig8 SegA + SegB + SegC + SegD + SegE + SegF + SegG

#define Dig9 SegA + SegB + SegC + SegD + 0 + SegF + SegG

#define DigMinus SegA + SegB + SegC + SegD + 0 + SegF + SegG

#define PositionPort PORTD

#define Position0 0

#define Position1 1

#define Position2 2

#define Position3 3

#define AllDigitsOFF 4

#define DigitNmb = [254, 253, 251, 247]

//== Global Variables =========================

unsigned char BufSeg[4];

unsigned char BufBCD[4];

void Bin2BCD_4Digit (unsigned int data);

//== Convert binary char into 7 Segment Code =============

unsigned char Bin2Seg (unsigned char data)

{

switch(data)

{

case 0: return Dig0;

case 1: return Dig1;

case 2: return Dig2;

case 3: return Dig3;

case 4: return Dig4;

case 5: return Dig5;

case 6: return Dig6;

case 7: return Dig7;

case 8: return Dig8;

default: return Dig9;

}

}

//== Convert 4 digits from BinBuf[] into SegBuf[] ============

void Bin2Seg_4Digit (void)

{

unsigned char i;

for(i=0;i<4;i++)

{

BufSeg[3-i] = Bin2Seg(BufBCD[i]);

}

}

//== Convert int value into 4 Digits of SegBuf[] ==============

void Bin2BCD_4Digit (unsigned int data)

{

unsigned char i;

for(i=0;i<4;i++)

{

BufBCD[i] = data % 10;

data /= 10;

}

}

//== Show the next Digit ================

void Ind (void)

{

unsigned char i;

for(i=0;i<4;i++)

{

PositionPort = AllDigitsOFF;

SymbolPort = BufSeg(i);

PositionPort = DigitNmb(i)

}

}

Файл main.c

//== Include files =========================

#include <mega16.h>

#include <bitsm16.h>

#include <ind.h>

#include "ctype.h"

#include "stdlib.h"

//== Common declarations ==========================

#define Tmr0_Reload 1;

#define PrescalerTmr0 4; // timer0 counts clk/256

#define PrescalerTmr1 5; // timer1 counts clk/1024

#define comp_t1 36000-1; // coBnaDeHie 1ro taimepa

//== Global Variables ==========================

unsigned char Tmr0Flag;

unsigned char Tmr1Flag;

unsigned char Tmr0Cnt;

unsigned char NewPortSignal;

unsigned char RealSignal;

unsigned char kol_otg;

//== Port Initialisation ===================================

void Init(void)

{

DDRA = 0xff; //Port A pins as output

PORTA = 0x00; //Send 0xFF to PortA output pins

DDRC = 0; //Port C pins as input

PORTC = 0xfe; //Turn ON PullUP for PortC pins

#asm("cli")

TIMSK = (1 << TOIE0)|(1 << OCIE1A); //Enable Timer0 & Timer1 Interrupt

TCNT0 = Tmr0_Reload;

TCCR0 = PrescalerTmr0;

#asm("sei")

}

//== Time wate ====================================

void Time_wate(void)

{

#asm("cli")

TCCR1B = PrescalerTmr1;

OCR1A = comp_t1;

#asm("sei")

while (Tmr1Flag == 0)

{}

}

//== CheckButton ====================================

void CheckButton (void)

{

unsigned char b;

static char OldPortSignal;

static char OldOldPortSignal;

NewPortSignal = PINC&1; //select PC0 - START_button

b = PINC&7; //select PC1,PC2 - bunker sensors

if((NewPortSignal != OldPortSignal) & (NewPortSignal != 0)) // Positive front found

{RealSignal = (NewPortSignal ^ OldPortSignal) ^ OldOldPortSignal;

OldOldPortSignal = OldPortSignal;

OldPortSignal = RealSignal;

if(b) //bunker CLOSED!

{

PORTA=0x01; //PA0 - transporter ON!

Time_wate(); //wate 5 sec!

Tmr1Flag = 0;

PORTA=0x03; //PA0&PA1 - bunker OPEN!

}

}

}

//== Main Procedure =====================

void main(void)

{

Init();

while(1)

{

unsigned char c;

if (Tmr0Flag)

{

Tmr0Flag=0;

Tmr0Cnt++;

if(Tmr0Cnt>10)

{

Tmr0Cnt=0;

CheckButton();

}

}

c = PINC&4; //select PC3 - overflow signal from WE2108

if(c)

{

PORTA=0x07; //PA2 - bunker CLOSE!

Time_wate(); //wate 5 sec!

Tmr1Flag = 0;

PORTA=0x00; //PA0 - tranporter OFF!

}

kol_otg++;

Bin2BCD_4Digit(kol_otg);

Bin2Seg_4Digit();

Ind ();

}

}

//== Interrup vectors ===============================

interrupt [TIM0_OVF] void TIMER0_OVF_interrupt(void)

{

TCNT0=Tmr0_Reload;

Tmr0Flag = 1;

}

interrupt [TIM1_COMPA] void TIMER1_COMP_interrupt(void)

{

Tmr1Flag = 1;

#asm("cli")

TCCR1B = 0;

#asm("sei")

}

//==End =========================================


5. Проектирование печатной платы устройства

Для разводки печатной платы была использована программа LayoutPlus пакета OrCad. Данная программа позволяет производить разводку печатных плат, как в автоматическом режиме, так и в ручном.

Схему необходимо создавать таким образом, что бы на ней не оставалось ни одного свободного входа/выхода или висячего провода. Необходимо убрать все вспомогательные компоненты схемы (источники тока, напряжения, генераторы и другие), и прописать в свойствах компонентов раздела Footprint тип корпуса.

В установках LayoutPlus выставляется количество слоев, ширина дорожек, расстояние между дорожками, между дорожками и контактными площадками, угол поворота дорожек. Затем производится разводка в автоматическом режиме, создается координатная сетка, и проставляются размеры.

В результате была получена печатная плата, показанная в приложении Б.. Плата изготавливается из фольгированного стеклотекстолита толщиной 1 - 5 мм. Все отверстия на плате должны быть металлизированы


Заключение

В данном курсовом проекте была разработана устройство управления системой измерения веса, построенном на микроконтроллере ATmega16 фирмы Atmel.

Микроконтроллер принимает сигналы от датчиков веса и управляет ленточным транспортером и бункером, тем самым, обеспечивая автоматическое взвешивание груза дозированными порциями.

Для устройства управления в пакете OrCad была разработана печатная плата.

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


Приложение


Информация о работе «Устройство управления системой измерения веса»
Раздел: Информатика, программирование
Количество знаков с пробелами: 22919
Количество таблиц: 11
Количество изображений: 6

Похожие работы

Скачать
148486
26
5

... плана ФЭ. Большое разнообразие моделей РК приводит к необходимости использования разнообразных способов и технических средств для измерения их параметров. Как правило, статические и динамические параметры РК измеряют на разных технологических установках. Методы построения средств измерения для идентификации моделей РК могут быть сведены к следующим принципам, учитывающим особенности подключения ...

Скачать
124866
3
8

... —к «массе». Качество отработки элементов вождения по трудным грунтам зависит от наличия и состояния цепей противоскольжения, трековых дорожек, матов и средств самовытаскивания 4. РАЗРАБОТКА КОНСТРУКЦИИ ДУБЛИРУЮЩЕГО УСТРОЙСТВА УПРАВЛЕНИЯ 4.1. ОПРЕДЕЛЕНИЕ РАСЧЕТНОЙ НАГРУЗКИ НА ВАЛ, ВОЗВРАТНЫЕ ПРУЖИНЫ И ПЕДАЛИ. Номинальное усилие на дополнительные педали тормоза и сцепления будет находиться в ...

Скачать
24574
0
5

... , что позволяет осуществлять монтаж этих весов без использования большегрузных кранов. Платформы могут быть снабжены ограничительными барьерами для предотвращения случайного съезда автотранспорта с весов. В автомобильных колейных весах может быть предусмотрен доступ для очистки конструктивных засоров без демонтажа весовой платформы [5, с. 11]. Также важным является то, что колейные автомобильные ...

Скачать
26094
9
10

... их на соответствующий порт, также необходимо вывести десятичную точку P2.7. Заключение В результате проделанной работы были разработаны электронные весы с диапазоном измерения от 0 до 250 килограмм, с точностью измерения 500 грамм, с микропроцессорным управлением. Точность измерения не зависит от положения объекта на весах. Габаритные размеры весов 5000x5000 мм. Электронные весы работают от ...

0 комментариев


Наверх