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 была разработана печатная плата.
Разработанное устройство управления является полностью законченным прибором со всеми необходимыми функциями. Но при желании или необходимости его возможности могут быть расширены.
Приложение
... плана ФЭ. Большое разнообразие моделей РК приводит к необходимости использования разнообразных способов и технических средств для измерения их параметров. Как правило, статические и динамические параметры РК измеряют на разных технологических установках. Методы построения средств измерения для идентификации моделей РК могут быть сведены к следующим принципам, учитывающим особенности подключения ...
... —к «массе». Качество отработки элементов вождения по трудным грунтам зависит от наличия и состояния цепей противоскольжения, трековых дорожек, матов и средств самовытаскивания 4. РАЗРАБОТКА КОНСТРУКЦИИ ДУБЛИРУЮЩЕГО УСТРОЙСТВА УПРАВЛЕНИЯ 4.1. ОПРЕДЕЛЕНИЕ РАСЧЕТНОЙ НАГРУЗКИ НА ВАЛ, ВОЗВРАТНЫЕ ПРУЖИНЫ И ПЕДАЛИ. Номинальное усилие на дополнительные педали тормоза и сцепления будет находиться в ...
... , что позволяет осуществлять монтаж этих весов без использования большегрузных кранов. Платформы могут быть снабжены ограничительными барьерами для предотвращения случайного съезда автотранспорта с весов. В автомобильных колейных весах может быть предусмотрен доступ для очистки конструктивных засоров без демонтажа весовой платформы [5, с. 11]. Также важным является то, что колейные автомобильные ...
... их на соответствующий порт, также необходимо вывести десятичную точку P2.7. Заключение В результате проделанной работы были разработаны электронные весы с диапазоном измерения от 0 до 250 килограмм, с точностью измерения 500 грамм, с микропроцессорным управлением. Точность измерения не зависит от положения объекта на весах. Габаритные размеры весов 5000x5000 мм. Электронные весы работают от ...
0 комментариев