Обработка аналоговых сигналов на основе МК C8051F064

Автор: Пользователь скрыл имя, 13 Декабря 2012 в 09:08, курсовая работа

Описание работы

Цель курсовой работы – получение навыков программирования аппаратных комплексов, включающих взаимодействующие между собой различные 8- или 32-разрядные микроконтроллерные системы (МК-системы) и персональные компьютеры (РС), на языках Ассемблеров, С – для микроконтроллеров (МК) и языке С++ для РС с платформой Windows.

Содержание

1. Постановка задачи 6
1.1. Стандартное задание 6
1.2. Индивидуальное задание 6
2. Техническое задание 7
3. Описание аппаратных и программных средств лабораторного комплекса 8
3.1. Структура аппаратных средств 8
3.1.1. Структурная схема лабораторного комплекса 8
3.1.2. Плата МК – системы 9
3.1.2.1. Конфигурируемые узлы МК C8051F064 11
3.1.2.2. Внешняя память XRAM 16
3.1.2.3. Входные усилители 17
3.1.2.4. Микросхема моста UART-USB 18
3.1.2.5. Сопряжение платы с PC 20
3.1.2.6. Питание платы 21
3.1.3. Требования к PC 21
3.1.4. ОСЦИГЕН 21
3.2. Перечень программных средств лабораторного комплекса 22
3.2.1. Средства программирования и отладки МК-системы 22
3.2.1.1. Интегрированная среда разработки фирмы SiLabs IDE 2.0 22
3.2.1.2. Ассемблер, компилятор и линкер интегрированной среды разработки Keil 23
3.2.2. Средства разработки Windows-приложений 24
3.2.2.1. Среда разработки 24
3.2.2.2. Библиотека WIN32 API функций 24
3.2.3. Приложения для ОСЦИГЕНа. 25
3.2.3.1. Драйвер конфигурируемого выносного блока 25
3.2.3.2. Windows-приложение OGView 25
3.2.4. Драйвер виртуального COM-порта фирмы SiLabs 26
4. Разработка программного комплекса для решения целевой задачи 26
4.1. Функциональная схема реализации функций запоминающего осциллографа 26
4.2. Состав и механизм взаимодействия приложений программного комплекса 27
4.2.1. Схема программного комплекса 27
4.2.2. Протокол обмена между PC-приложением и МК-приложением 27
4.2.3. Таблица допустимых команд 27
4.2.4. Размещение в памяти значений выборок сигнала со стороны МК и ПК 28
4.3. Разработка приложения для МК-системы 29
4.3.1. Обобщенная схема алгоритма 29
4.3.2. Обоснование выбора языка программирования и среды разработки 30
4.3.3. Описание файлов проекта приложения 30
4.3.3.1. Модули приложения 30
4.3.3.2. Модули, подключаемые на этапе линкования 30
4.3.4. Структура и организация программы 30
4.3.5. Схемы алгоритмов и описание функций приложения 30
4.3.5.1. Перечень функций приложения 30
4.3.5.2. Организация бесконечного цикла встроенного приложения 31
4.3.5.3. Отключение сторожевого таймера 31
4.3.5.4. Переключение с внутреннего генератора на внешний 32
4.3.5.5. Конфигурирование портов ввода/вывода 33
4.3.5.6. Конфигурирование аналого-цифровых преобразователей ADC 32
4.3.5.7. Конфигурирование интерфейса DMA 34
4.3.5.8. Инициализация последовательного интерфейса UART 35
4.3.5.9. Выбор и инициализация таймера для установки скорости обмена данными по последовательному каналу 36
4.3.5.10. Инициализация таймера для установки времени дискретизации входного сигнала 36
4.3.5.11. Выбор режимов работы внешней памяти XRAM и ее интерфейса 36
4.3.5.12. Инициализация прерываний 37
4.3.5.13. Формирование цифровых отсчетов и их сохранение во внешней памяти XRAM 37
4.3.5.14. Передача данных на PC 37
4.3.5.15. Прием данных с PC 37
4.3.5.16. Другие используемые функции 38
4.3.5.17. Конфигурирование узлов МК с учетом данных, пришедших с PC 38
4.4. Разработка Windows-приложения 39
4.4.1. Особенности использования среды разработки 39
4.4.2. Описание файлов проекта 39
4.4.3. Обобщенная схема алгоритма многопоточного приложения 40
4.4.4. Внешний вид и описание графического интерфейса, принципы построения программы 40
4.4.5. Описание структуры и организация программы 41
4.4.5.1. Назначение подключаемых файлов 41
4.4.5.2. Описание прототипов функций 41
4.4.5.3. Функция WinMain() 42
4.4.5.4. Функция главного окна 42
4.4.5.5. Организация дополнительных потоков, их назначение 43
4.4.5.6. Рабочие функции дополнительных потоков 43
4.4.5.7. Синхронизация потоков 43
4.4.5.8. Особенности обработки сообщений Windows в программе 43
4.4.5.9. Функция рисования графика восстановленного сигнала 45
4.4.5.10. Разметка осей графика 45
4.4.5.11. Использование контекстуальной памяти для рисования графика 45
4.4.6. Работа с COM-портом, описание WinAPI-функций и структур данных 46
4.4.6.1. Инициализация COM-порта, обоснование выбора режима (синхронный, асинхронный), объема буфера приема/передачи данных 46
4.4.6.2. Организация настроек COM¬-порта в графическом интерфейсе 48
4.4.6.3. Использование функций WaitCommEvent(), WaitForSingleObject(), WaitForMultiplyObject() 49
4.4.7. Работа оператора с приложением 49
4.4.7.1. Последовательность запуска приложения на МК и ПК в лаборатории 49
4.4.7.2. Примеры последовательности 49
4.4.7.3. Адаптация к сепктру входного сигнала 49
4.4.8. Описание протокола RS-232 49
5. Список используемых источников информации 87
6. Приложения 50
6.1. Исходные тексты модулей программы для МК 50
6.2. Фрагменты листингов файлов МК-приложения, полученные в результате трансляций: MAP-file и др 56
6.3. Исходные тексты файлов Windows-приложения 58
6.4. Алгоритмы 72
6.4.1. Обобщенный алгоритм программы для МК 72
6.4.2. Дополнительные алгоритмы программы для МК 73
6.4.2.1. Алгоритм процедуры отключения WDT 73
6.4.2.2. Алгоритм функции SYSCLK_Init 74
6.4.2.3. Алгоритм функции Port_Init 75
6.4.2.4. Алгоритм функции ADCInit 76
6.4.2.5. Алгоритм функции DMAInit 77
6.4.2.6. Алгоритм работы функции UART0_Init 79
6.4.2.7. Алгоритм функции Timer3_Init 80
6.4.2.8. Алгоритм функции main 81
6.4.2.9. Алгоритм функции Config 82
6.4.2.10. Алгоритм функции SendData 83
6.4.2.11. Алгоритм функции ReceiveData 84
6.4.3. Обобщенный алгоритм программы Windows-приложения 85
6.4.3.1. Алгоритм работы функции рисования графика 85
6.4.3.2. Алгоритм обработки сообщений 86

