• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

资深工程师实战项目征服单片机精讲【连载】

资深工程师实战项目征服单片机精讲【连载】

温馨提示:可以关注微信公众号:单片机精讲吴鉴鹰,随时随地学习本项目的连在分享。



 

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

      闻得elecinfo上有一批志同道合之士,愿意一道交流技术,于是花以时日浏览之,果然不乏卧虎藏龙之辈,鉴鹰深感钦佩,感谢这些前辈同行能够分享自己的项目经验和学习心得。也通过这些有技术含量的帖子博客获益不少。         

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

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

 

 

第一讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——硬件简介

第二讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——源代码介绍

第三讲:吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的摇摇棒制作(一)——原理介绍

 

 

 

 

 

 

全部回复(25)
正序查看
倒序查看
2015-01-06 09:13
鉴鹰你好,欢迎来到电源网的单片机论坛,占个沙发期待后面的心得分享~·
0
回复
qiang7260
LV.5
3
2015-01-06 09:32
@电源网-娜娜姐
鉴鹰你好,欢迎来到电源网的单片机论坛,占个沙发期待后面的心得分享~·

支持吴老师在电源网开贴,在其他网站看到过吴老师的教程,很丰富对我帮助很大。-

给吴老师提个建议:来这的网友以电源方面为主。可否吴老师讲些数控/数调电源,数控充电器,数控LED

方面的案例。

0
回复
yzmkf
LV.1
4
2015-01-06 12:19
新生报到
0
回复
aninstone
LV.4
5
2015-01-06 17:24
占座听讲 我倒是很想重倒你的覆辙
0
回复
吴鉴鹰
LV.1
6
2015-01-07 09:23
@电源网-娜娜姐
鉴鹰你好,欢迎来到电源网的单片机论坛,占个沙发期待后面的心得分享~·
谢谢娜娜姐的支持,一定分享跟多有技术价值,原创的内容。
0
回复
吴鉴鹰
LV.1
7
2015-01-07 09:34

     第一讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——硬件简介

 

相关原理图请点击下载:

吴鉴鹰基于单片机的数字电子钟.pdf

 

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

      其实吧, 人还不错,出了长点帅点以外,也没什么缺点

      在校期间,曾参加学校组织的电子设计大赛,一不小心获得了一等奖,于是代表学校参加全省的电子设计大赛,一不小心碰上强敌,虽获得一等奖,但并未拿到当年的最高奖项,所见,人外有人,天外有天于是更加发奋学习,以图他日能技艺超群,闻得电子发烧友有一大帮志同道合之士,愿意一同切磋武艺,于是花以时日浏览之,果然不泛有卧虎藏龙之辈,吴某深感钦佩。

      从大学二年级起,尾随恩师混迹于各大实验室,也算小有技术心得,现在愿意与大家一块分享两年的项目经验,我相信只有交流才能促进发展,只有讨论才能提升能力,恳请各位前辈同行斧正。    

     现在来第一讲,详细解析如何制作基于单片机的数字时钟,提供详细的硬件原理图和软件程序。      

    开关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。

 

0
回复
2015-01-07 09:36
@吴鉴鹰
谢谢娜娜姐的支持,一定分享跟多有技术价值,原创的内容。[图片]
客气了,坛子里对这块感兴趣的朋友挺多的,之前也掀起了一股单片机学习热,您来了应该会更热闹~~~
0
回复
2015-01-07 09:41
欢迎吴老师来到电源网。技术分享赞一个
0
回复
吴鉴鹰
LV.1
10
2015-01-07 09:43

   第二讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——源代码介绍

 

