专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于单片机的秒,分,时可调时钟的设计

作者:刘世解   来源:本站原创   点击数:  更新时间:2010年12月01日   【字体:

      今天主要做我喜欢的单片机,哦,顺便简单介绍下我学的专业吧! 呵呵!我所学专业名字叫“自动化”怎么样,听上去还可以吧!其实当是报志愿的时候也不知具体是学什么的。经过两三年的摸索才大致知道了我应该重点学什么,怎么学,将来参加后能干什么。说实话还真难摸索啊!两年多才明白了一二,也许这就是当初高中时没好好学上二流大学的惩罚吧!不过还好了现在很喜欢这个专业,怎么介绍这个自动化呢,感觉挺高科技的,其实也没什么,大家在现实生活中都能看到,社会上的很多作业流程都是尽可能的实现自动控制,一个按钮按下从最初的原材料就能得到想要的产品。我们所学就是怎样让它实现,其中的各个环节是怎样起作用的,最后将各个环节数字化实现用以计算机为核心控制并显示的一些整套系统,不过一整套系统不可能一个人都学会全部搞定的,能搞通期中一个环节就可以算是高手了!~呵呵

     这个学期接触到了单片机,算是个微处理机,是把计算机的部分功能集成化了的。在生活中随处可见:想厨房用的电磁炉内就集成了单片机的控制,客厅挂的数字万年历也是用单片机实现的!经过了解后,我对此产生了极大的兴趣。下面简单展示一个我做的基于单片机的实验,望在这方面有研究的一起分享学习哈!


   这个是用Proteus做的硬件设计,对单片机有兴趣大概都用过吧!另外还有软件程序,如果把这个硬件比作人的外观和手脚(是的还可以控制步进电机伺服系统再用电机去控制一些操作的话就更像机器人了)。那么软件程序就好比是人的大脑。下面我也把自己编的程序展示一下吧!望高手指点:是用C语言编的

     本程序要实现秒,分,时的精确计时,另外P1角也就是单片机的左边还有三个按钮可实现时、分、秒的调时。图上没有显示!下面先贴出一部分代码来由于篇幅有限完整的代码从http://www.51hei.com/ziliao/file/shiz5.rar 下载~
#include <reg51.h>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,};
unsigned char disbitcode[]={0X00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};//经38译码器片选数码管
unsigned char disbuf[8]={0,0,0,0,0,0,0,0};//八次循环逐个片选导通并显示。
sbit OE=P2^6;
sbit LE=P2^7;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;

void delay(unsigned int N)
{
 while(N--);
}
void getbuff()
{
  disbuf[0]=second%10;
  disbuf[1]=second/10;
  disbuf[2]=10;
  disbuf[3]=minite%10;
  disbuf[4]=minite/10;
  disbuf[5]=10;
  disbuf[6]=hour%10;
  disbuf[7]=hour/10;
}
void display()
{
 unsigned char i=0;
 for(i=0;i<8;i++)
   {
   LE=1;
   P3=disbitcode[i];         //经38译码器依次片选
   P0=dispcode[disbuf[i]];   //将相应值送入P0口
   OE=0;
   delay(500);
   } 
}
void key()
{
  
    if(K1==0)
  {
   delay(5000);
   if(K1==0)
    {
     second++;
            if(second==60)
    {
     second=0;
     
    }
  while(K1==0);
    }
   
  }
 if(K2==0)
  {
   delay(5000);
   if(K2==0)
    {
     minite++;
            if(minite==60)
    {
     minite=0;
     
    }
  while(K2==0);
    }
   
  }
 if(K3==0)
  {
   delay(5000);
   if(K3==0)
    {
     hour++;
            if(hour==24)
    {
     hour=0;
    }
  while(K3==0);
    }
  
  }    
  
}
void t0() interrupt 1 using 0
{
  tcnt++;
  if(tcnt==4000)
   {
    tcnt=0;
    second++;
    if(second==60)
      {
       second=0;
       minite++;
       if(minite==60)
          {
            minite=0;
            hour++;
            if(hour==24)
              {hour=0;}
          }
      }
    }
}
void main()
{
 TMOD=0x02;
 TH0=0x06;
 TL0=0x06;
 TR0=1;
 ET0=1;
 EA=1;
 second=0;
 minite=0;
 hour=0;
 tcnt=0;
 
 while(1)
 {
   key();
   getbuff();
   display();
 }
}

        经过近两个月的努力探索,还是有一点小小的成就感!确实我也做出点东西!相对现在来说是简单的事了!于是就想着做点复杂的有用的,唉!做起来真难!发现自己想做出产品来还差的远啊,之前所做的都应归为实验阶段的东西,拿不出手的啊!现在开始具体的做东西时发现之前学的东西太虚了,在高手面前甚至根本不能说自己学过更不必说会了!

        于是我觉得学东西一定要亲历亲为,不能放过一些关键细节,想想当有人问你你会什么技能的时候!你是否能底气十足的说我是个高手呢!呵呵!在学技术时,一定要自己狠一点,要学的东西弄得越透彻越好!不能对自己有宽容,不能打折扣!

      事情往往是麻烦之后才会变的简单!就像武林高手那样无招胜有招!哈哈!~

关闭窗口

相关文章