Создайте проект моделирования Proteus для Thermo Senser для моделирования конструкции встроенной системы - PullRequest
0 голосов
/ 07 августа 2020

Вас просят спроектировать электронный c контроллер для кондиционера, используя программирование микроконтроллера. Полные требования указаны ниже.

  • Требуемая температура устанавливается с помощью цифровой клавиатуры c.
  • Температура в помещении измеряется датчиком LM35.
  • Температура в помещении должна отображаться на семи сегментных дисплеях.
  • Когда целевая (желаемая) температура равна температуре в помещении, реле должно быть «выключено», в противном случае оно остается «включенным».
  • Нарисуйте следующую схему c с помощью программного обеспечения Proteus. Создайте проект моделирования Proteus для моделирования вашей встраиваемой системы. Вы должны использовать PIC16F877A в качестве микроконтроллера, LM35 в качестве датчика температуры и матричную клавиатуру KEYPAD-PHONE в качестве устройств ввода.
  • Напишите программу C для выполнения указанных выше требований.

введите описание изображения здесь

Проблема в C код не работает должным образом .... !!!!!!

/* Main.c file generated by New Project wizard
 *
 * Created:   Mon Jul 25 2016
 * Processor: PIC16F877A
 * Compiler:  HI-TECH C for PIC10/12/16
*/

#include <htc.h>

//ssd outputs
unsigned int ssd_out[] = {192, 249, 164, 176, 153, 146, 130, 248, 128, 144};

//displays the given number(temp) in 2 SSDs
void display_temp(int temp);

//Analog reading functions
void adc_init();
unsigned int adc_read(unsigned int channel);

void main(void)
{
//initialize analog ports
adc_init(); 
//initializing ports
TRISB = 0;
PORTB = 0; 
TRISC = 0;
PORTC = 0;  

while (1){
int reading = adc_read(0);
int room_temp = (int)(reading * 0.4883);
display_temp(room_temp);
}
}

void adc_init() {
ADCON0 = 0x41;
ADCON1 = 0xC0;
}

unsigned int adc_read(unsigned int channel) {
if (channel > 7) return 0;  
ADCON0 &= 0xC5;
ADCON0 |= channel << 3;
__delay_ms(2);
GO_nDONE = 1;   
while(GO_nDONE)
;   
return ((ADRESH<<8) + ADRESL);
}

void display_temp(int temp) {
int digit1 = temp % 10;
int digit2 = (temp / 10) % 10;

RB1 = 1;
RB2 = 0;
PORTC = ssd_out[digit2];    
__delay_ms(10);

RB1 = 0;
RB2 = 1;
PORTC = ssd_out[digit1]; 
__delay_ms(10);
}
...