AT89C2051驱动步进电机的电路和源码:AT89C2051驱动步进电机的电路和源码 程序:stepper.c stepper.hex/* * STEPPER.C * sweeping stepper's rotor cw and cww 400 steps * Copyright (c) 1999 by W.Sirichote */#i nclude c:\mc5151io.h /* include i/o header file */ #i nclude c:\mc5151reg.hregister unsigned char j,flag1,temp; register unsigned int cw_n,ccw_n;unsigned char step[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90} #define n 400/* flag1 mask byte 0x01 run cw() 0x02 run ccw() */main(){ flag1=0; serinit(9600); disable(); /* no need timer interrupt */ cw_n = n; /* initial step number for cw */ flag1 |=0x01; /* initial enable cw() */while(1){ { tick_wait(); /* wait for 10ms elapsed */energize(); /* round-robin execution the following tasks every 10ms */ cw(); ccw(); } }}cw(){ if((flag1&0x01)!=0) { cw_n--; /* decrement cw step number */ if (cw_n !=0) j++; /* if not zero increment index j */ else {flag1&=~0x01; /* disable cw() execution */ ccw_n = n; /* reload step number to ccw counter */ flag1 |=0x02; /* enable cww() execution */ } }
上传时间: 2013-11-21
上传用户:boyaboy
介绍了ATM 技术的特点以及深入分析了PowerPC MPC826o的ATM 步长控制器(APC)的原理,分析了VxW0rks网络模块. 给出了在VxWorks 实时操作系统下的END 模式的ATM 驱动程序设计.重点讨论了ATM 驱动开发中需注意的特殊问题
上传时间: 2013-10-11
上传用户:wwwwwen5
EPC-8000、液晶驱动摘要 本文介绍如何通过ADDLCD_EPC8000程序添加EPC-8000系列工控主板的液晶屏驱动。
上传时间: 2013-10-19
上传用户:WMC_geophy
基于LabVIEW和单片机的空调温度场测量系统的研究:室内温度是空调系统舒适性的重要指标,对其及时、准确地测量显得非常重要。介绍单片机AT89C51 和数字式、单总线型温度传感器DS18B20 组成矩形测量网络采集空调室内40 点温度,LabVIEW作为开发平台,二者之间通过串口实现数据通信,利用LabVIEW强大的数据处理和显示功能对采集的空调温度场数据进行实时处理、分析和显示,详细介绍了系统的硬件结构和软件模块的设计方案。关键词:单片机;DS18B20 ;LabVIEW;串行通信 Abstract : Temperature is a very important criterion of air condition system′s comfort , so it is very significant to measure it accurately and real timely. This paper int roduces a data acquisition system of measuring 40 point s temperature for air condition room based on single wire digital sensor DS18B20 and microcont roller AT89C51 which are composed of rectangle measuring meshwork. The data communication between LabVIEW and microcont roller is executed via serial port ,and the temperature field data of air condition room are processed analyzed and displayed on LabVIEW. The hardware and software modules are also given in detail.Keywords : single chip ;DS18B20 ;LabVIEW; serial communication
上传时间: 2014-05-05
上传用户:KSLYZ
本文简单介绍了MCGS 组态软件和SPCE061A 单片机的特点,即北京昆仑通态自动化软件科技有限公司的工控组态软件MCGS(Monitor and Control Generated System )和台湾凌阳科技推出的16 位微控制器SPCE061A,重点介绍了如何一步步开发SPCE061A 单片机的驱动程序,并简单介绍了下位机程序的设计,最后给出了测试情况。计算机技术的飞速发展为工业自动化开辟了广阔的发展空间,人们可以快捷地开发和组建高效的控制系统。笔者设计的液体点滴监控模型,可以对液体点滴情况实现远程监控和现场监控,终端和上位机均可人工设定所需的液体点滴速度并动态显示。在这方面,MCGS 工控组态软件提供了强有力的支持,它是一套Windows 环境下快速构造和生成上位机监控系统的组态软件系统,可快速构造和生成数据采集、报警处理、流程控制、动画显示、报表输出等界面,实现各种工程曲线的绘制、报表输出、远程通信等功能 [1]。MCGS 作为一种方便有效的通用工控软件,它提供了国内外各种常用的工控设备的驱动程序。但在实际应用中,因为所用设备的特殊性,允许用户根据需要来定制设备驱动程序。MCGS 用Active DLL 构件实现设备驱动程序,通过规范的OLE 接口挂接到MCGS 中,使其构成一个整体。鉴于Visual Basic 语言的通用性和简单性,使用VB 来开发单片机驱动,MCGS 的实现方法和原理与标准的Active DLL 完全一致,但MCGS 规定了一套接口规范,只有遵守这些接口规范的Active DLL 才能用作MCGS 的设备驱动构件。利用具有语音和 DSP 功能的SPCE061A 单片机作为液体点滴监控模型的核心控制器,SPCE061A 是台湾凌阳科技推出的16 位微控制器,提供了丰富的软、硬件资源,开发灵活方便。除此之外SPCE061A 的最高时钟频率可达到49MHz,具有运算速度高的优势,这为语音的录制和播放提供了条件[4]。
上传时间: 2013-12-19
上传用户:leesuper
该文介绍了开关磁阻电机的基本原理,设计了一种用80C196 单片机实现的开关磁阻电机驱动系统,并对该开关磁阻电机调速系统的性能进行了实验与测试,实验证明该系统运行可靠。开关磁阻电动机是磁阻电动机与电子开关驱动控制器组成的控制装置,又称开关磁阻电机驱动系统(Switched Reluctance Motor drive,简称SRD)。电机结构简单坚固,运行可靠,系统具有启动转矩高、启动电流低、调速范围宽、运行效率高,特别适用于频繁启停及正反转运行,使得SRD 成为交,直流电机驱动系统以及无刷直流电机驱动系统的强有力竞争者。目前,SRD 已用于多个领域,如:电动车驱动、家用电器、伺服与调速系统等许多领域。本文设计了一个以 80C196 单片机为控制核心的SRD 的控制系统,充分利用了SRD 电机控制方式灵活的特点,采用数字化控制系统对SR 电机进行控制,简化了硬件电路,提高了系统的可靠性。
上传时间: 2013-11-05
上传用户:18711024007
带键盘扫描和LED/LCD驱动显示板电路设计
上传时间: 2013-11-24
上传用户:liaocs77
本文介绍了一种PWM模块单片机的步进电机细分驱动方法。
上传时间: 2014-04-11
上传用户:jrsoft
有两种方式可以让设备和应用程序之间联系:1. 通过为设备创建的一个符号链;2. 通过输出到一个接口WDM驱动程序建议使用输出到一个接口而不推荐使用创建符号链的方法。这个接口保证PDO的安全,也保证安全地创建一个惟一的、独立于语言的访问设备的方法。一个应用程序使用Win32APIs来调用设备。在某个Win32 APIs和设备对象的分发函数之间存在一个映射关系。获得对设备对象访问的第一步就是打开一个设备对象的句柄。 用符号链打开一个设备的句柄为了打开一个设备,应用程序需要使用CreateFile。如果该设备有一个符号链出口,应用程序可以用下面这个例子的形式打开句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路径名的前缀“\\.\”告诉系统本调用希望打开一个设备。这个设备必须有一个符号链,以便应用程序能够打开它。有关细节查看有关Kdevice和CreateLink的内容。在上述调用中第一个参数中前缀后的部分就是这个符号链的名字。注意:CreatFile中的第一个参数不是Windows 98/2000中驱动程序(.sys文件)的路径。是到设备对象的符号链。如果使用DriverWizard产生驱动程序,它通常使用类KunitizedName来构成设备的符号链。这意味着符号链名有一个附加的数字,通常是0。例如:如果链接名称的主干是L“TestDevice”那么在CreateFile中的串就该是“\\\\.\\TestDevice0”。如果应用程序需要被覆盖的I/O,第六个参数(Flags)必须或上FILE_FLAG_OVERLAPPED。 使用一个输出接口打开句柄用这种方式打开一个句柄会稍微麻烦一些。DriverWorks库提供两个助手类来使获得对该接口的访问容易一些,这两个类是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass类封装了一个设备信息集,该信息集包含了特殊类中的所有设备接口信息。应用程序能有用CdeviceInterfaceClass类的一个实例来获得一个或更多的CdeviceInterface类的实例。CdeviceInterface类是一个单一设备接口的抽象。它的成员函数DevicePath()返回一个路径名的指针,该指针可以在CreateFile中使用来打开设备。下面用一个小例子来显示这些类最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface( GUID* pClassGuid, DWORD instance, PDWORD pError){ CDeviceInterfaceClass DevClass(pClassGuid, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; CDeviceInterface DevInterface(&DevClass, instance, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; cout << "The device path is " << DevInterface.DevicePath() << endl; HANDLE hDev; hDev = CreateFile( DevInterface.DevicePath(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hDev == INVALID_HANDLE_VALUE) *pError = GetLastError(); return hDev;} 在设备中执行I/O操作一旦应用程序获得一个有效的设备句柄,它就能使用Win32 APIs来产生到设备对象的IRPs。下面的表显示了这种对应关系。Win32 API DRIVER_FUNCTION_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解释一下设备类成员的Close和CleanUp:CreateFile使内核为设备创建一个新的文件对象。这使得多个句柄可以映射同一个文件对象。当这个文件对象的最后一个用户级句柄被撤销后,I/O管理器调用CleanUp。当没有任何用户级和核心级的对文件对象的访问的时候,I/O管理器调用Close。如果被打开的设备不支持指定的功能,则调用相应的Win32将引起错误(无效功能)。以前为Windows95编写的VxD的应用程序代码中可能会在打开设备的时候使用FILE_FLAG_DELETE_ON_CLOSE属性。在Windows NT/2000中,建议不要使用这个属性,因为它将导致没有特权的用户企图打开这个设备,这是不可能成功的。I/O管理器将ReadFile和WriteFile的buff参数转换成IRP域的方法依赖于设备对象的属性。当设备设置DO_DIRECT_IO标志,I/O管理器将buff锁住在存储器中,并且创建了一个存储在IRP中的MDL域。一个设备可以通过调用Kirp::Mdl来存取MDL。当设备设置DO_BUFFERED_IO标志,设备对象分别通过KIrp::BufferedReadDest或 KIrp::BufferedWriteSource为读或写操作获得buff地址。当设备不设置DO_BUFFERED_IO标志也不设置DO_DIRECT_IO,内核设置IRP 的UserBuffer域来对应ReadFile或WriteFile中的buff参数。然而,存储区并没有被锁住而且地址只对调用进程有效。驱动程序可以使用KIrp::UserBuffer来存取IRP域。对于DeviceIoControl调用,buffer参数的转换依赖于特殊的I/O控制代码,它不在设备对象的特性中。宏CTL_CODE(在winioctl.h中定义)用来构造控制代码。这个宏的其中一个参数指明缓冲方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表显示了这些方法和与之对应的能获得输入缓冲与输出缓冲的KIrp中的成员函数:Method Input Buffer Parameter Output Buffer Parameter METHOD_BUFFERED KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代码指明METHOD_BUFFERED,系统分配一个单一的缓冲来作为输入与输出。驱动程序必须在向输出缓冲放数据之前拷贝输入数据。驱动程序通过调用KIrp::IoctlBuffer获得缓冲地址。在完成时,I/O管理器从系统缓冲拷贝数据到提供给Ring 3级调用者使用的缓冲中。驱动程序必须在结束前存储拷贝到IRP的Information成员中的数据个数。如果控制代码不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,则DeviceIoControl的参数呈现不同的含义。参数InputBuffer被拷贝到一个系统缓冲,这个缓冲驱动程序可以通过调用KIrp::IoctlBuffer。参数OutputBuffer被映射到KMemory对象,驱动程序对这个对象的访问通过调用KIrp::Mdl来实现。对于METHOD_OUT_DIRECT,调用者必须有对缓冲的写访问权限。注意,对METHOD_NEITHER,内核只提供虚拟地址;它不会做映射来配置缓冲。虚拟地址只对调用进程有效。这里是一个用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE来定义一个IOCTL代码:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)现在使用一个DeviceIoControl调用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,这里放的是包含有执行操作命令的字符串指针 0, FirmwareRev, //这里是output串指针,存放从驱动程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果输出缓冲足够大,设备拷贝串到里面并将拷贝的资结束设置到FirmwareRevSize中。在驱动程序中,代码看起来如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){ ULONG fwLength=0; switch ( I.IoctlCode() ) { case IOCTL_MYDEV_GET_FIRMWARE_REV: fwLength = strlen(FIRMWARE_REV)+1; if (I.IoctlOutputBufferSize() >= fwLength) { strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV); I.Information() = fwLength; return I.Complete(STATUS_SUCCESS); } else { } case . . . } }
上传时间: 2013-10-17
上传用户:gai928943
24c16读写驱动程序,//=-------------------------------------------------------------------------------/*模块调用:读数据:read(unsigned int address)写数据:write(unsigned int address,unsigned char dd) dd为要写的 数据字节*///------------------------------------------------------------------------------ sbit sda=P3^0;sbit scl=P3^1; sbit a0=ACC^0; //定义ACC的位,利用ACC操作速度最快sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7; //------------------------------------------------------------------------------#pragma disablevoid s24(void) //起始函数{_nop_(); scl=0; sda=1; scl=1; _nop_(); sda=0; _nop_(); _nop_(); scl=0; _nop_(); _nop_(); sda=1;} //------------------------------------------------------------------------------#pragma disablevoid p24(void) //停止函数{sda=0; scl=1; _nop_(); _nop_(); sda=1;} //-----------------------------------------------------------------------------#pragma disableunsigned char rd24(void) /////////////////从24c16读一字节数据{ ACC=0x00;sda=1;scl=1;a7=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a6=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a5=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a4=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a3=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a2=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a1=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a0=sda;_nop_();_nop_();_nop_();_nop_();scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0; /// ///////////////24c16的一位回答位。return(ACC);}//------------------------------------------------------------------------------#pragma disablevoid wd24(unsigned char dd) ////////////////向24c16写一字节数据{ sda=1;ACC=dd;sda=a7;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a6;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a5;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a4;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a3;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a2;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a0;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=0;scl=1;//scl=0;(在下面程序中)}//---------------------------------------------------------------------------#pragma disableunsigned char read(unsigned int address){unsigned char dd; s24(); ////////////////////////开始条件 wd24(0xa0); /////////////////////////写器件地址(写命令) _nop_();_nop_();_nop_();_nop_(); scl=0; ///////////////////////////////////接收器件地址确认信号 wd24(address); //////////////////////////// 写数据地址 _nop_();_nop_();_nop_();_nop_(); scl=0;s24(); ///////////////////////////////////开始条件 wd24(0xa1); /////////////////////////////写器件地址(读命令) scl=0; dd=rd24(); //////////////////////////////////读 一字节 p24(); ////////////////////////////////////停止条件 return(dd);}//------------------------------------------------------------------------------#pragma disablevoid write(unsigned int address,unsigned char dd){s24(); /////////////////开始条件 wd24(0xa0); ////////////////////////写器件地址; scl=0; wd24(address); /////////////////////写数据地址 scl=0; wd24(dd); //////////////////////////写dd数据 scl=0; p24(); /////////////////////////停止条件; }
上传时间: 2013-11-18
上传用户:墙角有棵树