吴鉴鹰. 发表于 2014-6-10 16:15

资深工程师单片机实战项目精讲(连载),由易到难连续分享

<div class='showpostmsg'>资深工程师单片机实战项目精讲(连载),由易到难连续分享



    Hi!大家好,我叫吴鉴鹰,100%中国制造,长181cm,净重70kg。采用人工智能,各部分零件齐全,软硬件运转稳定,经二十多年的运行,属质量信得过产品。是一名从业10多年的单片机工程师,长年从事单机、DSP、fpga、PLC以及触摸屏的项目开发,自信比牛顿更懂单片机、比诸葛亮更会玩DSP、比汉武大帝懂得什么是指针,这年头就得玩一个综合实力。
       闻得EEWORLD上有一批志同道合之士,愿意一道交流技术,于是花以时日浏览之,果然不乏卧虎藏龙之辈,鉴鹰深感钦佩,感谢这些前辈同行能够分享自己的项目经验和学习心得。也通过这些有技术含量的帖子博客获益不少。      

       回想当年鉴鹰刚刚大学本科毕业不久,进入一家大型国企,保守传统思想——“教会徒弟,饿死师傅”这种陋习的影响,只能靠自己死磕书本,硬啃项目慢慢才取得一点进步。所以后来干脆辞职再次回到电子科技大学读了三年研究生!为了让现在毕业的毕业的年轻人不要重蹈鉴鹰当年的覆辙,我也愿意将自己多年积累的一点经验分享给大家,想让更多的年轻人看到,获得一点点帮助就足矣!

      鉴鹰将会逐步分享自己的一点项目经验和学习心得,由于水平能力有限,纰漏之处,还望各位同行指出。
每一个项目会提供原理图、源程序还有仿真图。



现在来开始详细解析如何完成各种项目的具体的方法和软硬件,提供详细的硬件原理图和软件程序,欢迎大家来畅所欲言!
温馨提示:点击相关标题下面的链接即可到相关的项目
1、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的数字电子钟设计

2、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的摇摇棒的制作

3、吴鉴鹰单片机实战项目精讲(连载)之燃气报警器的制作——硬件设计

4、吴鉴鹰单片机实战项目精讲(连载)之燃气报警器的制作——软件设计

5、吴鉴鹰单片机实战项目精讲(连载)之电子秤的设计 ——硬件设计

6、吴鉴鹰单片机实战项目精讲(连载)之电子秤的设计 ——软件设计

7、吴鉴鹰单片机实战项目精讲(连载)微机键盘的运用——原理介绍

8、吴鉴鹰单片机实战项目精讲(连载)微机键盘的运用——程序设计

9、吴鉴鹰单片机实战项目精讲(连载)之如何提高单片机的抗干扰能力

10、吴鉴鹰单片机实战项目精讲(连载)之超声波测距仪设计(一)——原理图

11、吴鉴鹰单片机实战项目精讲(连载)之超声波测距仪设计(二)——主机程序

12、吴鉴鹰单片机实战项目精讲(连载)之超声波测距仪设计(三)——从机程序

13、吴鉴鹰单片机实战项目精讲(连载)之数字示波器的使用教程

温馨提示:在以下连续的几个章节中,吴鉴鹰会只针对单片机驱动12864的显示分享一系列的项目,从最基本的文字数字的显示,再到图片的显示,到最后动画的显示,以及模拟时钟的显示,然后俄罗斯方块的显示,贪吃蛇的显示!让你彻底的征服12864,做12864的强者,相信没有你做不到的,只有你想不到的,玩转12864,小菜一碟!14、吴鉴鹰单片机实战项目精讲(连载)之驱动12864的滚动文字以及漫画图片的显示(一)——程序设计好15、吴鉴鹰单片机实战项目精讲(连载)滚动文字以及漫画图片的显示(二)——PROTEUS仿真、操作视频
16、吴鉴鹰单片机实战项目精讲(连载)之驱动12864的滚动文字以及美女图片的显示(一)——原理简介
17、吴鉴鹰单片机实战项目精讲(连载)之驱动12864的滚动文字以及美女图片的显示(一)——程序设计
18、吴鉴鹰单片机项目征服12864系列(连载)之基于单片机驱动12864的正弦波的显示
19、吴鉴鹰单片机项目征服12864系列(连载)之基于单片机驱动12864的武术动画的显示(一)——简介
20、吴鉴鹰单片机项目征服12864系列(连载)之基于单片机驱动12864的武术动画的显示(二)——程序设计
21、吴鉴鹰单片机项目征服12864系列(连载)之基于单片机驱动12864的拳击动画的显示(一)
22、吴鉴鹰单片机项目征服12864系列(连载)之基于单片机驱动12864的拳击动画的显示(二)——程序的设计和资料的上传
23、吴鉴鹰单片机项目征服12864系列(连载)之基于单片机驱动12864的美女游泳动画的显示(一)
24、吴鉴鹰单片机项目征服12864系列(连载)之基于单片机驱动12864的美女游泳动画的显示(二)——程序的而设计和Proteus仿真图的分享

25、吴鉴鹰单片机项目征服12864系列(连载)之基于12864的动态模拟时钟的显示(一)—— 时钟原理介绍
26、吴鉴鹰单片机项目征服12864系列(连载)之基于12864的动态模拟时钟的显示(二)—— 程序设计
27、吴鉴鹰单片机项目征服12864系列(连载)之基于12864的动态模拟时钟的显示(三)—— 完整资料
28、吴鉴鹰12864系列(连载)之基于12864的贪吃蛇游戏的设计详精讲(一)——设计思路
29、吴鉴鹰12864系列(连载)之基于12864的贪吃蛇游戏的设计详精讲(二)——贪吃蛇子程序
30、吴鉴鹰12864系列(连载)之基于12864的贪吃蛇游戏的设计详精讲(三)——贪吃蛇按键子程序
31、吴鉴鹰12864系列(连载)之基于12864的贪吃蛇游戏的设计详精讲(四)——完整程序
32、吴鉴鹰12864系列(连载)之基于12864的贪吃蛇游戏的设计详精讲(五)——完整资料
33.吴鉴鹰总结的Keil编译常见问题(一)
34、吴鉴鹰总结的Keil编译常见问题(二)
35、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(一)——思路简单介绍
36、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(二)——俄罗斯方块旋转算法的坐标实现
37、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(三)——俄罗斯算法程序
38、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(四)——底层程序讲解
39、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(五)——主程序讲解
40、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(六)——完整序讲解
41、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(七)——完整资料分享
42、吴鉴鹰单片机项目实战(连载)之如何看懂时序图
43、吴鉴鹰单片机项目实战(连载)之——只蜘蛛引发的惨案
44、吴鉴鹰单片机项目实战(连载)之——单片机常见算法总结
45.吴鉴鹰12864系列(连载)之基于单片机的密码锁设计详精讲(一)——简单介绍 温馨提示:未完待续,以后吴鉴鹰每个星期至少更新一讲内容,以后每讲内容尽量做到内容清晰,发帖必为经典,让读者更容易接受和吸收,分享更多有技术含量,我自己做过的项目,敬请持续关注

</div><script>                                var loginstr = '<div class="locked">查看精华帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                               
                                if(parseInt(discuz_uid)==0){
                                                                                        (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                }
</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

吴鉴鹰. 发表于 2014-6-10 16:18

本帖最后由 吴鉴鹰. 于 2015-4-27 09:04 编辑

1、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的数字电子钟设计
相关的原理图请点击下载:

      现在来第一讲,详细解析如何制作基于单片机的数字时钟,提供详细的硬件原理图和软件程序。
      开关K1:K1 = 0时,时钟正常运行,此时不允许调整时钟。数码管的高两位显示小时,后两位显示分钟,led每闪一次表示时钟运行一次,在调整的过程中,led是停止发亮的。
一、 按键、开关功能说明:
      *按键RESET:按下能复位程序。
      *按键PULSE:提供单脉冲,从而实现单片机对外部脉冲的计数,利用单脉冲实现相应的位加一。
      *开关K0:K0 = 0能调整分位,K0 = 1能调整时位。
      *开关K2:k2为高电平时,使单脉冲输入至INT1,通过外中断实现相应值的加一功能。

二、地址分配和链接
      *P2.7:和写信号一起组成字位口的片选信号,字位口的对应地址为8000H。
      *P2.6:和写信号一起组成字位口的片选信号,字位口的对应地址为4000H。
      *D0~D7: 单片机的数据总线,LED显示的内容通过D0~D7数据线从单片机传到LED。
      *P2.0~P2.5:单片机的P2口,和2764的高位地址线相连,决定2764中的存储单元的地址。
      *P1.4~P1.7: 单片机的P1端口,和发光二极管L1~L4相连,通过单片机的P1.4~P1.7控制,所以显示秒表和时钟的时间变化。
      *P1.0: 和开关K0相连,决定时间调整的字位。
      *P1.1 :和开关K1相连,决定时间运行的模式。
      *P1.2: 和开关K2相连,决定外中断的模式选择。

三、整体功能简介
      LED显示模块与单片机的链接中,对LED显示模块的读写和字位、段码的选择通过口P2.6\P2.7完成的。
      外部存储器2764是通过锁存器373和单片机相连,并且通过P2端口的相关信号线进行地址的分配。地址范围是0000H~1FFFH。

四、程序部分介绍*程序:吴鉴鹰数字电子钟的设计                                                         
** 这一讲的主要内容: 数字电子钟的设计原理和程序                                                                              
** 功能描述:
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.17


备注:有什么错误的地方,欢迎各大同仁指正


O(∩_∩)O~
*******************************************************/
//变量定义和头文件的调用
//定义头文件和各个输入管脚以及变量声明
#include<reg52.h>
#include<absacc.h>
#defineuint unsigned int
#defineucharunsigned char




/*定义字型字位口*/
#defineDIGPORTXBYTE
#defineWORDPORTXBYTE


/*定义P1口各管脚*/
sbitK0 = P1^0;
sbitK1 = P1^1;
sbitK2 = P1^2;
sbitBEEP = P1^3;
sbitL0 = P1^4;
sbitL1 = P1^5
sbitL2 = P1^6;
sbitL3 = P1^7;


uchardataBUFFER= {0,0};//显示的缓存数组,依次为低位、高位
uchardataCLOCK = {0,0,0,0};
uchardataSECOND = {0,0};


/*定义运行状态*/
uchardataSTATE = 0;
/*STATE = 0;秒表*/
/*STATE = 4,或者7,时钟运行*/
/* STATE = 6,时钟时调整 */


bitbdataSND = 0;    /*秒表START(开始)*/
bitbdataRST = 0;   /*秒表RESET(复位)*/


/*数码管显示编码“0”-“9”,"A","-"*/
ucharcodeTABLE[] = {0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X40};


/******************************************************
*程序:主程序                                                                                                                        
** 功能描述: 主干程序
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.17


备注:有什么错误的地方,欢迎各大同仁指正


O(∩_∩)O~
*******************************************************/
voidmain()
{
      uchar   stabak;
      P1 = 0X0F;
      EA = 1;
      IT1 = 1;
      ET0 = 1;
      TMOD = 0X61;
      TH0 = -5000/256;
      TL0 = -5000%256;
      TH1 = 0XFF;
      TL1 = 0XFF;
      T2CON = 0;
      TH2 = -5000/256;
      TL2 = -5000%256;


       K0 = 1;
       K1 = 1;
       K2 = 1;
       STATE = P1&0X07;
       stabak = STATE;


      for(;;)
    {
         switch()
      {
                case 0:
                {
                  EX1 = 0;
                  ET1 = 1;
                  ET2 = 1;
                  TR1 = 1;
                  SND = 1;
                  L1 = 1;   
                  L0 = 0;
                  L2 = 0;
                  SECOND = 0;
                  SECOND = 0;
                }break;


               case   5:
                {
                        IE1 = 0;
                        EX1 = 1;
                        ET1 = 0;
                        ET2 = 0;
                        TR0 = 0;
                        L0 = 1;
                        L1 = 0;
                        L2 = 0;
                }break;


                case6:
               {
                  IE1 = 0;
                  EX1 = 1;
                  ET1 = 0;
                  ET2 = 1;
                  TR0 = 0;
               }break;


                  default:
               {
                   EX1 = 0;
                   ET1 = 0;
                   ET2 = 1;
                   L1 = 0;
                                 L2 = 0;
               }


      }
         while(STATE == stabak)
   {
         switch(STATE)
      {
         case 0:
      {
         BUFFER = SECOND;
         BUFFER = SECOND;
      }break;
      
      case 5:
      {
          BUFFER = CLOCK;
          BUFFER = 101;/*A-*/
      }break;
      
      case 6:
      {
          BUFFER = 110;/*A-*/
          BUFFER = CLOCK;
      }break;
      
      default:
      {
          BUFFER = CLOCK;
          BUFFER = CLOCK;
      }break;


wzc86354120 发表于 2015-6-2 21:54

很牛逼,确实实力派

吴鉴鹰. 发表于 2014-6-17 10:53

10、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的超声波测距仪设计

本帖最后由 吴鉴鹰. 于 2014-6-17 11:11 编辑

10、吴鉴鹰单片机实战项目精讲(连载)之超声波测距仪设计(一)——原理图相关资料请点击下载:






图1
1、超声波测距原理
发射器发出的超声波以速度v在空气中传播,在到达被测物体是被反射返回,由接受器接受,其往返时间为t,有s=vt/2即可算出被测物体的距离。由于超声波也是一种声波,其声速v与温度有关,下表列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应该通过温度补偿的方法加以校正。

1超声波测距仪原理框图单片机发出40khz的信号,经放大后通过超声波发射器输出;超声波接受器将接受到得超声波信号经放大器放大,用锁相环电路进行检波处理后,启动单片机中断程序,测得时间为t,再由软件进行辨别、计算,得出距离数并送LCD显示并送语音播报模块播报。
2、吴鉴鹰的项目成品具有的功能
1) 具有超声波测距功能,测量距离0.20m~5.00m测距精度±1㎝。2) 具有测量距离数值无线传输功能。3) 实时显示测量的距离,显示格式为:X.XXm。4) 汉字提醒显示:距离在0.40m~1.00m,显示“危险距离”并用红色LED灯指示;距离在1.00m~2.00m,显示“保持距离”,并用黄书LED灯指示;距离在2.00m以上,显示“安全距离”并用绿色LED灯指示。5) 具有实时语音播报功能,实时播报测量距离数值,格式:X.XXm,实时播报时间间隔≤10s,实时播报声音清晰明亮、无明显失真,在1m距离处人耳能准确分辨。语音播报要与显示同步。

图2
3、超声波测距方法的选择
       超声波测距的原理一般采用渡越时间法TOF(time of flight)。首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。测量距离的方法有很多种,短距离的可以用尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0MHZ晶振,所以此系统的测量精度理论上可以达到毫米级。由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波可以用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到要求。根据设计任务、控制对象和现有条件本系统硬件电路采用由单片机最小系统、温度补偿电路、超声波发射电路、超声波接收电路、显示电路无线通信电路以及语音播报电路构成。本超声波测距仪的具体工作过程如下,单片机控制的振荡源产生40kHz的频率信号来驱动超声传感器。每次发射包含6个脉冲左右,当第一个超声波脉冲发射后,计数器开始计数,在检测到第一个回波脉冲的瞬间,计数器停止计数,得到从发射到接收的时间t 后,单片机读取温度值补偿声速,利用测距公式可计算出被测距离,同时由无线通信模块将测量数据传到下位机进行显示和语音播报。系统总体框图如图所示。

图3 发射模块

图 4
图4 接收模块
4、超声波发生器选择
超声波发生器可以分为两类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。本课题属于近距离测量,可以采用常用的压电式超声波换能器来实现。超声波测距的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离。实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。此次设计采用反射波方式。测距仪的分辨率取决于对超声波传感器的选择。超声波传感器是一种采用压电效应的传感器,常用材料是压电式陶瓷。由于超声波在空气传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择高频率的传感器,而长距离测量时应用低频率的传感器。
5、超声波接受传感器
超声探头的核心是其塑料外套或者金属外套中的一块压电晶片。构成晶片的材料可以有许多种。晶片的大小,如直径和厚度也各不相同,因此每个探头的性能是不同的,我们使用前必须预先了解它的性能。超声波传感器的主要性能指标包括:工作频率。工作频率就是压电晶片的共振频率。当加到它两端的交流电压的频率和晶片的共振频率相等时,输出的能量最大,灵敏度也最高。工作温度。由于压电材料的居里点一般比较高,特别时诊断用超声波探头使用功率较小,所以工作温度比较低,可以长时间地工作而不失效。医疗用的超声探头的温度比较高,需要单独的制冷设备。灵敏度。主要取决于制造晶片本身。机电耦合系数大,灵敏度高;反之,灵敏度低。因此超声波接受传感器应该应用集成电路CX20106A,CX20106A是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38kHz与测距的超声波频率40kHz较为接近,可以利用它制作超声波检测接收电路(如图2-3)。实验证明用CX20106A接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。适当更改电容CS的大小,可以改变接收电路的灵敏度和抗干扰能力。此部分电路在集成芯片上2.5显示单元选择显示单元是计算机系统开发时使用的主要设备之一,它可将计算机的运算结果、中间结果、存储器地址以及存储器、寄存器中的内容显示出来,从而实现人机对话。可以做显示器的有:LED,LCD,CRT等。CRT就是常见的显像管式的显示器。优点是颜色视觉效果好,视角宽,可靠性高,便宜;缺点是体积大耗电多,有微量的X射线辐射。LED就是发光二极管。LED一般适合做大屏幕的显示设备,最突出的有点那就是屏幕尺寸可以不受限制,亮度可以做的很高,其他的如显色性、对比度等都不如CRT显示器。但是考虑到本设计需要显示测量距离,补偿温度以及危险,保持 ,安全等警告信号。所以选择采用128*64液晶模块。2.6语音播报电路选择语音播报语音芯片有很多种,例如WT1380、WT588D等。WT1380具有多种报警功能,定时器功能,时钟输出功能,中断输出功能以及语音播报功能。它的语音功能和万年历功能可以同时工作,主频采用RC振荡,副频采用32.768K晶振精确分频。可以计算年、月、日、时、分、秒等信息,并可以将时间信息反馈给主控单片机。因而,WT1380是一款性价比极高的语音时钟芯片。但是本设计不要求芯片有可以计算年、月、日、时、分、秒等信息的复杂功能。所以播报电路采用WT588D系列的集单片机和语音电路于一体的可编辑语音芯片。WT588D系列语音单片机是广州唯创科技有限公司联合台湾华邦共同研发出来的集单片机和语音电路于一体的可编辑语音芯片。功能多音质好应用范围广性能稳定是WT588D系列语音单片机的特长,弥补了以往各类语音芯片应用领域狭小的缺陷,MP3控制模式、按键控制模式、按键组合控制模式、并口控制模式、一线串口控制模式、三线串口控制模式以及三线串口控制I/O口扩展输出模式,让应用人员能将产品投放在几乎可以想象得到的场所。WT588D是一款功能强大的可重复擦除烧写的语音单片机芯片。WT588D让语音芯片不再为控制方式而寻找合适的外围单片机电路,高度集成的单片机技术足于取代复杂的外围控制电路。配套WT-APP上位机操作软件可随意更换WT588D语音单片机芯片的任何一种控制模式,把信息下载到SPI-Flash上即可。软件操作方式简洁易懂,撮合了语音组合技术,大大减少了语音编辑的时间。2.7温度传感器的选择大家知道,声音在不同温度的空气中传播速度是不同的,所以这里要考虑到温度补偿的问题。温度传感器有很多种,例如温度传感器AD590。AD590是美国模拟器件公司生产的单片集成两端感温电流源。流过器件的电流(mA)等于器件所处环境的热力学温度(开尔文)度数。AD590的测温范围为-55℃~+150℃。AD590的电源电压范围为4V~30V。电源电压可在4V-6V范围变化,电流变化1mA,相当于温度变化1K。AD590可以承受44V正向电压和20V反向电压,因而器件反接也不会被损坏。输出电阻为710WM。它的精度高。AD590共有I、J、K、L、M五档,其中M档精度最高,在-55℃~+150℃范围内,非线性误差为±0.3℃。但是考虑到成本问题我选用TS-18B20数字温度传感器。该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0V至5.5V无需备用电源测量。温度范围为-55°C至+125℃ 。-10°C至+85°C范围内精度为±0.5°C
温度传感器可编程的分辨率为9~12位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统。


