这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 资深工程师单片机实战项目精讲(连载),由易到难连续分享

共78条 1/8 1 2 3 4 5 6 ›| 跳转至

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

助工
2015-01-07 13:50:43     打赏

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


友情提示:如果想及时查看本连载贴分享的内容,请关注微信公众号:单片机精讲吴鉴鹰 随时随地都可以查看项目分享

搜索微信公众号:单片机精讲吴鉴鹰 或者微信扫一扫


Hi!大家好,我叫吴鉴鹰,100%中国制造,长181cm,净重70kg。采用人工智能,各部分零件齐全,软硬件运转稳定,经二十多年的运行,属质量信得过产品。是一名从业10多年的单片机工程师,长年从事单机、DSP、fpga、PLC以及触摸屏的项目开发,自信比牛顿更懂单片机、比诸葛亮更会玩DSP、比汉武大帝懂得什么是指针,这年头就得玩一个综合实力。(以上的话,绝非自我夸奖,仅供娱乐


人还不错吧!除了长得帅点,也没什么缺点!哈哈......(估计有人想扇鉴鹰了,还骂道:打你个臭不要脸的)
闻得eepw上有一批志同道合之士,愿意一道交流技术,于是花以时日浏览之,果然不乏卧虎藏龙之辈,鉴鹰深感钦佩,感谢这些前辈同行能够分享自己的项目经验和学习心得。也通过这些有技术含量的帖子博客获益不少。
回想当年鉴鹰刚刚大学本科毕业不久,进入一家大型国企,保守传统思想——“教会徒弟,饿死师傅”这种陋习的影响,只能靠自己死磕书本,硬啃项目慢慢才取得一点进步。所以后来干脆辞职再次回到电子科技大学读了三年研究生!为了让现在毕业的毕业的年轻人不要重蹈鉴鹰当年的覆辙,我也愿意将自己多年积累的一点经验分享给大家,想让更多的年轻人看到,获得一点点帮助就足矣!


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

欢迎各位看官,各位同仁能够客观指出其中的问题,鉴鹰一定及时改进。


1、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的数字电子钟设计(一)——硬件介绍

http://forum.eepw.com.cn/thread/267046/1#2

2、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的数字电子钟设计(二)——源代码设计

http://forum.eepw.com.cn/thread/267046/1#3

3、吴鉴鹰单片机实战项目精讲(连载)之摇摇棒的制作(一)——硬件介绍

http://forum.eepw.com.cn/thread/267046/1#4

4、吴鉴鹰单片机实战项目精讲(连载)之摇摇棒的制作(二)——源程序介绍

http://forum.eepw.com.cn/thread/267046/1#5

5、吴鉴鹰单片机项目详细解析系列连载之基于单片机的电子秤设计(一)——硬件原理介绍

http://forum.eepw.com.cn/thread/267046/1#10

6、吴鉴鹰单片机项目详细解析系列连载之基于单片机的电子秤设计(二)——源代码设计介绍

http://forum.eepw.com.cn/thread/267046/2#16

7、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的微机键盘的运用(一)——原理介绍

http://forum.eepw.com.cn/thread/267046/2#17

8、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的微机键盘的运用(二)——相关的程序编写

http://forum.eepw.com.cn/thread/267046/2#18

9、吴鉴鹰单片机项目详细解析系列(连载)如何提高单片机的抗干扰能力(一)

http://forum.eepw.com.cn/thread/267046/2#19

10、吴鉴鹰单片机项目详细解析系列(连载)如何提高单片机的抗干扰能力(二)

http://forum.eepw.com.cn/thread/267046/2#20

11、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的超声波测距仪设计(一)——硬件设计一

http://forum.eepw.com.cn/thread/267046/3#23

12、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的超声波测距仪设计(二)——硬件设计二

http://forum.eepw.com.cn/thread/267046/3#24

13、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的超声波测距仪设计(三)——软件设计(一)

http://forum.eepw.com.cn/thread/267046/3#30

14、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的超声波测距仪设计(四)——软件设计(二)

http://forum.eepw.com.cn/thread/267046/4#31

15、吴鉴鹰单片机项目详细解析系列(连载)之卡通人物12864显示(一)

http://forum.eepw.com.cn/thread/267046/4#34

16、吴鉴鹰单片机项目详细解析系列(连载)之卡通人物12864显示(二)——源程序代码

http://forum.eepw.com.cn/thread/267046/4#35

17、吴鉴鹰单片机项目详细解析系列(连载)之美女人物12864显示(一)——原理介绍

http://forum.eepw.com.cn/thread/267046/5#43

18、吴鉴鹰单片机项目详细解析系列(连载)之美女人物12864显示(二)——源程序代码

http://forum.eepw.com.cn/thread/267046/5#44

19、吴鉴鹰单片机项目详细解析系列(连载)之12864的正弦波的显示(一)——原理图

http://forum.eepw.com.cn/thread/267046/5#45

20、吴鉴鹰单片机项目详细解析系列(连载)之12864的正弦波的显示(二)——源程序

http://forum.eepw.com.cn/thread/267046/5#49

21、吴鉴鹰单片机项目详细解析系列(连载)之12864的武术动画的显示(一)——展示

http://forum.eepw.com.cn/thread/267046/5#50

22、吴鉴鹰单片机项目详细解析系列(连载)之12864的武术动画的显示(二)——程序设计

http://forum.eepw.com.cn/thread/267046/6#51











关键词: 资深工程师     吴鉴鹰     单片机     实战项目     连载    

助工
2015-01-07 13:55:42     打赏
2楼

1、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的数字电子钟设计(一)——硬件介绍

 

相关硬件原理图点击下载:

吴鉴鹰单片机项目详细解析系列之基于单片机的数字时钟设计原理图.pdf

 

 

现在来第一讲,详细解析如何制作基于单片机的数字时钟,提供详细的硬件原理图和软件程序。
      开关K1K1 = 0时,时钟正常运行,此时不允许调整时钟。数码管的高两位显示小时,后两位显示分钟,led每闪一次表示时钟运行一次,在调整的过程中,led是停止发亮的。
一、 按键、开关功能说明:
      *  按键RESET:按下能复位程序。
      *  按键PULSE:提供单脉冲,从而实现单片机对外部脉冲的计数,利用单脉冲实现相应的位加一。
      *  开关K0K0 = 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

 


助工
2015-01-07 14:10:08     打赏
3楼

2、吴鉴鹰单片机实战项目精讲(连载)之基于单片机的数字电子钟设计(二)——源代码设计

 

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


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


O(∩_∩)O~
*******************************************************/
//变量定义和头文件的调用
//定义头文件和各个输入管脚以及变量声明
#include
#include
#define  uint unsigned int
#define  uchar  unsigned char




/*定义字型字位口*/
#define  DIGPORT  XBYTE  [0X8000]
#define  WORDPORT  XBYTE [0X4000]


/*定义P1口各管脚*/
sbit  K0 = P1^0;
sbit  K1 = P1^1;
sbit  K2 = P1^2;
sbit  BEEP = P1^3;
sbit  L0 = P1^4;
sbit  L1 = P1^5
sbit  L2 = P1^6;
sbit  L3 = P1^7;


uchar  data  BUFFER[2]  = {0,0};  //显示的缓存数组,依次为低位、高位
uchar  data  CLOCK[4] = {0,0,0,0};
uchar  data  SECOND[2] = {0,0};


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


bit  bdata  SND = 0;    /*  秒表START(开始)  */
bit  bdata  RST = 0;     /*秒表RESET(复位)*/


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


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


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


O(∩_∩)O~
*******************************************************/
void  main()
{
      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] = 0;
                    SECOND[1] = 0;
                }break;


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


                case  6:
               {
                    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[0] = SECOND[0];
         BUFFER[1] = SECOND[1];
      }break;
      
      case 5:
      {
          BUFFER[0] = CLOCK[2];
          BUFFER[1] = 101;/*A-*/
      }break;
      
      case 6:
      {
          BUFFER[0] = 110;/*A-*/
          BUFFER[1] = CLOCK[3];
      }break;
      
      default:
      {
          BUFFER[0] = CLOCK[2];
          BUFFER[1] = CLOCK[3];
      }break;

 

 

 

 

 


助工
2015-01-07 14:23:53     打赏
4楼

3、吴鉴鹰单片机实战项目精讲(连载)之摇摇棒的制作(一)——硬件介绍

 

相关原理图点击下载:

吴鉴鹰摇摇棒原理图.pdf

 

 

鉴鹰的摇摇棒具有如下功能:
   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)水银开关
水银开关,又称倾侧开关,是电路开关的一种,以一接著电极的小巧容器储存著一小滴水银,容器中多数注入惰性气体或真空。
   
  仔细观察水银开关,实际上他是一个封闭的玻璃管,里面有两个分开着的导线和一段水银球,当玻璃管的平衡位置变化时,水银球会来回移动,当水银球移动到两根导线时,因水银是金属-导体,故电路变为通路,此时接收器处于工作状态;反之,水银球远离两根导线时为断路,此时接收器处于非工作状态。
本设计采用震动开关代替水银开关,试验测试发现,水银开关多次高频率的接通断开后触点会氧化,容易接触不良,因此改用下面的震动开关。

 

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


 


助工
2015-01-07 14:28:41     打赏
5楼

4、吴鉴鹰单片机实战项目精讲(连载)之摇摇棒的制作(二)——源程序介绍

/******************************************************
*程序:摇摇棒的设计程序                                                      
** 这一讲的主要内容: 吴鉴鹰摇摇棒的设计和制作                                                                                  
** 功能描述:  
** 输 入:         
** 内容:     
** 输 出: 
**         
** 全局变量:
** 调用模块: 
**
** 作 者:    吴鉴鹰
** 日 期:     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 code  dayday[] = {
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 code  LiuShiShi[] = {
/*--  文字:  刘  --*/
/*--  楷体_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[disp*128+i*2];
      P2=~hanzi[disp*128+i*2+1];
      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[i*2];
      P2=~love[i*2+1];
      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[i*2];
      P2=~loveyou[i*2+1];
      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[i*2];
      P2=~hehe[i*2+1];
      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[i*2];
      P2=~dayday[i*2+1];
      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[i*2];
      P2=~damogu[i*2+1];
      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[disp*128+i*2];
      P2=~womenbiye[disp*128+i*2+1];
      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[i*2];
      P2=~LiuShiShi[i*2+1];
      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[disp*128+i*2];
      P2=~Ytzgzj[disp*128+i*2+1];
      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*****/

 

 