Работа содержит 1 файл

Обобщенная пояснительная записка.doc

— 5.12 Мб (Скачать)

 

 

 

  1. Список используемых источников  информации
  2. http://www.megachip.ru/images/templates/big/8051F064EK.jpg
  3. Описание МК C8051F064, https://www.silabs.com/Support%20Documents/TechnicalDocs/C8051F064-EK.pdf
  4. Описание семейства МК C8051F06x (перевод), http://www.efo.ru/doc/Silabs/pdf/C8051F06x.pdf
  5. «Новый UART-USB мост CP2102 от фирмы Silicon Laboratories», О.Николайчук, http://www.silabs.ru/pubs/Stat_096.pdf,
  6. «Сетевой комбинированный прибор Осицген»,  
    http://npo-rtc.ru/product/oscigen/why.html
  7. Программное обеспечение для МК фирмы Silicon Laboratories, http://www.efo.ru/doc/Silabs/Silabs.pl?2083#link1
  8. Keil uVision3 - среда разработки ПО для микроконтроллеровсерии х51 на языке С / Asembler,  
    http://binural.ru/soft/print:page,1,1147836023-keil-uvision-3-sreda-razrabotki-po-dlja.html
  9. Библиотека WindowsAPI 32, http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/WindowsAPI/API-DLL-1.mspx
  10. Программное обеспечение OGView,  
    http://www.npo-rtc.ru/product/oscigen/program.html
  11. SiLabs: использование USB,  
    http://www.efo.ru/doc/Silabs/Silabs.pl?2150
  12. Описание платы C8051F064EK, https://www.silabs.com/Support%20Documents/TechnicalDocs/C8051F064-EK.pdf,

 

 

  1. Приложения
    1. Исходный код программы Windows-приложения