/******************************************************
*程序:吴鉴鹰数字电子钟的设计                                                           
** 这一讲的主要内容: 数字电子钟的设计原理和程序                                                                                
** 功能描述:  
** 输 入:         
** 内容:     
** 输 出: 
**         
** 全局变量:
** 调用模块: 
**
** 作 者:    吴鉴鹰
** 日 期:     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(STATE)
        {
                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;
      
      default:
      {
          BUFFER[0] = CLOCK[2];
          BUFFER[1] = CLOCK[3];
      }
      
      }
      
     //显示函数
     display();
     K0 = 1;
     K1 = 1;
     K2 = 1;
     STATE = P1&0X07;    
     }
     stabak = STATE;
    }
}

/******************************************************
*程序:子函数(1):timer0(void)                                                                                                                         
** 功能描述:  用定时器0实现24小时的时钟显示
** 输 入:         
** 内容:     
** 输 出: 
**         
** 全局变量:
** 调用模块: 
**
** 作 者:    吴鉴鹰
** 日 期:     14.02.17

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

O(∩_∩)O~
*******************************************************/
void  timer0(void)   interrupt  1  using 1
{
    /*重置定时器初值*/
TH0 = -5000/256;
TL0 = -5000%256;


/*定时器处理*/
CLOCK[0] = CLOCK[0]+1;
if((CLOCK[0] == 50) && (STATE >= 4))
{
    L0 = !L0;
}

if(CLOCK[0] == 100)
{
    if(STATE >= 4)  L0 = !L0;
    CLOCK[0] = 0;
    CLOCK[1] = CLOCK[1] + 1;
    
    if(CLOCK[1] == 60)
    {
       CLOCK[1] = 0;
    CLOCK[2] = CLOCK[2] + 1;
    if(CLOCK[2] == 60)
    {
        CLOCK[2] == 0;
     CLOCK[3] == CLOCK[3] + 1;
     if(CLOCK[3] == 24)
     {
        CLOCK[3] = 0;
     }
    }
    }
}
}

/******************************************************
*程序:子函数(2):intsvr1(void)                                                                                                                        
** 功能描述:  对外中断1的按键脉冲进行判断和计数,并完成对应的时间调整功能。
** 输 入:         
** 内容:     
** 输 出: 
**         
** 全局变量:
** 调用模块: 
**
** 作 者:    吴鉴鹰
** 日 期:     14.02.17

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

O(∩_∩)O~
*******************************************************/
void intsvr1(void) interrupt  2  using 2  
{
   if(STATE == 5)
   {
       CLOCK[2] == CLOCK[2] + 1;
    if(CLOCK[2] == 60)  CLOCK[2] == 0;
   }
   if(STATE == 6)
   {
       CLOCK[3] == CLOCK[3] + 1;
    if(CLOCK[3] == 24)  CLOCK[3] = 0;
   }
}

/******************************************************
*程序:子函数(3):display(void)                                                                                                                        
** 功能描述:  用动态显示的方法,将当前的时间或秒表内容通过数码管显示。
** 输 入:         
** 内容:     
** 输 出: 
**         
** 全局变量:
** 调用模块: 
**
** 作 者:    吴鉴鹰
** 日 期:     14.02.17

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

O(∩_∩)O~
*******************************************************/
void diplay(void)
{
   uchar i;
   uchar delay;
   uchar disp;
   uchar digit;
   digit = 0x08;
   for(i = 0;i < 2; i++)
   {
      if(BUFFET> 100)  
{
   disp = BUFFER%10 + 10;
}
   else  disp = BUFFER%10;
   
   DIGPORT = digit;
   WORDPORT = TABLE[disp];
   
   for(delay = 0;delay <= 200;delay ++);
   digit = digit >> 1;
   disp = BUFFER/10;
   
   DIGPORT = digit;
   WORDPORT = TABLE[disp];
   
   for(delay = 0;delay <= 200;delay ++);
   digit = digit >> 1;
   }
}
 

 

