Вас просят спроектировать электронный 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);
}