// 111.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "111.h"

#include <commctrl.h>

#include <stdio.h>

#include <process.h>

#include <math.h>

#include <vector>

#include <string>

#define MAX_LOADSTRING 100

#define TIMEOUT 2000

 

// Global Variables:

HINSTANCE hInst; // current instance

TCHAR szTitle[MAX_LOADSTRING];     // The title bar text

TCHAR szWindowClass[MAX_LOADSTRING];   // the main window class name

TCHAR WB_Class[MAX_LOADSTRING];     //the graph window class name

std::vector<double> buffer;      //main buffer

 

HANDLE COMport = NULL;      //handle to COM port

struct Info         //information about options

{char adc_mode;        //1 - adc0, 2 - adc1, 3 - diff

double freq;        //frequency

char port;         //num of port

int samples;        //number of samples

double time_zoom;       //koefficients of zooming

double u_zoom;

char ready;

union

{unsigned char test;    //sending structure

struct {

unsigned char ADC0:1;    

unsigned char ADC1:1;

unsigned char F:2;    //optional frequency

unsigned char S:4;    //2^S>=samples

};

};

}mess;

 

 

HWND Main_Wnd;     //handles to the windows

HWND hFreq;

HWND hPort;

HWND hSamples;

ATOM aWB_Class;

RECT r;

 

#define ID_LIST 15    //ID of controls

#define ID_START 140

#define ID_KILL 666

#define ID_DEMO 500

 

#define ID_UINC 168

#define ID_UDEC 169

#define ID_TINC 178

#define ID_TDEC 179

 

#define ID_FREQ 4545

#define ID_ADC0 201

#define ID_ADC1 202

#define ID_CHECKBOX 203

#define ID_SAMP 204

#define ID_PORT 205

 

 

HWND WB_Wnd;

// Forward declarations of functions included in this code module:

ATOM    MyRegisterClass(HINSTANCE hInstance);

BOOL    InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK WorkBenchProc(HWND,UINT,WPARAM,LPARAM);

 

int SampChk()//function translating text into number

{

char **at= 0;

TCHAR SampStr[14];

int i=0; int res=0;

SendMessage(hSamples, EM_GETLINE, 0,(LPARAM) SampStr);

while(SampStr[i]<='9'&&SampStr[i]>='0')

{

 

res*=10;

res+=strtol((const char *)(SampStr+i++),at,10);

}

return res;

}

 

int parcechar(double a, WCHAR *dest) //function translating number into text

{

{int i=0;int tmp=0; int j=0;

while(pow(10.,++i)<a);

while(i>0)

{tmp=a/pow(10.,--i);

dest[j++]=48+tmp;

a-=tmp*pow(10.,i);

}

dest[j++]='.';

while(i>-2)

{tmp=a/pow(10.,--i);

dest[j++]=48+tmp;

a-=tmp*pow(10.,i);

}

dest[j]=0;

return j;

}

}

 

BOOL Line(HDC hdc, int x1, int y1, int x2, int y2)//function printing line from coordinates x1 y1 to x2 y2

{

MoveToEx(hdc, x1, y1, NULL);

return LineTo(hdc, x2, y2);

}

 

void demo()//function generating sine wave

