/*-------Лабораторная работа N6----------------*/
/*-------"Управление таймером"------------------*/
/* Подключение стандартных заголовков */
#include <dos.h>
#include <math.h>
#include <stdlib.h>
#include <graphics.h>
#include <time.h>
#include <conio.h>
#define TIMEINT 8 /* Прерывание таймера */
#define NN 100 /* Максимальное количество показаний */
void interrupt (*oldtime)(); /* Новый обpаботчик пpеpываний таймеpа */
void interrupt newtime(); /* Старый обpаботчик пpеpываний таймеpа */
static int y[NN]; /* Накопитель показаний */
static int ny; /* Индекс в массиве y */
static int yc; /* Текущее значение */
static int kf; /* Счетчик вызовов oldtime */
union REGS rr; /* Запись нового вектора */
struct SREGS sr;
void *readvect(int in); /* Получение старого вектора */
void writevect(int in, void *h); /* Запись нового вектора */
/*-----------------------------------------------*/
void main()
{
unsigned oldtic=65535u; /* Старый коэфф. деления */
unsigned newtic=32768u; /* Новый коэфф. деления */
int dd, /* Графический драйвер */
m, /* Графический режим */
errorcode; /* Код ошибки */
double x; /* Аргумент функций sin и cos */
textbackground(0);
clrscr();
textattr(0x0a);
cprintf(" Лабораторная работа N6 ");
cprintf("\n Управление таймером ");
textattr(0x8e);
gotoxy(35,12);
cprintf("Please wait");
/* Программирование канала 0 */
outportb(0x43,0x36); /* Управляющий байт */
outportb(0x40,newtic&0x00ff); /* Младший байт счетчика */
outportb(0x40,newtic>>8); /* Старший байт счетчика */
ny=-1; /* Признак того, что АЦП еще не началось */
kf=15;
/* Подключение к вектору */
oldtime=readvect(TIMEINT);
writevect(TIMEINT,newtime);
/* Запуск "непрерывного процесса" */
randomize();
for (x=ny=0; ny<NN; x+=1)
yc=(int)(50*(sin(x/10)+cos(x/8))+random(11)+150);
/* Восстановление вектора */
writevect(TIMEINT,oldtime);
/* Восстановление канала 0 */
outportb(0x43,0x36); /* Управляющий байт */
outportb(0x40,oldtic&0x00ff); /* Младший байт счетчика */
outportb(0x40,oldtic>>8); /* Старший байт счетчика */
/* Вывод запомненных результатов */
dd=3; /* EGA, 16 цветов */
m=1; /* Режим 640*350 */
initgraph(&dd,&m,"");
/* проверка результата инициализации */
errorcode = graphresult();
if (errorcode != grOk) /* ошибка графического режима */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* аварийное завершение */
}
setcolor(10);
settextstyle(0,0,2);
outtextxy(15,10,"Результати аналого-цифрового преобразования:");
setcolor(9);
rectangle(15,40,624,330);
setcolor(11);
for(ny=0; ny<NN; ny++)
{
circle(22+ny*6,330-y[ny]*1,2);
line(22+ny*6,330,22+ny*6,330-y[ny]*1);
}
setcolor(12);
settextstyle(0,0,1);
outtextxy(260,340,"Нажмите любую клавишу ...");
getch();
closegraph();
}
/* Новый обpаботчик пpеpиваний таймеpа */
void interrupt newtime()
{
if (--kf<0) {
/* Виклик oldtime — на 2-й раз */
(*oldtime)();
kf=1;
}
else /* иначе — сброс контроллера */
outportb(0x20,0x20);
if ((ny>=0) /* Если АЦП началось, */
&&(ny<NN)) /* и NN показаний еще не набрано, */
y[ny++]=yc; /* запоминание очередного показания */
}
/* Получение старого вектора */
void *readvect(int in)
{
rr.h.ah=0x35; rr.h.al=in;
intdosx(&rr,&rr,&sr);
return(MK_FP(sr.es,rr.x.bx));
}
/* Запись нового вектора */
void writevect(int in, void *h)
{
rr.h.ah=0x25;
rr.h.al=in;
sr.ds=FP_SEG(h);
rr.x.dx=FP_OFF(h);
intdosx(&rr,&rr,&sr);
}