用51单片机做一个LED显示的电子钟

最新更新时间:2011-02-16来源: 互联网关键字:LED  驱动  芯片 手机看文章 扫描二维码
随时随地手机看文章

#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="ME-400-A clock";
uchar code table1[]="    --:--:--    ";
uchar code table2[]="ALL:00:00:-- ";
uchar code table3[]="    ";
uchar clk_time[3];  //秒,分,时寄存器初始值
sbit T_RST=P2^2;//ds1302-5
sbit T_IO=P2^3;//ds1302-6
sbit T_CLK=P2^4;//ds1302-7
sbit en=P2^5;     //参照LCD1602说明档,使能信号
sbit rw=P2^6;     //。。。。。。。。,读写信号端(输入高电频时为读,低电为写)
sbit rs=P2^7;     //。。。。。。。。,数据/命令选择端(H/L)
sbit led=P1^0;
sbit dula=P1^1;
sbit wela=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit up=P3^3;
sbit down=P3^4;
sbit set=P3^2;
sbit did=P1^4;
uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hour,mie,sei,c,nhour,nmie,shour,smie;
/******************DS1302:写入操作(上升沿)*********************/

void write_byte(uchar da)
{
   uchar i;
   ACC=da;
   for(i=8;i>0;i--)
   {
      T_IO=ACC0;
   T_CLK=0;    
      T_CLK=1;
      ACC=ACC>>1;
   }
}

/******************DS1302:读取操作(下降沿)*****************/
uchar read_byte(void)
{
   uchar i;
   for(i=0;i<8;i++)
   {
      ACC=ACC>>1;
   T_CLK = 1;
   T_CLK = 0;
      ACC7 = T_IO;
   }
   return(ACC);

}

/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(uchar addr,uchar da)
{
   T_RST=0;    //停止工作
   T_CLK=0;                //只有在CLK为低电平时,才能将RST置为高电平,然后才能传输数据                
   T_RST=1;   //重新工作
   write_byte(addr);    //写入地址
  
   write_byte(da);
   T_RST=0;
   T_CLK=1;
}

/******************DS1302:读取数据(先送地址,再读数据)**************************/
uchar read_1302(uchar addr)
{
   uchar temp;
   T_RST=0;                                   //停止工作
   T_CLK=0; 
   T_RST=1;                         //重新工作
   write_byte(addr);   //写入地址
   temp=read_byte();
   T_RST=0;
   T_CLK=1;     //停止工作
   return(temp);
}

/***********************延时程序=a*1ms**************************************/
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void fn()
   {
             did=0;
    delay(120);
   did=1;
    delay(120);
       did=0;
    delay(120);
    did=1;
    delay(120);
             did=0;
    delay(120);
    did=1;
    delay(120);
             did=0;
    delay(320);
             did=1;
    delay(400);
   }
void write_com(uchar com)
{
    led=1;
 wela=1;
    P0=0xff;
    delay(1);
    led=0;
     wela=0;
    P0=0x00;
     dula=1;
     delay(1);
     dula=0;
    rs=0;
 P0=com;
 delay(5);
 en=1;
 delay(5);
 en=0;
}

void write_data(uchar date)
{
 led=1;
 wela=1;
    P0=0xff;
    delay(1);
    led=0;
     wela=0;
    P0=0x00;
     dula=1;
     delay(1);
     dula=0;
    rs=1;
 P0=date;
 delay(5);
 en=1;
 delay(5);
 en=0;
}
void morning()
  {   shour=clock_ss*10+clock_sg;
            smie=clock_fs*10+clock_fg;
    if(b==0)
     {
     if(nhour==shour)
     {
    if(smie>=nmie)
       {
      fn();
    }
         }
     }
 
 
  }