{ mess.ready=0;

buffer.clear();

for(int i=0;i<mess.samples;i++)

buffer.push_back(65536*fabs(sin((i*(1000/mess.freq)))));

mess.ready=1;

}

 

int Recieve(unsigned char *byte)//function recieving byte from the port

{

DWORD begin = GetTickCount();

DWORD read=0;

 

while((GetTickCount()-begin) < DWORD(TIMEOUT))

{

if(ReadFile(COMport,  byte, 1, &read, NULL))

{

return 1;

}

}

MessageBox(Main_Wnd, TEXT("Error recieving data"), TEXT("Error"), MB_OK);

return 0;

}

void RecieveData()//function making 1 integer from 2 bytes getting from the com port

{

unsigned char Hbyte,Lbyte;

int i;

for (i=0;i<pow(2.,mess.S);i++)

{

Recieve(&Hbyte);

Recieve(&Lbyte);

 

 

//buffer[i]=Hbyte*256+Lbyte;

buffer.push_back(Lbyte + 256*Hbyte);

 

}

 

}

 

 

 

int sendSet( )//function sending &recieving data from the com port

{

 

DWORD namePort[5];

 

switch (mess.port)//opening port

{

case 0: memcpy(namePort,"Com1",5); break;

case 1: memcpy(namePort,"Com2",5); break;

case 2: memcpy(namePort,"Com3",5); break;

case 3: memcpy(namePort,"Com4",5); break;

case 4: memcpy(namePort,"Com5",5); break;

}

 

COMport = CreateFile((LPCWSTR)namePort,GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

 

if (COMport == INVALID_HANDLE_VALUE)

{

MessageBox(Main_Wnd, TEXT("Error opening COM port"), TEXT("Error"), MB_OK);

return false;

}//end opening port

 

 

DCB dcbComm;

BOOL fSuccess;//checking port state

fSuccess = GetCommState(COMport, &dcbComm);

 

if (!fSuccess)

{

MessageBox(Main_Wnd, TEXT("Error configurating COM port"), TEXT("Error"), MB_OK);

CloseHandle(COMport);

return false;

}

//purify the port

PurgeComm(COMport, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

//configurating port & timeouts

memset(&dcbComm,0,sizeof(dcbComm));

dcbComm.DCBlength = sizeof(DCB);

GetCommState(COMport, &dcbComm);

dcbComm.BaudRate = CBR_115200;

dcbComm.ByteSize = 8;

dcbComm.Parity = NOPARITY;

dcbComm.StopBits = ONESTOPBIT;

dcbComm.fAbortOnError = TRUE;

dcbComm.fDtrControl = DTR_CONTROL_DISABLE;

dcbComm.fRtsControl = RTS_CONTROL_DISABLE;

dcbComm.fBinary = TRUE;

dcbComm.fParity = FALSE;

dcbComm.fInX = dcbComm.fOutX = FALSE;

dcbComm.XonChar = 0;

dcbComm.XoffChar = BYTE(0xff);

dcbComm.fErrorChar = FALSE;

dcbComm.fNull = FALSE;

dcbComm.fOutxCtsFlow = FALSE;

dcbComm.fOutxDsrFlow = FALSE;

dcbComm.XonLim = 128;

dcbComm.XoffLim = 128;

 

 

COMMTIMEOUTS TimeOuts;

 

SetCommMask(COMport, EV_RXCHAR);

SetupComm(COMport, 1500, 1500);

 

TimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;

TimeOuts.ReadTotalTimeoutMultiplier = 0;

TimeOuts.ReadTotalTimeoutConstant = TIMEOUT;

TimeOuts.WriteTotalTimeoutMultiplier = 0;

TimeOuts.WriteTotalTimeoutConstant = TIMEOUT;

 

if (!SetCommTimeouts(COMport, &TimeOuts))

{

MessageBox(Main_Wnd, TEXT("Error configurating COM port"), TEXT("Error"), MB_OK);

CloseHandle(COMport);

return false;

}

 

 

if (!SetCommState(COMport, &dcbComm))

{

MessageBox(Main_Wnd, TEXT("Error configurating COM port"), TEXT("Error"), MB_OK);

CloseHandle(COMport);

return false;

}

 

 

DWORD length = 1;

OVERLAPPED inf= {0};

//send information byte to the process

WriteFile(COMport, (LPCVOID) mess.test, length, NULL, &inf);

 

 

//recieving data

RecieveData();

 

 

 

//closing handle

CloseHandle(COMport);

return 0;

}

 

 

 void  MyThreadSend(void *dummy)

{ mess.ready=0;//buffer is not avaliable now

buffer.clear();//buffer is empty

if(sendSet())//sending and recieving

mess.ready=1;//buffer is full and avaliable

SendMessage(WB_Wnd, WM_PAINT, 0, 0);//repaint the graphysc

 

}

 

 void MyThreadPaint(void * hDCbuf)

{

 for(int i=0;i<mess.samples; i++)//putting pixels on the hDCbuf

{

SetPixel((HDC) hDCbuf,20+i*mess.time_zoom, -buffer[i]*160.*mess.u_zoom/65536+180, 0);

}

}

int APIENTRY _tWinMain(HINSTANCE hInstance,//general init

                     HINSTANCE hPrevInstance,

                     LPTSTR    lpCmdLine,

                     int       nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

 

  // TODO: Place code here.

MSG msg;

HACCEL hAccelTable;

 

// Initialize global strings

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_MY111, szWindowClass, MAX_LOADSTRING);

LoadString(hInstance, IDC_MYWBCLASS, WB_Class, MAX_LOADSTRING);

MyRegisterClass(hInstance);

 

// Perform application initialization:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

 

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY111));

 // InitCommonControls();

  LoadLibrary((LPCWSTR)"comctl32.dll");

 

  // Main message loop:

 

