最新日志

发表于:2008-5-17 1:33:18
标签:单片机  编程技巧  

0

单片机编程技巧--功能强大的时钟中断

在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。

       下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。


   定时器初值与中断周期

     时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。即中断时比启动时经过了N+1个机器周期。所以,我们只要在T0中预先存入一个比满值0FFFFh小N的数,然后启动定时器,便会在N个机器周期后产生中断。这个值便是所谓的“初值”。下面计算我们需要的初值:时钟为6MHz,12个时钟周期为一个机器周期,20mS中有10000个机器周期。(10000)10=(2710)16,则0FFFFh-2710h+1=0D8F0h。由于响应中断、保护现场及重装初值还需要7~8个机器周期,把这个值再加上7,即T0应装入的初值是0D8F7h。每次中断进入后,先把A及PSW的值压入堆栈,然后即把0D8F7h装入T0。 


   设置一个单元,每次中断加1 

        我们可以取内部RAM中一个单元,取名为INCPI(Increase Per Interrupt),在中断中,装完T0初值后,用INC INCPI指令将其加1。从这个单元中,无论中断程序还是主程序,都可以从中获得20mS的1~256之间任意整数倍的信号。例如:有一段向数码管送显的程序,需要每0.5秒执行一次以便刷新显示器,便可以设一单元(称为等待单元)W_DISP,用/MOV A,INCPI/ADD A,#25/MOV W_DISP,A/语句让其比当前的INCPI值大25,然后在每次中断中检查是否于INCPI值相等。若相等,说明已过了25个中断周期,便执行送显程序,并且让W_DISP再加上25,等待下个0.5秒。我们可以设置多个等待单元,以便取出多个不同的时基信号。让中断程序在每次中断时依次查询各个等待单元是否与INCPI相等,若相等,则执行相应的处理,并重新设置该等待单元的值,否则跳过。例如:用0.5秒信号刷新或闪烁显示器,用1秒信号产生实时时钟,或输出一定频率的方波,以一定间隔查询输入设备等。 

   在中断中读键 

        通常,我们在主程序中读键盘,步骤为:扫描键盘,若有键按下,则延时几十毫秒去抖动,再次确认此键确实按下,然后处理该键对应的工作,完成后再次重上述步骤。但这有两点不足:1.处理相应工作时无法锁存按键的输入,即可能漏键。2.延时去抖时CPU无法做其它事情,效率不高。如果把读键放入时钟中断中,则可避免上述不足。方法为:如果两次相邻的中断中都读到同一个键按下,则这个键是有效的(达到了去抖目的),并将其锁存到先入先出(队列)的键盘缓冲区,等主程序来处理。这样,主程序处理按键的同时,仍可响应键盘的输入。缓冲区深度通常可设为8级,若锁存的键数多于8个,则忽略新的按键,并报警提示用户新的按键将无效。若键盘缓冲队列停滞的时间大大长于主程序处理按键所需要的最大时间,说明主程序已出错或跑飞,可以在中断用指令将系统复位,起到了看门狗的目的。 

   主程序中的延时

     由于有常开的时钟中断,所以当主程序中有需要时间较短、精度较高的延时时,应暂时把时钟中断关闭。而程序中需要时间较长、精度不高的延时时,便可仿照下需的写法,避免多层嵌套的循环延时。 
   例:在P1.1输出1秒的高电平脉冲 
MOV A,INCPI 
INC A 
CJNE A,INCPI,$       ;等待一次中断处理完成 
SETB P1.1              ;设P1.1为H,脉冲开始 
ADD A,#50              ;50个20mS为1秒 
CJNE A,INCPI,$       ;等中断将INCPI加一50次 
CLR P1.1                ;设P1.1为L,脉冲结束 

 

   结束语:从上看出,要灵活地应用时钟中断,将任务合理分配给中断和主程序,并且二者要分工明确,接口简单。这其中的技巧还需要大家在实践中多多摸索与体会。另外要注意:应尽量缩短中断处理程序的执行时间,更不要长于20mS。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(18)
发表于:2008-5-17 1:30:32
标签:软件抗干扰  单片机  

0

软件抗干扰技术及其在单片机上的应用

黄 鑫,宋 洋

(中国空空导弹研究院河南洛阳471009)

1 引 言

微机测控系统中,对软件有以下几个方面的基本要求:

(1)可维护性:要求尽可能地采用模块化设计,程序流程清晰明了,最大限度地控制使用和调用嵌套次数;

(2)可理解性:软件源代码应注意加注提示内容,一般应不少于整个代码行数的60%,使其易于理解和阅读,便于修改和补充;

(3)实时性:随着集合度和运算速度的提高,实时性已经成为测试系统对软件的普遍要求,在工程应用软件设计中,采用汇编语言要比采用高级语言更具有实时性;

(4)准确性:系统要求在进行大量运算时,要选取合适的算法,以便控制最后结果的精度;

(5)可靠性:可靠性是测控软件最重要的指标之一,他要求两方面的内容:一方面是运行参数环境发生变化时(如电压在规定范围内出现较大波动),软件都能可靠运行并得出正确的结果,也就是软件的自适应性;另一方面是在工作环境恶劣,干扰环境复杂严重的情况下,软件必须保证可靠运行,这对测控软件尤为重要。为了保证以上两方面的要求,就必须使用多种抗干扰技术。

2软件抗干扰技术及一般方法

2.1 简 介

软件抗干扰技术是当系统受干扰后,使系统恢复正常运行或输入信号受干扰后去伪存真的一种辅助方法。此技术属于一种被动抗干扰措施,但是由于软件抗干扰设计灵活,节省硬件资源,操作起来方便易行,所以软件抗干扰技术越来越受到人们的重视。

软件抗干扰技术主要研究的方面:

(1)采取软件的方法对叠加在模拟输入信号上的噪声进行抑制,以读取真正有用的信息,如数字滤波器;

(2)在程序受到干扰"跑飞"的情况下,采取措施使程序回到正常的轨道上来,常见的抗干扰技术有:软件拦截技术(软件陷阱等);输人口信号重复检测方法;输出口数据刷新;数字滤波;

(3)程序具有自检功能。

2.2软件拦截技术

2.2.1 NOP指令使用

单片机中最容易受到干扰的是内部程序计数器--PC的值,当受到干扰时,PC值被改变,CPU误将程序从正确位置跳转到无意义区域,导致程序运行出错。

目前常用的方法是在对程序走向有重要作用的指令(RET,LCALL,SJMP,JC,LJMP,ACALL等)之前加人2~3个单字节的NOP指令,当失控的程序遇到该指令后得到调整,使接下来的程序得以正常执行。从实际使用过程中总结可知,应尽量多的使用NOP指令,而且发现NOP指令成对使用时,能起到比较满意的抗干扰效果。

2.2.2 软件陷阱

(1)未使用的中断区

对于未使用的中断源因干扰而开放,从而直接影响软件的正常工作的中断源,采用的方法一般是在对应的中断服务地址入口处设置软件陷阱,使其跳转到程序入口,通常的软件陷阱设置如下面的程序: 0RG 0003H

LJMP 0000H ;主程序入口

而在实际使用中,此种处理方法并不合适,特别是在系统联试中,突然重新执行程序的情况应尽量避免。实际处理应该是让其进入一个信息处理程序,并显示相关信息。这样做既可以使程序捕捉到错误的中断后,及时离开,又可以根据相关信息快速定位便于试验顺利进行。

如程序所示,只有定时器T0中断开放,对于可能影响程序的中断,如外部中断、定时器T1中断,在其中断地址人口,均加上了软件陷阱,使其跳转到ER38这个故障处理程序,从而避免程序的"跑飞",也便于判断程序的走向。

(2)未使用的EPROM空间

当装载软件程序的存储芯片为27C64,其地址空间为0000H~1FFFFH,一般程序很少能够用完,可填充"FF"。而FFH是MOV R7,A的机器码,当程序乱入非程序区后,不仅无法转入正轨,而且还会破坏R7的内容,因此在实际使用过程对未使用的EPROM空间应全部填充为"0",因为程序复位入口地址为0000H,当"跑飞"的程序指针跳至无程序处,可以让其重新指向主程序入口,可以起到防"跑飞"的功能。

(3)程序区

为了保证可靠的运行,以及一旦发生"跑飞",不但使其有出口而且便于判断,实际应用中在整个程序中设置了若干软件陷阱,当程序进入陷阱后,让其强制进入一个指定地址执行一段专门对程序出错进行处理的程序。通过试验验证和使用中的经验总结,在外场软件编写中,软件陷阱的设置,主要是在正常的程序流程中,在认为较为重要的程序段中,随机设置若干个故障信息显示程序区,一方面是完成正常的故障信息的显示,另一方面就是在程序"跑飞"的情况下,通过故障信息的显示,可以快速判断"跑飞',的程序段,从而使程序步入正轨。程序流程如图1所示。

2.2.3 输入口信号重复检测方法

对于重要开关量输入信号的检测,实际应用中一般采用3次或5次重复检测的方法,即对接口中的输人数据信息进行重复进行3次或5次检测,若结果完全一致则认为是"真"的输入信号,若多次测试结果不一致,即可以停止检测显示故障信息,又可以重复进行再检测。

对于软件测量而言,输入量干扰大多数是叠加到有效信号上的一系列作用时间短的尖脉冲,但是频率不一致,因此应在相邻的检测之间应有一定的时间间隔。理论上可以是等时间段的,而在实际使用过程中,由于外部环境比较复杂,等时间段只能滤除某个频段的干扰,为了滤除尽可能多的干扰,间隔时间应为不等的时间段,但是对数据影响较大的尖峰,通过观察其波形可知,其作用的时间宽度在几十到几百μs之间,所以把滤波时间限定ms级上。在经过使用和验证,此方法可以有效地保证软件可靠运行。需要注意的是,对于软件时序要求比较严格场合,延时查询时间不宜过长,查询次数一般以3次为宜。

程序流程如图2所示。

2.2.4 输出端口数据刷新

开关量输出软件抗干扰技术主要采用的方法是重复输出,这是提高输出端口稳定性的有效措施之一。外场设备的微机系统为51单片机系统,采用了8155,8255可编程I/O扩展芯片,理论上只在上电启动时,进行初始化一次即可。但是在实际使用中发现,由于干扰等原因,可使芯片的工作控制字遭到破坏,从而使系统输入输出状态混乱的情况时有发生,因此,在读取重要信号之前,先对8155,8255进行初始化操作,通过一段时间软件运行,稳定度大大提高,但是状态混乱情况仍有发生,经过分析数据特点和系统要求后,认为8155、8255允许多次设置状态字、控制字等,而且对系统并无不良影响。因此,在实际应用中,用到8255和8155之前均首先进行初始化操作,然后再进行状态的读取和写入。通过长时间试验和联试,不再出现此类问题,软件运行稳定可靠。另外应注意,在重复设置8255,8155芯片时,一定要将其工作方式、控制字一起设置,方可确保软件可靠工作。程序流程如图3所示。

