单片机2408点阵时钟电子制作

发布者:云淡风轻2014最新更新时间:2015-10-26 来源: eefocus关键字:单片机  2408点阵  时钟 手机看文章 扫描二维码
随时随地手机看文章
    这是一个单片机2408点阵时钟电子制作,用单片机直驱点阵,这里用的是STC89C52,驱动能力不是很好,有条件的话用STC12C5A60S,驱动能力已经比较好,屏的亮度会比较高。图中是用STC89C52单片机,直驱三个8*8的共阳点阵屏,亮度还基本可以,白天看都很清楚!P0口需要接上1K的上拉电阻,P1-P3口分别接三个8*8屏的阴极,用去了单片机的全部32个I/O口。为了能调时间,P2口的P2.0-P2.6接屏的1-7列,P2.7口接一个按扭作于调时间,调整方法: 长按一次是进入调时状态,短按是加1,长按二次是调分,短按是加1,长按3次回复正常状态! 感兴趣的爱好者可以动手实践一下,体验一下电子制作点阵时钟的乐趣。

[转载]单片机2408点阵时钟电子制作

 

[转载]单片机2408点阵时钟电子制作


 


//单片机点阵电子钟C语言程序
//MCU:STC89C52RD  晶振频率:12MHZ
//编写:桃源客  日期:2010-06-7
//电子小制作整理http://www.5imcu.net/转载请保留。
#include
#include
#define uchar unsigned char       //宏定义
#define uint  unsigned int

sbit KEY=P2^7;            //时调整键
uchar keymode;          //键状态
uchar keydate;          //键值,
uint  keycount;          //键延时值
unsigned char c=0;       //时分调整位置变量,0不调,1时调时,2时调分
bit D7,D6;              //键值有效,长按标志,
bit  SHAN;               //闪烁标志位
uchar second,minute,hour;        //定义秒、分、时寄存器
//以下字模与ASCII对应是,只要将 'A'-0x20就可以得到A的字模了
//高8*5宽 ASCII码  
//采用"字模提取软件V2.2"
//提取方式:纵向取模,字节倒序
uchar code ASCII86[10][5]=
{
{0x3E,0x41,0x49,0x41,0x3E},//0 
{0x00,0x42,0x7F,0x40,0x00},//1
{0x72,0x49,0x49,0x49,0x46},//2
{0x21,0x41,0x49,0x4D,0x32},//3
{0x18,0x14,0x12,0x7F,0x10},//4
{0x27,0x45,0x45,0x45,0x38},//5
{0x3C,0x4A,0x49,0x49,0x31},//6
{0x41,0x21,0x11,0x09,0x07},//7
{0x36,0x49,0x49,0x49,0x36},//8
{0x46,0x49,0x49,0x29,0x16},//9
};
uchar code seg[24][3]=
{
{0xfe,0xff,0xff},
{0xfd,0xff,0xff},
{0xfb,0xff,0xff},
{0xf7,0xff,0xff},
{0xef,0xff,0xff},
{0xdf,0xff,0xff},
{0xbf,0xff,0xff},
{0x7f,0xff,0xff},
{0xff,0xfe,0xff},
{0xff,0xfd,0xff},
{0xff,0xfb,0xff},
{0xff,0xf7,0xff},
{0xff,0xef,0xff},
{0xff,0xdf,0xff},
{0xff,0xbf,0xff},
{0xff,0x7f,0xff},
{0xff,0xff,0xfe},
{0xff,0xff,0xfd},
{0xff,0xff,0xfb},
{0xff,0xff,0xf7},
{0xff,0xff,0xef},
{0xff,0xff,0xdf},
{0xff,0xff,0xbf},
{0xff,0xff,0x7f}
};  //P1,P3,P2扫描列选码
uchar disbuf[]={0,0,0,0,0,0};//定义缓冲数组区
void delay(uchar t);          //延时函数
void init();              //初始化函数
void display();             //显示函数
[page]
void main()
   
 init();                //调用初始化函数
 P0=0xff; P1=0x00; P3=0x00; P2=0x00;
 for(c=0;c<10;c++) delay(255);
  P1=0xff; P3=0xff; P2=0xff;   //测试点阵屏全亮3秒.
  P0=0x00; P1=0x00; P3=0x00; P2=0x00;
 for(c=0;c<10;c++) delay(255);
  P1=0xff; P3=0xff; P2=0xff;   //测试点阵屏全灭3秒.
  P0=0xff; P1=0x00; P3=0x00; P2=0x00;
 for(c=0;c<10;c++) delay(255);
  P1=0xff; P3=0xff; P2=0xff;   //测试点阵屏全亮3秒.
    P0=0x00; P1=0x00; P3=0x00; P2=0x00;
 for(c=0;c<10;c++) delay(255);
  P1=0xff; P3=0xff; P2=0xff;   //测试点阵屏全灭3秒.
  c=0;
 while(1)               //主程序循环
  {
 switch(keymode)        //键盘处理程序
   {
   case 0x00:
    if(KEY==0)  { keymode=1; keycount=2;}
          break;
   case 0x01:
      if(keycount==0)
    { if(KEY==0)
        { keymode=2; keydate=1;D7=0;} else {keymode=0; break;}
    }
    else
    {
    keycount--;
    break;}
   case 0x02:
        if(KEY==1)
       { keymode=0; D7=1; break;}
     else
     {keymode=3; keycount=50;  break; }
   case 0x03:
        if(KEY==1)
     { keymode=0; D7=1; break;}
    else
     if(keycount==0)
      { keymode=4; D6=1; break; }
    else
    { keycount--; break;}
   case 0x04:
     if(KEY==1)
     {keymode=0; D7=1; break;}
   else
     break;
  
   default: break;
   
  //以下的键值调时间处理
   if(D7==1)
 {
    if(D6==0) { 
  if(c==1) hour++;
    if(hour==24) hour=0;
  if(c==2) minute++;
  if(minute==60) minute=0;
  D7=0; }
    else
  {c++; if(c>2) c=0; D6=0; D7=0;}
  }
  
 
  disbuf[0]=(second);
  disbuf[1]=(second/10);
  disbuf[2]=(minute);
  disbuf[3]=(minute/10);
  disbuf[4]=(hour);
  disbuf[5]=(hour/10);
  display();              //调用显示函数
 
 }
}

