查看: 2823|回复: 1

单片机实战项目【连载】精讲,打造单片机高手

[复制链接]

该用户从未签到

发表于 2014-5-20 16:09:07 | 显示全部楼层 |阅读模式
分享到:
                                                    吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的实战项目

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


                                 
       在校期间,曾参加学校组织的电子设计大赛,一不小心获得了一等奖,于是代表学校参加全省的电子设计大赛,一不小心碰上强敌,虽获得一等奖,但并未拿到当年的最高奖项,所见,人外有人,天外有天于是更加发奋学习,利用课余时间完成电子方面的专利申请10来项,以图他日能技艺超群,闻得电子发烧友有一大帮志同道合之士,愿意一同切磋武艺,于是花以时日浏览之,果然不泛有卧虎藏龙之辈,吴某深感钦佩。
       从大学二年级起,尾随恩师混迹于各大实验室,也算小有技术心得,现在愿意与大家一块分享数年来的项目经验,我相信只有交流才能促进发展,只有讨论才能提升能力,恳请各位前辈同行斧正。

 


 




























































          现在来开始详细解析如何完成各种项目的具体的方法和软硬件,提供详细的硬件原理图和软件程序,欢迎大家来畅所欲言!

          温馨提示:点击相关标题下面的链接即可到相关的项目

1.吴鉴鹰单片机项目详细解析系列之基于单片机的数字时钟

 



需要相关资料的请点击以下链接下载:

 



      

       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。

四、程序源代码

/******************************************************

*程序:吴鉴鹰数字电子钟的设计                                                           

** 这一讲的主要内容: 数字电子钟的设计原理和程序                                                                                

** 功能描述:  

** 输 入:         

** 内容:     

** 输 出: 

**         

** 全局变量:

** 调用模块: 

**

** 作 者:    吴鉴鹰

** 日 期:     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;

      

      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 > 1;

   disp = BUFFER/10;

   

   DIGPORT = digit;

   WORDPORT = TABLE[disp];

   

   for(delay = 0;delay > 1;

   }

}




 


 

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

387.89 KB, 下载次数: 13

回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2014-5-20 16:11:40 | 显示全部楼层

回复:单片机实战项目【连载】精讲,打造单片机高手

 
 
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条



手机版|小黑屋|与非网

GMT+8, 2025-1-11 16:49 , Processed in 0.116873 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.