用单片机制作多功能莫尔斯码电路:用单片机制作多功能莫尔斯码电路莫尔斯电码通信有着悠久的历史,尽管它已被现代通信方式所取代,但在业余无线电通信和特殊的专业场合仍具有重要的地位,这是因为等幅电码通信的抗干扰能力是其它任何一种通信方式都无法相比的。在短波波段用几瓦的功率即可进行国际间的通信,收发射设备简单易制成本低廉,所以深受业余无线电爱好者的喜爱,是业余无线电高手必备的技能。要想熟练掌握莫尔斯电码的收发技术除了持之以恒的毅力外,还需要相关的设备。设计本电路的目的就是给爱好者提供一个实用和训练的工具。 一、功能简介 本电路可以配合自动键体和手动键体,产生莫尔斯码控制信号,设有16种速度,从初学者到操作高手都能适用。监听音调也有16种,均可以通过功能键进行选择。可以按程序中设定好的呼号自动呼叫,设有听抄练习功能,听抄练习有短码和混合码两种模式,分别对10个数字和常用的38个混合码模拟随机取样,产生分组报码,供爱好者提高抄收水平之用,速度低4档的听抄练习是专为初学者所设,内容是时间间隔较长的单字符。设有PTT开关键,可以决定是否控制发射机工作,不需要反复通断控制线。无论当前处于呼叫状态还是听抄状态只要电键接点接通则自动转到人工发报程序。4分钟内不使用电路将自动关闭电源,只有按复位键才能重新开始工作。先按住听抄练习键复位则进入短码练习状态,其它功能不变。从开机到自动关机执行每个功能都有不同的莫尔斯码提示音。本电路具有较强的抗高低频干扰的能力和使用方便的大电流开关接口,以适应不同的发射设备。 二、硬件电路原理硬件电路如图1所示。设计电路的目的在于方便实用,以免在紧张的操作中失误,所以除了听抄练习键外其它键没有定义复用功能。各键的作用在图中已经标出。PTT控制在每次复位时处于关闭状态,每按动一次PTT功能键则改变一次状态,这样可以使用软件开关控制发射。 PTT处于控制状态时发光二极管随控制信号闪亮。考虑到自制设备及淘汰军用设备与高档设备控制电流的不同,PTT开关管采用了2SC2073,可以承受500mA的电流,同时还增加了无极性PTT开关电路,无论外部被控制的端口直流极性如何加到VT3的极性始终不变,供有兴趣的爱好者实验。应该注意,如果被控制的负载是感性,则电感两端必须并联续流二极管,除自制设备外成品机在这方面一般没有什么问题。手动键只有一个接点,接通后产生连续的音频和发射控制信号。在本电路中手动键的输入端是P1.5 ,程序不断检测P1.5电平,当按键按下时P1.5电平为0,程序转入手动键子程序。 自动键的接点分别接到P1.3和P1.4 ,同样当程序检测到有接点闭合时便自动产生“点”或“划”。音频信号从P输出,经VT1放大后推动扬声器发音。单片机的I/O口在输入状态下阻抗较高,容易受到高低频信号干扰,所以在每个输入端口和三极管的be端并联电阻和高频旁路电容,确保在较长的电键连线和大功率发射时电路工作稳定。图2是印刷电路版图,尺寸为110mmX85mm,扬声器用粘合剂直接粘接在电路版有铜箔的面。 三、软件设计方法 “点”时间长度是莫尔斯电码中的基本时间单位。按规定“划”的时间长度不小于三个“点”,同字符中“点”与“划”的间隔不小于一个“点”,字符之间不小于一个“划”,词与词之间不应小于五个“点”。在本程序中用条件转移指令来产生“点”时间长度。通过速度功能键功可以设置16种延时参数。用T0中断产生监听音频信号,并将中断设为优先级,保证在听觉上纯正悦耳。T1用于自动关机计时,如果不使用任何功能四分钟后将向PCON 位写1,单片机进入休眠状态,此时耗电量仅有几个微安。自动键的“点”或“划”以及手动键的连续发音都是子程序的反复调用。P1.2对地短接时自动呼叫可设定为另一内容。为了便于熟悉汇编语言的读者对发音内容进行修改,这里介绍发音字符的编码方法。莫尔斯码的信息与计算机中二进制恰好相同,我们可以用0表示“点”,用1表示“划”。提示音、自动呼叫、听抄内容等字符是预先按一定编码方式存储在程序中的常数。每个字符的莫尔斯码一般是由1至6位“点”、“划”组成,也就是发音次数最多6次。程序中每个字符占用1个字节,字符时间间隔不占用字节,但更长的延时或发音结束信息占用一个字节。我们用字节的低三位表示字节的性质,对于5次及5次以下发音的字符我们用存储器的高5位存储发音信息,发音顺序由高位至低位,用低3位存储发音次数,发音时将数据送入累加器A,先得到发音次数,然后使A左环移,对E0进行位寻址,判断是发“点”还是“划”,环移次数由发音次数决定。对于6次发音的字符不能完全按照上述编码规则,否则会出现信息重叠,如果是6次发音且最后一次是“划”我们把发音次数定义为111B,因为这时第6次位寻址得到的是1。如果第6次发音是“点”,那么这个字符的低三位定义为000B。字符间隔时间由程序自动产生,更长的时间隔或结束标志由字节低三位110B来定义,高半字节表示字符间隔的倍数,例如26H表示再加两倍时间间隔。如果字节为06H则表示读字符程序结束,返回主程序。更详细的内容不再赘述,读者可阅读源程序。四、使用注意事项手动键的操作难度相对大一些,时间节拍全由人掌握,其特点是发出的电码带有“人情味”。自动键的“点”、“划”靠电路产生,发音标准,容易操作,而且可以达到相当快的速度,长时间工作也不易疲劳。在干扰较大、信号微弱的条件下自动键码的辨别程度好于手动键码。初学者初次使用手动键练习发报要有老师指导,且不可我行我素,一旦养成不正确的手法则很难纠正。在电台上时常听到一些让对方难以抄收的电码,这可能会使对方反感而拒绝回答。使用自动键也应在一定的听抄基础上再去练习。在暂时找不老师的情况下可多练习听力,这对于今后能够发出标准正确的电码非常有益。
上传时间: 2013-10-31
上传用户:sdq_123
有两种方式可以让设备和应用程序之间联系: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
用C51写的普通拼音输入法源程序代码:原作使用了一个二维数组用以查表,我认为这样比较的浪费空间,而且每个字表的索引地址要手工输入,效率不高。所以我用结构体将其改写了一下。就是大家现在看到的这个。 因为代码比较的大,共有6,000多汉字,这样就得要12,000 byte来存放GB内码,所以也是没办法的.编译结果约为3000h,因为大部分是索引表,代码优化几乎无效。 在Keil C里仿真芯片选用的是华邦的W77E58,它有32k ROM, 256B on-chip RAM, 1K on-chip SRAM (用DPTR1指针寻址,相当于有1K的片上xdata)。条件有限,没有上片试验,仿真而已。 打算将其移植到AVR上,但CodeAVRC与IAR EC++在结构体、指针的定义使用上似乎与C51不太一样,现在还未搞定。还希望在这方面有经验的网友能给予指导。 #include<stdio.h> char * py_ime(char *); void main(void){ while(1) { char input_string[]="yI"; xdata char chinese_string[255]; sprintf(chinese_string,"%s",py_ime(input_string)); }}
上传时间: 2013-10-30
上传用户:cainaifa
Σ-ΔA/D技术具有高分辨率、高线性度和低成本的特点。本文基于TI公司的MSP430F1121单片机,介绍了采用内置比较器和外围电路构成类似于Σ-△的高精度A/D实现方案,适合用于对温度、压力和电压等缓慢变化信号的采集应用。 在各种A/D转换器中,最常用是逐次逼近法(SAR)A/D,该类器件具有转换时间固定且快速的特点,但难以显著提高分辨率;积分型A/D 有较强的抗干扰能力,但转换时间较长;过采样Σ-ΔA/D由于其高分辨率,高线性度及低成本的特点,正得到越来越多的应用。根据这些特点,本文以TI公司的MSP430F1121单片机实现了一种类似于Σ-ΔA/D技术的高精度转换器方案。 MSP430F1121是16位RISC结构的FLASH型单片机,该芯片有14个双向I/O口并兼有中断功能,一个16位定时器兼有计数和定时功能。I/O口输出高电平时电压接近Vcc,低电平时接近Vss,因此,一个I/O口可以看作一位DAC,具有PWM功能。 该芯片具有一个内置模拟电压比较器,只须外接一只电阻和电容即可构成一个类似于Σ-Δ技术的高精度单斜率A/D。一般而言,比较器在使用过程中会受到两种因素的影响,一种是比较器输入端的偏置电压的积累;另一种是两个输入端电压接近到一程度时,输出端会产生振荡。 MSP430F1121单片机在比较器两输入端对应的单片机端口与片外输入信号的连接线路保持不变的情况下,可通过软件将比较器两输入端与对应的单片机端口的连接线路交换,并同时将比较器的输出极性变换,这样抵消了比较器的输入端累积的偏置电压。通过在内部将输出连接到低通滤波器后,即使在比较器输入端两比较电压非常接近,经过滤波后也不会出现输出端的振荡现象,从而消除了输出端震荡的问题。利用内置比较器实现高精度A/D图1是一个可直接使用的A/D转换方案,该方案是一个高精度的积分型A/D转换器。其基本原理是用单一的I/O端口,执行1位的数模转换,以比较器的输出作反馈,来维持Vout与Vin相等。图1:利用MSP430F1121实现的实用A/D转换器电路方案。
上传时间: 2013-11-10
上传用户:lliuhhui
技术说明:线圈总长度应在20 ~ 30米左右,地感线应用横截面大于等于0.5 平方毫米的耐高温绝缘线;用切地机在坚硬水泥地面切槽,深度为 5~10 cm 左右,宽以切刻片厚度为准一般为5mm;然后将线一圈一圈放入槽中,再用水泥将槽封固,注意线不可浮出地面,在放入线圈时注意不要把线的绝缘层破坏,以免造成漏电或短路.引出线要双绞在一起并行接入地感两个LOOP 端,长度不能超过4米,每米中双绞数不能少于30个.
上传时间: 2013-11-04
上传用户:zhaoq123
用单片机实现温度远程显示摘 要:文章介绍了用AT89S8252单片机的串行接口与智能温度巡回检测仪(XJ-08S)通过RS—485总线相互通讯实现热水温度远程显示的一种低成本解决方案,内容涉及RS—485总线通讯、单片机驱动数码管显示、数据转换以及键盘处理软硬件设计等内容。关键词:单片机 RS—485总线 数码管显示 数据转换 键盘处理一、前 言目前检测温度一般采用热电偶或热敏电阻作为传感器,这种传感器至仪表之间一般都要用专用的温度补偿导线,而温度补偿导线价格很贵,并且线路太长也会影响测量精度。在实际应用中往往需要对较远处(1KM左右)的温度信号进行监视。现有的解决方案有很多,例如:1、 在现场用智能仪表对温度信号进行测量,用计算机作上位机与智能仪表进行通讯来实现远程温度监测(采用这种方案要增加计算机设备及相关计算机软件)。2、 NCU+DDC实现远程温度监测。用两个DDC,一个安装在现场测量温度,另一个安装在监视地,两个DDC通过NCU进行通讯从而实现远程温度监测。但以上方案都存在成本高的问题,有没有低成本的解决方案呢?其实,在单片机应用日益广泛的今天,完全可以用单片机以极低的成本来实现远程温度监测。二、问题的提出我单位管理的锅炉房同时给两栋建筑物内的两家酒店供应蒸汽,由安装在两栋建筑物地下室的热交换器进行热交换后产生热水送给客房。从锅炉房至两个热交换站的距离分别约600米,值班人员要不停地奔波于两个热交换站与锅炉房之间进行设备巡视,检查热水温度是否控制在规定的范围,这样不仅增加了值班人员的劳动强度,同时也使锅炉房经常无人(因每班1人值班)。如果能在锅炉房显示两个热交换站内各热交换器的热水温度,则值班人员仅在热水温度异常时才需到各热交换站检查设备,这样便可解决上述问题。我公司曾就此问题找专业公司作过方案,其报价在人民币10万元左右,后因种种原因该项目未实施。经过分析,本人发现可以用单片机+智能仪表以低成本实现温度远程显示,并且经过实验取得了成功,现将设计方案简述如下:三、控制要求及解决方案选择 1、 两个热交换站分高低区共安装有8个热交换器,正常水温在45oC至65oC之间;两个热交换站与锅炉房的距离分别为500米和600米左右。2、 要求在锅炉房能以巡回及定点两种方式显示8个热交换器的热水温度,巡回方式以3秒为周期轮流更新及显示各热交换器热水温度。定点方式时每按上键或下键一次则显示上或下一个热交换器热水温度,每3秒自动更新数据一次。3、 根据控制要求选择单片机+智能仪表的解决方案:用带通讯接口的智能仪表安装在现场测量温度,设计制作一个单片机装置完成与智能仪表的通讯及数据显示。四、通讯协议、智能仪表选择及其参数介绍因热水温度信号变化较慢,因而对通信的速度要求不高,对于这种低速率远距离的通讯选用RS-485总线适宜。RS-485是EIA(美国电子工业联合会)在1983年公布的新的平衡传输标准,是工业界使用最为广泛的双向、平衡传输线标准接口,它以半双工方式通信,支持多点连接,传统驱动器允许创建多达32个节点的网络,且其具有传输距离远(最大传输距离为1200M),传输速度快(1200M时为100KBPS)等优点。其连接方法如下图所示。
上传时间: 2013-10-12
上传用户:luopoguixiong
用单片机配置FPGA—PLD设计技巧 Configuration/Program Method for Altera Device Configure the FLEX Device You can use any Micro-Controller to configure the FLEX device–the main idea is clocking in ONE BITof configuration data per CLOCK–start from the BIT 0The total Configuration time–e.g. 10K10 need 15K byte configuration file•calculation equation–10K10* 1.5= 15Kbyte–configuration time for the file itself•15*1024*8*clock = 122,880Clock•assume the CLOCK is 4MHz•122,880*1/4Mhz=30.72msec
上传时间: 2013-10-09
上传用户:a67818601
I2C 总线包括了两条串行总线(时钟线SCL 和数据线SDA),通过这两条总线能实现多个芯片之间的通信。在互相连接的芯片中,至少有一个芯片作为总线控制器,而其它芯片则作为从控制器。在本应用说明中,介绍了用Holtek 的八位RISC 结构的单片机作为单总线控制器的软件实现的方法。在本文的示例中,采用了一片EEPROM(型号HT24LC02,2Kbit)作为从控制器参与测试。电路说明:HT24LC02 的A0、A1、A2、VSS、WP 引脚接地,VCC 接+5V,SCL 接PA3,SDA 接PA2使用说明:例程中先向eeprom 中写数据,写完后,再将eeprom 中内容读出来,并将读出数据进行比较,若数据不相等程序跳到fail_out 中;若相等,最后程序跳到ok_end 中。本说明中提供了一个源文件OP_HT24.ASM 和一个包含文件HT24.ASM。在应用时,要将OP_HT24.ASM 文件添加到用户的project 中,并修改HT24.INC 文件中的变量设置,以建立SCL/SDA引脚来与用户的应用电路相匹配。
上传时间: 2013-10-19
上传用户:ming52900
用VHDL语言进行MCS-51兼容单片机ip核开发
上传时间: 2013-10-28
上传用户:nem567397
用c5402构建的声回波对消器
上传时间: 2014-12-28
上传用户:pei5