void init()
{
 TMOD=1;TH0=0X3C;TL0=0XB0;       //定时器0模式1,50毫秒
 ET0=1;TR0=1;EA=1;           //开定时器0中断、启动定时器0、开总中断
}

void display( )
{
   unsigned char i,j=0;  //j为列位置变量
    
            
               for(i=0;i<5;i++)                                   //时十位
                     {
                      if(disbuf[5]==0) P0=0x00;             //时十分为0时不显示
                              else P0=ASCII86[disbuf[5]];
        P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
                        delay(1);
             P1=0xff; P3=0xff; P2=0xff;
                        j++;      
                      }
        j++;                          //隔一列            
                 
     for(i=0;i<5;i++)                                 //时个位
                     {
                      if(c==1&&SHAN)P0=0x00;
        else P0=ASCII86[disbuf[4]];          //调时状态时个位闪烁
             P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
                        delay(1);
             P1=0xff; P3=0xff; P2=0xff;
                        j++;      
                      }
   if(!SHAN) {P0=0x81;} else P0=0x00;          //秒闪
           
                 P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];              
                        delay(1);
       P1=0xff; P3=0xff; P2=0xff;
                        j++;      
                for(i=0;i<5;i++)                                    //分十位
                     {
                      P0=ASCII86[disbuf[3]];
             P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
                        delay(1);
             P1=0xff; P3=0xff; P2=0xff;
                        j++;      
                      }
        j++;
     for(i=0;i<5;i++)                                    //分个位
                     {
                      if(c==2&&SHAN)P0=0x00;
        else P0=ASCII86[disbuf[2]];     //调分状态时分闪烁
             P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
                        delay(1);
             P1=0xff; P3=0xff; P2=0xff;
                        j++;      
                      }
    

 }

void delay(uchar t)
{
 uchar i;               //定义变量
 for(;t>0;t--)             //如果t大于0,t减1(外层循环)
  for(i=124;i>0;i--);         //i等于124,如果i大于0,i减1
}