while (GetMessage(&msg, NULL, 0, 0))

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

 

return (int) msg.wParam;

}

 

 

 

//

//  FUNCTION: MyRegisterClass()

//

//  PURPOSE: Registers the window class.

//

//  COMMENTS:

//

//    This function and its usage are only necessary if you want this code

//    to be compatible with Win32 systems prior to the 'RegisterClassEx'

//    function that was added to Windows 95. It is important to call this function

//    so that the application will get 'well formed' small icons associated

//    with it.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

 

ATOM tmp;

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

 

wcex.style   = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra  = 0;

wcex.cbWndExtra  = 0;

wcex.hInstance  = hInstance;

wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY111));

wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MY111);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 

tmp= RegisterClassEx(&wcex);

WNDCLASSEX WorkBenchClass;

WorkBenchClass.cbSize=sizeof(WNDCLASSEX);

 

WorkBenchClass.style   = CS_HREDRAW | CS_VREDRAW;

WorkBenchClass.lpfnWndProc  = WorkBenchProc;

WorkBenchClass.cbClsExtra  = 0;

WorkBenchClass.cbWndExtra  = 0;

WorkBenchClass.hInstance  = hInstance;

WorkBenchClass.hIcon   = NULL;

WorkBenchClass.hCursor   = LoadCursor(NULL, IDC_ARROW);

WorkBenchClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

WorkBenchClass.lpszMenuName  = NULL;

WorkBenchClass.lpszClassName = WB_Class;

WorkBenchClass.hIconSm   = NULL;

 

aWB_Class=RegisterClassEx(&WorkBenchClass);

 

 

return tmp;

}

 

//

//   FUNCTION: InitInstance(HINSTANCE, int)

//

//   PURPOSE: Saves instance handle and creates main window

//

//   COMMENTS:

//

//        In this function, we save the instance handle in a global variable and

//        create and display the main program window.

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

   HWND hWnd;

 

   hInst = hInstance; // Store instance handle in our global variable

 

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

     20, 20, 600, 400, NULL, NULL, hInstance, NULL);

 

   if (!hWnd)

   {

      return FALSE;

   }

   Main_Wnd=hWnd;

 

  WB_Wnd = CreateWindow(WB_Class, NULL, WS_VISIBLE|//graphysc window

WS_TABSTOP|WS_CHILD|WS_THICKFRAME|WS_DLGFRAME|WS_CLIPCHILDREN,10,100,520,200,hWnd, NULL, hInstance, NULL);

 

   ShowWindow(hWnd, nCmdShow);

   UpdateWindow(hWnd);

 

 

 

 

   return TRUE;

}

 

//

//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)

//

//  PURPOSE:  Processes messages for the main window.

//

//  WM_COMMAND - process the application menu

//  WM_PAINT - Paint the main window

//  WM_DESTROY - post a quit message and return

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

static HWND ChBox;

static HWND hwndEdit;//lots of variables using because of imperfecion of the code

BOOL checked;

HWND hwndLeftLabel;

    HWND hwndRightLabel;

static LRESULT res = 0;

 static HWND hwndCombo, hwndStatic;

  const TCHAR *items[] = { TEXT("COM1"), TEXT("COM2"),

      TEXT("COM3"), TEXT("COM4"),TEXT("COM5") };

  int i;

  LRESULT sel = 0;

switch (message)

{

case WM_CREATE://create window, init the message fields; create configuration controls

mess.ADC0=0;mess.ADC1=1;mess.F=3;mess.S=15;

mess.adc_mode=1;

mess.freq=200000;

mess.port=1;

mess.samples=44000;

mess.time_zoom=1;

mess.u_zoom=1;

// ADC choising

          CreateWindow(TEXT("button"), TEXT("Select Mode"),

                WS_CHILD | WS_VISIBLE | BS_GROUPBOX,

                10, 10, 120, 60, hWnd, (HMENU) 0, hInst, NULL);

          CreateWindow(TEXT("button"), TEXT("ADC0"),

                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,

                15, 25, 60, 23, hWnd, (HMENU)ID_ADC0 , hInst, NULL);

  CreateWindow(TEXT("button"), TEXT("ADC1"),

                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,

                15, 43, 60, 23, hWnd, (HMENU)ID_ADC1, hInst, NULL);

CheckDlgButton(hWnd, ID_ADC1, BST_CHECKED);

  ChBox=CreateWindow(TEXT("button"), TEXT("Diff"),

                WS_VISIBLE | WS_CHILD |  WS_DISABLED|BS_CHECKBOX,

               80, 25, 45, 23,       

                hWnd, (HMENU) ID_CHECKBOX, hInst, NULL);

//Frequency control

  CreateWindow(TEXT("button"), TEXT("Select Frequency"),

                WS_CHILD | WS_VISIBLE | BS_GROUPBOX,

                140, 10, 180, 60, hWnd, (HMENU) 0, hInst, NULL);

       hwndLeftLabel = CreateWindow(TEXT("STATIC"), TEXT("50 kHz"),

                         WS_CHILD | WS_VISIBLE,

                         80, 80, 30, 30,

                         hWnd, (HMENU)0, NULL, NULL);

 

         hwndRightLabel = CreateWindow(TEXT("STATIC"),TEXT("200 kHz"),

                         WS_CHILD | WS_VISIBLE,

                         80, 80, 30, 30,

                         hWnd, (HMENU)0, NULL, NULL);

 

         hFreq = CreateWindow( TRACKBAR_CLASS, 0,WS_CHILD | WS_VISIBLE |TBS_AUTOTICKS | TBS_ENABLESELRANGE, 

              180, 30, 100, 30, hWnd, (HMENU)ID_FREQ, hInst, NULL);

 

         SendMessage(hFreq, TBM_SETRANGE,  TRUE,  MAKELONG(0, 3));

         SendMessage(hFreq, TBM_SETPAGESIZE, 0,  20);

         SendMessage(hFreq, TBM_SETTICFREQ, 20, 0);

         SendMessage(hFreq, TBM_SETPOS, FALSE, 255);

         SendMessage(hFreq, TBM_SETBUDDY, TRUE, (LPARAM) hwndLeftLabel);

         SendMessage(hFreq, TBM_SETBUDDY, FALSE, (LPARAM) hwndRightLabel);

//celection port control

 

 

CreateWindow(TEXT("button"), TEXT("Select Port"),

                WS_CHILD | WS_VISIBLE | BS_GROUPBOX,

                330, 10, 120, 60, hWnd, (HMENU) 0, hInst, NULL);

 

  hPort = CreateWindow(WC_COMBOBOX, NULL,

                  WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,

                  335, 25, 110, 110, hWnd,(HMENU)ID_PORT, hInst, NULL);  

 

 

            for ( i = 0; i < 5; i++ ) {

                SendMessage(hPort, CB_ADDSTRING, 0, (LPARAM) items[i]);

            }

 

SendMessage(hPort,CB_SETCURSEL,(WPARAM)0,0);

 

 //number of samples control

CreateWindow(TEXT("STATIC"), TEXT("Enter number of samples"),

                         WS_CHILD | WS_VISIBLE,

                         15, 80, 200, 30,

                         hWnd, (HMENU)0, NULL, NULL);

hSamples = CreateWindow(TEXT("Edit"), NULL,  WS_CHILD |WS_BORDER|WS_VISIBLE | ES_LEFT | ES_NUMBER,

220, 75, 150, 20, hWnd, (HMENU)0,

NULL, NULL);

SetWindowText(hSamples,TEXT("44000"));

CreateWindow(TEXT("BUTTON"),TEXT("Apply"), WS_CHILD | WS_VISIBLE | WS_BORDER,380, 75, 50, 20, hWnd, (HMENU)ID_SAMP,0,0);

 

 

//demo, start, exit

CreateWindow(TEXT("button"), TEXT("Demo"),   

             WS_VISIBLE | WS_CHILD ,

             520, 40, 50, 25,       

             hWnd, (HMENU) ID_DEMO, NULL, NULL);   

 

    CreateWindow(TEXT("button"), TEXT("Start"),   

             WS_VISIBLE | WS_CHILD ,

             520, 10, 50, 25,       

             hWnd, (HMENU) ID_START, NULL, NULL);   

CreateWindow(TEXT("button"), TEXT("Exit"),   

             WS_VISIBLE | WS_CHILD ,

             520, 70, 50, 25,       

             hWnd, (HMENU) IDM_EXIT, NULL, NULL);

 //zooming controls

CreateWindow(TEXT("BUTTON"),TEXT("+"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,550,120, 15,65, hWnd,(HMENU) ID_UINC,hInst,0);

CreateWindow(TEXT("BUTTON"),TEXT("-"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,550,190,15,65, hWnd,(HMENU) ID_UDEC,hInst,0);

CreateWindow(TEXT("BUTTON"),TEXT("+"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,320,310,65,15, hWnd,(HMENU) ID_TINC,hInst,0);

CreateWindow(TEXT("BUTTON"),TEXT("-"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,250,310,65,15, hWnd,(HMENU) ID_TDEC,hInst,0);

 

break;

 

case WM_HSCROLL:

sel=SendMessage((HWND)lParam, TBM_GETPOS, 0,0);

mess.freq=(sel+1)*50000;

mess.F=sel;

break;

 

case WM_COMMAND:

wmId    = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Parse the menu selections:

switch (wmId)

{case IDM_EXIT:

DestroyWindow(hWnd);

break;

//when we getting messages from configuration or zooming controls, we're writing the values to the message

case ID_PORT:

mess.port=SendMessage((HWND)lParam, CB_GETCURSEL,0,0L);

break;

case ID_CHECKBOX:

checked= IsDlgButtonChecked(hWnd, ID_CHECKBOX);

checked=!checked;

CheckDlgButton(hWnd, ID_CHECKBOX, checked);

if(checked){mess.adc_mode=3;mess.ADC0=1;mess.ADC1=1;}

if(!checked)mess.adc_mode=2;mess.ADC0=1;mess.ADC1=0;

break;

case ID_ADC0:

EnableWindow(ChBox,1);

CheckDlgButton(hWnd, 555, 0);

mess.adc_mode=1;mess.ADC0=1;mess.ADC1=0;

break;

case ID_ADC1:

CheckDlgButton(hWnd, 555, 0);

EnableWindow(ChBox,0);

Информация о работе Обработка аналоговых сигналов на основе МК C8051F064