Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 11:33   #1
michaelk
Новичок
Джуниор
 
Регистрация: 06.12.2009
Сообщений: 1
Печаль Подправить рабочий код.

Программа полностью рабочая, но как сказал препод, она пойдет только на 95, 98 виндоусе((((( Нужно просто поменять какие-то команды, что бы программа запустилась на ХР.

Посмотрите/помогите пожалуйста.

1. Цель роботы
Изучение функций системного таймера и закрепление практических навыков работы с ним.

3. Постановка задачи
Построить модель аналого-цифрового преобразователя (АЦП), которая работает в реальном времени. Процесс, который дискретизуется, моделируется программой (программным блоком), который выполняет циклическое вычисление функции y=F(x), где x - номер итерации. Преобразователь моделируется программой, которая выполняет с заданной частотой (в реальном времени) прерывание процесса, считывание и запоминание текущего значения функции. Запомнить не меньше 80 значений функции. Обеспечить наглядное представление результатов работы "АЦП".

• функция - y=50*(sin(x/10)+cos(x/8))+R+150;
• R - в диапазоне 0 - 10;
• частота - 36.4 Гц.


Код:
#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("              Lab work N6              ");
  cprintf("\n                Control timer               ");
  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,"Results:");
  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,"Press any key ...");
  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);
}
michaelk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код рабочий, но случайным образом Эксель глючит при сохранении. Где ошибка7 grenles Microsoft Office Excel 12 23.09.2009 11:03
вроде рабочий код добавления картинок в Blob поля!!! Rofar БД в Delphi 0 14.06.2009 19:14
Подправить код. Тема: База данных, хранимая в файле. На Паскале qwertytol Помощь студентам 0 02.06.2009 09:03
подправить код ELF astserg01 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 09.04.2009 06:49
constructor, destructor override. Подправить код. Roof Общие вопросы Delphi 9 31.07.2008 13:41