0
回复
2015-01-08 13:37
@吴鉴鹰
   第二讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——源代码介绍 /*******************************************************程序:吴鉴鹰数字电子钟的设计**这一讲的主要内容:数字电子钟的设计原理和程序**功能描述:**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************///变量定义和头文件的调用//定义头文件和各个输入管脚以及变量声明#include#include#defineuintunsignedint#defineucharunsignedchar/*定义字型字位口*/#defineDIGPORTXBYTE[0X8000]#defineWORDPORTXBYTE[0X4000]/*定义P1口各管脚*/sbitK0=P1^0;sbitK1=P1^1;sbitK2=P1^2;sbitBEEP=P1^3;sbitL0=P1^4;sbitL1=P1^5sbitL2=P1^6;sbitL3=P1^7;uchardataBUFFER[2]={0,0};//显示的缓存数组,依次为低位、高位uchardataCLOCK[4]={0,0,0,0};uchardataSECOND[2]={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(){ucharstabak;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(STATE){case0:{EX1=0;ET1=1;ET2=1;TR1=1;SND=1;L1=1;L0=0;L2=0;SECOND[0]=0;SECOND[1]=0;}break;case5:{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){case0:{BUFFER[0]=SECOND[0];BUFFER[1]=SECOND[1];}break;case5:{BUFFER[0]=CLOCK[2];BUFFER[1]=101;/*A-*/}break;case6:{BUFFER[0]=110;/*A-*/BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}}//显示函数display();K0=1;K1=1;K2=1;STATE=P1&0X07;}stabak=STATE;}}/*******************************************************程序:子函数(1):timer0(void)**功能描述:用定时器0实现24小时的时钟显示**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidtimer0(void)interrupt1using1{/*重置定时器初值*/TH0=-5000/256;TL0=-5000%256;/*定时器处理*/CLOCK[0]=CLOCK[0]+1;if((CLOCK[0]==50)&&(STATE>=4)){L0=!L0;}if(CLOCK[0]==100){if(STATE>=4)L0=!L0;CLOCK[0]=0;CLOCK[1]=CLOCK[1]+1;if(CLOCK[1]==60){CLOCK[1]=0;CLOCK[2]=CLOCK[2]+1;if(CLOCK[2]==60){CLOCK[2]==0;CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24){CLOCK[3]=0;}}}}}/*******************************************************程序:子函数(2):intsvr1(void)**功能描述:对外中断1的按键脉冲进行判断和计数,并完成对应的时间调整功能。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidintsvr1(void)interrupt2using2{if(STATE==5){CLOCK[2]==CLOCK[2]+1;if(CLOCK[2]==60)CLOCK[2]==0;}if(STATE==6){CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24)CLOCK[3]=0;}}/*******************************************************程序:子函数(3):display(void)**功能描述:用动态显示的方法,将当前的时间或秒表内容通过数码管显示。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voiddiplay(void){uchari;uchardelay;uchardisp;uchardigit;digit=0x08;for(i=0;i<2;i++){if(BUFFET>100){disp=BUFFER%10+10;}elsedisp=BUFFER%10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;disp=BUFFER/10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;}}  
关注加红!
0
回复
苑留记
LV.8
12
2015-01-08 14:55

占个位置

0
回复
2015-01-09 09:32
@苑留记
占个位置
学习,学习!
0
回复
ZYZ
LV.1
14
2015-01-09 15:07
@yueyunno1
学习,学习!
原理图好像有错,P2. 6引脚没有与其他相连。
0
回复
zhuzhu
LV.5
15
2015-01-09 16:44
@吴鉴鹰
   第二讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——源代码介绍 /*******************************************************程序:吴鉴鹰数字电子钟的设计**这一讲的主要内容:数字电子钟的设计原理和程序**功能描述:**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************///变量定义和头文件的调用//定义头文件和各个输入管脚以及变量声明#include#include#defineuintunsignedint#defineucharunsignedchar/*定义字型字位口*/#defineDIGPORTXBYTE[0X8000]#defineWORDPORTXBYTE[0X4000]/*定义P1口各管脚*/sbitK0=P1^0;sbitK1=P1^1;sbitK2=P1^2;sbitBEEP=P1^3;sbitL0=P1^4;sbitL1=P1^5sbitL2=P1^6;sbitL3=P1^7;uchardataBUFFER[2]={0,0};//显示的缓存数组,依次为低位、高位uchardataCLOCK[4]={0,0,0,0};uchardataSECOND[2]={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(){ucharstabak;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(STATE){case0:{EX1=0;ET1=1;ET2=1;TR1=1;SND=1;L1=1;L0=0;L2=0;SECOND[0]=0;SECOND[1]=0;}break;case5:{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){case0:{BUFFER[0]=SECOND[0];BUFFER[1]=SECOND[1];}break;case5:{BUFFER[0]=CLOCK[2];BUFFER[1]=101;/*A-*/}break;case6:{BUFFER[0]=110;/*A-*/BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}}//显示函数display();K0=1;K1=1;K2=1;STATE=P1&0X07;}stabak=STATE;}}/*******************************************************程序:子函数(1):timer0(void)**功能描述:用定时器0实现24小时的时钟显示**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidtimer0(void)interrupt1using1{/*重置定时器初值*/TH0=-5000/256;TL0=-5000%256;/*定时器处理*/CLOCK[0]=CLOCK[0]+1;if((CLOCK[0]==50)&&(STATE>=4)){L0=!L0;}if(CLOCK[0]==100){if(STATE>=4)L0=!L0;CLOCK[0]=0;CLOCK[1]=CLOCK[1]+1;if(CLOCK[1]==60){CLOCK[1]=0;CLOCK[2]=CLOCK[2]+1;if(CLOCK[2]==60){CLOCK[2]==0;CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24){CLOCK[3]=0;}}}}}/*******************************************************程序:子函数(2):intsvr1(void)**功能描述:对外中断1的按键脉冲进行判断和计数,并完成对应的时间调整功能。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidintsvr1(void)interrupt2using2{if(STATE==5){CLOCK[2]==CLOCK[2]+1;if(CLOCK[2]==60)CLOCK[2]==0;}if(STATE==6){CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24)CLOCK[3]=0;}}/*******************************************************程序:子函数(3):display(void)**功能描述:用动态显示的方法,将当前的时间或秒表内容通过数码管显示。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voiddiplay(void){uchari;uchardelay;uchardisp;uchardigit;digit=0x08;for(i=0;i<2;i++){if(BUFFET>100){disp=BUFFER%10+10;}elsedisp=BUFFER%10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;disp=BUFFER/10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;}}  
学习中
0
回复
higel
LV.8
16
2015-01-12 10:57
@吴鉴鹰
   第二讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——源代码介绍 /*******************************************************程序:吴鉴鹰数字电子钟的设计**这一讲的主要内容:数字电子钟的设计原理和程序**功能描述:**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************///变量定义和头文件的调用//定义头文件和各个输入管脚以及变量声明#include#include#defineuintunsignedint#defineucharunsignedchar/*定义字型字位口*/#defineDIGPORTXBYTE[0X8000]#defineWORDPORTXBYTE[0X4000]/*定义P1口各管脚*/sbitK0=P1^0;sbitK1=P1^1;sbitK2=P1^2;sbitBEEP=P1^3;sbitL0=P1^4;sbitL1=P1^5sbitL2=P1^6;sbitL3=P1^7;uchardataBUFFER[2]={0,0};//显示的缓存数组,依次为低位、高位uchardataCLOCK[4]={0,0,0,0};uchardataSECOND[2]={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(){ucharstabak;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(STATE){case0:{EX1=0;ET1=1;ET2=1;TR1=1;SND=1;L1=1;L0=0;L2=0;SECOND[0]=0;SECOND[1]=0;}break;case5:{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){case0:{BUFFER[0]=SECOND[0];BUFFER[1]=SECOND[1];}break;case5:{BUFFER[0]=CLOCK[2];BUFFER[1]=101;/*A-*/}break;case6:{BUFFER[0]=110;/*A-*/BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}}//显示函数display();K0=1;K1=1;K2=1;STATE=P1&0X07;}stabak=STATE;}}/*******************************************************程序:子函数(1):timer0(void)**功能描述:用定时器0实现24小时的时钟显示**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidtimer0(void)interrupt1using1{/*重置定时器初值*/TH0=-5000/256;TL0=-5000%256;/*定时器处理*/CLOCK[0]=CLOCK[0]+1;if((CLOCK[0]==50)&&(STATE>=4)){L0=!L0;}if(CLOCK[0]==100){if(STATE>=4)L0=!L0;CLOCK[0]=0;CLOCK[1]=CLOCK[1]+1;if(CLOCK[1]==60){CLOCK[1]=0;CLOCK[2]=CLOCK[2]+1;if(CLOCK[2]==60){CLOCK[2]==0;CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24){CLOCK[3]=0;}}}}}/*******************************************************程序:子函数(2):intsvr1(void)**功能描述:对外中断1的按键脉冲进行判断和计数,并完成对应的时间调整功能。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidintsvr1(void)interrupt2using2{if(STATE==5){CLOCK[2]==CLOCK[2]+1;if(CLOCK[2]==60)CLOCK[2]==0;}if(STATE==6){CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24)CLOCK[3]=0;}}/*******************************************************程序:子函数(3):display(void)**功能描述:用动态显示的方法,将当前的时间或秒表内容通过数码管显示。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voiddiplay(void){uchari;uchardelay;uchardisp;uchardigit;digit=0x08;for(i=0;i<2;i++){if(BUFFET>100){disp=BUFFER%10+10;}elsedisp=BUFFER%10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;disp=BUFFER/10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;}}  