2.2.5 数字滤波

为了克服干扰对A/D转换结果的影响,可根据情况采取相应的数字滤波技术。数字滤波的方法很多,如有中值滤波法、平均值滤波法等,经过对不同滤波法的实际使用和试验验证,认为采用防脉冲干扰平均值滤波法,抗干扰效果比较明显。

普通的平均值滤波,在干扰十分严重的场合,所得到的平均值中干扰的成分仍比较大,不易消除由于脉冲干扰而引起的误差。而防脉冲干扰平均值滤波是在采集的N个数据中,去掉数据中的最大值和最小值,然后计算N-2个数据的算术平均值。在实际应用中,此法主要是用在AD值的检测上,由于外场设备中AD采集值判定,直接影响此设备能否投入使用,所以对所采AD值的可靠性要求高,采用此滤波法后,通过仿真可以清楚看出,在某些特定
的情况下,AD采集值波动较大,但此法可以有效地避免了CPU对采集值的误判,使软件得以可靠运行。

程序流程如图4所示,此程序完成的主要功能是调用A/D测量输入子程序ACD,将循环采集的6个AD值,放在70H至75H的寄存器中,RO为记录采集次数,70H和75H分别放置最大值和最小值,去除最大值和最小值后,将其余4个值求算术平均数,以得到的值为最终AD采集值放在68H寄存器中。

2.2.6 程序自检

程序自检是提高测控软件可靠性的有效方法之一。在实际应用中,自检程序主要是对单片机系统的主要器件如8031的I/O口、外部扩展的可编程I/O接VI芯片、A/D器件、ROM器件等进行检测,如出现故障能够给出故障部位。因此自检程序不但可以了解与测试相关外设的工作情况,而且可避免因外设原因而使测控系统不能正常工作的干扰。

3 结 语

在采取以上所述的多种软件抗干扰技术,经过外场的沙尘、云雪的考验和干扰复杂、严重的环境下验证,完全可以保证软件可靠运行。但是同时需要说明的是,软件抗干扰技术只是被动的方式,只有在硬件没计合理的情况下,使用适当的抗干扰技术,才能更有效地保证软件可靠地工作。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(13)
发表于:2008-5-17 1:23:06
标签:单片机  软件抗干扰  

0

MCS 51系列单片机软件抗干扰技术中的误区

 作者:周航慈  


    摘要:文章指出了一种广泛流传的误解:在MCS-51系列单片机中,只要用指令使程序从起始地址开始执行,就可以复位单片机,摆脱干扰。通过一个简单的实验,揭示了软件复位的可靠方法。

    有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是用一系列指令来模仿复位操作,这就是MCS-51系列单片机所特有的软件复位技术。
    现用一简单的实验说明,实验电路如附图所示。接于仿真插座P1.0的发光二极管LED0用来表示主程序的工作情况,接于P1.1的发光二极管LED1用于表示低级中断子程序的工作情况,接于P1.2的发光二极管LED2用来表示高级中断子程序的工作情况,接于P3.2口的按钮用来设立干扰标志,程序检测到干扰标志后故意进入死循环或掉进陷井,模仿受干扰的情况,从而检验各种复位方法的实际效果。初始化程序如下:

             ORG  0000H
STAT:        LJMP MAIN               ;复位入口地址

             ORG  0003H    
             LJMP PX0                ;按钮中断向量(低级中断)
             ORG 000BH
             LJMP PT0                ;T0中断向量(低级中断)
             ORG 001BH
             LJMP PT1                ;T1中断向量(高级中断)


             ORG 0030H
MAIN:       CLR EA
             MOV SP,#7
             MOV P1,#0FFH
             MOV P3,#0FFH
             MOV TMOD,#11H
             CLR 00H                  ;干扰标志初始化
             SETB ET0
             SETB ET1
             SETB EX0
             SETB PT1
             SETB TR0
             SETB TR1
             SETB EA
LOOP:        CPL P1.0                 ;主程序发光二极管LED0闪烁
             MOV R6,#80H
             MOV R7,#0
TT1:         DJNZ R7,TT1
             DJNZ R6,TT1
             SJMP LOOP


PX0:         SETB 00H                 ;设立干扰标志,模拟发生干扰
             RETI

PT0:         CPL P1.1                 ;低级中断程序发光二极管LED1闪烁
             RETI

PT1:         CPL P1.2                 ;高级中断程序发光二极管LED2闪烁
             RETI
   

             END

实验步骤如下:

1. 按上述程序启动执行,三个发光二极管都应闪烁(否则应先排除故障),表示主程序和各中断子程序正常。因模拟干扰标志未加检测,故不受按钮影响。

2. 修改主程序如下,按下按钮后主程序即掉入死循环中。

LOOP: CPL P1.0
      MOV R6,#80H
      MOV R7,#0H
TT1:  DJNZ R7,TT1
      DJNZ R6,TT1
      JNB 00H,LOOP       ;受干扰否?
STOP:LJMP STOP          ;掉入死循环。

这时可以看到,主程序停止工作(LED0停止闪烁),而两个中断子程序继续运行(LED1和LED2继续闪烁)。

3. 将定时器T1用作软件WATCHDOG,将30H单元用作软件WATCHDOG计数器。主程序中加入一条复位软件WATCHDOG的指令。

LOOP: CPL P1.0
      MOV 30H,#0         ;复位软件WATCHDOG计数器

      MOV R6,#80H
      MOV R7,#0H
TT1:  DJNZ R7,TT1
      DJNZ R6,TT1
      JNB 00H,LOOP        ;受干扰否?
STOP:LJMP STOP           ; 掉入死循环。

T1中断子程序修改如下:

PT1: CPL P1.2             ;高级中断程序发光二极管闪烁
     INC 30H
     MOV A,30H
     ADD A,#0FDH
     JC ERR               ;达到3次否?
     RETI

ERR: LJMP STAT       ;软件WATCHDOG动作

    当按下按钮前,程序正常运行(三个LED全闪)。按下按钮后,主程序能迅速恢复工作,但两个中断子程序被封锁,不再工作。过程如下:主程序检测到干扰后进入死循环,不能执行复位30H单元的操作,T1中断使30H不断增值,计数到3时,软件WATCHDOG执行动作,执行一条LJMP指令,使程序从头执行。MAIN过程中清除了干扰标志(表示干扰已经过去),使主程序迅速恢复工作。按理说MAIN过程中也重新设定了各个中断,并开放了它们,为什么中断不能恢复工作呢?这是因为中断激活标志的复位工作被遗忘了,因为它没有明确的位地址可供编程,直接转向0000H地址并不能完成真正的复位。软件复位是使用软件陷阱和软件WATCHDOG后必须进行的工作,这时程序出错完全有可能发生在中断子程序中,中断激活标志已置位,它将阻止同级中断响应。由于软件WATCHDOG是高级中断,它将阻止所有中断响应。由此可见,清除中断激活标志的重要性,很多文献的作者因为没有认识到这一点进入误区。

4. 在所有指令中,只有RETI指令能清除中断激活标志。出错处理程序ERR主要是完成这一功能,其它的善后工作交由复位后的系统去完成。为此,我们重新设计T1中断子程序如下所示:

PT1: CPL P1.2         ;高级中断程序发光二极管闪烁
     INC 30H          ;软件WATCHDOG计数器增值
     MOV A,30H
     ADD A,#0FD
     JC ERR           ;达到3次否?
     RETI
ERR: CLR EA           ;关中断
     CLR A            ;准备复位地址(0000H)
     PUSH ACC
     PUSH ACC
     RETI             ;清除中断激活标志并复位

    这段程序先关中断,以便后续处理能顺利进行,然后用RETI指令替代LJMP指令,从而既清除了中断激活标志又完成了转向0000H的任务。按这样改好后程序再运行,结果仍不理想:按下按钮后,有时只有主程序和高级中断子程序能迅速恢复正常,而低级中断仍有被关闭的可能。如果按如下方法把干扰转移到低级中断中,则按下按钮后低级中断必然被关闭:

LOOP: CPL P1.0
      MOV R6,#80H
      MOV R7,#0H
TT1:  DJNZ R7,TT1
      DJNZ R6,TT1
      SJMP LOOP
PT0:  CPL P1.1
      JB 00H,STOP
      RETI
STOP:LJMP STOP         ; 掉入死循环。
 
    仔细分析后可能得出结论:当软件WATCHDOG是嵌套在低级中断中起作用时,复位后只清除了高级中断激活标志,低级中断标志仍然被置位,从而使低级中断一直被关闭。

5. 修改出错处理如下:

ERR: CLR EA             ;正确的软件复位入口
     MOV 66H,#0AAH      ;重建上电标志
     MOV 67H,#55H
     MOV DPTR,#ERR1     ;准备第一次返回地址
     PUSH DPL
     PUSH DPH
     RETI               ;清除高级中断激活标志
ERR1:CLR A
     PUSH ACC
     PUSH ACC
     RETI               ;清除低级中断激活标志

    这时,必须执行两次RETI,才能到达0000H,以保证清除全部中断激活标志,达到和硬件复位相同的效果。同样,软件陷井也必须由下列三条指令

     NOP
     NOP
     LJMP STAT
改成:
     NOP
     NOP
     LJMP ERR

才能达到目的。
 
    当主程序受到干扰被软件陷阱捕获时,中断标志并未置位,执行ERR过程中,RETI指令等效于RET指令,同样可以达到软件复位的目的。有兴趣的读者可以将软件陷阱代替死循环,分别用LJMP STAT和LJMP ERR1来替代LJMP ERR,再将干扰检测分别设在低级中断和主程序中,实验结果必然证明:只有LJMP ERR才能万无一失地实现软件复位,使系统摆脱干扰,恢复正常。在MCS-51单片机的软件复位过程中,必须连续执行两次中断返回指令RETI才能确保系统恢复正常。 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(12)
发表于:2008-5-17 1:20:05
标签:单片机  LED  

0

单端口管脚驱动双LED的方法

作者:Tom Gay, Dornstadt, Germany                 文章来源:EDN 电子设计技术

 

