Привет, вот мои знакомые задали мне вопрос:"Вот ты исользуешь такой дорогой микроконтроллер, чтобы вывести температуру на комп, ведь в Инете есть схемы, которые можно реализовать с помощю 2 шт. КТ315". Да...Тут трудно с ними не согласиться. И я подумал, а не зделать ли так, чтобы можно было управльять паралельно еще и нагрузками. Ответ - МОЖНО! Итак, приступим! Запустим наш Code Vision AVR, создадим новый проект с помощью Wizard'a, сначала выбираем чип и частоту ATmega8 и частота 8 МГц. Дальше выбираем порт С как выход. Так на порту С у нас будет подключена нагрузка, дальше выбираем куда будем подключать датчик DS18B20. И вот мы подошли к главному моменту - выбору и настройке USART, СОМ порта. Все, мы настроили начальный код. Дальше переписываем код на такой, или лучше удаляем все, что там было и вставляем вот это: #include <mega8.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=0 #endasm #include <1wire.h> // DS1820 Temperature Sensor functions #include <ds18b20.h> // Standard Input/Output functions #include <stdio.h> // Declare your global variables here void main(void) { char prin; int temp; unsigned char devices; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTC=0x00; DDRC=0x7F; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 19200 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // 1 Wire Bus initialization devices=w1_init(); printf("Start Device\n\r"); while (1) { prin=getchar(); switch (prin) { case 49: { PORTC=getchar()-48; break; } case 50: { temp=ds18b20_temperature(0); //читаем температуру if (temp>1000) { //если датчик выдаёт больше 1000 temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } printf("Temp=%d\n\r",temp); } }; } }
Компилируем, запускаем Proteus и рисуем следующую схемку и НЕ ЗАБУДЬТЕ В ТЕРМИНАЛЕ ВЫСТАВИТЬ СКОРОСТЬ ПОРТА 19200 Выбираем в микроконтроллере, где у нас .hex файл, дальше выставляем частоту 8 МГц. Очень рекомендую не пользоваться фюзами, а ставить кварц и конденсаторы, во избежании неправильной работы.</SPAN></SPAN> </P> Инструкция: 1) чтобы управлять нагрузкой на порту С, нужно при включеном терминале на клавиатуре нажать 1 и еще клавишу, например 2, тогда загориться 2 светодиод, только не подумайте, что если нажать 3, тогда загориться только 3тий, нет, загориться 1 и 2, почему так, спросите вы. Отвечаю, дело в том что мы отсылаем на утройство ASCII код и работаем уже дальше с ним, тоесть в двоичной системе число 3 будет иметь вид 11000000. Так, но число 3 в ASCII означает 51, да совершенно верно, в программе мы используем функцию PORTC=getchar()-48; где от полученого кода мы отнимаем 48 и результат заносим на порт С. 2) Чтобы узнать температуру нужно на клавиатуре нажать кнопку 2 и через секунду мы получим данные состояния термодатчика. Вот пожалуй и все,все вопросы на форуме. Да, и еще с этого момента я буду выкладывать все исходные файлы, прошивки и проекты Proteus'a в раздел "Файлы".
|