Код:#include <mega128.h>
#include <mega128_bits.h>
#include <delay.h>
#include <stdio.h>
#include <string.h>
#asm
.equ __lcd_port=3; PORTE
#endasm
#include <alcd.h>
#define ADC_VREF_TYPE 0x40
static float temp; // Переменная вывода значений температур
static int adc_T, i, j; // Переменные обработчика массива
int Lev[151] = { 1007, 1006, 1005, 1003, 1002, 1001, 1000, 998, 997, 996,
994, 993, 991, 989, 987, 985, 983, 980, 978, 975,
972, 969, 966, 962, 959, 956, 952, 948, 944, 940,
936, 931, 927, 922, 917, 911, 906, 900, 894, 888,
882, 875, 869, 862, 855, 848, 841, 833, 825, 817,
809, 801, 792, 783, 774, 765, 756, 747, 737, 727,
717, 707, 697, 687, 677, 666, 655, 645, 634, 623,
613, 602, 591, 580, 569, 558, 548, 537, 526, 515,
505, 494, 483, 473, 463, 452, 442, 432, 422, 412,
402, 392, 382, 373, 364, 355, 347, 339, 331, 323,
315, 307, 299, 292, 284, 277, 270, 263, 256, 250,
243, 237, 231, 225, 219, 213, 207, 202, 196, 191,
186, 181, 176, 171, 167, 162, 158, 154, 150, 146,
142, 138, 134, 131, 127, 124, 121, 117, 114, 111,
108, 105, 102, 100, 97, 94, 92, 90, 88, 85,
83 };
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(20);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void scanner()
{ // Сканируем массив зничений чемператур
for (i = 0; i < 150; i++){
if(Lev[i] <= adc_T){
return; }
}
}
void temp_des()
{ // Вычисляем десятые температур по диапазонам
float a = Lev[j-1] - Lev[j]; // разность для всего диапазона
float b = adc_T - Lev[j]; // десятые для низких температур
float c = Lev[j-1] - adc_T; // десятые для высоких температур
j = i;
if(Lev[j] == adc_T){ // Целочисленные значения температур при совпадении
temp = j;
} // значений таблицы с текущим значением АЦП
else if (adc_T > 882){ // Вычисляем значение минусовых температур
temp = j-b/a;
} // с десятыми
else { // Вычисляем значения плюсовых температур
temp = j-1+c/a; // с десятыми
}
}
void main(void)
{
unsigned int adc; // Переменная выборки из ADC (напряжение)
char string[10]; // Перенеммая для вывода на LCD
float U, T; // Переменные форматирования данных для вывода на LCD
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;
lcd_init(40);
lcd_clear();
while (1)
{
adc=read_adc(0); // вызываем функцию для измерения напряжения и передаем ей номер ножки,
U=(float) adc*50.0/1024; // Переводим в вольты
sprintf(string, "U %2.1fv", U); // форматируем
lcd_gotoxy(0,1); // Выставляем курсор
lcd_puts(string); // Выводим значение
delay_us(50);
adc_T=read_adc(1); // Вызов АЦП (замер показаний термистора
scanner(); // Вызов функции сканирования массива
temp_des(); // Вызов функции вычисления значений температур
T=(float) temp-40; // Получение значений температур
sprintf(string, "t %+3.1f C", T); // Отправили на LCD
lcd_gotoxy(10,1);
lcd_puts(string);
delay_us(50);
}
}
Всем доброго...