请继续~ 
0
回复
2015-01-12 11:59
@ZYZ
原理图好像有错,P2.6引脚没有与其他相连。
MARK
0
回复
2015-01-15 09:37
鹰哥讲课我也占个座
0
回复
Temo
LV.5
19
2015-01-15 12:27

顶,来听课

0
回复
2015-01-28 11:43
@Temo
顶,来听课
鹰哥貌似飞走了
0
回复
吴鉴鹰
LV.1
21
2015-03-09 14:48
@电源网-娜娜姐
鹰哥貌似飞走了[图片]
过完年,吴鉴鹰又飞回来了
0
回复
吴鉴鹰
LV.1
22
2015-03-09 14:56

3、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的摇摇棒制作(一)——原理介绍

HI!大家好,我叫吴鉴鹰,100%年中国制造,长181cm,净重70kg。采用人工智能,各部分零件齐全,软硬件运转稳定,经二十多年的运行,属质量信得过产品。是一名从业两年的单片机工程师,长年从事单片机、DSP、fpga以及触摸屏的项目开发,自信比牛顿更懂单片机、比诸葛亮更会玩DSP、比汉武大帝懂得社么是指针,这年头就得玩一个综合实力。   其实吧, 人还不错,出了长点帅点以外,也没什么缺点

   在校期间,曾参加学校组织的电子设计大赛,一不小心获得了一等奖,于是代表学校参加全省的电子设计大赛,一不小心碰上强敌,虽获得一等奖,但并未拿到当年的最高奖项,所见,人外有人,天外有天于是更加发奋学习,以图他日能技艺超群,闻得电子发烧友有一大帮志同道合之士,愿意一同切磋武艺,于是花以时日浏览之,果然不泛有卧虎藏龙之辈,吴某深感钦佩。

   从大学二年级起,尾随恩师混迹于各大实验室,也算小有技术心得,现在愿意与大家一块分享两年的项目经验,我相信只有交流才能促进发展,只有讨论才能提升能力,恳请各位前辈同行斧正。   现在来第二讲,详细解析如何制作基于单片机的摇摇棒,提供详细的硬件原理图和软件程序。   何为摇摇棒,鹰哥老给你们介绍摇摇棒是如今流行的一种玩具,在各种聚会、节日中均见得到它的身影。本设计也追随着摇摇棒的原理,利用人眼的视觉暂留特性,通过AT89S52单片机对16只高亮度LED发光二极管进行控制, 配合手的左右摇晃就可呈现一幅完整的画面。

原理图下载:

吴鉴鹰摇摇棒原理图.pdf  

  鹰哥的摇摇棒具有如下功能:

   1) 显示  “就要离开电子科技大学了!”;

   2) 显示  “o(∩_∩)o”微笑图案;

   3) 显示    心形图案;

   4) 显示  “LOVE”;

   5) 显示  “天天开心”

   6)显示  “笑笑照顾好自己!”

   7)显示   “我们毕业了!”

   8)显示   “周晓晓”

   9) 可以通过开关实现转换,轮流显示并循环。

 

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

 

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

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

 

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

 

 

0
回复
2015-03-10 09:37
@吴鉴鹰
3、吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的摇摇棒制作(一)——原理介绍HI!大家好,我叫吴鉴鹰,100%年中国制造,长181cm,净重70kg。采用人工智能,各部分零件齐全,软硬件运转稳定,经二十多年的运行,属质量信得过产品。是一名从业两年的单片机工程师,长年从事单片机、DSP、fpga以及触摸屏的项目开发,自信比牛顿更懂单片机、比诸葛亮更会玩DSP、比汉武大帝懂得社么是指针,这年头就得玩一个综合实力。   其实吧, 人还不错,出了长点帅点以外,也没什么缺点[图片]。   在校期间,曾参加学校组织的电子设计大赛,一不小心获得了一等奖,于是代表学校参加全省的电子设计大赛,一不小心碰上强敌,虽获得一等奖,但并未拿到当年的最高奖项,所见,人外有人,天外有天于是更加发奋学习,以图他日能技艺超群,闻得电子发烧友有一大帮志同道合之士,愿意一同切磋武艺,于是花以时日浏览之,果然不泛有卧虎藏龙之辈,吴某深感钦佩。   从大学二年级起,尾随恩师混迹于各大实验室,也算小有技术心得,现在愿意与大家一块分享两年的项目经验,我相信只有交流才能促进发展,只有讨论才能提升能力,恳请各位前辈同行斧正。   现在来第二讲,详细解析如何制作基于单片机的摇摇棒,提供详细的硬件原理图和软件程序。   何为摇摇棒,鹰哥老给你们介绍摇摇棒是如今流行的一种玩具,在各种聚会、节日中均见得到它的身影。本设计也追随着摇摇棒的原理,利用人眼的视觉暂留特性,通过AT89S52单片机对16只高亮度LED发光二极管进行控制, 配合手的左右摇晃就可呈现一幅完整的画面。原理图下载:吴鉴鹰摇摇棒原理图.pdf    鹰哥的摇摇棒具有如下功能:   1) 显示  “就要离开电子科技大学了!”;   2) 显示  “o(∩_∩)o”微笑图案;   3) 显示    心形图案;   4) 显示  “LOVE”;   5) 显示  “天天开心”   6)显示  “笑笑照顾好自己!”   7)显示   “我们毕业了!”   8)显示   “周晓晓”   9) 可以通过开关实现转换,轮流显示并循环。 跟大家讲,摇摇棒其实很简单,大学期间,我自己用万用板搭了一个,别人觉得很好玩,就来问我怎么做。其实就是一个循环的LED显示,利用人的视觉滞留产生静态显示的现象。要实现这个目标,就要求延时部分做的比较小,所以采用石英晶体振荡器。而目前能够实现这种功能的器件有很多种,不同的类型的器件也能够很好的完成。     鹰哥的这个作品本着方便、价格低廉的原则,采用单片机控制,由水银开关的闭合对单片机产生外部中断,从而对中断进行采集。到达一定数量便进行图象的转换。[图片]   这是鹰哥当年在大学做的送给女朋友的哦!她玩了好久,还带回去给她老爸看了,所以年轻的工程师可以做一个送给你心爱的姑娘啊![图片]信鹰哥,搞定女神不是梦!    整个系统由单片机控制模块,开关及电源模块和输出显示模块三个部分构成。 [图片] 
追女神的神器啊~福利贴
0
回复
Widey
LV.5
24
2015-03-21 19:49
@电源网-娜娜姐
追女神的神器啊~福利贴[图片]
学习了 
0
回复
吴鉴鹰
LV.1
25
2015-03-24 20:12
@Widey
学习了 
好好学习,做一个送给你心爱的女生吧。
0
回复
2016-02-21 19:37
学习
0
回复