Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_Sys_07_00.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
94 Кб
Скачать
☆

6.5. Текст программы

/*----------------Лабораторная работа N7------------------*/

/*-----------------"Управление таймером"------------------*/

/* Подключение стандартных заголовков */

#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);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]