Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Задание:
Спроектировать схему измерителя напряжения в пакете ISIS Proteus VSM. В качестве датчика использовать делитель напряжения на переменном резисторе. Предусмотреть светодиодную пороговую сигнализацию. Схему снабдить светодиодным семисегментным индикатором показаний напряжения. Микроконтроллер Atmega 8. Программу написать на языке Си в Code Vision AVR.
Решение.
Схема измерителя представлена на рисунке 1 и рисунке 2.
Рисунок 1. Измеритель напряжения.
На вход ADC0 порта С подаётся измеряемое напряжение с движка резистора RV1. С порта В на вход ABCDEFG светодиодного индикатора подаётся комбинация сигналов высокого и низкого уровней, соответствующая десятичной цифре либо первого, либо второго, либо третьего, либо четвёртого разрядов. На вход DP светодиодного индикатора подаётся сигнал десятичной запятой. Низкий уровень сигналов на этих входах соответствует включенному светодиоду. С выходов PD0…PD3 порта D микроконтроллера подаются стробирующие импульсы на входы 1, 2, 3, 4 светодиодного индикатора. Высокий уровень сигнала соответствует включенной цифре.
Если на входе ADC0 порта С уровень напряжения больше 1 В, то с помощью транзисторного ключа Q1 загорается диод D1 (рисунок 2).
Рисунок 2. Измеритель напряжения: индикация перегрузки.
Составим алгоритм работы микроконтроллера (см. рисунок 3).
По алгоритму создадим программу на языке Си в Code Vision AVR:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 25.04.2010
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 1,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
unsigned int x,a1,a2,a3,a4;
// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 500,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x81;
while (1)
{
// Place your code here
x=read_adc(0); //Запись величины.
if (x>1000) //Установление порога сигнализации.
PORTD.4=1; //Включить диод.
else
PORTD.4=0; //Выключить диод.
a1=x/1000; //Первая цифра.
a2=x-a1*1000;
a2=a2/100; //Вторая цифра.
a3=x-(a1*1000+a2*100);
a3=a3/10; //Третья цифра.
a4=x-(a1*1000+a2*100+a3*10); //Четвёртая цифра.
switch (a1) //Вывод первой цифры...
{
case 0: PORTB=0b00000001; break;
case 1: PORTB=0b01001111; break;
case 2: PORTB=0b00010010; break;
case 3: PORTB=0b00000110; break;
case 4: PORTB=0b01001100; break;
case 5: PORTB=0b00100100; break;
case 6: PORTB=0b00100000; break;
case 7: PORTB=0b00001111; break;
case 8: PORTB=0b00000000; break;
case 9: PORTB=0b00000100; break;
}
PORTD.0=1; //...в первую позицию.
delay_ms(10);
PORTD.0=0;
switch (a2) //Вывод второй цифры...
{
case 0: PORTB=0b10000001; break;
case 1: PORTB=0b11001111; break;
case 2: PORTB=0b10010010; break;
case 3: PORTB=0b10000110; break;
case 4: PORTB=0b11001100; break;
case 5: PORTB=0b10100100; break;
case 6: PORTB=0b10100000; break;
case 7: PORTB=0b10001111; break;
case 8: PORTB=0b10000000; break;
case 9: PORTB=0b10000100; break;
}
PORTD.1=1; //...во вторую позицию.
delay_ms(10);
PORTD.1=0;
switch (a3) //Вывод третьей цифры...
{
case 0: PORTB=0b10000001; break;
case 1: PORTB=0b11001111; break;
case 2: PORTB=0b10010010; break;
case 3: PORTB=0b10000110; break;
case 4: PORTB=0b11001100; break;
case 5: PORTB=0b10100100; break;
case 6: PORTB=0b10100000; break;
case 7: PORTB=0b10001111; break;
case 8: PORTB=0b10000000; break;
case 9: PORTB=0b10000100; break;
}
PORTD.2=1; //...в третью позицию.
delay_ms(10);
PORTD.2=0;
switch (a4) //Вывод четвёртой цифры...
{
case 0: PORTB=0b10000001; break;
case 1: PORTB=0b11001111; break;
case 2: PORTB=0b10010010; break;
case 3: PORTB=0b10000110; break;
case 4: PORTB=0b11001100; break;
case 5: PORTB=0b10100100; break;
case 6: PORTB=0b10100000; break;
case 7: PORTB=0b10001111; break;
case 8: PORTB=0b10000000; break;
case 9: PORTB=0b10000100; break;
}
PORTD.3=1; //...в четвёртую позицию.
delay_ms(10);
PORTD.3=0;
};
}
PAGE 8
Начало
аписать значение напряжения Х на входе в регистр АЦП..
Выключить сигнализацию.
Найти первую цифру. сигнализацию.
Найти вторую цифру. сигнализацию.
Найти третью цифру. сигнализацию.
Найти четвёртую цифру. сигнализацию.
Вывести первую цифру в первую позицию. сигнализацию
Вывести вторую цифру в первую позицию. сигнализацию.
Вывести третью цифру в первую позицию. сигнализацию.
Вывести четвёртую цифру в первую позицию. сигнализацию.
Включить сигнализацию.
Х>1.000
Да
Нет
Рисунок 3. Алгоритм работы контроллера.
Инициализация микроконтроллера.