院士
2015-01-07 14:33:52     打赏
6楼
插一腿,不错哦

工程师
2015-01-07 19:37:25     打赏
7楼
加精了哟,多谢高工分享

高工
2015-01-07 19:40:33     打赏
8楼

牛x

前排就坐


院士
2015-01-07 21:00:12     打赏
9楼
楼主的动画做得不错啊,自我推介也颇费心计的,顶一个。

助工
2015-01-08 09:07:31     打赏
10楼

5、吴鉴鹰单片机项目详细解析系列连载之基于单片机的电子秤设计(一)——硬件原理介绍

 

 原理图请点击下载:吴鉴鹰基于单片机的电子秤设计原理图.pdf

 

 

   有读者有疑问,怎么吴鉴鹰介绍的都是硬件和软件的结合,而且内容还讲的那么细,觉得很罗嗦,亲们不要急,在以后的章节中,一些现在工业常用的项目技巧我会逐步与大家分享,到时候可能针对某些特定的知识点单独分享!谢谢亲们的支持和理解!

   今天,吴鉴鹰来给大家讲述第四讲,就是日常生活中很常见的电子秤的设计,这个东西貌似很简单,其实要做一个稳定性高,精度高的电子秤也不是一个简单的事情。

首先鹰哥来给电子秤的做个简单的介绍: 

 1

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