void init()
{  
    b=0;
    P0=0xff;
    delay(5);
    led=1;
    delay(5);
    P0=0xff;
    led=0;
 dula=0;
 wela=1;
     delay(5);
    wela=0;//关ME-400开发板数码管
 nhour=0;
 nmie=0;
    rw=0;
 en=0;
 write_com(0x38);//设置液晶
 write_com(0x0c);//设光标等
 write_com(0x06);//写一个字符地址指针加1且光标加1
 write_com(0x01);//清屏
 write_com(0x80);//设置s地址指针
}
void display(uchar add,date)
{      
   if(b==0)
     {
        clock_ms=clk_time[0]/ 16;  clock_mg=clk_time[0]%16;
        led=0;
        clock_fs=clk_time[1]/ 16;  clock_fg=clk_time[1]%16;
        led=0;
        clock_ss=clk_time[2]/ 16;   clock_sg=clk_time[2]%16;
       write_com(0x80+0x44);
       write_data(0x30+clock_ss);
       write_com(0x80+0x45);
       write_data(0x30+clock_sg);
       write_com(0x80+0x47);
       write_data(0x30+clock_fs);
       write_com(0x80+0x48);
       write_data(0x30+clock_fg);
       write_com(0x80+0x4a);
       write_data(0x30+clock_ms);
       write_com(0x80+0x4b);
       write_data(0x30+clock_mg);
 
     }
   if(b!=0)
     {
  clock_s=date/ 10;  clock_g=date%10;
        write_com(0x80+0x40+add);
        write_data(0x30+clock_s);
        write_data(0x30+clock_g);  
  }
 
}
void key()
 {
   uchar clock_s1, clock_s2, clock_f1, clock_f2;
   rw=0;

   if(set==0)
      {
  delay(10);
          if(set==0)
                {
           did=0;
               delay(10); did=1;
      b++;
         
          }
              while(!set);
    
        if(b==1)
  {
    hour=clock_ss*10+clock_sg;
            mie=clock_fs*10+clock_fg;
    write_com(0x80+0x45);
          write_com(0x0f);

  }
     if(b==2)
    {
      write_com(0x80+0x48);
           
 
    }
          if(b==3)
           {
    write_com(0x80+0x40);
    for(num=0;num<13;num++)
    {
     write_data(table2[num]);
    
    }

            
    write_com(0x80+0x45); display(4,nhour);write_com(0x80+0x45);
           }
     if(b==4)
      {

                     write_com(0x80+0x48);
                    display(7,nmie); write_com(0x80+0x48);

      }
     if(b==5)
    {
                 write_com(0x80+0x40);
    for(num=0;num<4;num++)
    {
     write_data(table3[num]);
    
    }
      write_com(0x80+0x45);
           write_com(0x0c);
            b=0;
     clock_s1=hour/10;//十进制转十六进制
           clock_s2=hour%10;//十进制转十六进制
           clock_s1=clock_s1&0xff;//十进制转十六进制
     clock_s2=clock_s2&0xff;//十进制转十六进制
           clock_s1<<=4;//十进制转十六进制
           clock_s1=clock_s1|clock_s2;//十进制转十六进制
     
           clock_f1=mie/10;//十进制转十六进制
           clock_f2=mie%10;//十进制转十六进制
           clock_f1=clock_f1&0xff; //全1出1 与运算
     clock_f2=clock_f2&0xff;//十进制转十六进制
           clock_f1<<=4;//十进制转十六进制
           clock_f1=clock_f1|clock_f2;//十进制转十六进制
   
    write_1302(0x8e,0x00);             //WP=0 写操作
    write_1302(0x80,0x00);//写秒
    write_1302(0x82,clock_f1);//写分
    write_1302(0x84,clock_s1);//写时
             write_1302(0x86,0x14);//写日
    write_1302(0x88,0x02);//写月
    write_1302(0x8a,0x06);//写星期
             write_1302(0x8c,0x09);
    write_1302(0x8e,0x80); //WP=1 写保护
 
   
            }  
        }
  if(b!=0)
      {
     if(up==0)
        {
       delay(10);
      if(up==0)
       {
         did=0;
                    delay(10);
                       did=1;
                         while(!up);
                     if(b==1)
        {
       
          hour++;
        if(hour>=24)
          {
        delay(1);
        hour=0;
       }
                           display(4,hour);
                   write_com(0x80+0x45);

      }
                  if(b==2)  
                     {
         mie++;

       if(mie>=60)
         {
       mie=0;
      }
           display(7,mie);
          write_com(0x80+0x48);
            }
                   if(b==3)
        {
       
          nhour++;
        if(nhour>=24)
          {
        delay(1);
        nhour=0;
       }
                           display(4,nhour);
                   write_com(0x80+0x45);

      }
                if(b==4)  
                     {
         nmie++;

       if(nmie>=60)
         {
       nmie=0;
      }
           display(7,nmie);
          write_com(0x80+0x48);
            }
       }
                
    }
   
   if(down==0)
        {
       delay(10);
      if(down==0)
       {
         did=0;
                     delay(10);
                       did=1;
                     while(!down);
                        if(b==1)
      {
        hour--;
        if(hour<0)
          {
 
         hour=23;
       }
                           display(4,hour);
          write_com(0x80+0x45);

      }
                        if(b==2)
                       { 
                             mie--;
            if(mie<0)
               {
                 mie=59;
            }
                    display(7,mie);
          write_com(0x80+0x48);
               }
                    if(b==3)
      {
        nhour--;
        if(nhour<0)
          {
 
         nhour=23;
       }
                           display(4,nhour);
          write_com(0x80+0x45);

      }
                        if(b==4)
                       { 
                             nmie--;
            if(nmie<0)
               {
                 nmie=59;
            }
                    display(7,nmie);
          write_com(0x80+0x48);
               }
    
                    }
  
           }
         }
        }          

void main()
{
   uchar  temp=0x80;         
   uchar i;
 init();
 for(num=0;num<14;num++)
 {
  write_data(table[num]);
  delay(100);
 }

 write_com(0x80+0x40); //  设置数据地址指针为0X40
 for(num=0;num<15;num++)
 {
  write_data(table1[num]);
 
 }
 /*for(num=0;num<16;num++)
 {
  write_com(0x18);
  delay(20);
 }*/
 write_1302(0x8e,0x00);
 write_1302(0x90,0xa4);
 write_1302(0x8e,0x80);
 while(1)
     {
   
    if(b==0)

   { temp=0x81;                   
      for(i=0;i<3;i++)
    {
      clk_time[i]=read_1302(temp);
   temp+=2;
   }
   display(0x4b,0x00);
   }
  
morning();
key();

  }
}

关键字:LED  驱动  芯片 编辑:探路者 引用地址:用51单片机做一个LED显示的电子钟

上一篇:低噪声16通道恒流LED驱动器【德州仪器】
下一篇:LED日光灯亮度与传统荧光灯比较

推荐阅读最新更新时间:2023-10-18 15:06

Intel撑腰、展讯芯片将采14纳米FinFET
     联发科(2454)、台积电(2330)小心了!中国手机晶片厂展讯(Spreadtrum)获得英特尔(Intel)加持后如虎添翼,高层放话明年发布的行动晶片将找英特尔代工,采用14奈米FinFET制程。 EETimes 27日报导,展讯执行长李力游(Leo Li)接受EETimes专访透露,展讯2016年推出的高低阶行动晶片都计画采用英特尔的14奈米FinFET制程。展讯的行动晶片原本由台积电代工。 不仅如此,原本外界猜测,展讯可能会因英特尔入股,放弃ARM架构,投向英特尔怀抱。然而李力游坚称,除非英特尔技术具有竞争力,不然展讯没有义务改用英特尔架构晶片,英特尔不能强迫他们。双方协议没有载明,展讯未来的行
[手机便携]
射频芯片,5G手机里的一颗明珠
据统计,2020年第四季度,我国手机市场继续由4G向5G过渡,5G手机产品款型数占比已达六成。2021年全球智能手机出货量将达约 13.55 亿台,其中 5G 机型将有 5.39 亿台。对于制造而言压力着实不小,5G手机性能的好坏取决于内部的两大芯片——射频(RF)和基带。下面就带您了解一下射频芯片的奥秘。 简单来说,射频芯片的作用就是信息发送和接收。为什么说它如此重要?如果没有它,你的手机就是好几千块钱的大铁块。 先从射频说起,射频就是射频电流,是一种高频交流变化电磁波,是可以辐射到空间的电磁频率,频率范围在300KHz~300GHz之间。每秒变化小于1000次的交流电称为低频电流,大于10000次的称为高频电流,
[网络通信]
射频<font color='red'>芯片</font>,5G手机里的一颗明珠
内置SED1520控制驱动器的图形液晶显示模块MGLS-12032在智能测试仪中的应用
    摘要: 文章介绍了内置SED1520图形液晶显示模块MGLS-12032的特点和工作原理,给出了MGLS-12032与8031单片机的接口电路,介绍了SED1520的指令集,并结合具体实例给出了显示模块的相关程序。     关键词: 图形显示 液晶 单片机 SED1520 MGLS-12032 1 SED1520功能特点 SED1520是集行、列驱动器和控制器于一体的液晶显示控制驱动器,可广泛用于小规模液晶显示模块,例如香港精电公司的MGLS-12032、MGLS10032等。 SED1520液晶显示驱动器具有以下特性: ●内置显示RAM区,RAM容量为2560位。RAM中的1位数据控
[电源管理]
一款E类功率放大芯片性能测试电路的设计
1.引言 随着无线通信技术的发展,功率放大器作为发射机最重要的部分之一,它的性能好坏直接影响着整个通信系统的性能优劣,而功率放大器性能好坏的判决和芯片检测有关。本文介绍了一款E类功率放大芯片性能测试电路的设计,简介了检测中用到的实验设备、器材,并给测试电路加上各种测试信号后观察显示结果,对输出结果进行分析从而判定芯片是否合格。 2.E类功率放大器原理 射频功率放大器是将直流信号转变为射频信号的功率器件,衡量一个射频放大器性能的主要参数有:最大输出功率、效率、线性度、增益等等。功率放大器可 以划分为几类,这取决于它们是宽带还是窄带、它们的目的是为了线性工作还是恒包络工作。线性功率放大器有四种类型:A、B、AB、C,
[电源管理]
一款E类功率放大<font color='red'>芯片</font>性能测试电路的设计
Windows98下硬件中断驱动程序的开发
摘 要: 介绍了Windows98的内核管理机制和应用程序权限级别,简述了在Windows98下进行虚拟驱动程序开发的几种工具和编程方法,并给出了借助VToolsD用C++语言编写的处理硬件中断的程序实例。 关键词: 虚拟设备驱动程序 VToolsD 中断服务例程 美国微软公司出品的Windows98以其友好的图形用户界面,在我国赢得了广泛的市场。在给广大办公环境工作人员带来方便的同时,也给不少工程技术人员带来了一些麻烦。一些原本在DOS下很容易编出的控制硬件的程序,现在在Windows98下就不那么容易实现了。作为一个完善的操作系统也必须能控制硬件,象DOS那样直接与硬件打交道是Windo
[嵌入式]
三星暂缓芯片厂扩建 台积电16nm完胜三星14nm制程
  半导体设备商透露,三星近期已通知设备相关协力厂,暂缓逻辑芯片厂扩建脚步,主因三星考量旗下14纳米制程遭台积电16纳米完封,短期接单状况欠佳,若在此时继续投资扩厂,恐面临产能大量闲置窘境,对三星相对不利。   至截稿前,无法取得三星回应。业界分析,若三星放缓逻辑芯片扩建脚步,反映台积电16纳米制程气势如虹,几乎已确定苹果下世代处理器A10代工大单落袋,是台积电在先进制程技压三星的一大胜利。   此外,三星逻辑芯片新产能若延后开出,也有助化解一旦产能大量开出后,竞价抢单的疑虑,藉此维持代工价格稳定,让市场在健康机制下运作。   市场看好,随着苹果订单持续增加,台积电今年将扩大资本支出,主要用于加速
[半导体设计/制造]
Vishay推出业界最小的芯片级MOSFET
  日前,Vishay Intertechnology, Inc.宣布推出两款MICRO FOOT功率MOSFET --- Si8461DB和Si8465DB,最大尺寸为1mm x 1 mm x 0.548mm,是迄今为止业界最小的芯片级功率MOSFET。   在种类繁多的便携式设备中,20V的P沟道Si8461DB和Si8465DB可用于负载开关、电池开关和充电开关应用。器件的小尺寸和薄厚度有助于减少电源管理电路所占用的空间,以及/或是实现更多的功能。与市场上尺寸与之最接近的芯片级功率MOSFET相比,1mm x 1mm x 0.548mm的MICRO FOOT的占位小9%。   在4.5V栅极驱动下,Si8461D
[电源管理]
蔚来汽车首颗自研芯片面向智能座舱:三星7nm工艺,华为海思老将负责
9 月 18 日消息,蔚来汽车正在进行自研芯片布局,蔚来汽车硬件副总裁白剑上个月在社交平台发文称:“未来一两年内,AD 芯片为首的一些关键芯片会自研量产。”现在,更多相关爆料消息来了。 据 HiEV 大蒜粒车研所今日报道,蔚来自研的首颗芯片将面向智能座舱。知情人士称,蔚来第一颗自研芯片采用 7nm 制程工艺,将由三星代工,其芯片团队的研发负责人来自华为海思。 相比目前大热的自动驾驶芯片,智能座舱芯片领域的竞争确实较为低调,市面上不少汽车厂商都选择高通座舱芯片,而自研座舱芯片有望让蔚来汽车的车机互联更加融合,刚好搭配即将推出的蔚来手机。 根据蔚来官方公布的数据,截至 2023 年一季度,蔚来在全球已申请、公开和授权超 6000 件专
[汽车电子]
小广播
最新电源管理文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved