Изучить и исследовать методы программирования на языке Си линейных дисплеев на семисегментных светодиодных индикаторах. Исследовать методику проверки работы микроконтроллерных устройств с линейными дисплеями в среде моделирования Proteus

Страницы работы

Содержание работы

Цель работы: Изучить и исследовать методы программирования на языке  Си  линейных дисплеев на семисегментных светодиодных индикаторах. Исследовать методику проверки работы микроконтроллерных устройств с линейными дисплеями в  среде моделирования  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 )

{

Похожие материалы

Информация о работе