{
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 была разработана печатная плата.
Разработанное устройство управления является полностью законченным прибором со всеми необходимыми функциями. Но при желании или необходимости его возможности могут быть расширены.
Приложение