Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть2 / lab1sem / TIMEr
.CPP#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <stdlib.h>
#include <graphics.h>
#include <time.h>
#include <conio.h>
#define INT 8 /* Прерывание таймера */
#define N 100 /* Максимальное количество показаний */
void interrupt (*StInt)(...); /* Старый обpаботчик */
/* пpеpываний таймеpа */
void interrupt MyInt(...); /* Новый обpаботчик */
/* пpеpываний таймеpа */
static int y[N]; /* Накопитель показаний */
static int ny; /* Индекс в массиве y */
static int yc; /* Текущее значение */
static int kf; /* Счетчик вызовов oldtime */
void main()
{
unsigned StHz=65535u; /* Старый коэфф. деления */
unsigned MyHz=16384u; /* Новый коэфф. деления */
int dd, /* Графический драйвер */
m, /* Графический режим */
errorcode; /* Код ошибки */
double x; /* Аргумент функций sin и cos */
textbackground(0);
clrscr();
textattr(0x0a);
cprintf(" Lab N1 ");
cprintf(" Timer Control ");
textattr(0x8e);
gotoxy(35,12);
cprintf("Please wait");
/* Программирование канала 0 */
outportb(0x43,0x36); /* Управляющий байт */
outportb(0x40,MyHz&0x00ff); /* Младший байт счетчика */
outportb(0x40,MyHz>>8); /* Старший байт счетчика */
ny=-1; /* Признак того, что АЦП еще не началось */
kf=7;
/* Подключение к вектору */
StInt = getvect(INT);
setvect(INT,MyInt);
/* Запуск "непрерывного процесса" */
randomize();
for (x=ny=0; ny<N; x+=1)
{
int k = (int) (x)%100;
yc=(int)(1/2*k+100*sin(x/5)*random(3)+150);
}
/* Восстановление вектора */
setvect(INT,StInt); // восстановление стандартного обработчика прерывания
/* Восстановление канала 0 */
outportb(0x43,0x36); /* Управляющий байт */
outportb(0x40,StHz&0x00ff); /* Младший байт счетчика */
outportb(0x40,StHz>>8); /* Старший байт счетчика */
dd=3;
m=1;
initgraph(&dd,&m,"C:\\BORLANDC\\BGI");
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,"Result of Arifmetic Numeric Convertion");
setcolor(9);
rectangle(15,40,624,330);
setcolor(11);
for(ny=0; ny<N; ny++)
{
circle(22+ny*6,190-y[ny]/3,2);
line(22+ny*6,190,22+ny*6,190-y[ny]/3);
}
setcolor(3);
line(17,190,623,190);
setcolor(12);
settextstyle(0,0,1);
outtextxy(260,340,"Press any key ...");
delay(100);
getch();
closegraph();
}
/* Новый обpаботчик пpеpиваний таймеpа */
void interrupt MyInt(...)
{
if (--kf<0) {
/* Виклик StInt - на 8-ой раз */
(*StInt)();
kf=7;
}
else /* иначе - сброс контроллера */
outportb(0x20,0x20);
if ((ny>=0)&&(ny<N)) /* и N показаний еще не набрано, */
{
//sound(ny*100);
delay(50);
nosound();
y[ny++]=yc; /* запоминание очередного показания */
}
}