в результате unsigned char присваиваем значение меньше 1
unsigned char spectr_norm[1024];
...
maxel=0;
for (i=0;i<=N-1;i++)
{//1
if (spectr[i]>maxel) maxel=spectr[i];
}//1
//------------- Normirovka spectra -------------
newstring_UART1();
for (i=0;i<=N-1;i++)
{//1
spectr_norm[i]=(spectr[i]*255)/maxel;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
printbit_UART1(i,0,16,spectr_norm[i]);
}//1
//----------------------------------
ЗЫ
это ж как надо мучаться, чтобы регулярно малевать
for (i=0;i<=N-1;i++)
вместо
for (i=0;i<N;i++)
но это фигня по сравнению с глубинным смыслом вот этого
step=step*2;
halfstep= step / 2;
с учётом явно отсутствующего переполнения step