大多数现代微控制器都提供 I/O  端口,可以在程序执行期间改变这些端口的功能。当用作输出时,这些电路可以吸收或流出相当大的电流。本设计实例示出了用一个 I/O 管脚驱动双管脚、双色 LED 的三种方法。图 1 是一个可能的方案,它使用外接反相器 IC1 来驱动一只红/绿双向 LED,即D1。端口管脚的逻辑高电平输出使电流流过绿色(上方)LED,并将反相器输入电平拉高,于是驱动反相器输出端为低电平,从绿色 LED 吸入电流。端口管脚的逻辑低电平输出使反相器输出端为高电平,从而为红色(下方)LED提供电流,微控制器的输出端从红色 LED 吸入电流。


  要关掉两只LED 时,可以重新配置微控制器的端口管脚,使之从输出转为输入或将管脚切换成三态,任何一态都能阻止微控制器的端口管脚吸入或流出电流。这种电路的主要缺点是不能控制每只LED的亮度,而是由电阻器R5决定两只LED的正向电流。

  图2表示了另一种方法,它也有严重缺点。齐纳二极管D3、D4和电阻器R3、R4构成一个低阻分压器,为LED D5的一端提供VCC/2V电压。VCC的值决定了齐纳二极管电压VZ的选择,电压较低的齐纳二极管能提供更多的LED电流,较高电压的齐纳管限制了LED的最大电流。给定微控制器的输出可以提供满摆幅输出的电压, VCC与VZ之差限定了两只LED的最大正向电流。例如,如果VCC为5V,VZ为3V,则流过任何一只LED的正向电压就低于2V。一旦设计师选定了齐纳二极管的电压,VCC只能有少许变动,否则, LED的亮度就会出现波动。


  使用分立元件时,另有一种廉价的电路能避免其他电路的缺点(图3)。图中,当微控制器的输出端口为高电平时,电流流经绿色(上方)LED、R2、D2和FETQ2,端口的高电平接通。当微控制器输出端口变为低电平时,晶体管Q1导通,通过R2和红色(下方)LED向端口管脚提供电流。电路可以对称地工作,因为无论微控制器端口管脚的电平是高还是低,硅二极管D2的正向压降都出现。VCC可能在运行中出现变化,但必须保持高于3V。


  你可以单独调整 LED 的电流,以使两者亮度均衡,或对微控制器电源电压与LED驱动电路VCC之间的差异作出补偿。方法是在Q1的射极与D2的阳极之间用两只串联的电阻器代替R2。并将两支电阻器的中点连接到LED上。

  当微控制器的端口管脚被配制成“有上拉的输入”时,端口为绿色LED提供少量电流。但是,只要上拉电阻器阻值等于或高于22 kΩ,就不会使关断状态下的LED产生使人误解的光输出。当端口管脚的输入信号浮动时,即VCC为5V,而端口配置成无上拉电阻器的输入,则电路不产生任何额外的电流,而由R1所决定的静态电流平均值小于100mA。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(13)
发表于:2008-5-17 1:14:19
标签:C51  

0

谈谈C51的编程规范

 作者:方塘    

         现在单片机的程序设计,C51已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。

    作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果了。因此,为了便于源程序的交流,减少合作开发中的障碍,希望大家能够探讨一下C51的编程规范。把各人认为好的建议提出来,然后做一个总结,作为一种大家一致认同的规范,我认为将会是一件很有意义的事。我先提出一些自已的想法,以此抛砖引玉。

一、注释

   1,采用中文;
   2,开始的注释:   

   文件(模块)注释内容:
   公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需要加上流程说明;

比如:
/*********************************************************************/
/*公司名称:                                                          */

/*模 块 名:        LCD 模块              LCD 型号:HD44780          */

/*创 建 人:zhaojunjie                    日期:2001-06-08           */
/*修 改 人:                              日期:2001-06-08           */ 
/*功能描述:                                                         */
/*其他说明:                                                         */
/*版    本:
/**********************************************************************/

   函数开头的注释内容:
   函数名称、功能、说明  输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;

/*********************************************************************  
*
* 函 数 名: v_LcdInit
* 功能描述: LCD初始化
* 函数说明: 初始化命令:0x3c, 0x08, 0x01, 0x06, 0x10, 0x0c
* 调用函数: v_Delaymsec(),v_LcdCmd()
* 全局变量:
* 输    入: 无
* 返    回: 无
* 设 计 者:zhao                         日期:2001-12-09
* 修 改 者:zhao                         日期:2001-12-09
* 版    本:
***********************************************************************/

    3、程序中的注释内容:

    修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,一目了然的语句不加注释。

二、命名:
    
    命名必须具有一定的实际意义。

1、常量的命名:全部用大写。

2、变量的命名:
    变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。 
    其中变量数据类型:
     unsigned char  前缀 uc   signed char 前缀 sc 
     unsigned int   前缀 ui   signed int  前缀 si
     unsigned long  前缀 ul   signed long 前缀 sl
     bit            前缀 b    指针        前缀 p
     
     例:ucReceivData  接收数据
3、结构体命名:
            
4、函数的命名:
    函数名首字大写,若包含有两个单词的每个单词首字母大写。
    函数原型说明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 内部函数,只要注释其定义文件名;

三、编辑风格

  1、缩进:缩进以 Tab 为单位,一个 Tab 为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的“{”“}”配对对齐,并与其前一行对齐;

  2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如: 
if ( ... ) 等,运算符的空格规定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“&”(取址或引用)、“*”(指使用指针时)等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。

  3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。

  4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行
  
  5、修改:版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。

  6、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(12)
发表于:2008-5-17 1:11:29
标签:单片机  C51  输入法  

0

用C51实现单片机的中文输入法

说明:
拼音输入法杳询函数: unsigned char code * py_ime(unsigned char input_py_val[]);
input_py_val为已输入的拼音码字符串头指针,
反回值为中文的起始地址,当为0时,杳询失败
应用举例:
{
unsigned char input_string[]={"bang"};
unsigned char chines_string[100];
sprintf(chines_string,"%s",py_ime(input_string));
}

C51程序:

//"********************CCDC01采集器测试仪软件:拼音输入法模块********************"
//"* 软件设计:张 凯 *"
//"* 日期: 2001/3 *"
//"* 编译环境:Franklin 3.3.4 *"
//"******************************************************************************"

#i nclude <string.h>
#i nclude <reg51.h>

//"********************CCDC01采集器测试仪软件:拼音输入法码表********************"
//"* 软件设计:张 凯 *"
//"* 日期: 2001/3 *"
//"* 编译环境:Franklin 3.3.4 *"
//"******************************************************************************"

//"拼音输入法汉字排列表"
unsigned char code PY_mb_a []={"阿啊"};
unsigned char code PY_mb_ai []={"哎哀唉埃挨皑癌矮蔼艾爱隘碍"};
unsigned char code PY_mb_an []={"安氨鞍俺岸按案胺暗"};
unsigned char code PY_mb_ang []={"肮昂盎"};
unsigned char code PY_mb_ao []={"凹敖熬翱袄傲奥澳懊"};
unsigned char code PY_mb_ba []={"八巴叭扒吧芭疤捌笆拔跋把靶坝爸罢霸"};
unsigned char code PY_mb_bai []={"白百佰柏摆败拜稗"};
unsigned char code PY_mb_ban []={"扳班般颁斑搬板版办半伴扮拌绊瓣"};
unsigned char code PY_mb_bang []={"邦帮梆绑榜膀蚌傍棒谤磅镑"};
unsigned char code PY_mb_bao []={"包苞胞褒雹宝饱保堡报抱豹鲍暴爆剥薄瀑"};
unsigned char code PY_mb_bei []={"卑杯悲碑北贝狈备背钡倍被惫焙辈"};
unsigned char code PY_mb_ben []={"奔本苯笨夯"};
unsigned char code PY_mb_beng []={"崩绷甭泵迸蹦"};
unsigned char code PY_mb_bi []={"逼鼻比彼笔鄙币必毕闭庇毖陛毙敝痹蓖弊碧蔽壁避臂"};
unsigned char code PY_mb_bian []={"边编鞭贬扁卞便变遍辨辩辫"};
unsigned char code PY_mb_biao []={"彪标膘表"};
unsigned char code PY_mb_bie []={"憋鳖别瘪"};
unsigned char code PY_mb_bin []={"宾彬斌滨濒摈"};
unsigned char code PY_mb_bing []={"冰兵丙秉柄炳饼并病"};
unsigned char code PY_mb_bo []={"拨波玻钵脖菠播伯驳帛泊勃铂舶博渤搏箔膊卜"};
unsigned char code PY_mb_bu []={"补哺捕不布步怖部埠簿"};
unsigned char code PY_mb_ca []={"擦"};
unsigned char code PY_mb_cai []={"猜才材财裁采彩睬踩菜蔡"};
unsigned char code PY_mb_can []={"参餐残蚕惭惨灿"};
unsigned char code PY_mb_cang []={"仓沧苍舱藏"};
unsigned char code PY_mb_cao []={"操糙曹槽草"};
unsigned char code PY_mb_ce []={"册侧厕测策"};
unsigned char code PY_mb_ceng []={"层蹭曾"};
unsigned char code PY_mb_cha []={"叉插查茬茶搽察碴岔诧差刹"};
unsigned char code PY_mb_chai []={"拆柴豺"};
unsigned char code PY_mb_chan []={"掺搀谗馋缠蝉产铲阐颤"};
unsigned char code PY_mb_chang []={"昌猖肠尝偿常厂场敞畅倡唱"};
unsigned char code PY_mb_chao []={"抄钞超巢朝嘲潮吵炒绰"};
unsigned char code PY_mb_che []={"车扯彻掣撤澈"};
unsigned char code PY_mb_chen []={"郴尘臣忱沉辰陈晨衬趁"};
unsigned char code PY_mb_cheng []={"称撑成呈承诚城乘惩程澄橙逞骋秤"};
unsigned char code PY_mb_chi []={"吃痴弛池驰迟持尺侈齿耻斥赤炽翅"};
unsigned char code PY_mb_chong []={"充冲虫崇宠"};
unsigned char code PY_mb_chou []={"抽仇绸畴愁稠筹酬踌丑瞅臭"};
unsigned char code PY_mb_chu []={"出初除厨滁锄雏橱躇础储楚处搐触矗畜"};
unsigned char code PY_mb_chuai []={"揣"};
unsigned char code PY_mb_chuan []={"川穿传船椽喘串"};
unsigned char code PY_mb_chuang[]={"闯疮窗床创"};
unsigned char code PY_mb_chui []={"吹炊垂捶锤"};
unsigned char code PY_mb_chun []={"春椿纯唇淳醇蠢"};
unsigned char code PY_mb_chuo []={"戳"};
unsigned char code PY_mb_ci []={"疵词茨瓷慈辞磁雌此次刺赐"};
unsigned char code PY_mb_cong []={"囱从匆葱聪丛"};
unsigned char code PY_mb_cou []={"凑"};
unsigned char code PY_mb_cu []={"粗促醋簇"};
unsigned char code PY_mb_cuan []={"蹿窜篡"};
unsigned char code PY_mb_cui []={"崔催摧脆淬瘁粹翠"};
unsigned char code PY_mb_cun []={"村存寸"};
unsigned char code PY_mb_cuo []={"搓磋撮挫措错"};
unsigned char code PY_mb_da []={"搭达答瘩打大"};
unsigned char code PY_mb_dai []={"呆歹傣代带待怠殆贷袋逮戴"};
unsigned char code PY_mb_dan []={"丹单担耽郸胆掸旦但诞弹惮淡蛋氮"};
unsigned char code PY_mb_dang []={"当挡党荡档"};
unsigned char code PY_mb_dao []={"刀导岛倒捣祷蹈到悼盗道稻"};
unsigned char code PY_mb_de []={"得德的"};
unsigned char code PY_mb_deng []={"灯登蹬等邓凳瞪"};
unsigned char code PY_mb_di []={"低堤滴狄迪敌涤笛嫡底抵地弟帝递第缔蒂"};
unsigned char code PY_mb_dian []={"掂滇颠典点碘电佃甸店垫惦淀奠殿靛"};
unsigned char code PY_mb_diao []={"刁叼凋碉雕吊钓掉"};
unsigned char code PY_mb_die []={"爹跌迭谍叠碟蝶"};
unsigned char code PY_mb_ding []={"丁叮盯钉顶鼎订定锭"};
unsigned char code PY_mb_diu []={"丢"};
unsigned char code PY_mb_dong []={"东冬董懂动冻侗恫栋洞"};
unsigned char code PY_mb_dou []={"都兜斗抖陡豆逗痘"};
unsigned char code PY_mb_du []={"督毒读犊独堵赌睹妒杜肚度渡镀"};
unsigned char code PY_mb_duan []={"端短段断缎锻"};
unsigned char code PY_mb_dui []={"堆队对兑"};
unsigned char code PY_mb_dun []={"吨敦墩蹲盾钝顿遁"};
unsigned char code PY_mb_duo []={"多哆夺掇朵垛躲剁堕舵惰跺"};
unsigned char code PY_mb_e []={"讹俄娥峨鹅蛾额厄扼恶饿鄂遏"};
unsigned char code PY_mb_en []={"恩"};
unsigned char code PY_mb_er []={"儿而尔耳洱饵二贰"};
unsigned char code PY_mb_fa []={"发乏伐罚阀筏法珐"};
unsigned char code PY_mb_fan []={"帆番翻藩凡矾钒烦樊繁反返犯泛饭范贩"};
unsigned char code PY_mb_fang []={"方坊芳防妨房肪仿访纺放"};
unsigned char code PY_mb_fei []={"飞非啡菲肥匪诽吠废沸肺费"};
unsigned char code PY_mb_fen []={"分吩纷芬氛酚坟汾焚粉份奋忿愤粪"};
unsigned char code PY_mb_feng []={"丰风枫封疯峰烽锋蜂冯逢缝讽凤奉"};
unsigned char code PY_mb_fo []={"佛"};
unsigned char code PY_mb_fou []={"否"};
unsigned char code PY_mb_fu []={"夫肤孵敷弗伏扶拂服俘氟浮涪符袱幅福辐抚甫府斧俯釜辅腑腐父讣付妇负附咐阜复赴副傅富赋缚腹覆"};
unsigned char code PY_mb_ga []={"嘎噶"};
unsigned char code PY_mb_gai []={"该改钙盖溉概"};
unsigned char code PY_mb_gan []={"干甘杆肝柑竿秆赶敢感赣"};
unsigned char code PY_mb_gang []={"冈刚岗纲肛缸钢港杠"};
unsigned char code PY_mb_gao []={"皋羔高膏篙糕搞稿镐告"};
unsigned char code PY_mb_ge []={"戈疙哥胳鸽割搁歌阁革格葛隔个各铬咯"};
unsigned char code PY_mb_gei []={"给"};
unsigned char code PY_mb_gen []={"根跟"};
unsigned char code PY_mb_geng []={"更庚耕羹埂耿梗"};
unsigned char code PY_mb_gong []={"工弓公功攻供宫恭躬龚巩汞拱共贡"};
unsigned char code PY_mb_gou []={"勾沟钩狗苟构购垢够"};
unsigned char code PY_mb_gu []={"估咕姑孤沽菇辜箍古谷股骨蛊鼓固故顾雇"};
unsigned char code PY_mb_gua []={"瓜刮剐寡挂褂"};
unsigned char code PY_mb_guai []={"乖拐怪"};
unsigned char code PY_mb_guan []={"关观官冠棺馆管贯惯灌罐"};
unsigned char code PY_mb_guang []={"光广逛"};
unsigned char code PY_mb_gui []={"归圭龟规闺硅瑰轨诡癸鬼刽柜贵桂跪"};
unsigned char code PY_mb_gun []={"辊滚棍"};
unsigned char code PY_mb_guo []={"郭锅国果裹过"};
unsigned char code PY_mb_ha []={"蛤哈"};
unsigned char code PY_mb_hai []={"孩骸海亥骇害氦"};
unsigned char code PY_mb_han []={"酣憨含邯函涵寒韩罕喊汉汗旱悍捍焊憾撼翰"};
unsigned char code PY_mb_hang []={"杭航行"};
unsigned char code PY_mb_hao []={"毫豪嚎壕好郝号浩耗"};
unsigned char code PY_mb_he []={"呵喝禾合何和河阂核荷涸盒菏贺褐赫鹤"};
unsigned char code PY_mb_hei []={"黑嘿"};
unsigned char code PY_mb_hen []={"痕很狠恨"};
unsigned char code PY_mb_heng []={"亨哼恒横衡"};
unsigned char code PY_mb_hong []={"轰哄烘弘红宏洪虹鸿"};
unsigned char code PY_mb_hou []={"侯喉猴吼后厚候"};
unsigned char code PY_mb_hu []={"乎呼忽弧狐胡壶湖葫瑚糊蝴虎唬互户护沪"};
unsigned char code PY_mb_hua []={"花华哗滑猾化划画话"};
unsigned char code PY_mb_huai []={"怀徊淮槐坏"};
unsigned char code PY_mb_huan []={"欢还环桓缓幻宦唤换涣患焕痪豢"};
unsigned char code PY_mb_huang []={"荒慌皇凰黄惶煌蝗磺簧恍晃谎幌"};
unsigned char code PY_mb_hui []={"灰恢挥辉徽回蛔悔卉汇会讳绘诲烩贿晦秽惠毁慧"};
unsigned char code PY_mb_hun []={"昏荤婚浑魂混"};
unsigned char code PY_mb_huo []={"豁活火伙或货获祸惑霍"};
unsigned char code PY_mb_ji []={"讥击饥圾机肌鸡迹姬积基绩缉畸箕稽激及吉汲级即极急疾棘集嫉辑籍几己挤脊计记伎纪妓忌技际剂季既济继寂寄悸祭蓟冀藉"};
unsigned char code PY_mb_jia []={"加夹佳枷家嘉荚颊甲贾钾价驾架假嫁稼挟"};
unsigned char code PY_mb_jian []={"奸尖坚歼间肩艰兼监笺缄煎拣俭柬茧捡减剪检硷简碱见件建饯剑荐贱健涧舰渐溅践鉴键箭"};
unsigned char code PY_mb_jiang []={"江姜将浆僵疆讲奖桨蒋匠降酱"};
unsigned char code PY_mb_jiao []={"交郊娇浇骄胶椒焦蕉礁角狡绞饺矫脚铰搅剿缴叫轿较教窖酵觉嚼"};
unsigned char code PY_mb_jie []={"阶皆接秸揭街节劫杰洁结捷睫截竭姐解介戒芥届界疥诫借"};
unsigned char code PY_mb_jin []={"巾今斤金津筋襟仅紧谨锦尽劲近进晋浸烬禁靳"};
unsigned char code PY_mb_jing []={"京经茎荆惊晶睛粳兢精鲸井颈景警净径痉竞竟敬靖境静镜"};
unsigned char code PY_mb_jiong []={"炯窘"};
unsigned char code PY_mb_jiu []={"纠究揪九久灸玖韭酒旧臼咎疚厩救就舅"};
unsigned char code PY_mb_ju []={"居拘狙驹疽鞠局桔菊咀沮举矩句巨拒具炬俱剧惧据距锯聚踞"};
unsigned char code PY_mb_juan []={"娟捐鹃卷倦绢眷"};
unsigned char code PY_mb_jue []={"撅决诀抉绝倔掘爵攫"};
unsigned char code PY_mb_jun []={"军君均钧菌俊郡峻浚骏竣"};
unsigned char code PY_mb_ka []={"咖喀卡"};
unsigned char code PY_mb_kai []={"开揩凯慨楷"};
unsigned char code PY_mb_kan []={"槛刊勘堪坎砍看"};
unsigned char code PY_mb_kang []={"康慷糠扛亢抗炕"};
unsigned char code PY_mb_kao []={"考拷烤靠"};
unsigned char code PY_mb_ke []={"坷苛柯科棵颗磕壳咳可渴克刻客课"};
unsigned char code PY_mb_ken []={"肯垦恳啃"};
unsigned char code PY_mb_keng []={"吭坑"};
unsigned char code PY_mb_kong []={"空孔恐控"};
unsigned char code PY_mb_kou []={"抠口扣寇"};
unsigned char code PY_mb_ku []={"枯哭窟苦库裤酷"};
unsigned char code PY_mb_kua []={"夸垮挎胯跨"};
unsigned char code PY_mb_kuai []={"块快侩筷"};
unsigned char code PY_mb_kuan []={"宽款"};
unsigned char code PY_mb_kuang []={"匡筐狂况旷矿框眶"};
unsigned char code PY_mb_kui []={"亏岿盔窥奎葵魁傀愧溃馈"};
unsigned char code PY_mb_kun []={"坤昆捆困"};
unsigned char code PY_mb_kuo []={"扩括阔廓"};
unsigned char code PY_mb_la []={"垃拉啦喇腊蜡辣"};
unsigned char code PY_mb_lai []={"来莱赖"};
unsigned char code PY_mb_lan []={"兰拦栏婪阑蓝谰澜篮览揽缆懒烂滥"};
unsigned char code PY_mb_lang []={"郎狼廊琅榔朗浪"};
unsigned char code PY_mb_lao []={"捞劳牢老佬姥涝烙酪"};
unsigned char code PY_mb_le []={"乐勒了"};
unsigned char code PY_mb_lei []={"雷镭垒磊蕾儡肋泪类累擂"};
unsigned char code PY_mb_leng []={"棱楞冷"};
unsigned char code PY_mb_li []={"厘梨狸离莉犁漓璃黎篱礼李里哩理鲤力历厉立吏丽利励沥例隶俐荔栗砾粒傈痢"};
unsigned char code PY_mb_lian []={"连帘怜涟莲联廉镰敛脸练炼恋链"};
unsigned char code PY_mb_liang []={"俩良凉梁粮粱两亮谅辆晾量"};
unsigned char code PY_mb_liao []={"潦辽疗聊僚寥廖撩燎镣料撂"};
unsigned char code PY_mb_lie []={"列劣烈猎裂"};
unsigned char code PY_mb_lin []={"邻林临淋琳霖磷鳞凛吝赁拎"};
unsigned char code PY_mb_ling []={"伶灵岭玲凌铃陵羚菱零龄领令另"};
unsigned char code PY_mb_liu []={"溜刘流留琉硫馏榴瘤柳六"};
unsigned char code PY_mb_long []={"龙咙笼聋隆窿陇垄拢"};
unsigned char code PY_mb_lou []={"娄楼搂篓陋漏"};
unsigned char code PY_mb_lu []={"露卢庐芦炉颅卤虏掳鲁陆录赂鹿禄碌路戮潞麓"};
unsigned char code PY_mb_luan []={"孪峦挛滦卵乱"};
unsigned char code PY_mb_lue []={"掠略"};
unsigned char code PY_mb_lun []={"抡仑伦沦纶轮论"};
unsigned char code PY_mb_luo []={"罗萝逻锣箩骡螺裸洛络骆落"};
unsigned char code PY_mb_lv []={"滤驴吕侣旅铝屡缕履律虑率绿氯"};
unsigned char code PY_mb_ma []={"妈麻马玛码蚂骂吗嘛"};
unsigned char code PY_mb_mai []={"埋买迈麦卖脉"};
unsigned char code PY_mb_man []={"蛮馒瞒满曼谩慢漫蔓"};
unsigned char code PY_mb_mang []={"忙芒盲茫莽氓"};
unsigned char code PY_mb_mao []={"猫毛矛茅锚卯铆茂冒贸帽貌"};
unsigned char code PY_mb_me []={"么"};
unsigned char code PY_mb_mei []={"没枚玫眉梅媒煤酶霉每美镁妹昧媚寐"};
unsigned char code PY_mb_men []={"门闷们"};
unsigned char code PY_mb_meng []={"萌盟檬猛蒙锰孟梦"};
unsigned char code PY_mb_mi []={"弥迷谜醚糜靡米眯泌觅秘密幂蜜"};
unsigned char code PY_mb_mian []={"眠绵棉免勉娩冕缅面"};
unsigned char code PY_mb_miao []={"苗描瞄秒渺藐妙庙"};
unsigned char code PY_mb_mie []={"灭蔑"};
unsigned char code PY_mb_min []={"民皿抿闽悯敏"};
unsigned char code PY_mb_ming []={"名明鸣铭螟命"};
unsigned char code PY_mb_miu []={"谬"};
unsigned char code PY_mb_mo []={"貉摸摹模膜摩磨蘑魔抹末沫陌莫寞漠墨默"};
unsigned char code PY_mb_mou []={"牟谋某"};
unsigned char code PY_mb_mu []={"母亩牡姆拇木目牧募墓幕睦慕暮穆"};
unsigned char code PY_mb_na []={"拿哪那纳娜钠呐"};
unsigned char code PY_mb_nai []={"乃奶氖奈耐"};
unsigned char code PY_mb_nan []={"男南难"};
unsigned char code PY_mb_nang []={"囊"};
unsigned char code PY_mb_nao []={"挠恼脑闹淖"};
unsigned char code PY_mb_ne []={"呢"};
unsigned char code PY_mb_nei []={"内馁"};
unsigned char code PY_mb_nen []={"嫩"};
unsigned char code PY_mb_neng []={"能"};
unsigned char code PY_mb_ni []={"妮尼泥倪霓你拟逆匿溺腻"};
unsigned char code PY_mb_nian []={"拈年捻撵碾念蔫"};
unsigned char code PY_mb_niang []={"娘酿"};
unsigned char code PY_mb_niao []={"鸟尿"};
unsigned char code PY_mb_nie []={"捏涅聂啮镊镍孽"};
unsigned char code PY_mb_nin []={"您"};
unsigned char code PY_mb_ning []={"宁拧狞柠凝泞"};
unsigned char code PY_mb_niu []={"牛扭纽钮"};
unsigned char code PY_mb_nong []={"农浓脓弄"};
unsigned char code PY_mb_nu []={"奴努怒"};
unsigned char code PY_mb_nuan []={"暖"};
unsigned char code PY_mb_nue []={"疟虐"};
unsigned char code PY_mb_nuo []={"挪诺懦糯"};
unsigned char code PY_mb_nv []={"女"};
unsigned char code PY_mb_o []={"哦"};
unsigned char code PY_mb_ou []={"欧殴鸥呕偶藕沤"};
unsigned char code PY_mb_pa []={"趴啪爬耙琶帕怕"};
unsigned char code PY_mb_pai []={"拍徘排牌派湃"};
unsigned char code PY_mb_pan []={"潘攀盘磐判叛盼畔"};
unsigned char code PY_mb_pang []={"乓庞旁耪胖"};
unsigned char code PY_mb_pao []={"抛刨咆炮袍跑泡"};
unsigned char code PY_mb_pei []={"呸胚陪培赔裴沛佩配"};
unsigned char code PY_mb_pen []={"喷盆"};
unsigned char code PY_mb_peng []={"抨砰烹朋彭棚硼蓬鹏澎篷膨捧碰"};
unsigned char code PY_mb_pi []={"辟批坯披砒劈霹皮毗疲啤琵脾匹痞屁僻譬"};
unsigned char code PY_mb_pian []={"片偏篇骗"};
unsigned char code PY_mb_piao []={"漂飘瓢票"};
unsigned char code PY_mb_pie []={"撇瞥"};
unsigned char code PY_mb_pin []={"拼贫频品聘"};
unsigned char code PY_mb_ping []={"乒平评凭坪苹屏瓶萍"};
unsigned char code PY_mb_po []={"坡泼颇婆迫破粕魄"};
unsigned char code PY_mb_pou []={"剖"};
unsigned char code PY_mb_pu []={"脯仆扑铺莆菩葡蒲朴圃埔浦普谱曝"};
unsigned char code PY_mb_qi []={"七沏妻柒凄栖戚期欺漆祁齐其奇歧祈脐崎畦骑棋旗乞企岂启起气讫迄弃汽泣契砌器"};
unsigned char code PY_mb_qia []={"掐恰洽"};
unsigned char code PY_mb_qian []={"千仟扦迁钎牵铅谦签前钱钳乾潜黔浅遣谴欠堑嵌歉"};
unsigned char code PY_mb_qiang []={"呛羌枪腔强墙蔷抢"};
unsigned char code PY_mb_qiao []={"悄敲锹橇乔侨桥瞧巧俏峭窍翘撬鞘"};
unsigned char code PY_mb_qie []={"切茄且怯窃"};
unsigned char code PY_mb_qin []={"亲侵钦芹秦琴禽勤擒寝沁"};
unsigned char code PY_mb_qing []={"青氢轻倾卿清情晴氰擎顷请庆"};
unsigned char code PY_mb_qiong []={"穷琼"};
unsigned char code PY_mb_qiu []={"丘邱秋囚求泅酋球"};
unsigned char code PY_mb_qu []={"区曲驱屈蛆躯趋渠取娶龋去趣"};
unsigned char code PY_mb_quan []={"圈全权泉拳痊醛颧犬劝券"};
unsigned char code PY_mb_que []={"炔缺瘸却雀确鹊榷"};
unsigned char code PY_mb_qun []={"裙群"};
unsigned char code PY_mb_ran []={"然燃冉染"};
unsigned char code PY_mb_rang []={"瓤嚷壤攘让"};
unsigned char code PY_mb_rao []={"饶扰绕"};
unsigned char code PY_mb_re []={"惹热"};
unsigned char code PY_mb_ren []={"人仁壬忍刃认任纫妊韧"};
unsigned char code PY_mb_reng []={"扔仍"};
unsigned char code PY_mb_ri []={"日"};
unsigned char code PY_mb_rong []={"戎绒茸荣容溶蓉熔融冗"};
unsigned char code PY_mb_rou []={"柔揉肉"};
unsigned char code PY_mb_ru []={"如茹儒孺蠕汝乳辱入褥"};
unsigned char code PY_mb_ruan []={"阮软"};
unsigned char code PY_mb_rui []={"蕊锐瑞"};
unsigned char code PY_mb_run []={"闰润"};
unsigned char code PY_mb_ruo []={"若弱"};
unsigned char code PY_mb_sa []={"撒洒萨"};
unsigned char code PY_mb_sai []={"塞腮鳃赛"};
unsigned char code PY_mb_san []={"三叁伞散"};
unsigned char code PY_mb_sang []={"桑嗓丧"};
unsigned char code PY_mb_sao []={"搔骚扫嫂"};
unsigned char code PY_mb_se []={"色涩瑟"};
unsigned char code PY_mb_sen []={"森"};
unsigned char code PY_mb_seng []={"僧"};
unsigned char code PY_mb_sha []={"杀沙纱砂莎傻啥煞厦"};
unsigned char code PY_mb_shai []={"筛晒"};
unsigned char code PY_mb_shan []={"山删杉衫珊煽闪陕汕苫扇善缮擅膳赡栅"};
unsigned char code PY_mb_shang []={"伤商墒裳晌赏上尚"};
unsigned char code PY_mb_shao []={"捎梢烧稍勺芍韶少邵绍哨"};
unsigned char code PY_mb_she []={"奢赊舌蛇舍设社射涉赦慑摄"};
unsigned char code PY_mb_shen []={"申伸身呻绅娠砷深神沈审婶肾甚渗慎什"};
unsigned char code PY_mb_sheng []={"升生声牲胜甥绳省圣盛剩"};
unsigned char code PY_mb_shi []={"匙尸失师虱诗施狮湿十石时识实拾蚀食史矢使始驶屎士氏世仕市示式事侍势视试饰室恃拭是柿适逝释嗜誓噬似"};
unsigned char code PY_mb_shou []={"收手守首寿受兽售授瘦"};
unsigned char code PY_mb_shu []={"书抒叔枢殊梳淑疏舒输蔬孰赎熟暑黍署鼠蜀薯曙术戍束述树竖恕庶数墅漱属"};
unsigned char code PY_mb_shua []={"刷耍"};
unsigned char code PY_mb_shuai []={"衰摔甩帅"};
unsigned char code PY_mb_shuan []={"拴栓"};
unsigned char code PY_mb_shuang[]={"双霜爽"};
unsigned char code PY_mb_shui []={"谁水税睡"};
unsigned char code PY_mb_shun []={"吮顺舜瞬"};
unsigned char code PY_mb_shuo []={"说烁朔硕"};
unsigned char code PY_mb_si []={"丝司私思斯嘶撕死巳四寺伺饲嗣肆"};
unsigned char code PY_mb_song []={"松怂耸讼宋诵送颂"};
unsigned char code PY_mb_sou []={"嗽搜艘擞"};
unsigned char code PY_mb_su []={"苏酥俗诉肃素速粟塑溯僳"};
unsigned char code PY_mb_suan []={"酸蒜算"};
unsigned char code PY_mb_sui []={"虽绥隋随髓岁祟遂碎隧穗"};
unsigned char code PY_mb_sun []={"孙损笋"};
unsigned char code PY_mb_suo []={"唆梭蓑缩所索琐锁"};
unsigned char code PY_mb_ta []={"她他它塌塔獭挞踏蹋"};
unsigned char code PY_mb_tai []={"胎台抬苔太汰态泰酞"};
unsigned char code PY_mb_tan []={"坍贪摊滩瘫坛谈痰谭潭檀坦袒毯叹炭探碳"};
unsigned char code PY_mb_tang []={"汤唐堂棠塘搪膛糖倘淌躺烫趟"};
unsigned char code PY_mb_tao []={"涛绦掏滔逃桃陶淘萄讨套"};
unsigned char code PY_mb_te []={"特"};
unsigned char code PY_mb_teng []={"疼腾誊藤"};
unsigned char code PY_mb_ti []={"剔梯锑踢啼提题蹄体屉剃涕惕替嚏"};
unsigned char code PY_mb_tian []={"天添田恬甜填腆舔"};
unsigned char code PY_mb_tiao []={"调挑条迢眺跳"};
unsigned char code PY_mb_tie []={"贴铁帖"};
unsigned char code PY_mb_ting []={"厅汀听烃廷亭庭停挺艇"};
unsigned char code PY_mb_tong []={"通同彤桐铜童酮瞳统捅桶筒痛"};
unsigned char code PY_mb_tou []={"偷头投透"};
unsigned char code PY_mb_tu []={"凸秃突图徒涂途屠土吐兔"};
unsigned char code PY_mb_tuan []={"湍团"};
unsigned char code PY_mb_tui []={"推颓腿退蜕褪"};
unsigned char code PY_mb_tun []={"囤吞屯臀"};
unsigned char code PY_mb_tuo []={"托拖脱驮陀驼鸵妥椭拓唾"};
unsigned char code PY_mb_wa []={"哇娃挖洼蛙瓦袜"};
unsigned char code PY_mb_wai []={"歪外"};
unsigned char code PY_mb_wan []={"弯湾豌丸完玩顽烷宛挽晚婉惋皖碗万腕"};
unsigned char code PY_mb_wang []={"汪亡王网往枉妄忘旺望"};
unsigned char code PY_mb_wei []={"危威微巍为韦围违桅唯惟维潍伟伪尾纬苇委萎卫未位味畏胃尉谓喂渭蔚慰魏"};
unsigned char code PY_mb_wen []={"温瘟文纹闻蚊吻紊稳问"};
unsigned char code PY_mb_weng []={"翁嗡瓮"};
unsigned char code PY_mb_wo []={"挝涡窝蜗我沃卧握斡"};
unsigned char code PY_mb_wu []={"乌污呜巫屋诬钨无毋吴吾芜梧五午伍坞武侮捂舞勿务戊物误悟晤雾"};
unsigned char code PY_mb_xi []={"夕汐西吸希昔析矽息牺悉惜烯硒晰犀稀溪锡熄熙嘻膝习席袭媳檄洗喜戏系细隙"};
unsigned char code PY_mb_xia []={"虾瞎匣侠峡狭暇辖霞下吓夏"};
unsigned char code PY_mb_xian []={"铣仙先纤掀锨鲜闲弦贤咸涎舷衔嫌显险县现线限宪陷馅羡献腺"};
unsigned char code PY_mb_xiang []={"乡相香厢湘箱襄镶详祥翔享响想向巷项象像橡"};
unsigned char code PY_mb_xiao []={"宵消萧硝销霄嚣淆小晓孝肖哮效校笑啸"};
unsigned char code PY_mb_xie []={"些楔歇蝎协邪胁斜谐携鞋写泄泻卸屑械谢懈蟹"};
unsigned char code PY_mb_xin []={"心忻芯辛欣锌新薪信衅"};
unsigned char code PY_mb_xing []={"兴星惺猩腥刑邢形型醒杏姓幸性"};
unsigned char code PY_mb_xiong []={"凶兄匈汹胸雄熊"};
unsigned char code PY_mb_xiu []={"宿休修羞朽秀绣袖锈嗅"};
unsigned char code PY_mb_xu []={"戌须虚嘘需墟徐许旭序叙恤绪续酗婿絮蓄吁"};
unsigned char code PY_mb_xuan []={"轩宣喧玄悬旋选癣绚眩"};
unsigned char code PY_mb_xue []={"削靴薛穴学雪血"};
unsigned char code PY_mb_xun []={"勋熏寻巡旬驯询循训讯汛迅逊殉"};
unsigned char code PY_mb_ya []={"丫压呀押鸦鸭牙芽蚜崖涯衙哑雅亚讶"};
unsigned char code PY_mb_yan []={"咽烟淹焉阉延严言岩沿炎研盐阎蜒颜奄衍掩眼演厌彦砚唁宴艳验谚堰焰雁燕"};
unsigned char code PY_mb_yang []={"央殃秧鸯扬羊阳杨佯疡洋仰养氧痒样漾"};
unsigned char code PY_mb_yao []={"侥妖腰邀尧姚窑谣摇遥瑶咬舀药要耀钥"};
unsigned char code PY_mb_ye []={"椰噎爷耶也冶野业叶曳页夜掖液腋"};
unsigned char code PY_mb_yi []={"一伊衣医依铱壹揖仪夷沂宜姨胰移遗颐疑彝乙已以矣蚁倚椅义亿忆艺议亦屹异役抑译邑易绎诣疫益谊翌逸意溢肄裔毅翼臆"};
unsigned char code PY_mb_yin []={"因阴姻茵荫音殷吟寅淫银尹引饮隐印"};
unsigned char code PY_mb_ying []={"应英婴缨樱鹰迎盈荧莹萤营蝇赢颖影映硬"};
unsigned char code PY_mb_yo []={"哟"};
unsigned char code PY_mb_yong []={"佣拥痈庸雍臃永咏泳勇涌恿蛹踊用"};
unsigned char code PY_mb_you []={"优忧幽悠尤由犹邮油铀游友有酉又右幼佑诱釉"};
unsigned char code PY_mb_yu []={"迂淤渝于予余盂鱼俞娱渔隅愉逾愚榆虞舆与宇屿羽雨禹语玉驭芋育郁狱峪浴预域欲喻寓御裕遇愈誉豫"};
unsigned char code PY_mb_yuan []={"冤鸳渊元员园垣原圆袁援缘源猿辕远苑怨院愿"};
unsigned char code PY_mb_yue []={"曰约月岳悦阅跃粤越"};
unsigned char code PY_mb_yun []={"云匀郧耘允陨孕运晕酝韵蕴"};
unsigned char code PY_mb_za []={"匝杂砸咋"};
unsigned char code PY_mb_zai []={"灾哉栽宰载再在仔"};
unsigned char code PY_mb_zan []={"咱攒暂赞"};
unsigned char code PY_mb_zang []={"赃脏葬"};
unsigned char code PY_mb_zao []={"遭糟凿早枣蚤澡藻灶皂造噪燥躁"};
unsigned char code PY_mb_ze []={"则择泽责"};
unsigned char code PY_mb_zei []={"贼"};
unsigned char code PY_mb_zen []={"怎"};
unsigned char code PY_mb_zeng []={"增憎赠"};
unsigned char code PY_mb_zha []={"喳渣扎札轧闸铡眨乍诈炸榨柞"};
unsigned char code PY_mb_zhai []={"斋摘宅翟窄债寨"};
unsigned char code PY_mb_zhan []={"沾毡粘詹瞻斩展盏崭辗占战栈站绽湛蘸"};
unsigned char code PY_mb_zhang []={"长张章彰漳樟涨掌丈仗帐杖胀账障瘴"};
unsigned char code PY_mb_zhao []={"招昭找沼召兆赵照罩肇爪"};
unsigned char code PY_mb_zhe []={"遮折哲蛰辙者锗这浙蔗着"};
unsigned char code PY_mb_zhen []={"贞针侦珍真砧斟甄臻诊枕疹阵振镇震帧"};
unsigned char code PY_mb_zheng []={"争征怔挣狰睁蒸拯整正证郑政症"};
unsigned char code PY_mb_zhi []={"之支汁芝吱枝知织肢脂蜘执侄直值职植殖止只旨址纸指趾至志制帜治炙质峙挚秩致掷痔窒智滞稚置"};
unsigned char code PY_mb_zhong []={"中忠终盅钟衷肿种仲众重"};
unsigned char code PY_mb_zhou []={"州舟诌周洲粥轴肘帚咒宙昼皱骤"};
unsigned char code PY_mb_zhu []={"朱诛株珠诸猪蛛竹烛逐主拄煮嘱瞩住助注贮驻柱祝著蛀筑铸"};
unsigned char code PY_mb_zhua []={"抓"};
unsigned char code PY_mb_zhuai []={"拽"};
unsigned char code PY_mb_zhuan []={"专砖转撰篆"};
unsigned char code PY_mb_zhuang[]={"妆庄桩装壮状幢撞"};
unsigned char code PY_mb_zhui []={"追椎锥坠缀赘"};
unsigned char code PY_mb_zhun []={"谆准"};
unsigned char code PY_mb_zhuo []={"卓拙捉桌灼茁浊酌啄琢"};
unsigned char code PY_mb_zi []={"孜兹咨姿资淄滋籽子紫滓字自渍"};
unsigned char code PY_mb_zong []={"宗综棕踪鬃总纵"};
unsigned char code PY_mb_zou []={"邹走奏揍"};
unsigned char code PY_mb_zu []={"租足卒族诅阻组祖"};
unsigned char code PY_mb_zuan []={"赚纂钻"};
unsigned char code PY_mb_zui []={"嘴最罪醉"};
unsigned char code PY_mb_zun []={"尊遵"};
unsigned char code PY_mb_zuo []={"昨左佐作坐座做"};

//================================================================================================


//"拼音输入法查询码表"

unsigned char code PY_index_a[][8]={
{" ",0x00,0x00},
{"i ",0x05,0x00},
{"n ",0x20,0x00},
{"ng ",0x33,0x00},
{"o ",0x3A,0x00}};
unsigned char code PY_index_b[][8]={
{"a ",0x4D,0x00},
{"ai ",0x70,0x00},
{"an ",0x81,0x00},
{"ang ",0xA0,0x00},
{"ao ",0xB9,0x00},
{"ei ",0xDE,0x00},
{"en ",0xFD,0x00},
{"eng ",0x08,0x01},
{"i ",0x15,0x01},
{"ian ",0x44,0x01},
{"iao ",0x5D,0x01},
{"ie ",0x66,0x01},
{"in ",0x6F,0x01},
{"ing ",0x7C,0x01},
{"o ",0x8F,0x01},
{"u ",0xB8,0x01}};
unsigned char code PY_index_c[][8]={
{"a ",0xCD,0x01},
{"ai ",0xD0,0x01},
{"an ",0xE7,0x01},
{"ang ",0xF6,0x01},
{"ao ",0x01,0x02},
{"e ",0x0C,0x02},
{"eng ",0x17,0x02},
{"ha ",0x1E,0x02},
{"hai ",0x37,0x02},
{"han ",0x3E,0x02},
{"hang ",0x53,0x02},
{"hao ",0x6C,0x02},
{"he ",0x81,0x02},
{"hen ",0x8E,0x02},
{"heng ",0xA3,0x02},
{"hi ",0xC2,0x02},
{"hong ",0xE1,0x02},
{"hou ",0xEC,0x02},
{"hu ",0x05,0x03},
{"huai ",0x28,0x03},
{"huan ",0x2B,0x03},
{"huang",0x3A,0x03},
{"hui ",0x45,0x03},
{"hun ",0x50,0x03},
{"huo ",0x5F,0x03},
{"i ",0x62,0x03},
{"ong ",0x7B,0x03},
{"ou ",0x88,0x03},
{"u ",0x8B,0x03},
{"uan ",0x94,0x03},
{"ui ",0x9B,0x03},
{"un ",0xAC,0x03},
{"uo ",0xB3,0x03}};
unsigned char code PY_index_d[][8]={
{"a ",0xC0,0x03},
{"ai ",0xCD,0x03},
{"an ",0xE6,0x03},
{"ang ",0x05,0x04},
{"ao ",0x10,0x04},
{"e ",0x29,0x04},
{"eng ",0x30,0x04},
{"i ",0x3F,0x04},
{"ian ",0x64,0x04},
{"iao ",0x85,0x04},
{"ie ",0x96,0x04},
{"ing ",0xA5,0x04},
{"iu ",0xB8,0x04},
{"ong ",0xBB,0x04},
{"ou ",0xD0,0x04},
{"u ",0xE1,0x04},
{"uan ",0xFE,0x04},
{"ui ",0x0B,0x05},
{"un ",0x14,0x05},
{"uo ",0x25,0x05}};
unsigned char code PY_index_e[][8]={
{" ",0x3E,0x05},
{"n ",0x59,0x05},
{"r ",0x5C,0x05}};
unsigned char code PY_index_f[][8]={
{"a ",0x6D,0x05},
{"an ",0x7E,0x05},
{"ang ",0xA1,0x05},
{"ei ",0xB8,0x05},
{"en ",0xD1,0x05},
{"eng ",0xF0,0x05},
{"o ",0x0F,0x06},
{"ou ",0x12,0x06},
{"u ",0x15,0x06}};
unsigned char code PY_index_g[][8]={
{"a ",0x6E,0x06},
{"ai ",0x73,0x06},
{"an ",0x80,0x06},
{"ang ",0x97,0x06},
{"ao ",0xAA,0x06},
{"e ",0xBF,0x06},
{"ei ",0xE2,0x06},
{"en ",0xE5,0x06},
{"eng ",0xEA,0x06},
{"ong ",0xF9,0x06},
{"ou ",0x18,0x07},
{"u ",0x2B,0x07},
{"ua ",0x50,0x07},
{"uai ",0x5D,0x07},
{"uan ",0x64,0x07},
{"uang ",0x7B,0x07},
{"ui ",0x82,0x07},
{"un ",0xA3,0x07},
{"uo ",0xAA,0x07}};
unsigned char code PY_index_h[][8]={
{"a ",0xB7,0x07},
{"ai ",0xBC,0x07},
{"an ",0xCB,0x07},
{"ang ",0xF2,0x07},
{"ao ",0xF9,0x07},
{"e ",0x0C,0x08},
{"ei ",0x2F,0x08},
{"en ",0x34,0x08},
{"eng ",0x3D,0x08},
{"ong ",0x48,0x08},
{"ou ",0x5B,0x08},
{"u ",0x6A,0x08},
{"ua ",0x8F,0x08},
{"uai ",0xA2,0x08},
{"uan ",0xAD,0x08},
{"uang ",0xCA,0x08},
{"ui ",0xE7,0x08},
{"un ",0x12,0x09},
{"uo ",0x1F,0x09}};
unsigned char code PY_index_j[][8]={
{"i ",0x34,0x09},
{"ia ",0xA1,0x09},
{"ian ",0xC6,0x09},
{"iang ",0x15,0x0A},
{"iao ",0x30,0x0A},
{"ie ",0x69,0x0A},
{"in ",0x9C,0x0A},
{"ing ",0xC5,0x0A},
{"iong ",0xF8,0x0A},
{"iu ",0xFD,0x0A},
{"u ",0x20,0x0B},
{"uan ",0x55,0x0B},
{"ue ",0x64,0x0B},
{"un ",0x77,0x0B}};
unsigned char code PY_index_k[][8]={
{"a ",0x8E,0x0B},
{"ai ",0x95,0x0B},
{"an ",0xA0,0x0B},
{"ang ",0xAF,0x0B},
{"ao ",0xBE,0x0B},
{"e ",0xC7,0x0B},
{"en ",0xE6,0x0B},
{"eng ",0xEF,0x0B},
{"ong ",0xF4,0x0B},
{"ou ",0xFD,0x0B},
{"u ",0x06,0x0C},
{"ua ",0x15,0x0C},
{"uai ",0x20,0x0C},
{"uan ",0x29,0x0C},
{"uang ",0x2E,0x0C},
{"ui ",0x3F,0x0C},
{"un ",0x56,0x0C},
{"uo ",0x5F,0x0C}};
unsigned char code PY_index_l[][8]={
{"a ",0x68,0x0C},
{"ai ",0x77,0x0C},
{"an ",0x7E,0x0C},
{"ang ",0x9D,0x0C},
{"ao ",0xAC,0x0C},
{"e ",0xBF,0x0C},
{"ei ",0xC6,0x0C},
{"eng ",0xDD,0x0C},
{"i ",0xE4,0x0C},
{"ian ",0x29,0x0D},
{"iang ",0x46,0x0D},
{"iao ",0x5F,0x0D},
{"ie ",0x78,0x0D},
{"in ",0x83,0x0D},
{"ing ",0x9C,0x0D},
{"iu ",0xB9,0x0D},
{"ong ",0xD0,0x0D},
{"ou ",0xE3,0x0D},
{"u ",0xF0,0x0D},
{"uan ",0x19,0x0E},
{"ue ",0x26,0x0E},
{"un ",0x2B,0x0E},
{"uo ",0x3A,0x0E},
{"v ",0x53,0x0E}};
unsigned char code PY_index_m[][8]={
{"a ",0x70,0x0E},
{"ai ",0x83,0x0E},
{"an ",0x90,0x0E},
{"ang ",0xA3,0x0E},
{"ao ",0xB0,0x0E},
{"e ",0xC9,0x0E},
{"ei ",0xCC,0x0E},
{"en ",0xED,0x0E},
{"eng ",0xF4,0x0E},
{"i ",0x05,0x0F},
{"ian ",0x22,0x0F},
{"iao ",0x35,0x0F},
{"ie ",0x46,0x0F},
{"in ",0x4B,0x0F},
{"ing ",0x58,0x0F},
{"iu ",0x65,0x0F},
{"o ",0x68,0x0F},
{"ou ",0x8D,0x0F},
{"u ",0x94,0x0F}};
unsigned char code PY_index_n[][8]={
{"a ",0xB3,0x0F},
{"ai ",0xC2,0x0F},
{"an ",0xCD,0x0F},
{"ang ",0xD4,0x0F},
{"ao ",0xD7,0x0F},
{"e ",0xE2,0x0F},
{"ei ",0xE5,0x0F},
{"en ",0xEA,0x0F},
{"eng ",0xED,0x0F},
{"i ",0xF0,0x0F},
{"ian ",0x07,0x10},
{"iang ",0x16,0x10},
{"iao ",0x1B,0x10},
{"ie ",0x20,0x10},
{"in ",0x2F,0x10},
{"ing ",0x32,0x10},
{"iu ",0x3F,0x10},
{"ong ",0x48,0x10},
{"u ",0x51,0x10},
{"uan ",0x58,0x10},
{"ue ",0x5B,0x10},
{"uo ",0x60,0x10},
{"v ",0x69,0x10}};
unsigned char code PY_index_o[][8]={
{" ",0x6C,0x10},
{"u ",0x6F,0x10}};
unsigned char code PY_index_p[][8]={
{"a ",0x7E,0x10},
{"ai ",0x8D,0x10},
{"an ",0x9A,0x10},
{"ang ",0xAB,0x10},
{"ao ",0xB6,0x10},
{"ei ",0xC5,0x10},
{"en ",0xD8,0x10},
{"eng ",0xDD,0x10},
{"i ",0xFA,0x10},
{"ian ",0x1F,0x11},
{"iao ",0x28,0x11},
{"ie ",0x31,0x11},
{"in ",0x36,0x11},
{"ing ",0x41,0x11},
{"o ",0x54,0x11},
{"ou ",0x65,0x11},
{"u ",0x68,0x11}};
unsigned char code PY_index_q[][8]={
{"i ",0x87,0x11},
{"ia ",0xD0,0x11},
{"ian ",0xD7,0x11},
{"iang ",0x04,0x12},
{"iao ",0x15,0x12},
{"ie ",0x34,0x12},
{"in ",0x3F,0x12},
{"ing ",0x56,0x12},
{"iong ",0x71,0x12},
{"iu ",0x76,0x12},
{"u ",0x87,0x12},
{"uan ",0xA2,0x12},
{"ue ",0xB9,0x12},
{"un ",0xCA,0x12}};
unsigned char code PY_index_r[][8]={
{"an ",0xCF,0x12},
{"ang ",0xD8,0x12},
{"ao ",0xE3,0x12},
{"e ",0xEA,0x12},
{"en ",0xEF,0x12},
{"eng ",0x04,0x13},
{"i ",0x09,0x13},
{"ong ",0x0C,0x13},
{"ou ",0x21,0x13},
{"u ",0x28,0x13},
{"uan ",0x3D,0x13},
{"ui ",0x42,0x13},
{"un ",0x49,0x13},
{"uo ",0x4E,0x13}};
unsigned char code PY_index_s[][8]={
{"a ",0x53,0x13},
{"ai ",0x5A,0x13},
{"an ",0x63,0x13},
{"ang ",0x6C,0x13},
{"ao ",0x73,0x13},
{"e ",0x7C,0x13},
{"en ",0x83,0x13},
{"eng ",0x86,0x13},
{"ha ",0x89,0x13},
{"hai ",0x9C,0x13},
{"han ",0xA1,0x13},
{"hang ",0xC4,0x13},
{"hao ",0xD5,0x13},
{"he ",0xEC,0x13},
{"hen ",0x05,0x14},
{"heng ",0x28,0x14},
{"hi ",0x3F,0x14},
{"hou ",0xA0,0x14},
{"hu ",0xB5,0x14},
{"hua ",0xF8,0x14},
{"huai ",0xFD,0x14},
{"huan ",0x06,0x15},
{"huang",0x0B,0x15},
{"hui ",0x12,0x15},
{"hun ",0x1B,0x15},
{"huo ",0x24,0x15},
{"i ",0x2D,0x15},
{"ong ",0x4C,0x15},
{"ou ",0x5D,0x15},
{"u ",0x66,0x15},
{"uan ",0x7D,0x15},
{"ui ",0x84,0x15},
{"un ",0x9B,0x15},
{"uo ",0xA2,0x15}};
unsigned char code PY_index_t[][8]={
{"a ",0xB3,0x15},
{"ai ",0xC6,0x15},
{"an ",0xD9,0x15},
{"ang ",0xFE,0x15},
{"ao ",0x19,0x16},
{"e ",0x30,0x16},
{"eng ",0x33,0x16},
{"i ",0x3C,0x16},
{"ian ",0x5B,0x16},
{"iao ",0x6C,0x16},
{"ie ",0x79,0x16},
{"ing ",0x80,0x16},
{"ong ",0x95,0x16},
{"ou ",0xB0,0x16},
{"u ",0xB9,0x16},
{"uan ",0xD0,0x16},
{"ui ",0xD5,0x16},
{"un ",0xE2,0x16},
{"uo ",0xEB,0x16}};
unsigned char code PY_index_w[][8]={
{"a ",0x02,0x17},
{"ai ",0x11,0x17},
{"an ",0x16,0x17},
{"ang ",0x39,0x17},
{"ei ",0x4E,0x17},
{"en ",0x91,0x17},
{"eng ",0xA6,0x17},
{"o ",0xAD,0x17},
{"u ",0xC0,0x17}};
unsigned char code PY_index_x[][8]={
{"i ",0xFB,0x17},
{"ia ",0x40,0x18},
{"ian ",0x59,0x18},
{"iang ",0x90,0x18},
{"iao ",0xB9,0x18},
{"ie ",0xDC,0x18},
{"in ",0x05,0x19},
{"ing ",0x1A,0x19},
{"iong ",0x37,0x19},
{"iu ",0x46,0x19},
{"u ",0x5B,0x19},
{"uan ",0x82,0x19},
{"ue ",0x97,0x19},
{"un ",0xA6,0x19}};
unsigned char code PY_index_y[][8]={
{"a ",0xC3,0x19},
{"an ",0xE4,0x19},
{"ang ",0x27,0x1A},
{"ao ",0x4A,0x1A},
{"e ",0x6D,0x1A},
{"i ",0x8C,0x1A},
{"in ",0xF7,0x1A},
{"ing ",0x18,0x1B},
{"o ",0x3D,0x1B},
{"ong ",0x40,0x1B},
{"ou ",0x5F,0x1B},
{"u ",0x88,0x1B},
{"uan ",0xE1,0x1B},
{"ue ",0x0A,0x1C},
{"un ",0x1D,0x1C}};
unsigned char code PY_index_z[][8]={
{"a ",0x36,0x1C},
{"ai ",0x3F,0x1C},
{"an ",0x50,0x1C},
{"ang ",0x59,0x1C},
{"ao ",0x60,0x1C},
{"e ",0x7D,0x1C},
{"ei ",0x86,0x1C},
{"en ",0x89,0x1C},
{"eng ",0x8C,0x1C},
{"ha ",0x93,0x1C},
{"hai ",0xAE,0x1C},
{"han ",0xBD,0x1C},
{"hang ",0xE0,0x1C},
{"hao ",0x01,0x1D},
{"he ",0x18,0x1D},
{"hen ",0x2F,0x1D},
{"heng ",0x52,0x1D},
{"hi ",0x6F,0x1D},
{"hong ",0xC6,0x1D},
{"hou ",0xDD,0x1D},
{"hu ",0xFA,0x1D},
{"hua ",0x2F,0x1E},
{"huai ",0x32,0x1E},
{"huan ",0x35,0x1E},
{"huang",0x40,0x1E},
{"hui ",0x51,0x1E},
{"hun ",0x5E,0x1E},
{"huo ",0x63,0x1E},
{"i ",0x78,0x1E},
{"ong ",0x95,0x1E},
{"ou ",0xA4,0x1E},
{"u ",0xAD,0x1E},
{"uan ",0xBE,0x1E},
{"ui ",0xC5,0x1E},
{"un ",0xCE,0x1E},
{"uo ",0xD3,0x1E}};
unsigned char code PY_index_end[][8]={" ",0,0};

//================================================================================================

//================================================================================================

//"========================================变量声明========================================"
unsigned int code py_mb_begin=(unsigned int)&PY_mb_a[0];
unsigned char code (* code PY_index_pointer[27])[8]={
PY_index_a,PY_index_b,PY_index_c,PY_index_d,PY_index_e,PY_index_f,PY_index_g,PY_index_h,
PY_index_j,PY_index_j,PY_index_k,PY_index_l,PY_index_m,PY_index_n,PY_index_o,PY_index_p,
PY_index_q,PY_index_r,PY_index_s,PY_index_t,PY_index_w,PY_index_w,PY_index_w,PY_index_x,
PY_index_y,PY_index_z,PY_index_end};

//"========================================函数声明========================================"
//"拼音输入法杳询函数,input_py为已输入的拼音码,反回值为中文的起始地址,当为0时,杳询失败"
unsigned char code * py_ime(unsigned char input_py_val[]);

//"========================================主程序体========================================"

unsigned char code * py_ime(unsigned char input_py_val[])
{
unsigned char code (* xdata p1)[8],(* xdata p2)[8],(* xdata p3)[8];
unsigned char xdata i="1";
if (input_py_val[0]==0) return(0); //"如果输入空字符返回0"
if (input_py_val[0]=='i') return(0);
if (input_py_val[0]=='u') return(0);
if (input_py_val[0]=='v') return(0);
p1=p2=PY_index_pointer[input_py_val[0]-0x61]; //"计算入口树根"
p3=PY_index_pointer[input_py_val[0]-0x60]; //"设置指针界限"
if (p1==0) return(0); //"查询失败返回0"
while (p1<p3) if ((*p1)[0]==input_py_val[1]) {p2=p1;break;} else p1++; //"查询第二个拼音"
p1=p2;
while (p1<p3) //"阶梯法查询余下拼音"
if (((*p1)[i]==input_py_val[i+1])&&((*p1)[i-1]==input_py_val[i]))
{
p2=p1;
i++;
}
else p1++;
return((unsigned char code *)((*p2)[6]+(*p2)[7]*256+py_mb_begin)); //"返回查询结果首地址"
}

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(11)
发表于:2008-5-17 1:05:49
标签:电感  磁珠  

0

电感和磁珠的区别和联系

电感是储能元件,而磁珠是能量转换(消耗)器件

 

电感多用于电源滤波回路,磁珠多用于信号回路,用于EMC对策

 

磁珠主要用于抑制电磁辐射干扰,而电感用于这方面则侧重于抑制传导性干扰。两者都可用于处理EMCEMI问题。

 

磁珠是用来吸收超高频信号,象一些RF电路,PLL,振荡电路,含超高频存储器电路(DDR SDRAMRAMBUS等)都需要在电源输入部分加磁珠,而电感是一种蓄能元件,用在LC振荡电路,中低频的滤波电路等,其应用频率范围很少超过错50MHZ

 

地的连接一般用电感,电源的连接也用电感,而对信号线则采用磁珠?
但实际上磁珠应该也能达到吸收高频干扰的目的啊?而且电感在高频谐振以后都不能再起电感的作用了……

还请各位大侠明示

 

先必需明白EMI的两个途径,即:辐射和传导,不同的途径采用不同的抑制方法。前者用磁珠,后者用电感。

 

对于扳子的IO部分,是不是基于EMC的目的可以用电感将IO部分和扳子的地进行隔离,比如将USB的地和扳子的地用10uH的电感隔离可以防止插拔的噪声干扰地平面?

 

电感一般用于电路的匹配和信号质量的控制上。在模拟地和数字地结合的地方用磁珠。

 

在模拟地和数字地结合的地方用磁珠。数字地和模拟地之间的磁珠用多大

 

磁珠的大小(确切的说应该是磁珠的特性曲线)
取决于你需要磁珠吸收的干扰波的频率

 

为什么磁珠的单位和电阻是一样的呢??都是欧姆!!

 

磁珠就是阻高频嘛,对直流电阻低,对高频电阻高,不就好理解了吗,
比如1000R@100Mhz就是说对100M频率的信号有1000欧姆的电阻

 

因为磁珠的单位是按照它在某一频率产生的阻抗来标称的,阻抗的单位也是欧姆。磁珠的datasheet上一般会附有频率和阻抗的特性曲线图。一般以100MHz为标准,比如2012B601,就是指在100MHz的时候磁珠的Impedance600欧姆。

 

在很多产品中,交换机的两个地用电容连接起来,为什么不用电感?    你说的两个地,其中一个是不是机壳的?
我估计(以下全部估计,有错请指点)

如果用磁珠或者直接相连的话,

人体静电等意外电平会轻易进入交换机的地,

这样交换机工作就不正常了。


但如果它们之间断开,那么遭受雷击或者其他高压的时候,两个地之间的电火花引起起火……

加电容则避免这种情况。

对于加电容的解释我也觉得很勉强呵呵,