6、硬件电路的设计 --------------------------------------------

硬件电路的设计主要包括单片机系统及显示电路、语音播报电路、温度补偿电路、无线传输、超声波发射电路和超声波检测接受电路五部分。单片机采用AT89C51或其兼容系列。采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测量误差。单片机用P3.6端口输出超声波换能器所需的40KHz的方波信号,利用外部中断1口检测超声波接受电路输出的返回信号。显示单元部分采用12864液晶模块。3.1 AT89S51单片机的功能及特点AT89S51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4K bytes的课反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度。非易失性存储技术生产,兼容标准MCS—51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89S51单片机可以为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。3.1.1主要性能参数Ø 与MCS—51产品指令系统完全兼容。Ø 4K字节可以重复擦写Flash闪速存储器。Ø 1000吃擦写周期。Ø 全静态操作:0Hz—24Hz。Ø 三级加密程序存储器。Ø 128*8字节内部RAM。Ø 32个可编程I/O口线。Ø 6个中断源。Ø 可编程串行UART通道。Ø 低功耗空闲和掉电模式。3.1.2功能特性概述AT89S51提供以下功能:Ø 4k字节Flash闪速存储器;Ø 128字节内部RAM;Ø 32个I/O口线;Ø 两个16位定时器/计时器;Ø 一个5向量两级中断结构;Ø 一个双工串行口通信;Ø 片内振荡器及时钟电路。同时,AT89S51可以降至0Hz的静态逻辑操作,并支持两种软件可选的节点工作模式。空闲方式停止CPU的工作,当允许RAM,定时/计数器,串行口及中断系统继续工作。掉电式保存RAM中的内容,但振荡器停止工作并禁止其他左右部件工作直到下一个硬件复位。

图5
图5,AT89S51单片机 3.2单片机最小系统其作用主要是为了保证单片机系统能正常工作。如图3-2所示,单片机最小系统主要由AT89S51单片机、外部振荡电路、复位电路和+5V电源组成。在外部振荡电路中,单片机的XTAL1和XTAL2管脚分别接至由12MHZ晶振和两个30PF电容构成的振荡电路两侧,为电路提供正常的时钟脉冲。在复位电路中,单片机RESET管脚一方面经20 F的电容接至电源正极,实现上电自动复位,另一方面经开关s接电源。其主要功能是把PC初始化为0000H,是单片机从0000H单元开始执行程序,除了进入系统的初始化之外,当由于程序出错或者操作错误使系统处于死锁状态时,为了摆脱困境,也需要按复位键重新启动。因此,复位电路是单片机系统中不可缺少的一部分。


图6
图6,单片机最小系统,单片机测距原理单片机发出超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差tr,然后求出距离S=Ct÷2式中的C为超声波波速。限制该系统的最大可测距离存在4个因素:超声波的幅度、反射的质地、反射和入射声波之间的夹角以及接收换能器的灵敏度。接收换能器对声波脉冲的直接接收能力将决定最小的可测距离。为了增加所测量的覆盖范围、减小测量误差,可采用多个超声波换能器分别作为多路超声波发射/接收的设计方法,限于实际需要,本电路只采用单路超声波发射接收。由于超声波属于声波范围,其波速C与温度有关。
7、超声波发射电路
超声波发射电路压电式超声波换能器是利用压电晶体的谐振来工作的。超声波换能器内部有两个压电晶片和一个换能板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片会发生共振,并带动共振板振动产生超声波,这时它就是一个超声波发生器;反之,如果两电极问未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收换能器。超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。

图7
发射电路主要由反相器74LS04和超声波发射换能器T构成,如图所示,单片机P2.7端口输出的40kHz的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。输出端采两个反向器并联,用以提高驱动能力。上位电阻R2、R3一方面可以提高反向器74LS04输出高电平的驱动能力,另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡时间。
8、超声波检测接收电路
超声波接收电路CX20106A是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38kHz与测距的超声波频率40kHz较为接近,可以利用它制作超声波检测接收电路。实验证明用CX20106A接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。适当更改电容C16
的大小,可以改变接收电路的灵敏度和抗干扰能力。其电路由图所示。

图8

CX20106A的引脚注释:1脚IN:超声波信号输入端,该脚的输入阻抗约为40kΩ。2脚AGC:该脚与GND之间连接RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值能改变前置放大器的增益和频率特性。增大电阻R或减小C,将使负反馈量增大,放大倍数下降,反之则放大倍数增大。但C的改变会影响到频率特性,一般在实际使用中不必改动,推荐选用参数为R=4.7Ω,C=3.3μF。3脚C0:该脚与GND之间连接检波电容,电容量大为平均值检波,瞬间相应灵敏度低;若容量小,则为峰值检波,瞬间相应灵敏度高,但检波输出的脉冲宽度变动大,易造成误动作,推荐参数为3.3μF。4脚GND:接地端。5脚RC0:该脚与电源端VCC接入一个电阻,用以设置带通滤波器的中心频率f0,阻值越大,中心频率越低。例如,取R=200kΩ时,fn≈42kHz,若取R=220kΩ,则中心频率f0≈38kHz。6脚C:该脚与GND之间接入一个积分电容,标准值为330pF,如果该电容取得太大,会使探测距离变短。7脚OUT:遥控命令输出端,它是集电极开路的输出方式,因此该引脚必须接上一个上拉电阻到电源端,该电阻推荐阻值为22kΩ,没有接收信号时该端输出为高电平,有信号时则会下降。8脚RC1:电源正极,4.5V~5V。9、温度补偿电路
DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,测温范围为-55~125℃,最大分辨率可达0.0625℃。DS18B20可以直接读出被测温度值,而且采用了一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。测温电路图3-5所示。DS18B20温度传感器:(1):技术性能描述独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。Ø 测温范围-55℃~+125℃,固有测温分辨率0.5℃。Ø 工作电源:3~5V/DC。Ø 在使用中不需要任何外围元件。Ø 测量结果以9~12位数字量方式串行传送。Ø 不锈钢保护管直径Φ6。Ø 适用于DN15~25,DN40~DN250各种介质工业管道和狭小空间设备测温。Ø 标准安装螺纹M10X1,M12X1.5,G1/2任选。Ø PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
10、显示模块
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64。内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字。12864液晶模块可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。


图9
11、语音播报电路
语音播报电路采用WT588D系列的集单片机和语音电路于一体的可编辑语音芯片。功能多音质好应用范围广性能稳定是WT588D系列语音单片机的特长,同时具有MP3控制模式、按键控制模式、按键组合控制模式、并口控制模式、一线串口控制模式、三线串口控制模式以及三线串口控制I/O口扩展输出模式。可控制的语音地址位能达到220个!每个地址位里能加载可组合语音为128段语音。只需通过适当的访问地址就可以实现语音播报,使用方便,语音播报电路设计如图所示。


图10
11、 APC240无线通信模块
无线发射与接收电路采用APC240无线通信模块。它是新一代的多通道嵌入式无线数传模块,其可设置众多的频道,发射功率高,而仍然具有较低的功耗。它可以在工业等强干扰的恶劣环境中使用。在任何状态下都可以1次传输256bytes的数据,当设置空中波特率大于串口波特率时,可1次传输无限长度的数据。同时它还提供标准的UART/TTL,RS485和RS232三种接口1200/2400/4800/9600bps四速率,和三种接口校验方式.采用串口设置模块参数。具有丰富便洁的软件编程设置选项。无线发射与接收电路见

图 11

图12

Ø 接口方式:232/485/TTL串口,格式有8N1/8E1/8O1可选;Ø 接受灵敏度高,视距可靠传输距离可达1200m;Ø 采用FSK的方式调制,支持OOK/ASK/MSK调制;Ø 载频433MHz,可定制315M/868M/915M等其他ISM频段;Ø 提供PC机配置软件,可以灵活设置模块的各种参数;Ø 串口速率:4800/9600/19200/38400/57600/115200bps;Ø 空中速率:5K/10K/20K/30K/40K/50K/77K/100K/150K/200K/250Kbps;Ø 功耗和休眠省电模式:功率<100 mw,接收电流<35mA,发射电流<100mA,休眠时电流<12uA;Ø 支持多个字网组群工作模式,网络地址配置相同的模块间才可以相互通讯;Ø 具有中继功能,可选择中继节点进行传输,有效扩大传输距离;Ø 支持透明传输方式和地址传输方式,可以组成点对点、点对多点、对点对多点等无线通信网络;Ø 5V直流供电(可以选择3.3V);3.9.2APC240无线通信模块主要技术指标工作频率:433M      调制方式:FSK发射功率:<20dBm(100mW)接收灵敏度:-119dB发射电流:<35mA接收电流:<100mA休眠电流:<12uA工作信道:32个频段选择数据接口:232/485/TTL串口数据格式:8N1/8E1/8O1串口速率:4800/9600/19200/38400/57600/115200bps空中速率:5K/10K/20K/30K/40K/50K/77K/100K/150K/200K/250Kbps硬件接口:2.0插针/插座通讯距离:0-700米(10dbm,10kbps,可视距离)天线阻抗:50Ω工作温度:-40-85℃供电方式:DC3.3V/5V尺寸:32.3x54.0mm(不包括天线)



吴鉴鹰. 发表于 2014-7-5 15:32

17、吴鉴鹰单片机实战项目精讲(连载)之驱动12864的滚动文字以及美女图片的显示(一)——程序设计
/******************************************************
*程序:LCD12664液晶显示原理                                                         
*
** 这一讲的主要内容:LCD12664液晶显示原理                                                                                       
** 功能描述:对滚动汉字和美女图片的LCD12864的显示
** 输 入:
** 液晶:Proteus元件库—AMPIRE128X64(无字库)         
** 内容:显示滚动汉字和美女图片      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12

备注:有什么错误的地方,欢迎各大烧友指正

O(∩_∩)O~
*******************************************************/

#include<AT89X52.h>
#include<intrins.h>
#include<math.h>
//#include"source.h"
#define uchar unsigned char
#define uintunsigned int

#define LCD_databus P0 //LCD12864的8位数据口

sbit LCD_RS_OUT=P2^2;         //LCD_RS_OUT为0---命令;1----数据
sbit LCD_RW_OUT=P2^1;         //LCD_RW_OUT为1---写;0---读
sbit LCD_EN_OUT=P2^0;         //使能端
sbit LCD_CS1_OUT=P2^4;         //片选1低电平有效,控制左半屏
sbit LCD_CS2_OUT=P2^3;         //片选1低电平有效,控制右半屏

sbit KK_KEY1_OUT=P3^0;
sbit KK_KEY2_OUT=P3^1;
sbit KK_KEY3_OUT=P3^2;      
sbit KK_KEY4_OUT=P3^3;
sbit KK_KEY5_OUT=P3^4;
sbit KK_KEY6_OUT=P3^5;
sbit KK_KEY7_OUT=P3^6;

//五个按键控制口

void CHECK_busy();

uchar code rrrr_table[]={      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0E,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x87,0x13,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x0E,0x30,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x78,0x1C,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0xFC,0x38,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xDE,0x71,0xDE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x9E,0x79,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x3C,0x3C,0x3C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x3B,0x9E,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0xF7,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xEF,0x37,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x03,0xDE,0x7B,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xBC,0xFD,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xDE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x79,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1E,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,
0x00,0x01,0x9C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xC0,0x00,0x99,0x00,0x00,0x30,0x00,0x03,0x9A,0x00,0x0C,0x23,0x00,0x00,0x00,0x02,0xC6,
0x00,0x99,0x80,0x06,0xB4,0x00,0x02,0x21,0x00,0x06,0x33,0x00,0x10,0x80,0x07,0x26,0x00,0x98,0x00,0x12,0x88,0x00,0x02,0x24,0x80,0x06,0x3F,
0x00,0x1F,0xC0,0x05,0x26,0x00,0x15,0x00,0x1C,0x00,0x00,0x03,0x66,0x70,0x17,0x67,0x00,0x0F,0x00,0x01,0xBE,0x00,0x02,0x00,0x0E,0x70,0x00,
0x03,0x7E,0x00,0x17,0xE2,0x00,0x07,0x00,0x07,0x00,0x01,0xA0,0x40,0x18,0x00,0x00,0x06,0xCE,0x00,0x0E,0x62,0x00,0x07,0x00,0x03,0xA6,0x00,
0x9C,0x80,0x12,0x38,0x00,0x06,0x0F,0x80,0x06,0x62,0x00,0x06,0x00,0x03,0x08,0x00,0x84,0x00,0x10,0xF0,0x00,0x0C,0xFC,0x00,0x06,0x22,0x00,
0x1E,0x00,0x05,0x1C,0x00,0x1E,0x00,0x10,0x40,0x00,0x12,0x24,0x80,0x3E,0x42,0x00,0x1E,0x00,0x01,0x1C,0x00,0x04,0x00,0x10,0x80,0x00,0x02,
0x44,0xC0,0x3C,0x43,0x00,0x7F,0xF0,0x01,0x0E,0x00,0x04,0x00,0x11,0x10,0x80,0x02,0x64,0x80,0x00,0x03,0x00,0x20,0x00,0x00,0xFA,0x80,0x08,
0x00,0x13,0x08,0x80,0x02,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x07,0x00,0x02,0x0C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00};

