Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Цель работы: Изучить и исследовать методы программирования на языке Си линейных дисплеев на семисегментных светодиодных индикаторах. Исследовать методику проверки работы микроконтроллерных устройств с линейными дисплеями в среде моделирования Proteus.
Порядок выполнения работы
Задание для самостоятельной работы
1. Схема МКУ приведена на рис. 1. Нужно ввести кнопку SB1 для управления моментом измерения входного напряжения. После запуска программы и разомкнутом контакте кнопки SB1 на дисплей выводятся символы 8.8.8.8. При замкнутом контакте кнопки SB1 МКУ производит измерение напряжения и вывод значения на дисплей. При размыкании контакта кнопки измерения не производятся, а на дисплее остается величина последнего измеренного значения напряжения. Кнопку подключите к линии RA3 порта МК.
Рисунок 1. - Принципиальная схема МКУ к заданию
#include<p18f242.h>
#include<timers.h>
#include<delays.h>
#include<adc.h>
#pragma config WDT = OFF, OSC = HS
void timer0_isr(void);
#pragma interrupt timer0_isr
#pragma code high_vector = 0x08
void high_interrupt(void)
{
_asm
goto timer0_isr
_endasm
}
#pragma code
rom near char table[ ] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,
0x07, 0x7F, 0x6F };
void init(void);
float get_volts(unsigned char channel);
float volts;
char displayRAM[4];
char select = 0b11111110;
char a = 0;
void main(void)
{
init( );
while( 1 )
{
char b;
if(PORTAbits.RA3==0)
{
volts = get_volts( ADC_CH0 );
for( b = 0; b < 4; b++)
{
displayRAM[ b ] = table[(int) volts];
volts -= (int) volts;
volts *= 10;
}
}
}
}
void init(void)
{
char b;
PORTA = 0;
TRISA = 0b00001001;
PORTB = 0xFF;
TRISB = 0;
PORTC = 0;
TRISC = 0;
for (b=0; b<4; b++)
{
displayRAM[b]=0xFF;
OpenADC(ADC_FOSC_4 & ADC_RIGHT_JUST & ADC_1ANA_0REF,
ADC_CH0 & ADC_INT_OFF);
OpenTimer0(TIMER_INT_ON & T0_SOURCE_INT &
T0_8BIT & T0_PS_1_32);
WriteTimer0( 0 );
INTCONbits.GIE=1;
}
}
float get_volts(unsigned char channel)
{
SetChanADC( channel );
Delay10TCYx( 2 );
ConvertADC( );
while( BusyADC( ) );
volts = ReadADC( ) * 0.00489;
return volts;
}
void timer0_isr(void)
{
PORTB = 0xFF;
if( a == 0 )
PORTC = displayRAM[ a ] | 0b10000000;
else
PORTC = displayRAM[ a ];
PORTB = select;
select = (select << 1) | 0b00000001;
a++;
if( a == 4)
{
a = 0;
select = 0b11111110;
}
INTCONbits.TMR0IF = 0;
}
2. Требуется разработать программу для трехканального вольтметра постоянного напряжения, принципиальная схема которого приведена на рис. 2. После включения питания, если не нажата ни одна из клавиш SB1, SB2 и SB3, на дисплей выводится информация в виде:
8. |
8. |
8. |
8. |
8. |
8. |
8. |
8. |
Если нажата клавиша SB1 (измерение напряжения U1), то производится измерение напряжения U1. Если нажата клавиша SB2 (измерение напряжения U2), то производится измерение напряжения U2.Если нажата клавиша SB3 (измерение напряжения U3), то производится измерение напряжения U3.
И, наконец, если нажаты одновременно две клавиши (в любой комбинации) или три клавиши, то измерение напряжения не производится, а на дисплей выводится сообщение об ошибке в следующем виде:
E |
r |
r |
o |
r |
Рисунок 2. - Принципиальная схема МКУ к заданию
#include<p18f242.h>
#include<timers.h>
#include<delays.h>
#include<adc.h>
#pragma config WDT = OFF, OSC = HS
void timer0_isr(void);
#pragma interrupt timer0_isr
#pragma code high_vector = 0x08
void high_interrupt(void)
{
_asm
goto timer0_isr
_endasm
}
#pragma code // возврат в исходную программную секцию кода
rom near char table[ ] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,
0x07, 0x7F, 0x6F }; // таблица семисегментных кодов
void init(void); // прототип функции инициализации МК
float get_volts(unsigned char channel); // прототип функции измерения
// входного напряжения
float volts;
char displayRAM[8]; // ОЗУ дисплея
char select = 0b11111110; // код для выбора 1-го индикатора
char a = 0; // счетчик индикаторов
void main(void)
{
char get_sb; // переменная для отображения состояния
// кнопок SB1, SB2
init( ); // вызов функции инициализации МК
while( 1 )
{
Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.