⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.cpp

📁 基于Senbo ADT650
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ADT650demo.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include "stdlib.h"
#include "stdio.h"
#include "ADT650.h"
#include <winioctl.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

#define ID_TIMER    1//设定一个定时器的ID值


HANDLE hDevice=0;//加载设备驱动程序的句柄
BOOL sucess=0;//设备初始化的返回值
unsigned int count=0;  //  计数值
unsigned int  BaseAddr=0x300;  //  基地址
unsigned char irq=7;            //  中断号
unsigned char IOport0=1,IOport1=1,IOport2=1;  // 三个数字I/O口都为输入状态
unsigned char IOport;	// 数字I/O口
unsigned char outbyte,inbyte;        //  数字I/O输入输出数值
float adresult,daresult;  //  模拟电压值
int ADValue,DAValue;   //  变换的数据
int adchannel=0,dachannel=0;  //  模拟通道


//定义全局参数
float TijiNongduXishu,GutiBizhongXishu,WeightNongduXishu,LiuliangXishu;

//定义全局结果
float ShunshiLiuliang,class1Liang,class2Liang,class3Liang,TijiNongdu,WeightNongdu;

HANDLE hEvent=0; // AD采样事件句柄
HWND hAdlg,hBdlg;  //  窗口句柄
int Curcha; 
char buffer[512],buffer1[512],buffer2[512];

char setting[20];
char name[20],temp[30];
time_t now;
int check,starthour1,endhour1,startmin1,endmin1,
          syshour,sysmin,syssec,
		  starthour2,endhour2,startmin2,endmin2,
		  starthour3,endhour3,startmin3,endmin3;

//应用程序窗口的消息处理函数
BOOL CALLBACK	DlgProc(HWND, WPARAM, WPARAM,LPARAM);
BOOL CALLBACK	DlgProc2(HWND, WPARAM, WPARAM,LPARAM);
BOOL CALLBACK	DlgProc3(HWND, WPARAM, WPARAM,LPARAM);
BOOL CALLBACK	DlgProc4(HWND, WPARAM, WPARAM,LPARAM);
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);     
void ftoa(float source,char destination[10],char precision);
void change(char setting[],int input,int set);
void Clear(char setting[]);
void getdetail(char input[],char temp[]);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    TijiNongduXishu=GutiBizhongXishu=WeightNongduXishu=0;
	LiuliangXishu=ShunshiLiuliang=class1Liang=class2Liang=class3Liang=TijiNongdu=WeightNongdu=0;
    check=0;
    if(!hDevice)//加载设备驱动
	{
					
	hDevice=ADT650_DevLoad();
						
	if(hDevice==INVALID_HANDLE_VALUE)
	{
		MessageBox(0,"Load driver Error","error",MB_OK);
		ExitProcess(1);
	}

	}
	//设备初始化
	ADT650_InitBoard(hDevice,BaseAddr,irq);

	

    DialogBox(hInstance, (LPCTSTR)IDD_DIALOG1,0, DlgProc);
	return 0;
}

// AD采样事件的线程被驱动程序唤醒,用来通知应用程序中断到来并且显示模拟输入电压值
DWORD WINAPI ServiceThread(PVOID hEvent) 
{
	 
	while (TRUE)
	{
		WaitForSingleObject(hEvent, INFINITE);
		while (ADT650_ConversionDone(hDevice) == 1);  // 监测A/D变换是否结束  
                 ADValue = ADT650_ReadData(hDevice);           //  读取A/D变换的数据
                 adresult=ADT650_DigitToAnalog(hDevice,ADValue,&Curcha);    //  转换为模拟输入电压值
                 ftoa(adresult,buffer,2);
				 ADT650_ClearIRQ(hDevice);     //  清除中断
        }
	return 0;	
}

void hevent()  // AD采样事件
{
	DWORD Tid;		  
	
	hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	ADT650_SetEvent(hDevice,hEvent);         // 产生一个事件并且发送到驱动程序
    ADT650_ADSettings(hDevice,10,1);         // 设置模拟输入电压的量程和极性	 
	ADT650_SetChannel(hDevice,0,0);          // 设置模拟输入通道
	ADT650_ADConfig(hDevice,0,0,0,4,0);      // 配置 A/D
	ADT650_EnableIRQ(hDevice);     //  设置中断使能
	ADT650_SetIRQSource(hDevice,0);  //  选择中断源为AD转换结束
	CreateThread(0, 0x1000, ServiceThread, (PVOID)hEvent, 0, &Tid); // 产生一个等待AD采样事件的线程
}