unsigned char code picture_DIS[]={/*--调入了一幅图像:E:\学习资料\专业课程相关资料\单片机学习\吴鉴鹰单片机项目详细解析\12864项目系列\LCD12864显示\Proteus_12864程序包\12864美女图片显示\图片\1888-11120210532720.bmp--*/
/*--调入了一幅图像:C:\Users\Administrator\Desktop\美女图片\1.bmp--*/
/*--宽度x高度=128x64--*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF3,0xFB,0xFF,0xFF,0xFF,0xFF,0xC6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,
0xFF,0xFF,0xFE,0xF4,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xF0,0xF0,
0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x3C,
0x3F,0xFF,0xF3,0xC3,0x03,0x03,0x01,0x00,0x00,0x01,0x00,0x01,0x01,0x07,0x0F,0x0F,
0xC9,0xFF,0x7F,0x1F,0x1F,0x1F,0x1B,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x19,0x1F,
0x1F,0x1F,0x1F,0x1F,0x18,0x18,0x18,0x1D,0x1D,0x1D,0x0D,0x0D,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x88,
0x88,0x88,0x98,0x18,0x18,0x30,0xF0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,
0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0xFE,0xFF,0xFF,0xFF,0xFC,0xFC,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xFF,
0xFF,0x39,0x18,0x18,0x18,0x18,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,
0x1E,0x06,0x06,0x06,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
0x03,0x03,0x2F,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF7,0xF7,0xFA,0xFC,0xF8,0xF8,0xF8,0xF8,0xF8,0xF0,0xF8,0xF8,0xF0,0xF0,0xF8,0x7C,
0x78,0x78,0x7C,0x3C,0x3C,0x3C,0x3C,0x3C,0xB8,0xFC,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,
0xF8,0xF8,0xF8,0xFC,0xFC,0xF8,0xF8,0xF0,0xFC,0xFC,0xE4,0xE8,0x60,0x00,0x00,0x00,
0x10,0x03,0xEF,0xEF,0xBF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,
0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x07,0x03,0x0D,0x3F,0x7F,0xDE,0xFF,0xFF,
0x00,0x1E,0x1E,0x0C,0x00,0x00,0x00,0x00,0x81,0xC3,0xC3,0xC1,0xE3,0xE3,0xB0,0xB0,
0xF0,0xF8,0xF9,0xF9,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xF8,0xE0,
0x00,0x00,0x00,0x7E,0x73,0xF7,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x0F,0x3E,0x78,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE1,0xFF,0xFF,0xFE,0xF8,0xF8,0xF0,0xE0,0xE1,0xC1,
0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xE3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x0F,0xD9,0x9F,0x7F,0xFF,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0x1F,0x7C,0x60,0x40,0x40,0xC0,0xE0,0xC0,0xC0,0x80,0x80,
0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xB8,0x0C,0x86,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F,0x7F,0x7F,0x7F,0xFF,0xFF,
0x80,0x80,0xC0,0xC0,0xD8,0xEF,0xFF,0xFF,0xF9,0xFF,0xFF,0xFE,0xF0,0xE0,0xE0,0xE0,
0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x02,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x0C,0x08,0x08,0x08,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x11,0x73,0x77,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xEF,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFB,0xFB,0xFB,0xBB,0x3B,0x37,0x3F,0x1F,0x0F,0x00,0x00,0x00,0x00,
0x00,0x00,0xE0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFD,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x63,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC,0xFC,0xFC,
0xFC,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xE8,0xE8,0xE8,0xE8,0xE8,0xE8,0xE8,
0xE8,0xE8,0xE8,0xFC,0xFC,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xCF,0xCF,0xCF,0xCF,0xDF,
0xFF,0xFC,0xFF,0xFF,0xFD,0xE1,0xC0,0xC0,0xC1,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0xFC,0xF8,0xF0,0xF0,0xF0,
0xF0,0xF0,0xF0,0xF1,0xF3,0xF3,0xF3,0xF3,0xF3,0xFB,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,


};


unsigned char code picture_DIS_ONE[]={
/*--调入了一幅图像:C:\Users\Administrator\Desktop\美女图片\2.bmp--*/
/*--宽度x高度=128x64--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,
0x80,0xC0,0x40,0x40,0x40,0x40,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0xE0,0xA0,0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0x60,
0x20,0x20,0x20,0x30,0x10,0x10,0x10,0x18,0x08,0x08,0x0C,0x84,0x86,0x83,0x81,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x40,0x60,0x20,0x20,0x20,0x20,0xA0,0xA0,0xA0,
0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,
0xF0,0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFE,0xFC,0xF0,0xF0,0xF0,
0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xD8,0xB8,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x60,0x20,0xF0,
0xD0,0x10,0x18,0x08,0x0C,0x04,0x06,0x03,0x01,0xF1,0xA1,0x21,0x60,0x40,0x41,0xC3,
0x02,0x04,0x04,0xCC,0xFE,0xFE,0xFE,0xFF,0x1F,0xE3,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0x7F,
0xFF,0xDF,0xDD,0xD9,0xD1,0xC0,0xD1,0xC0,0xD0,0xF0,0xF0,0xE1,0xFF,0xFB,0xFF,0xFF,
0x3F,0x1F,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x07,0x3F,0x7F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xFC,
0xF8,0xF8,0xF8,0xFC,0xF8,0xF8,0xF0,0xE0,0xE0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x0C,0x04,0x04,0x06,0x02,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x1C,0x7B,
0xFF,0xC0,0xC0,0x00,0x00,0x1C,0xFA,0xCC,0xF0,0xF3,0xFF,0x02,0x0E,0x66,0x36,0x02,
0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFD,0x0F,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0xC1,0x63,0x37,0x17,0x8F,0xCF,0x07,0x07,0x03,0x03,0x03,0x03,0xF3,0xF1,0x71,0xE3,
0x03,0x07,0x07,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xE0,
0xE0,0xE0,0xF0,0xF0,0xF0,0xF0,0xF8,0x7F,0xFF,0xFF,0xB7,0xF0,0xB0,0x10,0x10,0x10,
0x10,0x18,0xFE,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFF,0xFF,0xFF,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,
0xCF,0xF8,0xE0,0xC0,0x9F,0x3F,0x00,0x0E,0x1F,0x1C,0x0C,0x0C,0xF5,0xF0,0xF0,0xE0,
0x00,0x00,0x00,0x00,0x80,0xD0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,
0x7C,0x7C,0xFC,0xFE,0x7E,0x7E,0x3F,0x1F,0x1F,0x1F,0x0F,0x0F,0x07,0x07,0x07,0x03,
0x07,0x3D,0xFF,0x9F,0x01,0x01,0x00,0x00,0x00,0x01,0xCF,0x7D,0x83,0xC7,0xCE,0x8C,
0xF0,0x80,0x07,0x1F,0xFF,0xFF,0x7F,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x3F,0xBF,0xBF,0xFF,0xFF,0xBF,
0xFF,0xFF,0xFF,0xFF,0xDF,0x8F,0x07,0x43,0x87,0xC7,0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFC,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0,0xC0,0xC0,0xC0,0xF0,0xFD,0x7F,0x3F,0x3F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,
0xFC,0xFC,0xFE,0xFF,0xFF,0x7F,0x7F,0x7F,0x3F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,
0x02,0x03,0x03,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x18,0x10,
0x10,0x30,0x21,0x21,0x20,0x20,0x60,0x40,0xC0,0x80,0x81,0x90,0x18,0x08,0x0C,0x0C,
0x06,0x02,0x00,0x00,0xC1,0xE3,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x3F,0x3F,
0x3F,0x1F,0x1F,0x1F,0x0F,0x0F,0x0F,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,
0x03,0x03,0x03,0x83,0x83,0x83,0x81,0x81,0x83,0x83,0x83,0x83,0x83,0x83,0x87,0x8F,
0xFF,0x77,0x7F,0x7F,0x7F,0x7F,0x5F,0x7F,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x03,
0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x07,0x07,0x03,0x03,0x02,0x02,0x02,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x01,
0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code picture_DIS_TWO[]={
/*--调入了一幅图像:C:\Users\Administrator\Desktop\美女图片\3.bmp--*/
/*--宽度x高度=128x64--*/
0x00,0x00,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,
0x07,0x07,0x07,0x07,0x07,0x03,0x07,0x07,0x03,0x07,0x07,0x0F,0x4F,0x1F,0x1F,0x7F,
0x00,0x00,0x00,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x2F,0x2F,0xAF,0xEF,0xEF,0x7B,
0x3F,0x57,0x1B,0x31,0xB3,0xB7,0xF7,0xFF,0xBF,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x7F,0xFF,0xFF,0xBF,0xBF,0x87,0x81,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,
0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,
0x00,0x00,0x00,0x00,0x02,0x87,0x80,0xB0,0x80,0xC0,0xC3,0xE0,0xE8,0xF8,0xF8,0xFC,
0x00,0xC0,0xC0,0x83,0xFF,0xFF,0xC0,0xDF,0xFF,0xBF,0x9F,0x8F,0x87,0x9F,0xFF,0xC7,
0x81,0x80,0x80,0x83,0x83,0x83,0x01,0x00,0x00,0x70,0xFC,0x6E,0x67,0x03,0x00,0xC2,
0x04,0x84,0x84,0x80,0x06,0xDA,0xF2,0xFA,0x7B,0x78,0x18,0x18,0x30,0x30,0x30,0x30,
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0x60,0x60,0x60,0x60,
0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x40,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x03,0x07,0x0E,0x0C,0x18,0x30,0x7F,0x67,0xC7,0x87,0x07,0x03,0x63,0xE3,
0xE3,0xC3,0x63,0xE3,0xE3,0xF3,0xF3,0xE3,0xE3,0xF3,0xF3,0xF3,0xF3,0xF7,0xF7,0xF1,
0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x07,0x03,0x07,0x07,0x07,0x07,0x07,0x0F,
0x0D,0x0F,0x0F,0x0F,0x0F,0x0F,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
0x00,0x14,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF7,0x1E,0x1D,0xEF,0xE7,
0x07,0xC3,0xC3,0xC1,0x81,0xF9,0x21,0x39,0x03,0x03,0x03,0x07,0x0F,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x60,0xE0,0xF0,
0x70,0x58,0x78,0x18,0x0C,0xAC,0x44,0x07,0x23,0x00,0x00,0x00,0x08,0x00,0x40,0x00,
0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xD0,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x28,
0x2A,0x00,0x32,0x68,0x3C,0x2E,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFE,0xF8,0xF3,0xE7,
0xE0,0xE3,0xE3,0xE3,0xD9,0xFF,0xFC,0xF8,0xC0,0xE0,0xF0,0xF8,0xFC,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,
0xE0,0xE0,0xF0,0xF0,0xF8,0xFC,0xFC,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFB,
0xFB,0xFA,0xF8,0xF8,0xFC,0xFF,0xFC,0xFC,0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,
0xF3,0xF7,0xFF,0xFD,0xEF,0xE3,0xE1,0xE1,0xE1,0xE1,0xE1,0xE3,0xE3,0xE7,0xE7,0xE7,
0xEE,0xEE,0xFE,0xFC,0xDC,0xDC,0xD8,0xF8,0xEF,0xCC,0xDD,0xFD,0xFC,0xE0,0xE4,0xF0,
0xF0,0xF0,0xF8,0xF8,0xFC,0xFF,0xFF,0xDF,0xFF,0xE7,0xCD,0xC7,0xCF,0xCF,0x9F,0xBF,
0xBF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,
0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0xF0,0xF8,0xF8,0xE0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,
0xF8,0xF8,0xF8,0xF8,0xFC,0xFC,0xFC,0xFE,0xFE,0x3F,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0x79,0x30,0x30,0x10,
0x00,0x10,0x19,0x29,0x5B,0x7F,0x6F,0xEF,0xEF,0xFF,0xFF,0xF3,0xFF,0xFF,0x9F,0xBF,
0x01,0x01,0x01,0x03,0x87,0xBF,0xBF,0xFF,0xFF,0xFF,0xF7,0xF7,0xF3,0xF3,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA5,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xF4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xCF,0xCF,0x8F,0xCF,0x8F,0xDF,0x9F,0x9F,0xBF,0xFF,0xDF,0xFF,0xFF,
0xCF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x13,0x7B,0xFB,0x03,0x03,0x03,
0x03,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x0F,0x0F,0x0F,0x1F,0x1B,0x03,0x07,0x07,
0x07,0x07,0x07,0x07,0x0F,0x1F,0x1F,0x0F,0x1F,0x1F,0x1F,0x1F,0x1F,0x3F,0xBE,0xFE,
0xCE,0xC6,0x8E,0x9E,0x3E,0x6E,0x8E,0xCE,0xDE,0xDC,0xFC,0xFE,0xFC,0xFE,0xFE,0xFE,

};