用我们自己话讲就是测重量的。

 

 2

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

 3

  电子秤介绍鹰哥就介绍到这了,下面开始硬件部分的介绍了

   首先,鹰哥给大家从该设计的最前端讲起了,先是信号的采集,在这里就是所测得物体的重量,将物体的重量转化成我们MCU能测量的电压信号。

  

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





 5

传感器工作原理

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

号电压可由下式所示:

    Eout = R2R4×(ΔR1/R1+ΔR2/R2+ΔR3/R3+ΔR4/R4)/(R2+R4) (这是传感器的知识,感兴趣可以找下相关的资料)

放大电路介绍:

   主要由高精度低漂移运算放大器构成差动放大器,而构成的前级处理电路差动放大器具有高输入阻抗,增益高的特点,可以利用普通运放做成一个差动放大器。

    一般说来,集成化仪用放大器具有很高的共模抑制比和输入阻抗,因而在传统的电路设计中都是把集成化仪器放人器作为前置放人器。然而,绝人多数的集成化仪器放大器,特别是集成化仪器放大器,它们的共模抑制比与增益相关:增益越高,共模抑制比越大。而集成化仪器放大器作为心电前置放大器时,由于极化电压的存在,前置放大器的增益只能在几十倍以内,这就使得集成化仪器放大器作为前置放大器时的共模抑制比不可能很高。有同事问过鹰哥试图在前置放大器的输入端加上隔直电容(高通网络)来避免极化电压使高增益的前置放大器进入饱和状态,但由于信号源的内阻高,且两输入端不平衡,隔直电容(高通网络)使等共模干扰转变为差模干扰,结果适得其反,严重地损害了放大器的性能。 

为了实现信号的放人,其设计电路如图所示:

                                     6

1. 前级采用运放AlA2组成并联型差动放大器。理论上不难证明,存运算放大器为理想的情况下,并联型差动放人器的输入阻抗为无穷人,共模抑制比也为无穷人。更值得一提的是,在理论上并联型差动放人器的共模抑制比与电路的外围电阻的精度和阻值无关。

2. 阻容耦合电路放存由并联型差动放大器构成的前级放大器和由仪器放大器构成的后级放大器之间,这样可为后级仪器放大器提高增益,进而提高电路的共模抑制比提供了条件。同时,南于前置放大器的输出阻抗很低,同时又采用共模驱动技术,避免了阻容耦合电路中的阻、容元件参数不对称(匹配)导致的共模干扰转换成差模干扰的情况发生。

3. 后级电路采用廉价的仪器放大器,将双端信号转换为单端信号输出。由于阻容耦合电路的隔直作用,后级的仪器放大器可以做到很高的增益,进而得到很高的共模抑制比。

                                                   7

可见康华光版的模电pg36页的介绍:VR1= V1 - V2VR1/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芯片。

 

 8

 

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口不够。

 9

 

 

 10

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

 

 

 11

 


                    图 12

人机界面:

由于电子秤需要设置单价(十个数字键),还具有确认、删除等功能,总共需设置17个键(包括一个复位键)。键盘的扩展有使用以下方案:

采用矩阵式键盘:矩阵式键盘的特点是把检测线分成两组,一组为行线,一组列线,按键放在行线和列线的交叉点上。图2-4给出了一个4×4的矩阵键盘结构的键盘接口电路,图中的每一个按键都通过不同的行线和列线与主机相连这。4×4矩阵式键盘共可以安装16个键,但只需要8条测试线。当键盘的数量大于8时,一般都采用矩阵式键盘。结合本设计的实际要求,16个按键使用4×4矩阵式键盘,另外四个键使用独立式按键实现。

 

 13


电源模块:

采用7805,790578127912组成稳压电路

   7805,7905固定式三端稳压器可输出±5V,固定式三端可调稳压器78127812组装电路可对称输出±12v,其电路图如图所示

由三端可调式稳压器和三端固定式稳压器共同组成,所用器件比方案一多,但电路组装简单,不会增添麻烦,在方案二中可直接得到+5v和±12的输出电压.

使用时比较方便。

 

 

 14

 

 


共78条 1/8 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]