BOOL CALLBACK DlgProc(HWND hDlg, WPARAM uMsg, WPARAM wParam, LPARAM lParam)
{

	hAdlg = hDlg;
   	switch (uMsg) 
	{
		case WM_CLOSE://关闭窗口消息
			if(hDevice)
			{
			if(hEvent)
				CloseHandle(hEvent); 
			  KillTimer (hDlg, ID_TIMER);
		      ADT650_DevClose(hDevice);//卸载设备驱动程序
			}
			EndDialog(hBdlg,TRUE);
			EndDialog(hDlg,TRUE);//关闭对话框
			break;
		 
         case WM_COMMAND:
			switch (wParam)
			{

			    case IDC_Set:
					    check++;
						if(check==1)
						DialogBox(0, (LPCTSTR)IDD_DIALOG2,0, DlgProc2);

						else ShowWindow(hBdlg,SW_SHOW);
                        /*
		                ftoa(TijiNongduXishu,buffer2,3);
	                    SetDlgItemText(hBdlg,IDC_TijiBox,buffer2);
						ftoa(GutiBizhongXishu,buffer2,2);
						SetDlgItemText(hBdlg,IDC_GutiBox,buffer2);
						ftoa(WeightNongduXishu,buffer2,3);
						SetDlgItemText(hBdlg,IDC_WeightBox,buffer2);
						ftoa(LiuliangXishu,buffer2,2);
						SetDlgItemText(hBdlg,IDC_LiuliangBox,buffer2);
                        */
						break;

				case IDC_Start:
					    SetTimer(hDlg,ID_TIMER,1000,TimerProc);
						break;

				case IDC_End:
					    SetTimer(hDlg,ID_TIMER,1000,NULL);
				
				/*
				case Load_Driver:  //加载设备驱动程序
					    if(hDevice)
						break;
					
					    hDevice=ADT650_DevLoad();
						
					    if(hDevice==INVALID_HANDLE_VALUE)
					    {
						MessageBox(hDlg,"Load driver Error","error",MB_OK);
						ExitProcess(1);
					    }
					   EnableWindow(GetDlgItem(hDlg,Load_Driver),FALSE);
					   
					   break;
				
				case Initial:  //  初始化
					   if(!hDevice)
						break;
					   ADT650_InitBoard(hDevice,BaseAddr,irq);
						EnableWindow(GetDlgItem(hDlg,Initial),FALSE);
					   break;
				case Read_IO:  // 读数字I/O
					   if(!hDevice)
						break;
					   IOport = (unsigned char)GetDlgItemInt(hDlg,IDC_RPORT,NULL,FALSE);
                    
					   if(IOport == 0)  IOport0=1;
					   else if(IOport == 1)  IOport1=1;
					   else if(IOport == 2)  IOport2=1;
					   ADT650_ConfigIOPorts(hDevice,IOport0,IOport1,IOport2);
               		   inbyte = ADT650_ReadDigitIO(hDevice,IOport);
					   SetDlgItemInt(hDlg,IDC_RVALUE,inbyte,FALSE);
					   break;
				case Write_IO:  // 写数字I/O
					   if(!hDevice)
						break;
					   IOport = (unsigned char)GetDlgItemInt(hDlg,IDC_WPORT,NULL,FALSE);
					   outbyte = (unsigned char)GetDlgItemInt(hDlg,IDC_WVALUE,NULL,FALSE);

					   if(IOport == 0)  IOport0=0;
					   else if(IOport == 1)  IOport1=0;
					   else if(IOport == 2)  IOport2=0;
					   ADT650_ConfigIOPorts(hDevice,IOport0,IOport1,IOport2);
			           ADT650_WriteDigitIO(hDevice,IOport,outbyte);
					   break;
				case DA_Output:  //  D/A输出
						if(!hDevice)	break;
					    dachannel = (unsigned char)GetDlgItemInt(hDlg,IDC_DACHANNEL,NULL,FALSE);
						GetDlgItemText(hDlg,IDC_DAVALUE,buffer,10);
						daresult = atof(buffer);
						DAValue = (int)((daresult/10.0)*2048)+2048;
						ADT650_WriteDataDA(hDevice,dachannel,DAValue);
						
						break;
				case Start_AD:  //  启动A/D变换
					   ADT650_ADSettings(hDevice,10,1);   //  设置模拟输入电压量程和极性
					   if(!hEvent)
					   {
						 hevent();         // AD采样事件
					         hAdDlg=hDlg;
					   }
					  
					   ADT650_EnableIRQ(hDevice);     //  设置中断使能
					   ADT650_SetIRQSource(hDevice,0);  //  选择中断源为AD转换结束
					   ADT650_ADConfig(hDevice,0,0,0,1,0);  // 配置AD
					   adchannel= (unsigned char)GetDlgItemInt(hDlg,IDC_ADCHANNEL,NULL,FALSE); 
                       ADT650_SetChannel(hDevice,adchannel,adchannel);     //设置模拟输入通道     
					    ADT650_ClearIRQ(hDevice);     //  清除中断

  
                      if (!SetTimer (hDlg, ID_TIMER, 1000, NULL))  //  启动定时器
					   {
						MessageBox (hDlg, "定时器太多!","error", MB_OK) ;
						return FALSE ;
    					}
					   
                      break;
				case Start_Counter:   //  启动计数器
                    
					   ADT650_ClockMode(hDevice,0, 2);
                       ADT650_ClockDivisor(hDevice,0, 800);

                       ADT650_ClockMode(hDevice,1,2);
                       ADT650_ClockDivisor(hDevice,1, 2000);

                       ADT650_ClockMode(hDevice,2, 2);
                       ADT650_ClockDivisor(hDevice,2, 5000);

					    break;
				case ReadBackCountV:   //  读回计数值
					   count=ADT650_ClockReadBack(hDevice,2);
					   SetDlgItemInt(hDlg,IDC_RBCOUNTV,count,FALSE);
					   break;
			    */ 
			}
			break;
	}
   return FALSE;
}

