Всем здравствуйте и доброго времени суток. У меня есть задание - передать по USART данные с датчика ds18b20 и вывести их на экран, готовая функция на датчик есть, на прием и передачу USART написал сам, вроде все правильно, но что бы проверить в Протеусе нужно написать функцию вывода на LCD, я прочитал как с ним работать на многих ресурсах, но у меня не вышло. Я не понимаю как вывести, с инициализацией проблем нет, там несколько строчек.
Я хотел сначала просто попробовать передать число 0хFF и вывести его на экран на приемной стороне...но увы, что не так.
Помогите пожалуйста разобраться с этим вопросом
вот код на передачу по USART
CODE:
#include <tiny2313.h>
#include <stdio.h>
#define speed XTAL/(16ul*baudrate)-1
#define XTAL 8000000ul // тактова частота
#define baudrate 9600ul //скорость в бодах
#define SET_B(x) |= (1<<x) // Установить бит
#define CLR_B(x) &=~(1<<x) // Сбросить бит
void main(void)
{
UBRRL = speed;
UBRRH = 0;
UCSRB SET_B(TXEN); // разрешаем передачу - установка бита TXEN в 1
UCSRC SET_B(USBS); // один стоповый бит
UCSRC = (3<<UCSZ0); // формат кадра - 8 бит
while(!(UCSRA & (1<<UDRE)) ); // ждем пока очистится буфер передачи
// как только UDRE установится
UDR = 0xFF; // начать передачу данных
}
А вот на прием
CODE:#include <tiny2313.h>
#include <stdio.h>
#define UBR_ XTAL/(16ul*baudrate)-1
#define XTAL 8000000ul // тактова частота
#define baudrate 9600ul //скорость в бодах
#define SET_B(x) |= (1<<x) // Установить бит
#define CLR_B(x) &=~(1<<x) // Сбросить бит
#if UBR_ > 255 // если число записанное в регстр скорости больше 255
#error "USART!" // то ошибка
#endif
int temp; // глобальная переменная данных температуры
void main(void)
{
UCSRA =0;
UBRRL =(UBR_&0xFF); // скорость 9600 бод
UBRRH =0; // удвоенная скорость отключена
UCSRC = (1 << UCSZ0) | (1 << UCSZ1); // формат кадра 8 бит
UCSRB =(1<<RXEN)|(1<<RXCIE); //включить приемник
while(!(UCSRA & (1<<RXC)) ); // ждем пока очистится буфер приема
// как только UDRE установится
temp=UDR; //записать из удр в темп
}
И самое страшное для меня на LCD
CODE:#include <tiny2313.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключён экран – порт B
.equ __lcd_port=0x18
#endasm
#include <lcd.h> //библиотека для LCD
#include <stdio.h> //не знаю что за библиотека, но без неё Коллапс
char lcd_buffer[33]; //массив с данными для экрана
void main(void)
{
int temp; //переменная для хранения температуры
lcd_init(16); //инициилизация LCD, и говорим что он на 16 символов
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записываем в массив для экрана температуру и всё такое
lcd_clear(); //чистим дисплей перед выводом
lcd_puts(lcd_buffer); //выводим масив на LCD
delay_ms(500); //ждём 500мс
};
}
Прошу прощения за такой монолог
[/code]
И кому интересно, программа на сам датчик
CODE:#include <tiny2313.h> //библиотека ввода\вывода
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x12; PORTD
.equ __w1_bit=3
#endasm
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //ненаю что за библиотека, но без неё неполучается
void main(void)
{
unsigned char devices; //переменная в которой количество присоединенных датчиков
int temp; //переменная для хранения температуры
devices=w1_init(); //ищем датчики
while(devices>0) //бесконечный цикл, если датчик подключен
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
};
}
|