unsigned char code picture_DIS_THREE[]={
/*--调入了一幅图像:C:\Users\Administrator\Desktop\美女图片\4.bmp--*/
/*--宽度x高度=128x64--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xCF,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xDF,0x5F,0x5F,0x5F,0x7F,0x7F,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,
0x38,0x38,0x6E,0x7E,0x00,0x30,0x78,0x20,0x20,0x00,0x00,0xFE,0xFF,0xFF,0xFE,0x00,
0x60,0xC0,0xC0,0x80,0x00,0x00,0x00,0x80,0x6E,0x07,0x00,0x00,0x06,0x0C,0x18,0x30,
0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x16,
0x1A,0x1B,0x1F,0x17,0x37,0x36,0x24,0x20,0x30,0x31,0x13,0x13,0x13,0x12,0x32,0x32,
0x22,0x66,0x66,0xC4,0xC4,0xC4,0xF4,0xF4,0x04,0x04,0x04,0x0F,0x0F,0x0C,0x08,0x08,
0x08,0x08,0x08,0x18,0x18,0x10,0x10,0x30,0x3F,0x3F,0x2F,0x3F,0x7F,0x7F,0x5F,0xDF,
0x9F,0x8B,0x8F,0x1E,0x1E,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x28,0x28,0x38,
0x20,0x08,0x7E,0x7E,0x00,0x30,0x78,0x00,0x00,0x00,0x00,0xCE,0xFF,0xFF,0xFF,0x00,
0x00,0x80,0x81,0x83,0x87,0x86,0xFC,0x97,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0x60,0x60,0x20,0x30,0x30,0x30,0x10,0x18,
0x18,0x08,0x08,0x08,0x0C,0x0C,0x0C,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x02,0x02,
0x02,0x02,0x06,0x06,0x04,0x0D,0xEB,0xFF,0xFF,0xE6,0xC6,0xCC,0xDC,0xFC,0xFC,0xF8,
0xF8,0x70,0xF0,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,
0x80,0x00,0x01,0x01,0x01,0xE3,0xE7,0x26,0x6C,0xD8,0x98,0x70,0xE0,0x00,0x00,0x00,
0x38,0x38,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x02,
0x21,0x29,0x69,0xC9,0xC9,0x89,0x99,0x11,0x11,0x31,0x21,0x61,0x41,0xC1,0x81,0x81,
0x80,0x00,0x00,0x01,0x01,0x01,0x03,0x82,0xE2,0x02,0x02,0x02,0x02,0x02,0x02,0x03,
0x03,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x7B,0x0F,0x7F,0x00,0x00,0x00,0x01,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0xE1,0x39,0x1F,0x03,0x01,0x01,0x03,0x07,0x07,
0x07,0x07,0xB7,0x9F,0x9F,0xCF,0xC3,0xC0,0xE0,0xF8,0xFF,0xFE,0xFF,0x3E,0x3C,0xFE,
0xFE,0xDE,0xDE,0x1E,0x1E,0x7E,0x7E,0x7E,0x36,0x74,0x76,0xF6,0xFE,0xF6,0x00,0x00,
0x00,0x00,0x00,0xC0,0xDE,0x00,0x01,0x01,0x03,0x03,0x02,0x06,0x04,0x04,0x04,0x14,
0xDD,0x89,0x09,0x09,0x0B,0x1B,0x1F,0x1F,0x1F,0x16,0x30,0x30,0x20,0x60,0x60,0x40,
0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFC,0x6F,0x03,0x80,0x80,0xC0,0x40,0x60,0x70,0x30,0x78,0x4C,
0xC6,0xC3,0x81,0x80,0xFE,0x83,0x81,0xC3,0xC3,0xC7,0xCF,0xCF,0xDF,0xF8,0xE0,0xC3,
0x43,0xC0,0xC0,0xC0,0xC0,0xCE,0xE7,0xE7,0xE0,0xE0,0xF0,0xFF,0xFF,0xFF,0x3E,0x00,
0x00,0x40,0xB0,0x1F,0x30,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,
0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x03,0x02,0x02,
0x02,0x02,0x06,0x04,0x04,0x04,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x8C,
0x8C,0x84,0x84,0xDC,0xFC,0xFC,0xCC,0x0C,0x0E,0x0D,0x0F,0x0C,0x0C,0x0C,0x0E,0x0E,
0x0A,0x0A,0x0B,0x0B,0x0B,0x09,0x09,0x19,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xF1,0xA1,0xE1,0x79,0x7F,0x7F,0xFF,0xFF,0xFF,0x7F,0x7F,0x3F,0x3F,
0x3F,0x1F,0x1F,0x1F,0x1F,0x1F,0xDF,0xDF,0xCF,0xCF,0xCF,0xDF,0xFF,0xCF,0x00,0x00,
0x30,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x3E,
0x7E,0x4E,0x58,0x58,0x58,0x58,0x68,0x6C,0x2C,0x36,0x36,0x13,0x13,0x19,0x09,0x09,
0x09,0x08,0x0C,0x0C,0x0C,0x04,0x07,0x0C,0x0C,0xF8,0xF8,0x08,0x08,0x08,0x08,0x08,
0x08,0x08,0x0C,0x0C,0x0C,0x2C,0xFC,0xE4,0xE4,0xE4,0xE4,0xE6,0xE6,0xE2,0xE6,0xE6,
0xC7,0xC7,0x01,0xB9,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x06,
0x08,0x0F,0x00,0x0C,0x1F,0x16,0x17,0x97,0x9F,0x9F,0x9F,0xBF,0xFF,0x9F,0x00,0x00,
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x80,0x00,0x00,0x00,0x00,
0xBC,0x80,0x80,0x80,0xC0,0xFB,0xFF,0xC7,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xDF,
0x9F,0x07,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,
0x17,0x17,0x00,0x3C,0x3E,0x0C,0x0F,0x07,0x3F,0x3F,0x7F,0x7F,0xFF,0x3F,0x00,0x00,

};


unsigned char code picture_DIS_FOUR[]={
/*--调入了一幅图像:C:\Users\Administrator\Desktop\美女图片\5.bmp--*/
/*--宽度x高度=128x64--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0xE0,0x70,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
0x04,0x0C,0x0C,0x0C,0x08,0x08,0x08,0x08,0x08,0x08,0x18,0x18,0x18,0x18,0x18,0x10,
0x10,0x10,0x10,0x30,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,
0x60,0x40,0x40,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0x38,
0x1C,0x0E,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x50,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x06,0x0E,0x1C,
0x78,0xE0,0xC0,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0xF8,0x3E,0x07,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xF0,0x5F,0x41,0x40,
0x40,0x40,0x60,0x20,0x20,0x30,0x18,0x18,0x0C,0x06,0x03,0x01,0x01,0x01,0x00,0x00,
0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xC0,0xE0,0x60,0x30,0x10,0x10,0x18,0x18,0x08,0x18,0x78,0xF8,0xFC,0x0C,
0x04,0x06,0x07,0x07,0x07,0x87,0xCF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xFC,0xF8,0xF8,
0xF8,0xF0,0xF0,0xE0,0xE0,0xE0,0xE0,0x40,0x40,0x40,0x00,0x80,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x70,0x1C,0x0F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x38,0x0E,0x03,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x18,0x18,0x0C,
0x0E,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x60,0x30,0x18,0x18,
0x0C,0x06,0x06,0x03,0x01,0x01,0x80,0xC0,0xC0,0x41,0x61,0x3B,0x1B,0x0F,0x87,0x07,
0x07,0x07,0x07,0x03,0x00,0x02,0x03,0x07,0x0F,0x0F,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF,
0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC,0xFC,0xFC,0xF8,0xF0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x06,0x06,0xF4,
0x14,0x1C,0x18,0x18,0x10,0x30,0x70,0xE0,0xA0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x7C,0x07,0x81,0x80,0x80,0xC0,0xC0,0xE0,0xF0,
0x10,0x18,0x18,0x0C,0x86,0x86,0xC2,0xC3,0xE3,0x61,0x60,0x60,0x30,0x30,0x1F,0x1F,
0xDF,0xFF,0x7F,0x1E,0x0E,0x1F,0x1D,0x30,0x60,0xC0,0x80,0x9C,0x3A,0x7F,0x01,0x00,
0x38,0x18,0x08,0x00,0x00,0x80,0x0C,0x0F,0x0F,0x17,0x1C,0x0E,0x00,0x00,0x80,0x81,
0xC3,0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x08,0x08,0x08,0x08,0x18,0x18,0x10,0x30,0x30,0x20,0x20,0x20,0x20,0x20,0xC0,0xF7,
0xFC,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x0F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x08,0x08,0x08,
0x0C,0x0C,0x0C,0x0E,0x07,0x05,0x06,0x06,0x07,0x05,0x05,0x05,0x04,0x07,0x0F,0x0E,
0x07,0x07,0x03,0x03,0x03,0x01,0x01,0x00,0x00,0x80,0x80,0xC0,0xC0,0x60,0x7C,0x0F,
0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x02,0x06,
0x04,0x0C,0x08,0x18,0x1F,0x3F,0x3F,0x3E,0x7E,0x7C,0x7C,0x7E,0x7F,0x7F,0x7F,0x7F,
0x7F,0x7F,0x3F,0x3F,0x3F,0x1F,0x1F,0x1F,0x0F,0x07,0x07,0x03,0x00,0x00,0x00,0x00,
0x00,0x04,0xEC,0x3C,0x18,0x1C,0x0C,0x04,0x06,0x06,0x02,0x03,0x01,0xF9,0xFF,0x87,
0xC0,0x78,0x32,0x1B,0x98,0x8A,0x8C,0x84,0x0E,0x0F,0x1E,0x7E,0xF4,0x04,0x04,0x86,
0xC6,0xC4,0x64,0x34,0x14,0x1E,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x04,0x04,
0x04,0x04,0x04,0x06,0x02,0x02,0x02,0x02,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x01,0x03,0x03,0x0F,0x0B,
0x1B,0x33,0x30,0x23,0x23,0x23,0x23,0x31,0x10,0x18,0x08,0x0C,0x0D,0x06,0x03,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

unsigned char code huan[] = {/*--文字:欢--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00};

unsigned char code ying[] = {/*--文字:迎--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00};

unsigned char code guang[] = { /*--文字:光--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,0x40,0xC0,0x50,0x48,0x46,0x40,0x40,0x00,
0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00};

unsigned char code ling[] = {/*--文字:临--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xF8,0x00,0x00,0xFF,0x40,0x20,0x18,0x0F,0x18,0x68,0x08,0x08,0x08,0x08,0x00,
0x00,0x1F,0x00,0x00,0xFF,0x00,0x00,0x7F,0x21,0x21,0x3F,0x21,0x21,0x7F,0x00,0x00,};

unsigned char code wuwu[] = {/*--文字:吴--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x80,0x9E,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x9E,0x80,0x00,0x00,0x00,
0x84,0x84,0x44,0x44,0x24,0x14,0x0C,0x07,0x0C,0x14,0x24,0x44,0x44,0x84,0x84,0x00};

unsigned char code jianjian[] = {/*--文字:鉴--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x3E,0x00,0x80,0xBF,0x40,0x20,0x58,0x87,0x84,0x0C,0x34,0x04,0x00,0x00,
0x02,0x42,0x49,0x49,0x5A,0x6A,0x4A,0x7E,0x4A,0x6A,0x5A,0x49,0x49,0x42,0x02,0x00};

unsigned char code yingY[] = {/*--文字:鹰--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFE,0x22,0x12,0xFA,0x26,0x12,0xFB,0xAE,0xAA,0xFE,0xAA,0xAA,0x02,0x00,
0x40,0x30,0x0F,0x40,0x40,0x5E,0x52,0x53,0x56,0x52,0x1A,0x56,0x90,0x70,0x00,0x00};

unsigned char codeMEIMEI[] = {/*--文字:美--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x04,0x24,0x24,0x25,0x26,0x24,0xFC,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00,
0x81,0x89,0x89,0x49,0x49,0x29,0x19,0x0F,0x19,0x29,0x49,0x49,0x89,0x89,0x81,0x00};

unsigned char code NVNV[] ={/*--文字:女--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x20,0x20,0x20,0xA0,0x70,0x2F,0x20,0x20,0x20,0xE0,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x80,0x46,0x45,0x28,0x28,0x10,0x18,0x26,0x21,0x40,0x80,0x00,0x00,0x00};

unsigned char code TUTU[] = {/*--文字:图--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFE,0x02,0x42,0x22,0x32,0x5E,0x92,0x52,0x32,0x12,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x42,0x42,0x42,0x51,0x55,0x64,0x69,0x41,0x42,0x42,0x42,0xFF,0x00,0x00};

unsigned char code PIANN[] = {/*--文字:片--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xFE,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x00,0x00,
0x00,0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x00};

unsigned char code ZHANN[] = {/*--文字:展--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFE,0x12,0x92,0x92,0xF2,0x92,0x92,0x92,0xF2,0x92,0x92,0x1E,0x00,0x00,
0x80,0x60,0x1F,0x04,0x04,0xFC,0x47,0x24,0x0C,0x14,0x27,0x34,0x4C,0x44,0x44,0x00};


unsigned char code yuan[]={/*--文字:圆--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFF,0x01,0x01,0xDD,0x55,0x55,0x55,0x55,0x55,0xDD,0x01,0x01,0xFF,0x00,0x00,
0x00,0xFF,0x40,0x40,0x67,0x50,0x48,0x47,0x48,0x50,0x67,0x40,0x40,0xFF,0x00,0x00};

unsigned char code ju[]={/*--文字:矩--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0xA0,0x90,0x8F,0xF8,0x88,0x88,0x88,0x00,0xFE,0x22,0x22,0x22,0x22,0xE2,0x02,0x00,
0x40,0x20,0x18,0x07,0x02,0x04,0x18,0x00,0x7F,0x42,0x42,0x42,0x42,0x47,0x40,0x00};

unsigned char code xing[]={/*--文字:形--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x42,0x42,0xFE,0x42,0x42,0xFE,0x42,0x42,0x40,0x10,0x88,0xE4,0x47,0x02,0x00,
0x80,0x40,0x30,0x0F,0x00,0x00,0x7F,0x00,0x84,0x42,0x21,0x10,0x08,0x0E,0x04,0x00};

unsigned char code zhi[]={/*--文字:直--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x04,0x04,0xF4,0x94,0x94,0x9C,0x97,0x94,0x94,0x94,0xF4,0x04,0x04,0x00,0x00,
0x40,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x40,0x00};

unsigned char code xian[]={/*--文字:线--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x60,0x58,0xC7,0x62,0x00,0x90,0x90,0x90,0xFF,0x90,0x92,0x9C,0x94,0x80,0x00,
0x20,0x22,0x23,0x12,0x12,0x12,0x20,0x20,0x10,0x13,0x0C,0x14,0x22,0x40,0xF8,0x00};



unsigned char code qing[]={/*--文字:请--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x20,0xE2,0x04,0x40,0x40,0x54,0xD4,0xBF,0xAA,0xAA,0x20,0x20,0x20,0x00,
0x00,0x00,0x18,0x0F,0x04,0x02,0x00,0x3F,0x0A,0x0A,0x20,0x7F,0x00,0x00,0x00,0x00};

unsigned char code an[]={/*--文字:按--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x20,0x20,0xFF,0x90,0x00,0x60,0x20,0x20,0xD2,0x14,0x10,0x50,0x30,0x00,0x00,
0x02,0x02,0x11,0x3F,0x00,0x22,0x22,0x12,0x17,0x09,0x0D,0x13,0x21,0x21,0x01,0x00};

unsigned char code button[]={/*--文字:键--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x40,0x70,0xCE,0x48,0x18,0xF0,0x00,0xA8,0xA8,0xFF,0x54,0x7C,0x10,0x10,0x00,
0x00,0x02,0x02,0x1F,0x29,0x14,0x0D,0x0B,0x14,0x15,0x1F,0x25,0x24,0x20,0x20,0x00};

unsigned char code xuan[]={/*--文字:选--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x80,0x44,0xC8,0x00,0xA0,0x98,0x90,0x7F,0xC8,0x48,0x48,0x40,0x00,0x00,0x00,
0x10,0x10,0x0F,0x08,0x08,0x14,0x12,0x11,0x10,0x27,0x28,0x28,0x28,0x26,0x20,0x00};

unsigned char code ze[]={/*--文字:择--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x20,0x20,0xFF,0x50,0x90,0x40,0x2C,0x14,0xD2,0xAA,0xA6,0x40,0x40,0x40,0x00,
0x02,0x02,0x09,0x1F,0x00,0x04,0x04,0x05,0x05,0x3F,0x02,0x02,0x02,0x02,0x00,0x00};

unsigned char code andsoon[]={/*--文字:…--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,
0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00};




/*******************************************************************************************
** 函数名称:void delay(uint i)
** 功能描述:延时函数
** 输 入:    uint i(需要延时的数量)
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void delay(uint i)
{
      while(--i);
}


/*******************************************************************************************
** 函数名称:void LCD_COM_WRI(uchar value)
** 功能描述:LCD液晶写命令函数
** 输 入:    uchar value(向LCD写入的命令)
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void LCD_COM_WRI(uchar value)      //写命令函数
{
   CHECK_busy();                                                //对LCD的每次读写都要读忙
   LCD_RS_OUT=0;                                                         //选择命令
   LCD_RW_OUT=0;                                                         //读操作
   LCD_databus=value;
   LCD_EN_OUT=1;                                                      //LCD_EN_OUT由1----0锁存有效数据
   _nop_();
   _nop_();
   LCD_EN_OUT=0;
}

/*******************************************************************************************
** 函数名称:void LCD_DATA_WRI(uchar value)
** 功能描述:LCD液晶写数据的函数
** 输 入:    uchar value(向LCD写入的数据)
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void LCD_DATA_WRI(uchar value)//写数据函数      
{
   CHECK_busy();
   LCD_RS_OUT=1;                                                 //选择数据
   LCD_RW_OUT=0;      
   LCD_databus=value;
   LCD_EN_OUT=1;                                                //LCD_EN_OUT由1----0锁存有效数据
   _nop_();               
   _nop_();
   LCD_EN_OUT=0;
}

/*******************************************************************************************
** 函数名称:void CHECK_busy()
** 功能描述:读“忙”函数,判断液晶当前是否忙碌
** 输 入:   
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void CHECK_busy()//读“忙”函数-----数据线的最高位DB71则busy               
{
      P0=0x00;
         LCD_RS_OUT=0;
         LCD_RW_OUT=1;
      LCD_EN_OUT=1;
      while(P0 & 0x80);
      LCD_EN_OUT=0;
}


/*******************************************************************************************
** 函数名称:uchar Read_LCD(void)
** 功能描述:读LCD数据函数
** 输 入:   
**         
**      
** 输 出:    return value(返回读出的数据)
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
uchar Read_LCD(void)                        //读数据函数
{
      uchar value;
      CHECK_busy();
      LCD_databus=0xFF;                        //先进行一次空读操作
      LCD_RS_OUT=1;
      LCD_RW_OUT=1;
      LCD_EN_OUT=1;
      _nop_();
      _nop_();
      LCD_EN_OUT=0;
      
      LCD_databus=0xFF;                        //读取真正的数据
      LCD_RS_OUT=1;
      LCD_RW_OUT=1;
      LCD_EN_OUT=1;
      value=LCD_databus;
      _nop_();
      _nop_();
      LCD_EN_OUT=0;
      
      return value;
}

/*******************************************************************************************
** 函数名称:void CHOOSE_PG(uchar page)
** 功能描述:设置“页”LCD12864共8页,一页是8行点阵点
** 输 入:    uchar page(送入设置的页数)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void CHOOSE_PG(uchar page)                //设置“页”LCD12864共8页,一页是8行点阵点      
{
page=0xb8|page;                                 //页的首地址为0xB8
LCD_COM_WRI(page);
}

/*******************************************************************************************
** 函数名称:void CHOOSE_LINE(uchar startline)
** 功能描述:设置显示的起始行
** 输 入:    uchar startline(送入设置的起始行)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void CHOOSE_LINE(uchar startline)//设置显示的起始行         
{
startline=0xC0|startline;   //起始行地址为0xC0
LCD_COM_WRI(startline); //设置从哪行开始:共0--63;一般从0 行开始显示
}


/*******************************************************************************************
** 函数名称:void CHOOSE_COLUMN(uchar column)
** 功能描述:设置显示的列
** 输 入:    uchar column(设置显示的列)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void CHOOSE_COLUMN(uchar column)      //设置显示的列      
{
column=column &0x3f;                         //列的最大值为64
column= 0x40|column;                         //列的首地址为0x40
LCD_COM_WRI(column);      //规定显示的列的位置
}

/*******************************************************************************************
** 函数名称:void SET_ON_Off(uchar onoff)
** 功能描述:显示开关函数:0x3E是关显示,0x3F是开显示
** 输 入:    uchar onoff(0x3E是关显示,0x3F是开显示)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void SET_ON_Off(uchar onoff)                //显示开关函数:0x3E是关显示,0x3F是开显示   
{
      onoff=0x3e|onoff;                         //onoff:1---开显示;0---关显示
      LCD_COM_WRI(onoff);
}

/*******************************************************************************************
** 函数名称:void SEL_SCREN(uchar screen)
** 功能描述:LCD选择屏幕
** 输 入:    uchar screen(选择屏幕0:全屏1:左半屏 2:右半屏)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void SEL_SCREN(uchar screen)      //选择屏幕
{                                                
   switch(screen)
   {
            case 0: LCD_CS1_OUT=0;LCD_CS2_OUT=0;break; //全屏   
   case 1: LCD_CS1_OUT=0;LCD_CS2_OUT=1;break;//左半屏      
   case 2: LCD_CS1_OUT=1;LCD_CS2_OUT=0;break;//右半屏      
   default:break;
   }
}

/*******************************************************************************************
** 函数名称:void ClearScreen(uchar screen)
** 功能描述:清屏函数
** 输 入:    uchar screen(0--全屏;1---左半屏;2---右半屏 )
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void ClearScreen(uchar screen)      //清屏函数
{         
   uchar i,j;
   SEL_SCREN(screen);                //0--全屏;1---左半屏;2---右半屏
         for(i=0;i<8;i++)                         //控制页数0-7,共8页
         {
      CHOOSE_PG(i);
                CHOOSE_COLUMN(0);
            for(j=0;j<64;j++)         //控制列数0-63,共64列
                  {
          LCD_DATA_WRI(0x00); //写入0,地址指针自加1
            }
   }                                       
}


/*******************************************************************************************
** 函数名称:void init_LCD()
** 功能描述:LCD的初始化
** 输 入:      
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void init_LCD()                                       //LCD的初始化
{
      SET_ON_Off(1);                                 //开显示
      SEL_SCREN(0);
      ClearScreen(0);                              //清屏
      CHOOSE_LINE(0);                                 //开始行:0
}

/*******************************************************************************************
** 函数名称:void Draw_dots(uchar x,uchar y,uchar color)
** 功能描述:画点函数
** 输 入:    uchar x,uchar y,uchar color (x:很坐标 y:纵坐标 color:显示的颜色)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void Draw_dots(uchar x,uchar y,uchar color)
{
      uchar x_byte;
      uchar x_bit;
      uchar Temp_data;                //暂时存放从LCD读出的数据
      x_byte=(y>>3);                  //计算出该点属于哪个字节
      x_bit=y-(x_byte<<3);      //属于字节的哪一位

      
      if(x>63)                              //x>63则显示在右半屏
      {
                SEL_SCREN(2);
                x=x-64;
      }
      else                                        //显示在左半屏
      {
                SEL_SCREN(1);
      }
      CHOOSE_PG(x_byte);                //设置行地址
      CHOOSE_COLUMN(x);                        //设置列地址
         Temp_data=Read_LCD();      //先读出没打点前LCD中的数据
      switch(color)
      {
                case 0x01 : Temp_data &= ~(1<<x_bit);break;      //擦除
                case 0x02 : Temp_data ^= (1<<x_bit); break;      //反白
                case 0x03 : Temp_data |= (1<<x_bit); break;      //画点
                default : break;
      }
      
      CHOOSE_PG(x_byte);
      CHOOSE_COLUMN(x);
      LCD_DATA_WRI(Temp_data);      //将处理后的数据送到LCD中显示
      
}


/*******************************************************************************************
** 函数名称:void Draw_line(unsigned char x1,y1,x2,y2)
** 功能描述:两点间画直线:x1<x2<127,y1<y2<64
** 输 入:   unsigned char x1,y1,x2,y2(两点的坐标)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/                  
void Draw_line(unsigned char x1,y1,x2,y2)
{
      unsigned char i;      
      for(i=x1;i<x2+1;i++)      
                Draw_dots(i,(y2-y1)*(i-x1)/(x2-x1)+y1,2);
}

/*******************************************************************************************
** 函数名称:void Draw_circle(unsigned char x,y,r)
** 功能描述:画圆函数
** 输 入:    画圆:(x,y)为圆心,r为半径
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void Draw_circle(unsigned char x,y,r)
{
      unsigned char i;      
      for(i=x-r;i<x+r+1;i++)
      {
                Draw_dots(i,y-sqrt(r*r-(x-i)*(x-i)),2);               
                Draw_dots(i,y+sqrt(r*r-(x-i)*(x-i)),2);               
      }
}

/*******************************************************************************************
** 函数名称:void Draw_retic(uchar x1,uchar y1,uchar x2,uchar y2)
** 功能描述:画矩形
** 输 入:    uchar x1,uchar y1,uchar x2,uchar y2 (x1,y1为左上角坐标,x2,y2为右下角坐标)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void Draw_retic(uchar x1,uchar y1,uchar x2,uchar y2)//画正方形,x1,y1为左上角坐标,x2,y2为右下角坐标
{
      uchar i;
      for(i=0;i<=x2-x1;i++)
      {
                Draw_dots(x1+i,y1,2);
                Draw_dots(x1+i,y2,2);
      }
      for(i=0;i<=y2-y1;i++)
      {
                Draw_dots(x1,y1+i,2);
                Draw_dots(x2,y1+i,2);
      }
}


/*******************************************************************************************
** 函数名称:void Display_ASCII(uchar screen,uchar page,uchar column,uchar *p)
** 功能描述:显示开关函数:0x3E是关显示,0x3F是开显示
** 输 入:    uchar screen,uchar page,uchar column,uchar *p(屏数,页数,还有显示的数组首地址)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void Display_ASCII(uchar screen,uchar page,uchar column,uchar *p)
{
      uchar i;
      SEL_SCREN(screen);
      CHOOSE_PG(page);
      CHOOSE_COLUMN(column);
      for(i=0;i<8;i++)                        //显示字符上半部分:8*8
      {
                LCD_DATA_WRI(p);
      }
      CHOOSE_PG(page+1);                        //显示字符下半部分:8*8
      CHOOSE_COLUMN(column);
      for(i=0;i<8;i++)
      {
                LCD_DATA_WRI(p);
      }
}

/*******************************************************************************************
** 函数名称:void Display_HZ(uchar screen,uchar page,uchar column,uchar *p)
** 功能描述:显示汉字
** 输 入:    uchar screen,uchar page,uchar column,uchar *p(屏数,页数,还有显示的数组首地址)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void DIS_HZ_HANSHU(uchar screen,uchar page,uchar column,uchar *p)
{
      uchar i;
      SEL_SCREN(screen);
      CHOOSE_PG(page);                                        //写上半页:16*8
      CHOOSE_COLUMN(column*16);                         //控制列
      for(i=0;i<16;i++)                                  //控制16列的数据输出
      {
                LCD_DATA_WRI(p);               //汉字的上半部分
      }
      CHOOSE_PG(page+1);                              //写下半页:16*8
      CHOOSE_COLUMN(column*16);                        //控制列
    for(i=0;i<16;i++)                              //控制16列的数据输出
      {
                LCD_DATA_WRI(p);      //汉字的下半部分
      }
}


/*******************************************************************************************
** 函数名称:void Display_picture(uchar a[])
** 功能描述:显示图片的函数
** 输 入:    uchar a[](存放图片的数组)
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void Display_picture(uchar a[])//显示图形—128*64大小
{
      uchar i,j;
      
      for(j=0;j<8;j++)
      {      
                SEL_SCREN(1);
                CHOOSE_PG(j);
                CHOOSE_COLUMN(0);
                for(i=0;i<64;i++)
                {
                        LCD_DATA_WRI(a);//每隔一行取一次数组中的数据
                }
                SEL_SCREN(2);
                CHOOSE_PG(j);
                CHOOSE_COLUMN(0);
                for(i=0;i<64;i++)
                {
                        LCD_DATA_WRI(a);//每隔一行取一次数组中的数据
                }      
      }      
}


/*******************************************************************************************
** 函数名称:void key_scan(void)
** 功能描述:按键函数
** 输 入:   
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void key_scan(void)
{
      uchar i;
      if(KK_KEY1_OUT==0)                                                //按键1按下,显示汉字
      {
                delay(5000);
                if(KK_KEY1_OUT==0)
                {
                        while(!KK_KEY1_OUT);
                        ClearScreen(0);
                        for(i=8;i>0;i--)                  //滚屏
                        {
                              DIS_HZ_HANSHU(1,0+i,2,huan);
                              DIS_HZ_HANSHU(1,0+i,3,ying);
                              DIS_HZ_HANSHU(2,0+i,0,guang);
                              DIS_HZ_HANSHU(2,0+i,1,ling);
                              DIS_HZ_HANSHU(1,2+i,0,wuwu);
                              DIS_HZ_HANSHU(1,2+i,1,jianjian);
                              DIS_HZ_HANSHU(1,2+i,2,yingY);
                              DIS_HZ_HANSHU(1,2+i,3,MEIMEI);
                              DIS_HZ_HANSHU(2,2+i,0,NVNV);
                              DIS_HZ_HANSHU(2,2+i,1,TUTU);
                              DIS_HZ_HANSHU(2,2+i,2,PIANN);
                              DIS_HZ_HANSHU(2,2+i,3,ZHANN);
                              delay(30000);
                              ClearScreen(0);
                        }
                        DIS_HZ_HANSHU(1,0+i,2,huan);
                        DIS_HZ_HANSHU(1,0+i,3,ying);
                        DIS_HZ_HANSHU(2,0+i,0,guang);
                        DIS_HZ_HANSHU(2,0+i,1,ling);
                        DIS_HZ_HANSHU(1,2+i,0,wuwu);
                        DIS_HZ_HANSHU(1,2+i,1,jianjian);
                        DIS_HZ_HANSHU(1,2+i,2,yingY);
                        DIS_HZ_HANSHU(1,2+i,3,MEIMEI);
                        DIS_HZ_HANSHU(2,2+i,0,NVNV);
                        DIS_HZ_HANSHU(2,2+i,1,TUTU);
                        DIS_HZ_HANSHU(2,2+i,2,PIANN);
                        DIS_HZ_HANSHU(2,2+i,3,ZHANN);                        
                }
      }

      if(KK_KEY2_OUT==0)                              //按键2按下,显示图片---美女图片1
      {
                delay(5000);
                if(KK_KEY2_OUT==0)
                {
                        while(!KK_KEY2_OUT);
                        ClearScreen(0);
                        Display_picture(picture_DIS);
                }
      }

      if(KK_KEY3_OUT==0)                              //按键2按下,显示图片---美女图片2
      {
                delay(5000);
                if(KK_KEY3_OUT==0)
                {
                        while(!KK_KEY3_OUT);
                        ClearScreen(0);
                        Display_picture(picture_DIS_ONE);
                }
      }

      if(KK_KEY4_OUT==0)                              //按键2按下,显示图片---美女图片3
      {
                delay(5000);
                if(KK_KEY4_OUT==0)
                {
                        while(!KK_KEY4_OUT);
                        ClearScreen(0);
                        Display_picture(picture_DIS_TWO);
                }
      }

    if(KK_KEY5_OUT==0)                              //按键2按下,显示图片---美女图片14
      {
                delay(5000);
                if(KK_KEY5_OUT==0)
                {
                        while(!KK_KEY5_OUT);
                        ClearScreen(0);
                        Display_picture(picture_DIS_THREE);
                }
      }

      if(KK_KEY6_OUT==0)                              //按键2按下,显示图片---美女图片5
      {
                delay(5000);
                if(KK_KEY6_OUT==0)
                {
                        while(!KK_KEY6_OUT);
                        ClearScreen(0);
                        Display_picture(picture_DIS_FOUR);
                }
      }
      if(KK_KEY7_OUT==0)                              //按键3按下,显示几何图形
      {
                delay(5000);
                if(KK_KEY7_OUT==0)
                {
                        while(!KK_KEY7_OUT);
                        ClearScreen(0);
                        DIS_HZ_HANSHU(1,0,2,zhi);
                        DIS_HZ_HANSHU(1,0,3,xian);
               
                        DIS_HZ_HANSHU(2,2,1,ju);
                        DIS_HZ_HANSHU(2,2,2,xing);
               
                        DIS_HZ_HANSHU(1,4,1,yuan);
               
                        Draw_line(0,0,127,63);
                        Draw_retic(70,0,120,33);
                        Draw_circle(30,40,25);
                }
      }
}


/*******************************************************************************************
** 函数名称:void main()
** 功能描述:完成滚动汉字和美女图片的显示
** 输 入:      
**         
**      
** 输 出:   
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.03.12
********************************************************************************************/
void main()
{
         init_LCD();                                        //初始12864
         ClearScreen(0);                              //清屏
      //Display_picture(rrrr_table);
      //while(1);
         CHOOSE_LINE(0);                              //显示开始行
      DIS_HZ_HANSHU(1,2,1,qing);
      DIS_HZ_HANSHU(1,2,2,an);
      DIS_HZ_HANSHU(1,2,3,button);
      DIS_HZ_HANSHU(2,2,0,xuan);
      DIS_HZ_HANSHU(2,2,1,ze);
      DIS_HZ_HANSHU(2,2,2,andsoon);      //上电显示:“请按键选择…”
      while(1)
      {      
                key_scan();
      }
}



航航爱利利 发表于 2014-6-25 15:35

表示很崇拜。。。

吴鉴鹰. 发表于 2014-6-13 13:10

本帖最后由 吴鉴鹰. 于 2014-6-13 13:12 编辑

6、吴鉴鹰单片机实战项目精讲(连载)之电子秤的设计 ——软件设计

/*************************************************************************
** 函数名称:   _Low_level_init
** 功能描述:   这个函数的主要功能是对单片机的端口和串行通讯的波特率、通信方式等作一系列的规定很处理
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:    14.03.2
*******************************************************************************/
//Low_level_init.c
#include<ina90.h>
#include<io8585.h>
int_Low_level_init(void)
{
   UBRR = 12;
   UCR = 0X08;
   GIMSK = 0X40;
   _SEI();
   return 1;
}
   
   
/*主函数*/
#include<pgmspace.h>
#include<stdio.h>
#include<stdlib.h>
#include "io8515.h"
#include "serial.h"
#include "gpr.h"
#include "kb.h"
/***************************************************************************************
** 函数名称:   main
** 功能描述:   串口的初始化、初始化键盘的收发
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:    14.03.2
*****************************************************************************************/
void main()
{
   unsigned char key;
   init_usart();                  //串口的初始化程序
   init_kb();                     //初始化键盘的收发
   while(1)
   {
      key = getchar();
   putchar(key);
   delay(100);                   //延时子程序
   }
}

/*键盘处理子程序*/
#include<pgmspace.h>
#include "kb.h"
#include "serial.h"
#include "qpr.h"
#include "scancodes.h"
#define BUFF_SIZE 64
unsigned char dege,bitcount;      //0 :符号,1 :正号
unsigned char kb_buffer;
unsigned char *inpt,*outpt;
unsigned char buffercnt;
/******************************************************************************
** 函数名称:   init_kb
** 功能描述:   初始化键盘
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:    14.03.2
**********************************************************************************/
void init_kb(void)
{
    inpt = kb_buffer;               //初始化缓冲区      
outpt = kb_buffer;
buffcnt = 0;
MCUCR = 2;                     //INT0中断,下降沿触发
edge = 0;                        //0:下降沿,1 :上升沿
bitcount = 11;
}
/**********************************************************************************
** 函数名称:   INT0_interrupt
** 功能描述:   按键接收中断函数
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:    14.03.2
**************************************************************************************/
interruptvoid INT0_interrupt(void)
{
   static unsigned char data;            //保持接收扫描码的状态
   if(!edge)                           //下降沿触发中断服务程序
   {
      if(bitcount < 11 && bitcount > 2)//3~10位是数据
   {                                  //删除起始位和停止位
   data = (data >> 1);            
if(PIND & 8)
data = data | 0x80;             //如果为“1”则存储         
   }
   MCUCR = 3;                         //设置该寄存器是为了用上升沿触发中断
   edge = 1;
   }
   else
   {
   MCUCR = 2;
edge = 0;
if(--bitcount == 0)               //该判断是接收到所有的中断的时候
{
    decode(data);
    bitcount = 11;
}
   }
}
/*********************************************************************************
** 函数名称:   decode
** 功能描述:   键盘按键码解码函数
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:    14.03.2
************************************************************************************/
void decode(unsigned char sc)
{
   static unsigned char is_up = 0,shift = 0,mode = 0;
   unsigned char i;
   if(!is_up)                        //最后一位数据的接收
   {
      switch(sc)
   {
   case 0xf0: is_up = 1;break;    //确定完成了的按键
case 0x12: shift = 1;break;    //左边的shift键
case 0x59: shift = 1;break;    //右边的shift键
case 0x05:                     //F1键
if(mode == 0)
{
    mode = 1;                  //进入按键扫描模式
}
if(mode == 2)                  //离开按键扫描模式
{
    mode = 3;
}
break;
default:
if(mode == 0 || mode == 3)   //ASCΙΙ模式
{
    if(!shift)                   //如果没有shift键被按下
    {                            //查表
      for(i=0;unshifted != sc && unshifted;i++);
   if(unshifted == sc)
   {
      put_kbuffer(unshifted);
   }
    }
    else
    {                           //如果shift键被按下
         for(i = 0;shifted != sc && shifted;i ++);
      if(shifted == sc)
      {
         put_kbbuffer(shifted);
      }
    }
}
else
{
    print_hexbyte(sc);          //扫描键盘吗模式
    put_kbbuffer(' ');          //显示模式
    put_kbbuffer(' ');
}
break;
   }
   }
   else
   {
      is_up = 0;                      //2个0xf0在一列中不允许的
   switch(sc)
   {
       case 0x12:shift = 0;break;//左shift
    case 0x59:shift = 0;break;//右shift
    case 0x05:                  //F1
    {
      if(mode == 1)
   {
   mode = 2;
   }
   if(mode == 3)
   {
   mode = 0;
   }
   break;
   case 0x06:                //F2
   clr();
   break;
    }
   }
   }
}
/****************************************************************************************
** 函数名称:   put_kbbuff
** 功能描述:   键盘输入字符的函数
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:    14.03.2
****************************************************************************************/
void put_kbbuff(unsigned char c)
{
   if(buffcnt < BUFF_SIZE)                  //若缓冲区为空
   {
       *inpt = C;                        //在缓冲区中输入一个字符            
    inpt++;                           //指针加1
    buffcnt ++;
    if(inpt >= kb_buffer + BUFF_SIZE)   //指针判断
    {
       inpt = kb_buffer;
    }
}   
}
/*****************************************************************************************
** 函数名称:   getchar
** 功能描述:   读取键盘输入字符的函数
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:    14.03.2
****************************************************************************************/
intgetchar(void)
{
   int byte;
   while(buffcnt == 0);                     //等待数据
   byte = *outpt;                           //取数据
   outpt++;                                 //指针加1
   if(outpt >= kb_buffer + BUFFER_SIZE)   //指针比较
   outpt = kb_buffer;
   buffcnt--;                               //缓冲区减去1
   return byte;
}


qinkaiabc 发表于 2014-6-10 16:17

期待ing

吴鉴鹰. 发表于 2014-6-10 16:36

本帖最后由 吴鉴鹰. 于 2015-4-27 08:17 编辑

2、吴鉴鹰单片机实战项目精讲(连载)之摇摇棒的制作
相关的硬件原理图请点击下载:

鉴鹰的摇摇棒具有如下功能:
   1) 显示“就要离开西北工业大学了!”;
   2) 显示“o(∩_∩)o”微笑图案;
   3) 显示    心形图案;
   4) 显示“LOVE”;
   5) 显示“天天开心”
   6)显示“笑笑照顾好自己!”
   7)显示   “我们毕业了!”
   8)显示   “周晓晓”
   9) 可以通过开关实现转换,轮流显示并循环。

跟大家讲,摇摇棒其实很简单,大学期间,我自己用万用板搭了一个,别人觉得很好玩,就来问我怎么做。其实就是一个循环的LED显示,利用人的视觉滞留产生静态显示的现象。要实现这个目标,就要求延时部分做的比较小,所以采用石英晶体振荡器。而目前能够实现这种功能的器件有很多种,不同的类型的器件也能够很好的完成。

    鹰哥的这个作品本着方便、价格低廉的原则,采用单片机控制,由水银开关的闭合对单片机产生外部中断,从而对中断进行采集。到达一定数量便进行图象的转换。


   这是鹰哥当年在大学做的送给女朋友的哦!她玩了好久,还带回去给她老爸看了,所以年轻的工程师可以做一个送给你心爱的姑娘啊!信鉴鹰,搞定女神不是梦!

   整个系统由单片机控制模块,开关及电源模块和输出显示模块三个部分构成。


2、主要部件原理
   (1)单片机控制模块
    用单片机想要控制LED显示只需要定时输出就可以,但每个人摇动的速度不一样,如何准确的并稳定的变换图案呢?这就需要用到外部中断。将水银开关的两个引脚一端接VCC,一端接GND,这样的话,当摇棒向一边运动时LED按照程序编辑好的规律显示,而向另一边运动时LED全灭,此时一个周期就会产生一个下跳沿的信号,信号传递给单片机的nINT0产生中断,对中断的数量计数,当计到10时便转换显示的图案,当依次显示完后便回到初始状态进行循环。
由于人的视觉滞留时间长达0.1s,所以在每显示完一列LED后加入一段合适的延时,如5ms,每个字之间加入延时如15ms,这样,我们就能看到静态的稳定的字,并且每个字之间是有空隙的。为了让字能够在空间的中部显示,在启动中断显示后延时一段合适的时间,使棒在半圆轨迹的大约1/4处开始显示,这样看到的字方向上才比较正。
   
(2)水银开关
水银开关,又称倾侧开关,是电路开关的一种,以一接著电极的小巧容器储存著一小滴水银,容器中多数注入惰性气体或真空。
   
  仔细观察水银开关,实际上他是一个封闭的玻璃管,里面有两个分开着的导线和一段水银球,当玻璃管的平衡位置变化时,水银球会来回移动,当水银球移动到两根导线时,因水银是金属-导体,故电路变为通路,此时接收器处于工作状态;反之,水银球远离两根导线时为断路,此时接收器处于非工作状态。
本设计采用震动开关代替水银开关,试验测试发现,水银开关多次高频率的接通断开后触点会氧化,容易接触不良,因此改用下面的震动开关。

   主要的人原理和器件鹰哥已经介绍完毕了,现在来给大家介绍大家最关心的程序了,让鹰哥来一点点介绍。


3、程序设计
</blockquote></div><div class="blockcode"><blockquote>/******************************************************
*程序:摇摇棒的设计程序                                                      
** 这一讲的主要内容: 吴鉴鹰摇摇棒的设计和制作                                                                                 
** 功能描述:
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
#include <AT89X52.h>
#define uchar unsigned char
#define uint unsigned int    //宏定义
#define KEY P3_7      //定义画面切换按键
uchar KY;    //KY作用在后面说明   
uchar disp;   //显示汉字指针
uchar pic=0,num=0;   //pic为按键次数;num为中断次数

uchar code love[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,
0x04,0x10,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x04,0x10,0xF8,0x0F,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x10,
0x00,0x08,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x82,0x20,0x82,0x20,
0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*LOVE*/
};

uchar code loveyou[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x78,0x00,0xFC,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x07,0xFE,0x0F,0xFE,0x1F,0xFC,0x3F,
0xF8,0x7F,0xFC,0x3F,0xFE,0x1F,0xFE,0x0F,0xFE,0x07,0xFE,0x03,0xFE,0x01,0xFC,0x00,
0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*心形图案*/
};
uchar code hehe[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
0xF0,0x0F,0x08,0x10,0x04,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x04,0x20,0x08,0x10,
0xF0,0x0F,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*呵呵o(∩_∩)o图案*/
};
unsigned char code hanzi[] = {
/*--文字:欢--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
//0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,

/*--文字:迎--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,
//0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,

/*--文字:使--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x80,0x60,0xF8,0x07,0x04,0xE4,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0xE4,0x04,0x00,
//0x00,0x00,0xFF,0x00,0x80,0x81,0x45,0x29,0x11,0x2F,0x41,0x41,0x81,0x81,0x80,0x00,

/*--文字:用--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
//0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,

/*--文字:吴--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x00,0x00,0x80,0x9E,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x9E,0x80,0x00,0x00,0x00,
//0x84,0x84,0x44,0x44,0x24,0x14,0x0C,0x07,0x0C,0x14,0x24,0x44,0x44,0x84,0x84,0x00,

/*--文字:鉴--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x00,0x00,0x3E,0x00,0x80,0xBF,0x40,0x20,0x58,0x87,0x84,0x0C,0x34,0x04,0x00,0x00,
//0x02,0x42,0x49,0x49,0x5A,0x6A,0x4A,0x7E,0x4A,0x6A,0x5A,0x49,0x49,0x42,0x02,0x00,

/*--文字:鹰--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x00,0x00,0xFE,0x22,0x12,0xFA,0x26,0x12,0xFB,0xAE,0xAA,0xFE,0xAA,0xAA,0x02,0x00,
//0x40,0x30,0x0F,0x40,0x40,0x5E,0x52,0x53,0x56,0x52,0x1A,0x56,0x90,0x70,0x00,0x00,

/*--文字:的--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00,
//0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00,

/*--文字:摇--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x10,0x10,0x10,0xFF,0x90,0x00,0x94,0x64,0x44,0x54,0xE2,0x42,0x63,0x5A,0x00,0x00,
//0x02,0x42,0x81,0x7F,0x00,0x00,0x02,0x7A,0x42,0x42,0x7F,0x42,0x42,0xFA,0x02,0x00,

/*--文字:摇--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x10,0x10,0x10,0xFF,0x90,0x00,0x94,0x64,0x44,0x54,0xE2,0x42,0x63,0x5A,0x00,0x00,
//0x02,0x42,0x81,0x7F,0x00,0x00,0x02,0x7A,0x42,0x42,0x7F,0x42,0x42,0xFA,0x02,0x00,

/*--文字:棒--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
//0x10,0x10,0xD0,0xFF,0x90,0x10,0x44,0x54,0xD4,0x74,0x5F,0x54,0xD4,0x54,0x44,0x00,
//0x04,0x03,0x00,0xFF,0x00,0x01,0x12,0x11,0x14,0x14,0xFF,0x14,0x14,0x11,0x12,0x00,
    //就
0x04,0x10,0xE4,0x4B,0x25,0x82,0x26,0x7E,0x24,0x02,0xE4,0x0B,0x04,0x90,0x20,0x6,
0x20,0x1C,0xFF,0x03,0x20,0x00,0xE2,0x3F,0x2C,0x40,0x20,0x40,0x20,0x70,0x00,0x00,/*"就",0*/
/* (16 X 16 , 宋体 ) */
0x00,0x00,0x02,0x02,0xF2,0x82,0x92,0x92,0x92,0x9A,0xFE,0x56,0x92,0x63,0x92,0x22,
0x92,0x32,0xFE,0x4A,0x92,0x46,0x92,0x42,0xF2,0x82,0x02,0x02,0x00,0x00,0x00,0x00,/*"要",1*/
/* (16 X 16 , 宋体 ) */
0x04,0x00,0x04,0xFE,0x04,0x02,0xF4,0x02,0x84,0x12,0xD4,0x3A,0xA5,0x16,0xA6,0x13,
0xA4,0x12,0xD4,0x1A,0x84,0x32,0xF4,0x42,0x04,0x82,0x04,0x7E,0x04,0x00,0x00,0x00,/*"离",2*/
/* (16 X 16 , 宋体 ) */
0x80,0x00,0x82,0x80,0x82,0x40,0x82,0x30,0xFE,0x0F,0x82,0x00,0x82,0x00,0x82,0x00,
0x82,0x00,0x82,0x00,0xFE,0xFF,0x82,0x00,0x82,0x00,0x82,0x00,0x80,0x00,0x00,0x00,/*"开",3*/
/* (16 X 16 , 宋体 ) */
0x80,0x00,0x90,0x80,0x8C,0x80,0x84,0x84,0x84,0x46,0x84,0x49,0xF5,0x28,0x86,0x10,
0x84,0x10,0x84,0x2C,0x84,0x23,0x84,0x40,0x94,0x80,0x8C,0x00,0x80,0x00,0x00,0x00,/*"安",4*/
/* (16 X 16 , 宋体 ) */
0x10,0x01,0x88,0x00,0xC4,0xFF,0x23,0x48,0xAE,0x29,0x68,0x8D,0x2F,0xFB,0x28,0x09,
0xAE,0xAC,0x20,0x48,0xD8,0x37,0x17,0x08,0x10,0x36,0xF0,0x41,0x10,0x80,0x00,0x00,/*"徽",5*/
/* (16 X 16 , 宋体 ) */
0x04,0x20,0x84,0x60,0x84,0x20,0xFC,0x1F,0x84,0x10,0x84,0x10,0x00,0x40,0xFE,0x44,
0x92,0x44,0x92,0x44,0xFE,0x7F,0x92,0x44,0x92,0x44,0xFE,0x44,0x00,0x40,0x00,0x00,/*"理",6*/
/* (16 X 16 , 宋体 ) */
0x00,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0xFC,0x3F,
0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x00,0x20,0x00,0x00,/*"工",7*/
/* (16 X 16 , 宋体 ) */
0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00,
0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/*"大",8*/
/* (16 X 16 , 宋体 ) */
0x40,0x04,0x30,0x04,0x11,0x04,0x96,0x04,0x90,0x04,0x90,0x44,0x91,0x84,0x96,0x7,
0x90,0x06,0x90,0x05,0x98,0x04,0x14,0x04,0x13,0x04,0x50,0x04,0x30,0x04,0x00,0x00,/*"学",9*/
/* (16 X 16 , 宋体 ) */
0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x40,0x02,0x80,0xE2,0x7F,
0x22,0x00,0x12,0x00,0x0A,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"了",10*/
/* (16 X 16 , 宋体 ) */
       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
       0x00,0x00,0x00,0x00,0x7C,0x10,0xFE,0x3B,
       0xFE,0x3B,0x7C,0x10,0x00,0x00,0x00,0x00,
       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
unsigned char codedayday[] = {
0x40,0x80,0x40,0x80,0x42,0x40,0x42,0x20,0x42,0x10,0x42,0x0C,0x42,0x03,0xFE,0x00,
0x42,0x03,0x42,0x0C,0x42,0x10,0x42,0x20,0x42,0x40,0x40,0x80,0x40,0x80,0x00,0x00,/*"天",0*/
/* (16 X 16 , 宋体 ) */
0x40,0x80,0x40,0x80,0x42,0x40,0x42,0x20,0x42,0x10,0x42,0x0C,0x42,0x03,0xFE,0x00,
0x42,0x03,0x42,0x0C,0x42,0x10,0x42,0x20,0x42,0x40,0x40,0x80,0x40,0x80,0x00,0x00,/*"天",1*/
/* (16 X 16 , 宋体 ) */
0x80,0x00,0x82,0x80,0x82,0x40,0x82,0x30,0xFE,0x0F,0x82,0x00,0x82,0x00,0x82,0x00,
0x82,0x00,0x82,0x00,0xFE,0xFF,0x82,0x00,0x82,0x00,0x82,0x00,0x80,0x00,0x00,0x00,/*"开",2*/
/* (16 X 16 , 宋体 ) */
0x00,0x10,0x00,0x0C,0x80,0x03,0x00,0x00,0x00,0x00,0xE0,0x3F,0x02,0x40,0x04,0x40,
0x18,0x40,0x00,0x40,0x00,0x40,0x00,0x78,0x40,0x00,0x80,0x01,0x00,0x0E,0x00,0x00,/*"心",3*/
/* (16 X 16 , 宋体 ) */
};
unsigned char code damogu[] = {
0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00,
0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/*"大",0*/
/* (16 X 16 , 宋体 ) */
0x10,0x04,0x60,0x04,0x02,0x7C,0x0C,0x03,0xC0,0x80,0x04,0x88,0xE4,0x4B,0xAF,0x2A,
0xA4,0x1A,0xA4,0x0E,0xA4,0x1A,0xAF,0x2A,0xE4,0x4B,0x04,0x88,0x00,0x80,0x00,0x00,/*"漠",1*/
/* (16 X 16 , 宋体 ) */
0x02,0x42,0x02,0x82,0xF2,0x7F,0x8A,0x00,0x46,0x80,0x00,0x60,0xFC,0x1F,0x04,0x00,
0xFC,0x7F,0x04,0x28,0x02,0x10,0xFE,0x61,0x03,0x0E,0x02,0x30,0x00,0x40,0x00,0x00,/*"孤",2*/
/* (16 X 16 , 宋体 ) */
0x00,0x40,0x00,0x30,0xFE,0x0F,0x22,0x40,0x12,0x40,0xFA,0x5E,0x26,0x52,0x12,0x53,
0xFB,0x56,0xAE,0x52,0xAA,0x1A,0xFE,0x56,0xAA,0x90,0xAA,0x70,0x02,0x00,0x00,0x00,/*"鹰",3*/
/* (16 X 16 , 宋体 ) */
};
unsigned char code womenbiye[] = {
0x20,0x00,0x24,0x08,0x24,0x48,0x24,0x84,0xFE,0x7F,0x23,0x02,0x22,0x41,0x20,0x40,
0x20,0x20,0xFF,0x13,0x20,0x0C,0x22,0x14,0x2C,0x22,0xA0,0x41,0x20,0xF8,0x00,0x00,/*"我",0*/
/* (16 X 16 , 宋体 ) */
0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,
0x06,0x00,0x00,0x00,0x04,0x00,0x04,0x40,0x04,0x80,0xFC,0x7F,0x00,0x00,0x00,0x00,/*"们",1*/
/* (16 X 16 , 宋体 ) */
0x00,0x04,0x00,0x04,0xFF,0x05,0x88,0x04,0x88,0x04,0x48,0x04,0x48,0x04,0x00,0xFF,
0x7F,0x04,0x88,0x04,0x84,0x04,0x84,0x04,0x82,0x04,0xE0,0x04,0x00,0x04,0x00,0x00,/*"毕",2*/
/* (16 X 16 , 宋体 ) */
0x00,0x40,0x10,0x40,0x60,0x40,0x80,0x43,0x00,0x40,0xFF,0x7F,0x00,0x40,0x00,0x40,
0x00,0x40,0xFF,0x7F,0x00,0x42,0x00,0x41,0xC0,0x40,0x30,0x40,0x00,0x40,0x00,0x00,/*"业",3*/
/* (16 X 16 , 宋体 ) */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x0F,0x04,0x04,0xFC,0x0F,0x00,0x00,0x10,0x44,0x10,0x82,0xFF,0x7F,
0x90,0x00,0xC8,0x40,0x09,0x4F,0x0E,0x60,0x08,0x5C,0xE8,0x43,0x08,0x40,0x00,0x00,/*"啦",4*/
/* (16 X 16 , 宋体 ) */
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",5*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* (16 X 16 , 宋体 ) */

};
unsigned char codeLiuShiShi[] = {
/*--文字:刘--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x28,0x48,0x89,0x0E,0x88,0x78,0x08,0x08,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,
0x40,0x20,0x10,0x09,0x06,0x19,0x60,0x00,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,

/*--文字:诗--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x42,0xCC,0x00,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x00,0x00,0x00,0x7F,0x20,0x12,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,

/*--文字:诗--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x42,0xCC,0x00,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x00,0x00,0x00,0x7F,0x20,0x12,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,

};
unsigned char code Ytzgzj[] = {
{0x00,0x08,0x00,0x04,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0xFF,0x7F},
{0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x0E,0x00,0x00},/*"小",0*/
/* (16 X 16 , 宋体 ) */

0x40,0x00,0x40,0x00,0x42,0x00,0xCC,0x7F,0x00,0x20,0x40,0x12,0x48,0x0A,0x48,0x32,
0x48,0x02,0x7F,0x42,0x48,0x82,0xC8,0x7F,0x48,0x02,0x48,0x02,0x40,0x02,0x00,0x00,/*"诗",1*/
/* (16 X 16 , 宋体 ) */

0x00,0x80,0xFE,0x6F,0x42,0x08,0x42,0x08,0x42,0x28,0xFE,0xCF,0x00,0x00,0x42,0x00,
0xA2,0x2F,0x9E,0xC8,0x82,0x08,0xA2,0x08,0xC2,0x28,0xBE,0xCF,0x00,0x00,0x00,0x00,/*"照",2*/
/* (16 X 16 , 宋体 ) */

0x00,0x80,0xFE,0x7F,0x02,0x00,0xF2,0x7F,0x12,0x21,0x12,0x12,0xF2,0x89,0x00,0x80,
0xF2,0x4F,0x1A,0x20,0x16,0x18,0xD2,0x17,0x12,0x20,0xF2,0x4F,0x02,0x80,0x00,0x00,/*"顾",3*/
/* (16 X 16 , 宋体 ) */

0x10,0x40,0x10,0x22,0xF0,0x15,0x1F,0x08,0x10,0x16,0xF0,0x61,0x00,0x00,0x80,0x00,
0x82,0x40,0x82,0x80,0xE2,0x7F,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0x00,0x00,/*"好",4*/
/* (16 X 16 , 宋体 ) */

0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x88,0x44,0x8C,0x44,0x8A,0x44,0x89,0x44,
0x88,0x44,0x88,0x44,0x88,0x44,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"自",5*/
/* (16 X 16 , 宋体 ) */

0x00,0x00,0x00,0x00,0x82,0x3F,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0x40,0x00,0x40,0x00,0x78,0x00,0x00,0x00,0x00,/*"己",6*/
/* (16 X 16 , 宋体 ) */

0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",7*/
/* (16 X 16 , 宋体 ) */

};
/*****函数声明*****/
void display1_ltor(void);
void display2_ltor(void);
void display2_rtol(void);
void display3(void);
void display4(void);
void display5(void);
void display6(void);
void display7(void);
void display8(void);
void display9(void);


/******************************************************
*程序:void DelayUs(uint N)                                                                                                                        
** 功能描述: n(us)延时子程序
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void DelayUs(uint N)
{
uint x;
for(x=0; x<=N;x++);
}

/******************************************************
*程序:void intersvr0(void) interrupt 0                                                                                                                        
** 功能描述: 中断服务程序
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void intersvr0(void) interrupt 0
{
//;
KY=~KY;      //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
if(KY==0)
{
    num++;   //计算中断次数
   switch(pic)      //选择画面
   {
   case 0:{display1_ltor();}break;
   case 1:{display2_ltor();}break;
   case 2:{display3();}break;
   case 3:{display4();}break;
case 4:{display5();}break;
case 5:{display6();}break;
case 6:{display7();}break;
case 7:{display8();}break;
case 8:{display9();}break;
   default:{display1_ltor();}
    }
}
}

/******************************************************
*程序:void display1_ltor(void)                                                                                                                        
** 功能描述: 显示子程序1(汉字)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display1_ltor(void)
{
uchar i;
if(num>10){disp++;num=0;}   //12个汉字分为3次显示完(每次显示4个),每中断10次切换
if(disp>2)disp=0;
   DelayUs(5200);   //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可
for(i=0;i<64;i++)
{
      P0=~hanzi;
      P2=~hanzi;
      DelayUs(100);
}
}

/******************************************************
*程序:void display2_ltor(void)                                                                                                                        
** 功能描述: 显示子程序2(LOVE)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display2_ltor(void)
{
uchar i;
DelayUs(4000);
for(i=0;i<64;i++)
{
      P0=~love;
      P2=~love;
      DelayUs(140);
}
}

/******************************************************
*程序:void display3(void)                                                                                                                        
** 功能描述: 显示子程序3(心形图案)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display3(void)
{
uchar i;
   DelayUs(4000);
for(i=0;i<64;i++)
{
      P0=~loveyou;
      P2=~loveyou;
      DelayUs(120);
}
}

/******************************************************
*程序:void display4(void)                                                                                                                        
** 功能描述: 显示子程序4(呵呵o(∩_∩)o图案)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display4(void)
{
uchar i;
DelayUs(4000);
for(i=0;i<64;i++)
{
      P0=~hehe;
      P2=~hehe;
      DelayUs(120);
}
}

/******************************************************
*程序:void display5(void)                                                                                                                        
** 功能描述: 显示子程序5(天天开心)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display5(void)
{
uchar i;
DelayUs(4000);
for(i=0;i<64;i++)
{
      P0=~dayday;
      P2=~dayday;
      DelayUs(120);
}
}

/******************************************************
*程序:void display6(void)                                                                                                                        
** 功能描述: 显示子程序6(天天开心)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display6(void)
{
uchar i;
DelayUs(4000);
for(i=0;i<64;i++)
{
      P0=~damogu;
      P2=~damogu;
      DelayUs(120);
}
}

/******************************************************
*程序:void display7(void)                                                                                                                        
** 功能描述: 显示子程序7(天天开心)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display7(void)
{
uchar i;
if(num>10){disp++;num=0;}   //8个汉字分为3次显示完(每次显示4个),每中断10次切换
if(disp>1)disp=0;
   DelayUs(5200);   //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可
for(i=0;i<64;i++)
{
      P0=~womenbiye;
      P2=~womenbiye;
      DelayUs(100);
}
}

/******************************************************
*程序:void display8(void)                                                                                                                        
** 功能描述: 显示子程序8(天天开心)
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display8(void)
{
uchar i;
DelayUs(4000);
for(i=0;i<64;i++)
{
      P0=~LiuShiShi;
      P2=~LiuShiShi;
      DelayUs(120);
}   
}

/******************************************************
*程序:void display9(void)                                                                                                                        
** 功能描述: 小诗照顾好自己
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void display9(void)
{
uchar i;
if(num>10){disp++;num=0;}   //8个汉字分为2次显示完(每次显示4个),每中断10次切换
if(disp>1)disp=0;
   DelayUs(5200);   //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可
for(i=0;i<64;i++)
{
      P0=~Ytzgzj;
      P2=~Ytzgzj;
      DelayUs(100);
}
}

/******************************************************
*程序:void main(void)                                                                                                                        
** 功能描述: 主函数
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/
void main(void)
{
IT0=1;
EX0=1;
EA=1;      //开中断,下降沿中断
KY=0;
KEY=1;
while(1)   //主程序中只检测按键
{
   if(KEY==0)   //画面切换键按下
{
      DelayUs(10000);   //按键去抖
   if(KEY==0) //这个地方多了一个分号,谢谢 lhxtzlhxtz的提醒!这是我的疏忽,向大家道歉,只能以后发表更多有价值的帖子表示我的歉意了!
   pic++;
      while(KEY==0);
   }
   if(pic>8)pic=0;
}
}
/*****END*****/






ruya3699 发表于 2014-6-10 20:02

跟老师好好学习下

youluo 发表于 2014-6-10 20:10

感谢分享。

exiao 发表于 2014-6-10 21:28

呵呵,在这里看到楼主了

吴鉴鹰. 发表于 2014-6-11 08:10

exiao 发表于 2014-6-10 21:28
呵呵,在这里看到楼主了

哈哈,:)多多交流啊!!!

Laspide 发表于 2014-6-11 09:04

乘128,乘2这种运算,可以用移位运算替代
TH0 = -5000/256;
TL0 = -5000%256;
这种赋值,何不先算好,再加条注释

吴鉴鹰. 发表于 2014-6-11 09:18

Laspide 发表于 2014-6-11 09:04
乘128,乘2这种运算,可以用移位运算替代
TH0 = -5000/256;
TL0 = -5000%256;


这只是让读者知道这个数据是怎么来的,如果要求运算速度很高的话,肯定就这样做了!

吴鉴鹰. 发表于 2014-6-11 09:35

本帖最后由 吴鉴鹰. 于 2014-6-17 09:49 编辑

3.吴鉴鹰单片机实战项目精讲(连载)之燃气报警器的制作——硬件设计相关的原理图请点击下载:

   今天来讲第三个项目,有兄弟说我的帖子内容不够细,今后一定做到模块化,硬件软件模块化,对软硬件难点、重点内容作详细解析。
一提到燃报警器,鹰哥我就有一种独特的情绪,因为这是我的毕业设计做的实物,遥想要想当年毕业答辩那会,直接拿着实物去答辩,省去了不少口舌,事实胜于雄辩嘛,老师也不多问,直接让我演示了一下,结果效果还不错,得到了老师的肯定,说做的不错,还问我有没有意向推广从那以后我对电子的热情更加强了。


这是鉴鹰当时做的实物图片:



图1

       这也是鹰哥自己一手负责软件、硬件做成的一个完整的产品,从原理图到PCB板,再到程序,都是鹰哥一人搞定的,现在想想那感觉还是很好的,虽然很辛苦,但是乐在其中。


图   2
          鹰哥的这篇文章主要论述了一种便携式瓦斯检测仪的工作原理,并给出了系统硬件原理电路设计与软件系统流程。该系统主要由电源模块、催化燃烧式气体传感器模块、单片机控制模块、键盘、LED显示器和声光报警模块等部分构成。该装置将单片机的适时控制及数据处理功能与传感技术相结合,不仅可精确检测井下空气中的瓦斯浓度,还能根据瓦斯浓度的大小及时发出声光报警信号,而且可通过数码管显示装置显示出瓦斯的浓度。

图3
首先来介绍硬件部分

一、介绍最前端的传感器
       这个项目采用MJC4/3.0L瓦斯检测传感器,当时在网上买了一个,价格在40块钱左右,虽然价钱不是太高,可是对那时的鹰哥来说也不是一笔小
钱,那可是巨款啊!能买10瓶营养快线,当时鹰哥一咬牙还是买了一个回来。

    图 4
                                                                                                         
MJC4/3.0L原理图

刚买回来,也没有说明书,就到网上到处找,打电话问客服,也说不是做技术的,后来又联系工程师,才终于弄明白个大概。

传感器原理:



图5

载体催化元件一般由一个带催化剂的敏感元件(俗称黑元件)和一个不带催化剂的补偿元件(俗称白元件)构成。其检测电路如图所示。黑元件是载体催化燃烧式元件,当甲烷气体在元件表面与氧气产生无焰燃烧时,电桥失去平衡,输出一个电压信号,白元件是补偿元件,基本结构和技术参数与黑元件相同,但表面不涂镀催化剂,所以它不掺入低温燃烧。但它处在与黑元件相同的工作环境中,所以对非甲烷浓度变化引起的催化元件阻值变化起补偿作用,从而提高仪器零点稳定性和抗干扰能力。

二、由OP07组成的双运放高共模抑制比放大电路
    OP07介绍:放大器OP07参数及引脚说明,大家只需要知道芯片怎么用就行了,没有必要详细研究,毕竟咱们不学搞微电子的
OP07参数如下:
图6
1、低的输入噪声电压幅度:0.35μVP-P (0.1Hz -10Hz)
2、极低的输入失调电压:10μV
3、极低的输入失调电压温漂:0.2μV/ ℃
4、具有长期的稳定性:0.2μV/MO
5、低的输入偏置电流:±1nA
6、高的共模抑制比:126dB
7、宽的共模输入电压范围:±14V
8、宽的电源电压范围:±3V-±22V
   1和8脚为偏置平衡(调零端),2脚为反向输入端,3脚为正向输入端,5脚为空脚 ,6脚为输出端,7和4分别接电源的正负极。




图 7

电路分析计算:
由电路可得:
          Uo1 = (1 + R4/R3)×Ui                  (1)
         (Uo1 - Ui2)/R5 = (Ui2 - Uo)/R6      (2)

所以由式(1)和式(2)得:                  
                                                          Uo = ((1 + R6/R5)×Ui2 - (1 + R4/R3)×R6Ui)/R5      (3)
又因为输入共模电压Uic = (Ui1 + Ui2)/2,输入差模电压Uid = Ui1 - Ui2,将它们带入式(3)可得:
                               Uo =( (1 - R4R6/R3R5)×Uic + 1 )/(2(1+2×R6/R5+R4R6/R3R5)×Uid)       (4)

       为了获得零共模增益,式(3-4)右边第一项必须为零,可取此时,电路得差动闭环增益为:
因为从传感器输出得电压信号为0-90mv,为了取得较大的A/D转换器输入信号,需要对其放大,取R3=R6=5000Ω,R4= R5=100Ω,放大倍数为51倍。

感兴趣的读者可以自己推导一下,这也是有的公司笔试喜欢考的题目类型,其实模电研究一下也挺有意思的。鹰哥当时自己可是认认真真的推导过得的哦。

三、AD采样模块的简单介绍

A/D转换模块设计

       在检测系统中,传感器将采集到的信号(例如:我们这个项目中,信号就是瓦斯的浓度),这些信号都是模拟信号,将这些模拟信号进行处理,放大、滤波、补偿、以及信号的变换等方式,然后在案通过某些芯片将模拟信号变成数字信号,这里我们用ADC0809将传感器转化的电压进行数字化,然后再传递给MCU,也就是51单片机。一定会有人问我,为什么采用这么低档次的51单片机,精确度如此低的ADC0809,鹰哥告诉你,一个好的项目并不是采用的芯片越高档就越好,而且对于初学者,档次越低的芯片,学到的东西越多,所以大家不要嫌弃51单片机低级,也不要嫌弃ADC0809芯片不够先进。
      相信鹰哥,只要你能把ADC0809用好,别的AD转换芯片也没有问题。
鹰哥来给大家简单介绍一下ADC0809芯片。
ADC0809芯片简单介绍
       当时鹰哥采用的是ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件,。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。芯片的引脚图如图所示:




图 8
1、ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。下面说明各引脚功能。
      (1) IN0-IN7:8路模拟量输入端;
      (2) D0-D7:8位数字量输出端;
      (3) ADD-A、ADD-B、ADD-C:3位地址输入线,用于选通8路模拟输入中的一路;
      (4) ALE:地址锁存允许信号输入端,高电平有效;
      (5) START:A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使ADC0809复位,下降沿启动A/D转换);
      (6) EOC:A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平);
      (7) OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量;
      (8) CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ;
      (9) REF(+)、REF(-):基准电压;
      (10) Vcc:电源,单一+5V;
      (11) GND:接地。
2、ADC0809的主要特性有:
      (1) 8路输入通道,8位A/D转换器,即分辨率为8位;
      (2) 具有转换起停控制端;
      (3) 转换时间为100μs;
      (4) 单个+5V电源供电;
      (5) 模拟输入电压范围0~+5V,不需零点和满刻度校准;
      (6) 工作温度范围为-40~+85摄氏度;
      (7) 低功耗,约15mW。
3、ADC0809的工作过程:
      首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。

    对于AD采样的模块就到这了,后面内容更加精彩。

四、数码管显示电路设计
1、显示器结构与原理以及显示方式
LED显示块是由发光二极管显示字段的显示器件,也称为数码管。在单片机中通常使用的是7段LED。这种显示块有共阳极和共阴极两种,共阳极LED显示块的发光二极管阳极并联(系统中接驱动电源)。当某个发光二极管阴极为低电平时,发光二极管点亮;共阴极LED显示块的发光二极管阴极共地。当某个发光二极管的阳极为高电平时,发光二极管点亮。通常使用的7段显示块有8个二极管组成,故也称8段显示器。其中7个发光二极管构成7笔字型“8”;一个发光二极管构成小数点“.”。7段发光二极管,再加上一个小数点,共计8段,这样提供给LED显示器的字形数据正好一个字节。LED显示块与单片机接口非常容易,只要将一个8位并行输出口与显示块的发光二极管引脚相连即可。8位并行输出口输出不同的字节数据可显示不同的数字或字符。7段LED显示器如图所示。




                                                                   图9


7段LED显示器图

4位LED显示器有4根位选线和32根段选线。根据显示方式不同,位选线与段选线的连接方法不同。段选线控制要显示什么样的字符,而位选线则控制要在哪—位上显示这个字符。LED显示有静态显示和动态显示两种方式。本设计采用4位LED动态显示方式。
4位LED动态显示电路只需要两个4位I/O口。其中一个控制段选码,另一个控制位选。由于所有位的段选码皆由一个4位I/O口控制,因此,在每个瞬间,4位LED可能显示相同的字符。要想每位显示不同的字符,必须采用扫描显示方式,即在每一瞬间只使某一位显示相应字符。在此瞬间,段选码由控制I/O口输出相应字符电平,位选I/O口输出位选码(共阴极送低电平、阳极送高电平)以保证位显示相应字符。如此轮流,使每位显示该位应显示字符,并延时一段时间,以造成视觉暂留效果。

2 显示驱动器MAX7219
MAX7219是串行输入/输出共阴极显示驱动器。它采用了3线串行接口,传送速率达到10M数据,能驱动8位七段数字型的LED或条形显示器或64只独立的 LED。MAX7219内置BCD码译码器、多路扫描电路、段和数字驱动器和存储每一位的8×8静态RAM。能方便的用模拟或数字方法控制段电流的大小,改变显示器的亮度;能对每一位进行译码或不译码控制;能选择驱动显示器的数量;能进入低功耗的关断模式(仅消耗150uA电流,数据保留);而且其最重要的一点是,每个显示位都能个别寻址和刷新,而不需要重写其他的显示位,这使得软件编程十分简单且灵活。
MAX7219的引脚排列如图所示。


图 10MAX7219引脚图

MAX7219采用串行寻址方式,在传送的串行数据中包含有内部RAM的地址。加在 DIN脚上的串行数据,必须在LOAD信号为高电平的前提下,以每两个字节为一个数据包在CLK信号上升沿移入16位的移位寄存器。然后在LOAD信号的上升沿锁存进数字或控制寄存器中。LOAD信号必须在第16个CLK信号上升沿的同时,或在下一个 CLK信号上升沿之前升高,否则,数据会丢失。DIN脚上的串行数据在16.5个CLK信号后出现在 DOUT脚上,以便级连应用时传到下一个MAX7219上。

MAX7219和单片机的接口电路
如图3-15所示为AT89C51单片机和MAX7219的连接图。用单片机AT89C51的P口中的P2.0、P2.1、P2.2,分别和MAX7219的DIN、CLK、LOAD相连,MAX7219的段输出A-DP,分别和共阴极数码管的A-DP相连。位驱动DIG0和数码管的地端COM1脚相连,位驱动DIG1和数码管的地端COM2脚相连,位驱动DIG2和数码管的地端COM3脚相连,位驱动DIG3和数码管的地端COM4脚相连。

五、电源模块的简单介绍
    电源是一个好产品的心脏,所以只有电源做好了,才能做出好的产品,鹰哥来给大家简单阐述一下这个项目的电源。虽然鹰哥主攻软件,但是对硬件也是有点小研究的。

+3V稳压源的设计
+3V电压的实现需要LM317芯片。LM317作为输出电压可变的集成三端稳压块,是一种使用方便、应用广泛的集成稳压块。输出电压范围为1.2V到37V之间可调节;内部有热过载保护;不随温度变化的内部短路电流限制;输入至少要比输出高2V,否则不能调压;输出电流最好不超过1A;可调整输出电压可低到1.2V。
用LM317实现+3V稳压电源,提供传感器工作电压。其稳压示意图如图所示。


图11LM317稳压示意图
+5V稳压源的设计
该稳压电源的设计需要芯片MAX756。MAX756是CMOS升压DC-DC开关小型,低输入电压或电池供电的系统监管芯片。MAX756可接受一个输入电压低至0.7V,并将其转换为更高3.3V或5V可选的输出电压。典型的全负荷的MAX756效率大于87%。
其关键特性是,输入电压为0.7V;20mA的效率为87%;静态电流为60μA;20μA的关闭模式;温度误差±1.5%;低电池最检波器 (LBI/LBO);8-Pin SO封装。用MAX756实现+5V的稳压电路如图所示。   

图12   MAX756稳压电路图

-5V稳压源的设计
该稳压电源的设计采用芯片ICL7660来实现。LCL7660有8个引脚。其中的NC是空脚;CAP+是储能电容正极;CAP-是储能电容负极;LV是输入低电压控制端,输入电压低于3.5V时,该脚接地,输入电压高于5V时该脚必须悬空;OSC是作时钟输入端。采用ICL7660芯片实现-5V稳压电源的电路如图所示。

                                                图13
   电源部分也讲解完了,现在要讲解鹰哥最擅长的软件部分了,不要走开,精彩马上到来。
(未完待续,下一节程序设计讲解)




吴鉴鹰. 发表于 2014-6-11 11:15

本帖最后由 吴鉴鹰. 于 2014-6-13 08:57 编辑

4.吴鉴鹰单片机实战项目精讲(连载)之燃气报警器的制作——软件设计

/******************************************************
*程序:可燃性气体报警器                                                   
** 这一讲的主要内容: 可燃性气体报警器的设计和制作                                                                                 
** 功能描述:
** 输 入:         
** 内容:   
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22

备注:有什么错误的地方,欢迎各大烧友指正

O(∩_∩)O~
*******************************************************/
#include <reg51.h>      // 引用标准库的头文件
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int

sbit DIN = P2^0;   // 串行数据输入
sbit CLK = P2^1;   // 串行时钟
sbit LOAD = P2^2;   // 显示数据锁存控制
sbit SOUND = P1^5;   //用来进行蜂鸣器的报警
sbit ST=P3^6;//启动信号
sbit EOC=P3^3;//转换结束信号,连到外部中断1口,转换结束后进入外部中断
sbit OE=P3^7;//输出使能
#define NoOp   0x00         // 空操作寄存器
#define Digit0 0x01         // 数码管1寄存器
#define Digit1 0x02         // 数码管2寄存器
#define Digit2 0x03         // 数码管3寄存器
#define Digit3 0x04         // 数码管4寄存器
#define Digit4 0x05         // 数码管5寄存器
#define Digit5 0x06         // 数码管6寄存器
#define Digit6 0x07         // 数码管7寄存器
#define Digit7 0x08         // 数码管8寄存器
#define DecodeMode 0x09       // 译码模式寄存器
#define Intensity 0x0a         // 亮度寄存器
#define ScanLimit 0x0b      // 扫描位数寄存器
#define ShutDown 0x0c         // 低功耗模式寄存器
//#define DisplayTest 0x0f      // 显示测试寄存器
#define ShutdownMode 0x00      // 低功耗方式
#define NormalOperation 0x01   // 正常操作方式
#define ScanDigit 0x07         // 扫描位数设置,显示8位数码管
#define DecodeDigit 0xff         // 译码设置,8位均为BCD码
#define CommonDigit 0x00            // 译码设置,8位均为非译码方式
#define IntensityGrade 0x0a      // 亮度级别设置
#define TestMode 0x01            // 显示测试模式
#define TextEnd 0x00             // 显示测试结束,恢复正常工作模式

float result; //这是AD采样采得的数据
ucharMAX,MIN; //这是报警极的最低值和不报警的最大值
uint f;
/**********************************************************************
** 函数名称:SendChar
** 功能描述:向MAX7219写入字节(8位)
** 输 入:ch :要送入的数据
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块: 延时函数_nop_
**
** 作 者:   吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
***********************************************************************/
void SendChar(uchar ch)
{
   uchar i,temp;
   _nop_();    //短暂的延时
   for (i=0;i<8;i++)
   {
temp=ch&0x80;
   ch=ch<<1;
      if(temp)    //当该位为1时写入
      {
         DIN=1;
            CLK=0;
         CLK=1;
      }
      else   //当该位为0时写入
      {
         DIN=0;
         CLK=0;
         CLK=1;
      }
   }
}

/***********************************************************************
** 函数名称:changestyle
** 功能描述:译码功能,将需要显示的数字转成相应的七段译码表
            如要显示的字符为“0”,则为7e ---0111 1111,就中间的一个LED不亮
** 输 入:    p:要转换的数据
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:   吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
***********************************************************************/
uchar changestyle(uint p)
{
   uchar c;
   if(p==0) c = 0x7e;
   if(p==1) c = 0x30;
   if(p==2) c = 0x6d;
   if(p==3) c = 0x79;
   if(p==4) c = 0x33;
   if(p==5) c = 0x5b;
   if(p==6) c = 0x5f;
   if(p==7) c = 0x70;
   if(p==8) c = 0x7f;
   if(p==9) c = 0x7b;
       return(c);
}

/***********************************************************************
** 函数名称:delayms
** 功能描述:译码功能,将需要显示的数字转成相应的七段译码表
            如要显示的字符为“0”,则为7e ---0111 1111,就中间的一个LED不亮
** 输 入:    ms:需要延时的长度
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:   吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
***********************************************************************/
void delayms(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}

/***********************************************************************
** 函数名称:WriteWord
** 功能描述:向MAX7219写入字(16位)
** 输 入:    addr:需要延时的长度
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:   吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
***********************************************************************/
/* 向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
    LOAD=0;      
    _nop_();
    SendChar(addr);
    _nop_();
    SendChar(num);
    _nop_();
    LOAD=1;    // 锁存进相应寄存器
}
/* MAX7219初始化 */
void InitDisplay ()
{
   WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
   WriteWord (DecodeMode,CommonDigit);      // 设置译码模式为非译码模式
   WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式
}
/***********************************************************************
** 函数名称:show
** 功能描述:显示函数,其中Fdata为状态为第一位,Sdata状态为第二位,Tdata为状态为第三位。
   Fdata为状态为第四位。degdata为显示的具体数值degdata 为4位例如23.21(要求degdata输入格式)
** 输 入: FdataSdataDdataHdata
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
***********************************************************************/
void show(float degdata,uint Fdata,Sdata,Ddata,Hdata)
{
       uint a,b,c,d;   //a为10位值,b为个位值,c为小数点后1位值,d为小数点后2位值,e为临时数据
    InitDisplay ();   // MAX7219初始化
    _nop_();         //延时一小会
    a=degdata/10;   
    b=(degdata-a*10)/1;
    c=(degdata-a*10-b)*10;
    d=(degdata-a*10-b-c*0.1)*100;
    a=changestyle(a);
    b=changestyle(b);
    c=changestyle(c);
    d=changestyle(d);
    b=b|0x80;
       WriteWord(Digit0,a);
       WriteWord(Digit1,b);
       WriteWord(Digit2,c);
       WriteWord(Digit3,d);
       WriteWord(Digit4,Fdata);
       WriteWord(Digit5,Sdata);
       WriteWord(Digit6,Ddata);
       WriteWord(Digit7,Hdata);
}
/***********************************************************************
** 函数名称:KEY
** 功能描述:按键检测程序,实现检测标准的修改
** 输 入:
**         
**      
** 输 出:MAX , MIN
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
***********************************************************************/
void KEY()
{
   if(P0&0X01)
   {
      EA = 0;
      delayms(30);
   if(P0&0X01)
   {
      MAX ++;
   }
   EA = 1;
   }
   else if(P0&0X02)
   {
       EA = 0;
       delayms(30);
       if(P0&0X02)
    {
       MAX--;
    }
    EA = 1;
   }
   else if(P0&0X04)
   {
       delayms(30);
       if(P0&0X04)
    {
       MIN++;
    }
   }
   else if(P0&0X08)
   {   EA = 0;
       delayms(30);
       if(P0&0X08)
    {
       MIN--;
    }
    EA = 1;
   }
}
/***********************************************************************
** 函数名称:shutshow
** 功能描述:用来熄灭所有的数码管
** 输 入:
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
******************************************************************/
void shutshow()            //数码管不显示函数
{
   WriteWord(0x0c,0x00); //向低功耗模式寄存器(地址为0X0c)写入全1值(上电状态)用来熄灭显示器
}

main()
{
   TMOD=0x02;//T1工作模式2
TH0=0x14;   //定时器初始值高位
TL0=0x00;
IE=0x82;   //IE.7位为1表示CPU开放中断,IE.1位也为1,表示允许定时器T0溢出中断
TR0=1;         //使能定时器
P1=0x00;//选择ADC0809的通道1(000)(P1.0~P1.2)   


    // IT1=0;       //低电平触发
    IT1=1;          //下降沿触发
    EX1=1;   //使能外部中断1
    EA=1;      //允许全局中断

WriteWord(0x0f,0x00);//退出测试模式
WriteWord(0x0a,0x03);//调解亮度,16级可选择,用于设置LED的显示亮度,从0xX0~0xXF

delayms(1000);
show(88.89,0x01,0x01,0x01,0x01);
delayms(1000);
while(1)
{
   ST=0;ST=1;ST=0;//启动A/D转换
      while(EOC==0);//等待转换完成
OE=1;
if(f==1)
{
   delayms(1000);                   // 延时1s
   if(result > MAX) SOUND = 0;       //这里的60是设定的报警极限值,当超过该值时开始报警
   if(result < MIN) SOUND = 1;    //没达到报警值,无动作
   show(result,0x01,0x01,0x01,0x01); //显示ad转换后的电压值
   delayms(1000);
}
else
{                                     //这是鹰哥的风格,不管几句话都加上大括号,这样看起不会乱
   show(0x01,0x01,0x01,0x01,55.55);   //如果初始化未成功则显示55.55
}
//Display_Result(P3);
OE=0;
KEY();
}
}

/***********************************************************************
** 函数名称:counter1
** 功能描述:当数据采集完毕,出发单片机的外部中断进行数据的存储显示以及报警
** 输 入:
**         
**      
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:   14.02.22
**-------------------------------------------------------------------------------------------------------
** 修改人:吴鉴鹰
** 日 期:
**------------------------------------------------------------------------------------------------------
*******************************************************************/
voidcounter1(void) interrupt 2 using 2
{
   
   EX1=0;
   result = P0;
   EX1=1;
}



Cresta 发表于 2014-6-12 00:07

吴鉴鹰. 发表于 2014-6-12 07:54

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=1693585&amp;ptid=439979" target="_blank"><font color="#999999">Cresta 发表于 2014-6-12 00:07</font></a></font><br />
这不是在发烧友论坛分享的么</blockquote>
</div>

<p><br />
:)为了让更多的人看到,所以也在这里分享了!!!</p>

peter_ly 发表于 2014-6-12 13:01

好贴 ,mark,以后慢慢看。

吴鉴鹰. 发表于 2014-6-13 08:51

本帖最后由 吴鉴鹰. 于 2015-1-12 09:14 编辑

5、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的电子秤的设计

需要相关硬件原理图的请点击下载:




   有读者有疑问,怎么吴鉴鹰介绍的都是硬件和软件的结合,而且内容还讲的那么细,觉得很罗嗦,亲们不要急,在以后的章节中,一些现在工业常用的项目技巧我会逐步与大家分享,到时候可能针对某些特定的知识点单独分享!谢谢亲们的支持和理解!
       今天,吴鉴鹰来给大家讲述第四讲,就是日常生活中很常见的电子秤的设计,这个东西貌似很简单,其实要做一个稳定性高,精度高的电子秤也不是一个简单的事情。
首先鹰哥来给电子秤的做个简单的介绍:


图1
       电子称是什么,讲的专业点就是:利用物体的重力作用来确定物体质量的测量仪器,也可用来确定与物体质量相关的其他量的大小,参数,或特性
用我们自己话讲就是测重量的。

图2

       电子称一般由以下三部分组成。承重、传力复位系统,称重传感器,测量显示和数据输出的的载荷测量装置。当被称物体放置在秤体的秤台上时,其重量便通过秤体传递到称重传感器,传感器随之产生力-电效应,将物体的重量转换成与被称物体重量成一定函数关系(一般成正比关系)的电信号(电压或电流等)。此信号由放大电路进行放大、经滤波后再由模/数(A/D)器进行转换,数字信号再送到微处器的CPU处理,CPU不断扫描键盘和各种功能开关,根据键盘输入内容和各种功能开关的状态进行必要的判断、分析、由仪表的软件来控制各种运算。运算结果送到内存贮器,需要显示时,CPU发出指令,从内存贮器中读出送到显示器显示,我们这里显示采用是12864,其实真实显示应该不会用这个,鹰哥在这里主要是跟大家分享12864驱动程序的编写
。一般地信号的放大、滤波、A/D转换以及信号各种运算处理都在仪表中完成。

图3
电子秤介绍鹰哥就介绍到这了,下面开始硬件部分的介绍了。
      首先,鹰哥给大家从该设计的最前端讲起了,先是信号的采集,在这里就是所测得物体的重量,将物体的重量转化成我们MCU能测量的电压信号。

      本设计采用SP20C-G501电阻应变式传感器,其最大量程为7.5 Kg.称重传感器由组合式S型梁结构及金属箔式应变计构成,具有过载保护装置。由于惠斯登电桥具诸如抑制温度变化的影响,抑制干扰,补偿方便等优点,所以该传感器测量精度高、温度特性好、工作稳定等优点,广泛用于各种结构的动、静态测量及各种电子秤的一次仪表。该称重传感器主要由弹性体、电阻应变片电缆线等组成,其工作原理如图所示




图4
传感器工作原理
其工作原理:用应变片测量时,将其粘贴在弹性体上。当弹性体受力变形时,应变片的的敏感栅也随之变形,其阻值发生相应的变化,通过转换电路转换为电压或电流的变化。由于内部线路采用惠更斯电桥,当弹性体承受载荷产生变形时,输出信
号电压可由下式所示:

    Eout = R2R4×(ΔR1/R1+ΔR2/R2+ΔR3/R3+ΔR4/R4)/(R2+R4) (这是传感器的知识,感兴趣可以找下相关的资料)
放大电路介绍:
       主要由高精度低漂移运算放大器构成差动放大器,而构成的前级处理电路差动放大器具有高输入阻抗,增益高的特点,可以利用普通运放做成一个差动放大器。
一般说来,集成化仪用放大器具有很高的共模抑制比和输入阻抗,因而在传统的电路设计中都是把集成化仪器放人器作为前置放人器。然而,绝人多数的集成化仪器放大器,特别是集成化仪器放大器,它们的共模抑制比与增益相关:增益越高,共模抑制比越大。而集成化仪器放大器作为心电前置放大器时,由于极化电压的存在,前置放大器的增益只能在几十倍以内,这就使得集成化仪器放大器作为前置放大器时的共模抑制比不可能很高。有同事问过鹰哥试图在前置放大器的输入端加上隔直电容(高通网络)来避免极化电压使高增益的前置放大器进入饱和状态,但由于信号源的内阻高,且两输入端不平衡,隔直电容(高通网络)使等共模干扰转变为差模干扰,结果适得其反,严重地损害了放大器的性能。
为了实现信号的放人,其设计电路如图所示:

图 5

1. 前级采用运放Al和A2组成并联型差动放大器。理论上不难证明,存运算放大器为理想的情况下,并联型差动放人器的输入阻抗为无穷人,共模抑制比也为无穷人。更值得一提的是,在理论上并联型差动放人器的共模抑制比与电路的外围电阻的精度和阻值无关。
2. 阻容耦合电路放存由并联型差动放大器构成的前级放大器和由仪器放大器构成的后级放大器之间,这样可为后级仪器放大器提高增益,进而提高电路的共模抑制比提供了条件。同时,南于前置放大器的输出阻抗很低,同时又采用共模驱动技术,避免了阻容耦合电路中的阻、容元件参数不对称(匹配)导致的共模干扰转换成差模干扰的情况发生。
3
. 后级电路采用廉价的仪器放大器,将双端信号转换为单端信号输出。由于阻容耦合电路的隔直作用,后级的仪器放大器可以做到很高的增益,进而得到很高的共模抑制比。

图6
可见康华光版的模电pg36页的介绍:VR1= V1 - V2和VR1/R1 = (V3-V4)/(2R2+R1),顾得
V3-V4 = (2R2+R1)×VR1/R1 = (1+2R2/R1)×(V1-V2)
    由减法电路:VO =R4(Vi2-Vi1)/R1,可得
       VO = -R4×(V3-V4)/R3= -R4×(1+2R2/R1)×(V1-V2)/R3
所以电路的电压增益为:
AV = VO/(V1-V2)=-R4×(1+2R2/R1)/R3
在鹰哥的这个设计里面,将数据代入得到:
AV = -20×(1+2×4)/10 = -18
AD采样模块:
    在检测系统中,传感器将采集到的信号(例如:我们这个项目中,信号就是瓦斯的浓度),这些信号都是模拟信号,将这些模拟信号进行处理,放大、滤波、补偿、以及信号的变换等方式,然后在案通过某些芯片将模拟信号变成数字信号,这里我们用ADC0809将传感器转化的电压进行数字化,然后再传递给MCU,也就是51单片机。一定会有人问我,为什么采用这么低档次的51单片机,精确度如此低的ADC0809,鹰哥告诉你,一个好的项目并不是采用的芯片越高档就越好,而且对于初学者,档次越低的芯片,学到的东西越多,所以大家不要嫌弃51单片机低级,也不要嫌弃ADC0809芯片不够先进。
      相信鹰哥,只要你能把ADC0809用好,别的AD转换芯片也没有问题。
鹰哥来给大家简单介绍一下ADC0809芯片。

图7
ADC0809芯片简单介绍
       当时鹰哥采用的是ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件,。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。芯片的引脚图如图所示:
1、ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。下面说明各引脚功能。
      (1) IN0-IN7:8路模拟量输入端;
      (2) D0-D7:8位数字量输出端;
      (3) ADD-A、ADD-B、ADD-C:3位地址输入线,用于选通8路模拟输入中的一路;
      (4) ALE:地址锁存允许信号输入端,高电平有效;
      (5) START:A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使ADC0809复位,下降沿启动A/D转换);
      (6) EOC:A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平);
      (7) OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量;
      (8) CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ;
      (9) REF(+)、REF(-):基准电压;
      (10) Vcc:电源,单一+5V;
      (11) GND:接地。
2、ADC0809的主要特性有:
      (1) 8路输入通道,8位A/D转换器,即分辨率为8位;
      (2) 具有转换起停控制端;
      (3) 转换时间为100μs;
      (4) 单个+5V电源供电;
      (5) 模拟输入电压范围0~+5V,不需零点和满刻度校准;
      (6) 工作温度范围为-40~+85摄氏度;
      (7) 低功耗,约15mW。
3、ADC0809的工作过程:
      首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
    对于AD采样的模块就到这了,后面内容更加精彩。
显示部分:
本项目采用12864液晶屏显示,由于 IO口资源不够用,所以只能采用串口驱动,可以节约大量的IO口资源,不要说鹰哥是小气啊,其实是IO口不够。

图 8


图9
这是实物图片,左边是用AT89C51做的,右侧和下面的是移植到C8051F020单片机上面的。

图10

图11


人机界面:
由于电子秤需要设置单价(十个数字键),还具有确认、删除等功能,总共需设置17个键(包括一个复位键)。键盘的扩展有使用以下方案:
采用矩阵式键盘:矩阵式键盘的特点是把检测线分成两组,一组为行线,一组列线,按键放在行线和列线的交叉点上。图2-4给出了一个4×4的矩阵键盘结构的键盘接口电路,图中的每一个按键都通过不同的行线和列线与主机相连这。4×4矩阵式键盘共可以安装16个键,但只需要8条测试线。当键盘的数量大于8时,一般都采用矩阵式键盘。结合本设计的实际要求,16个按键使用4×4矩阵式键盘,另外四个键使用独立式按键实现。

图12


电源模块:采用7805,7905,7812和7912组成稳压电路
   7805,7905固定式三端稳压器可输出±5V,固定式三端可调稳压器7812和7812组装电路可对称输出±12v,其电路图如图所示
由三端可调式稳压器和三端固定式稳压器共同组成,所用器件比方案一多,但电路组装简单,不会增添麻烦,在方案二中可直接得到+5v和±12的输出电压.
使用时比较方便。



图   13

YOy0 发表于 2014-6-13 10:00

关注ING

吴鉴鹰. 发表于 2014-6-13 14:13

资深工程师单片机实战项目精讲(连载),由易到难连续分享

吴鉴鹰. 发表于 2014-6-13 21:52

7、吴鉴鹰单片机实战项目精讲(连载)微机键盘的运用——原理介绍

本帖最后由 吴鉴鹰. 于 2014-6-17 09:47 编辑

7、吴鉴鹰单片机实战项目精讲(连载)微机键盘的运用——原理介绍


有的时候我们总是抱怨键盘太少,做起来太麻烦了,所以就有人就比较聪明,直接运用电脑的键盘,也就是人们常说的“微机键盘”。下面吴鉴鹰就针对这个微机键盘的给大家做简单的介绍,已解决大家的键盘太少之忧,让大家做人机界面更加畅通无阻。

图 1
   本文通过分析微机键盘的工作原理及数据格式, 从单片机应用系统的实际需出发, 对微机键盘与单片机的接口及软件进行了设计。用中断方式实现了微机键盘与单片机之间的通信。

   大家知道微机键盘是微机系统必不可少的外设, 其品种很多, 既有最经常使用的101、102 等键盘, 又有各种适用于金融、证券等领域的小键盘。实际上, 单片机应用系统中也可用微机键盘作为人机交互工具。然而, 由于微机键盘的数据格式较多, 要开发它的完整功能编程量大。因此,在实际使用中, 往往要求厂家做成适合于单片机应用接口要求的特殊键盘, 如R S 一2 32 串口格式, 这对应用是很不方便的。

    本文通过开发实践体会到: 微机键盘应用于单片机系统时, 只要满足实际要求, 硬件电路和软件设计完全可以简化, 并在这方面作了许多工作。
1 键盘功能及数据格式
键盘通过五芯插头与主机系统相连。一条数据线、一条时钟线均是双向的
(既可向系统发键盘数据, 又可接收系统发来的键盘命令), 一条是复位线, 另两条分别是+ SV 电源线和地线。五芯插头的布局如图1 所示。

图 2
微机键盘尽管形式各异, 但一般都符合两种标准川; 一种是Pc / XT 标准, 另一种是AT标准。前者数据位为9 位(较老式), 后者数据n 位, 是较常用的一种标准, 目前许多微机键盘都兼容这一标准。下面对后者作一简要介绍:                           
1.1 键盘功能
键盘通过数据线和时钟线与系统通信, 它接收系统发来的键盘命令码, 送出键盘数据。
在接通电源后键盘首先进行复位等初始化工作, 然后进行键盘扫描, 作好接收命令和发送键盘数据的准备工作。
键盘和系统相互间的数据通信均采用n 位格式的串行方式: 第一位起始位, 第2 一9 位是8 位数据位(低位在前高位在后), 第10 位是奇偶校验位, 第n 位是停止位, 数据的起始位为低电平。系统接收的键盘数据和键盘接收的键盘命令均在移位时钟的下降沿同步输人, 时钟周期为50 u s 。其时序如图2 所示。

2 微机键盘与系统通信帧格式时序

图 3

1.2 键盘命令
键盘命令是由系统发送给键盘的命令码。键盘在接收到这些命令时, 在20 ms 内予以响应, 即送回一个响应(FA ll)。
键盘命令的含义如下:
(l) FFH 复位键盘一一使键盘进行复位和内部自测试操作;
(2)FE H 重新发送一检测到键盘数据错误时, 要求键盘重新输出原来的内容;
(3) F6 H 设置键盘缺省值一一使键盘复位到初始状态, 并停止键盘扫描;
(4) FS H 设置缺省值并停止键盘一一使键盘复位到初始状态, 并停止键盘扫描;
(5) F4 H 启动键盘一一清除键盘输出缓冲器, 并启动键盘扫描和输出数据;
(6) F3 H 设置拍发速率/ 延时参数;
(7) E E H 回响命令一一要求键盘接收到此命令时也回送E E H 予以响应;
(8) E l〕H 置位/ 复位LE D 指示器。

1.3 键盘数据
键盘数据包括键盘扫描码和命令响应码。键盘扫描码是用户按下键盘按键时, 键盘发送给系统的数据, 不同的键其码值是不同的。可通过查阅有关资料〔‘〕或测试获得。命令响
应码则是键盘对系统命令的响应。其含义如下:
(1) FE H 请求重发一一对收到一个奇偶校验错或无效命令时, 请求系统重发命令;
(2) FA H 正常应答一一对任何一个有效的键盘命令, 均以该响应作答;
(3 ) OOH 超限应答一一当用户按键速度超出键盘内缓冲器存放的16 个扫描码时, 发
出该应答;
(4 ) FD H 诊断故障应答一一键盘在自测试过程中, 若有故障则以FD H 应答;
(5) A A I硕诊断正常应答一一键盘在自测试过程中, 若无故障则以A A H 应答;
(6) E E H 回响命令应答一一键盘收到系统的回响命令(E E H ) 时, 也发一个E E H 作
答;
(7 ) FO H 断开扫描码前缀字节一一断开扫描码占两个字节, 第一个字节总是刊H , 第
二个字节和接通扫描码相同。

2、接口及软件设计
微机键盘与单片机的接口如图
3 所示。

图4
在此对单片机无特殊要求, 可采用

A T ME L 公司的AT89 C5 1 单片机, 其指令系统和IN J、E L 公司的MCS -51 系列单片机完全兼容。单片机Pl.7 连数据线1)A T,P3.2 (IN ,I’0 )连时钟C LK。微机键盘与单片机只有建立正常的通信关系, 才能控制键盘及处理键盘数据
。因此在软件设计上本文着重于介绍键盘数据的接收、键盘命令的发送、键盘的自检和复位这三部分。在软件设计时键盘命令只需使用一个,即初始化键(F FH )。对键盘数据的接收不作奇偶校验, 以简化编程。
2.1 键盘数据的接收
键盘数据的接收用IN TO 外部中断方法来实现; 在时钟线C LK 为低电平时产生一次中断, 读取数据线D A I,一位数据。键盘通过时钟线C L K 产生n 个时钟脉冲, 使单片机产生1 次中断, 才接收完一帧信息。中断次数的识别由单元E IC 来完成,E IC 的初值为1 1, 每中断一次减1。当E IC 为0 时, 表明一帧信息接收完, 同时禁止外部中断(E XO = O)、禁止键盘发数据(C LK = 0 )、置数据接收完成标志bR ()K = 1 并使E IC 的初值为1 1 。
键盘数据存放单元在K B D 中; 其初值为# o fh, 每中断一次数据线1)A T 向K B D 左移一位数据, 同时K B D 也左移出一位, 当检测到K丑D 左移出起始位“ 0 ” 时, K B D 中的内容即为要接收的键盘数据。当主程序处理完键盘数据K BD 后, 为了接收下一帧信息, 应置C LK= 1,EXO = 1 及
bR O K = 0。
2.2.2 键盘命令的发送
键盘命令的发送采用刊中断方法来实现; 每次中断, 都对时钟线C LK 求反, 以产生n个脉冲, 把发送缓冲区SB L、S13H 中的信息经数据线1〕A T 送给键盘。
中断次数由单元T IC来控制, T IC 的初值为2, 每中断一次减1。当T IC 为0 时, 一帧n 位信息发送完, 置D A T= 1、CL K = 1、命令发送完成标志b R ()K = 1, 置T IC 的初值为2, 并禁止定时器工作(T R O= 0 ), 为发送键盘命令或接收键盘数据作好准备。
由SB H、SB L 组成的发送缓冲区, 用于存放要发送的一帧n 位信息。其中S 13H 为高字
节,SB L 为低字节, 一帧信息在该缓冲区中的存放格式如图4 所示。

图 5

其中: d0 位为一帧信息的起始位;
功,d7 一d l 为键盘命令(田为最高位,d1 为最低位) ;D l 为奇偶校验位;砚为停止位;其余未定义。如单片机时钟频率为12 M llz , 定时器工作方式1, 要确保键盘对时钟周期为5 0 u s 的要求, 则时间常数取值为TL0 = # ocdh,THO = # offh。

页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 资深工程师单片机实战项目精讲(连载),由易到难连续分享