BOOL CALLBACK DlgProc2(HWND hDlg, WPARAM uMsg, WPARAM wParam, LPARAM lParam)
{

	hBdlg = hDlg;
		

	switch(uMsg)
	{

	    case WM_CLOSE:
			check=0;
			EndDialog(hDlg,TRUE);
			break;
		case WM_COMMAND:
			switch(wParam)
			{
			   case IDC_Sure:
                   ShowWindow(hDlg,SW_HIDE);
				   break;

			   case IDC_NotSure:
				   ShowWindow(hDlg,SW_HIDE);
				   break;

			   case IDC_Tiji:
				   Clear(setting);
				   strcpy(name,"体积浓度系数");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
				   sscanf(setting,"%f",&TijiNongduXishu);
				   SetDlgItemText(hDlg,IDC_TijiBox,setting);
				   break;

               case IDC_Weight:
				   Clear(setting);
				   strcpy(name,"重量浓度系数");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
				   sscanf(setting,"%f",&WeightNongduXishu);
				   SetDlgItemText(hDlg,IDC_WeightBox,setting);
				   break;

			   case IDC_Class1Start:
				   Clear(setting);
				   strcpy(name,"一班开始时间");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
                   sscanf(setting,"%d:%d",&starthour1,&startmin1);   
				   SetDlgItemText(hDlg,IDC_Class1StartBox,setting);
				   break;

			   case IDC_Class2Start:
				   Clear(setting);
				   strcpy(name,"二班开始时间");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
				   sscanf(setting,"%d:%d",&starthour2,&startmin2); 
				   SetDlgItemText(hDlg,IDC_Class2StartBox,setting);
				   break;
				   
			   case IDC_Class3Start:
				   Clear(setting);
				   strcpy(name,"三班开始时间");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
				   sscanf(setting,"%d:%d",&starthour3,&startmin3); 
				   SetDlgItemText(hDlg,IDC_Class3StartBox,setting);
				   break;

			   case IDC_Guti:
				   Clear(setting);
				   strcpy(name,"固体比重");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
				   sscanf(setting,"%f",&GutiBizhongXishu);
				   SetDlgItemText(hDlg,IDC_GutiBox,setting);
				   break;
				
			   case IDC_Liuliang:
				   Clear(setting);
				   strcpy(name,"流量计系数");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
				   sscanf(setting,"%f",&LiuliangXishu);
				   SetDlgItemText(hDlg,IDC_LiuliangBox,setting);
				   break;

			   case IDC_Class1End:
				   Clear(setting);
				   strcpy(name,"一班结束时间");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
				   sscanf(setting,"%d:%d",&endhour1,&endmin1); 
				   SetDlgItemText(hDlg,IDC_Class1EndBox,setting);
				   break;

			   case IDC_Class2End:
				   Clear(setting);
				   strcpy(name,"二班结束时间");
                   DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -