Читайте также:
|
|
Client
#define F_CPU 12000000L
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>
#define LED_PORT PORTB
#define LED_DIR DDRB
#define LED_PIN 0
//подключение заголовочных файлов 1Wire библиотеки
#include "OWIPolled.h"
#include "OWIHighLevelFunctions.h"
#include "OWIBitFunctions.h"
#include "common_files\OWIcrc.h"
//номер вывода, к которому подключен датчик (порт определяется в OWIPolled.h, здесь номер вывода)
#define BUS OWI_PIN_5
//команды датчика DS18B20
#define DS18B20_WRITE_SCRATCHPAD 0x4e // write scratchpad (0x4E) - записывать в ОЗУ датчика DS18B20 три байта – Th, Tl и конфигурационный регистр
#define DS18B20_ALARM_SEARCH 0xec // alarm search (0xEC) - отвечать на нее будут подчиненные устройства с установленным флагом аварии
#define DS18B20_SKIP_ROM 0xcc // skip rom (0xCC) - для обращения ко всем 1-Wire устройствам, подключенным к шине
#define DS18B20_CONVERT_T 0x44 // convert t (0x44) - запускает процесс температурного преобразования датчика
#define DS18B20_READ_SCRATCHPAD 0xbe // read scratchpad (0xBE) - позволяет микроконтроллеру считывать содержимое ОЗУ датчика
unsigned char scratchpad[9]; // 9 байт ОЗУ датчика, буфер для хранения ОЗУ датчика
//отправка символа по usart`у
void USART_SendChar(unsigned char sym)
{
while(!(UCSRA & (1<<UDRE)));
UDR = sym;
}
//Отправляет строку символов
void USART_SendStr(char * s)
{
while(*(s)!='\0') USART_SendChar(*(s++));
}
// Функция приема данных по USART без прерывания
int USART_receive(void)
{
while(!(UCSRA & (1 << RXC))); // Ожидаем, когда данные будут получены
return UDR; // Читаем данные из буфера и возвращаем их при выходе из подпрограммы
}
// прием строки
#define SIZE_BUF 48
//буфер
volatile unsigned char cycleBuf[SIZE_BUF];
volatile unsigned char tail = 0; //"указатель" хвоста буфера
//"очищает" буфер полностью
void FlushBuf(void)
{
tail = 0;
cycleBuf[0]=0;
}
volatile unsigned char usartRxBuf = 0;
ISR (USART_RXC_vect) // Обработчик прерывания по завершению приема (соизволило заработать, кажется фаза в луну зашла - нужно продолжать)
{
usartRxBuf = UDR;
cycleBuf[tail] = usartRxBuf;
tail++;
}
unsigned char i=0;
int main (void)
{
unsigned char i=0;
unsigned char n=0;
unsigned char temperature;
unsigned char digit;
unsigned char decimal;
OWI_Init(BUS);
//статусный светодиод
LED_DIR |= (1<<LED_PIN);
LED_PORT &= ~(1<<LED_PIN);
//====================================================================
// инициализация USART
// 5 регистров – UBRRH, UBRRL, UCSRA, UCSRB, UCSRC
UBRRH = 0; // 0, потму что там ничего не затрагиваем
UBRRL = 12; // скорость обмена
//разр. прерыв при приеме, разр приема, разр передачи.
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
//обращаемся к регистру UCSRS, размер слова – 8 бит. Асинхронный режим
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
// UCSRA содержит флаги устанавливаемые самим модулем USART
//=====================================================================
sei (); // глобально разрешили прерывания
LED_PORT |= (1<<LED_PIN);
_delay_ms(500);
FlushBuf();
LED_PORT &= ~(1<<LED_PIN);
_delay_ms(500);
USART_SendStr("AT+CWQAP");
USART_SendChar(13);
_delay_ms(500);
USART_SendStr("AT+CWMODE=1");
USART_SendChar(13);
_delay_ms(300);
USART_SendStr("AT+RST");
USART_SendChar(13);*/
USART_SendStr("AT+CWQAP\r\n");
_delay_ms(500);
USART_SendStr("AT+CIPMODE=0\r\n");
_delay_ms(500);
LED_PORT &= ~(1<<LED_PIN); _delay_ms(500);}
USART_SendStr("AT+CIPMUX=1\r\n");
_delay_ms(500);
USART_SendStr("AT+CWJAP=\"TEST\",\"11223344\"\r\n");
_delay_ms(6000);
USART_SendStr("AT+CIPSTART=0,\"TCP\",\"192.168.4.1\",8888\r\n");
_delay_ms(2000);
while (1)
{
//подаем сигнал сброса
//команду для адресации всех устройств на шине
//подаем команду - запук преобразования
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_CONVERT_T,BUS);
//ждем, когда датчик завершит преобразование
while (!OWI_ReadBit(BUS));
//подаем сигнал сброса
//команду для адресации всех устройств на шине
//команду - чтение внутренней памяти
//затем считываем внутреннюю память датчика в массив
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_READ_SCRATCHPAD, BUS);
scratchpad[0] = OWI_ReceiveByte(BUS);
scratchpad[1] = OWI_ReceiveByte(BUS);
/*выводим значение целое знач. температуры*/
digit = (scratchpad[0]>>4)|((scratchpad[1]&7)<<4);
//дробная
//decimal= scratchpad[0] & 0x8;
decimal=(scratchpad[0]&15);
decimal = (decimal<<1) + (decimal<<3);
decimal = (decimal>>4);
// отправить по WiFi текущую температуру
if (digit>99){
USART_SendStr("AT+CIPSEND=0,3\r\n");
_delay_ms(200);
char buf[3];
utoa(digit, buf, 10);
USART_SendStr(buf);
}else{
USART_SendStr("AT+CIPSEND=0,7\r\n");
_delay_ms(200);
char buf[4];
sprintf(buf, "%+d.%01u C", digit, decimal);
}
FlushBuf();
_delay_ms(800);
USART_SendStr("AT+CIPSEND=0,2\r\n");
_delay_ms(10);
char buf[2];
utoa(n, buf, 10);
USART_SendStr(buf);
for (i=0; i<50; i++) {
if (cycleBuf[11]=='a') { LED_PORT |= (1<<LED_PIN); FlushBuf();}
if (cycleBuf[11]=='b') { LED_PORT &=~(1<<LED_PIN); FlushBuf();}
FlushBuf();
_delay_ms(50);
}} // конец while (1) } // конец main
Дата добавления: 2015-09-05; просмотров: 60 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Разработка и описание программного продукта | | | Слова Ю. Энтина, музыка Е. Крылатова к/ф Гостья из будущего |