void timer0() interrupt 1        //定时器0(中断1)
{
   uchar tim1,tim2;           //定义临时变量
 TL0=TL0+0XB0;TH0=0X3C;        //重装定时器初值
 tim1++;                //每中断一次tim1加1
 if(tim1==10)             //中断10(0.5秒)
                  
  SHAN=!SHAN;             //闪烁标志取反
  tim1=0;tim2++;           //tim1清零,tim2加1
  if(tim2==2)             //到了1秒
  {
   tim2=0;second++;         //tim2清零,秒加1
   if(second>=60)          //如果秒到60
                 
    second=0;minute++;       //秒变0,分加1
    if(minute>=60)         //如果分到60
    {
     minute=0;hour++;       //分变0,时加1
     if(hour>=24) hour=0;     //如果时到24,时变0
    }
   }
  }
 }
}

关键字:单片机  2408点阵  时钟 引用地址:单片机2408点阵时钟电子制作

上一篇:单片机交通灯C语言程序
下一篇:51单片机中使用ucos ii的优缺点

推荐阅读最新更新时间:2024-03-16 14:37

基于C8051F005单片机的小电阻测试仪
1、引言   在电路测试过程中常常会碰到由于忽略某些小电阻的影响引起实验数据与理论值之间存在较大误差,从而影响测试效果。例如电感器、变压器中往往存在铜电阻,地铁铁轨的电阻;由于其数值较小,一般的指针万用表无法测量出来;通常实验室里会用电桥进行测量,但电桥操作手续较烦,又不能直接读出被测电阻阻值。鉴于此,我们采用了单片机,利用单片机的优势设计了该测量仪。该测量仪可直接从LCD显示屏上读出所测得的电阻值,测量范围为10μΩ~2.9999kΩ,同时可以把测试的数据进行储存,然后经串行口送入上位机,通过上位机的强大功能,可以对所测得的数据进行分析、处理。该测试仪的测量精度高达±0.1%,并采用四端测量法,电阻值不受引线长短及接触电阻的影
[测试测量]
基于C8051F005<font color='red'>单片机</font>的小电阻测试仪
avr单片机模拟比较器初始化配置及说明
avr模拟比较器对正极 AIN0 的值与负极 AIN1 的值进行比较。当 AIN0 上的电压比负极 AIN1 上的电压要高时,模拟比较器的输出 ACO 即置位。比较器的输出可用来触发定时器 / 计 数器 1 的输入捕捉功能。此外,比较器还可触发自己专有的、独立的中断。用户可以选择 比较器是以上升沿、下降沿还是交替变化的边沿来触发中断。 /* 特殊功能 IO 寄存器- SFIOR 7 6 5 4 3 2 1 0 ADTS2 ADTS1 ADTS0 ACME PUD PSR2 PSR10 Bit 3 ACME: 模拟比较器多路复用器使能
[单片机]
基于单片机的生物电阻抗频谱测量系统
0 引 言 长期以来,对生物组织电性质的研究一直是生物医学工程学关注的热点。生物组织的电学性质是人们认识生命物质的一个重要方面。 生命物质电阻抗作为一个重要的电参数,在电性质研究中占有很重要的地位,生物组织生理病理特性可以通过电阻抗来反映。许多研究表明,生物组织电特性的频率依赖性很强,因此,对生物组织电特性的研究常采用多频电阻抗法。目前,国内外学者已经通过研究生物组织的阻抗特性预测早期疾病、治疗过程中的监护、区分正常组织和病变组织等。在这些研究报道中发现,对相关生物组织的阻抗特性主要使用现成的阻抗分析仪测量,这些仪器均非针对生物组织而设计,因此存在对测量对象造成破坏、非实时、价格昂贵等问题。同时对生物组织频谱测量系统的研究
[工业控制]
基于<font color='red'>单片机</font>的生物电阻抗频谱测量系统
基于单片机的CO浓度检测及报警系统设计
本论文主要完成一氧化碳检测仪软件和硬件仿真设计,设计内容包括:A/D转换器程序、控制程序、超标报警、键盘检测、数据显示等。 硬件设计部分主要包括:单片机、A/D转换器、时钟芯片、LCD、外围扩展数据RAM等芯片的选择;硬件主电路设计、数据采集、模数转换电路设计、液晶显示电路设计、外围扩充存储器接口电路、时钟电路、复位电路、键盘接口电路等功能模块电路设计。硬件结构框图2.1。硬件设计总体电路图见附录A1。 图2.1 硬件结构框图 2.1 STC89C52单片机简介 本系统采用STC89C52单片机。而目前世界上较为著名的8位单片机的生产厂家和主要机型如下: 美国Intel公司:MCS—51系列及其增强型系列;
[单片机]
基于<font color='red'>单片机</font>的CO浓度检测及报警系统设计
e-peas在CES上展示最新低功耗MCU及人数统计应用
e-peas展出的能源自主监控系统支持能量手机以满足其电力需求,可用于人数统计和面部识别(访问存储的数据以确认个人身份)等应用。 e-peas 演示的核心将是改变游戏规则的 EDMS105N MCU。 EDMS105N MCU是一款功耗优化的 32 位产品,可以提供 24MHz 的运行频率。它依赖于 ARM Cortex-M0 处理内核,从而利用工程师已经熟悉的平台和相关工具。 这是市面上功耗最低的 Cortex-M0 MCU,在工作模式下仅消耗 18µA/MHz。它有一系列不同的睡眠状态,其中最低的情况下,仅消耗340nA功耗(RTC和 8kB SRAM 保留)。 MCU 中嵌入了多种不同的接口(UART、I2
[单片机]
e-peas在CES上展示最新低功耗<font color='red'>MCU</font>及人数统计应用
MSP430系列单片机的加密熔断器是怎样炼成的?
MSP430 系列单片机是德州仪器(TI)公司推出的一款16位超低功耗单片机。它能够在1.8~3.6 V电压、1 MHz频率的条件下运行,耗电电流在0.1~400μA。在运算速度上,MSP430系列单片机能在8 MHz晶振的驱动下,实现125 ns的指令周期。16位的数据宽度、125 ns的指令周期以及多功能的硬件乘法器相配合,能实现数字信号处理的某些算法(如FFT等)。 在整合方面,MSP430系列单片机将大量的CPU外围模块集成在片内,有如下一些模块:看门狗(WDT)、模拟比较器、串口、硬件乘法器、液晶驱动器、 10位/12位/14位ADC、端口0~6、基本定时器。其中定时器A、B均带有多个捕获/比较寄存器,同时可实现多路
[单片机]
MSP430系列<font color='red'>单片机</font>的加密熔断器是怎样炼成的?
单片机是什么?它是怎样执行程序的?
单片机(Micro Control Unit): 全称微型控制单元,简称单片机(MCU),从字面意思我们可以了解到,它就是一个微型的计算机系统。然后我们下面通过对比来了解下它为什么时一个微型计算机系统。 单片机(MCU)是什么? 1.9 万播放 · 12 赞同 视频 电脑主板 我们首先来看下我们熟悉的电脑主板,可能有人会问,我是来学单片机的,你给我介绍主板干嘛?我们这里是用主板来做一个类比,我们看了上面一大堆东西,估计很多人用了很长时间的也不知道单片机和代码是怎么回事。 我这里找了一张电脑主板的电路框图,这个是比较老的一个主板,DDR2内存的,从下面框图中我们大概可以看到大的板块包括CPU,北桥,南桥;其中南
[单片机]
<font color='red'>单片机</font>是什么?它是怎样执行程序的?
总是搞不清微处理器和微控制器的区别?
中央处理器是一块超大规模的集成电路,是一台计算机的运算核心和控制核心,它的功能主要是解释计算机指令以及处理计算机软件中的数据。主要包括运算器和高速缓冲存储器及实现它们之间联系的数据、控制及状态的总线。它与内部存储器和输入/输出设备合称为电子计算机三大核心部件。 目前,嵌入式处理器的高端产品有:Advanced RISC Machines公司的ARM、Silicon Graphics公司的MIPS、IBM和Motorola的Power PC 、Intel的X86和i960芯片、AMD的Am386EM、Hitachi的SH RISC芯片;掌上电脑的处理器有六类处理器,分别是:英特尔的PXA系列处理器、MIPS处理器、StrongAR
[单片机]
总是搞不清微处理器和<font color='red'>微控制器</font>的区别?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved