51单片机4位数码管电子钟源程序

发布者:BlissfulMoon最新更新时间:2015-06-16 来源: 51hei关键字:51单片机  4位数码管  电子钟 手机看文章 扫描二维码
随时随地手机看文章
/***************************************************************************

标题:     定时器中断 24小时时钟程序

效果:     数码管显示24小时制时钟(具有调时功能)

说明:     使用12M晶振        ,key1=P3^7; key2=P3^6; key3=P3^5;key4=P3^4;

                  数码管位选P1.0~P1.3   ,段选P0

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

 

#include

 

#define uchar unsigned char;

#define uint unsigned int;

                                              

 

uchar position;           

uchar tt;             

uchar second;       

uchar minute;

uchar hour;       

 

 

uchar code table[]=

                            {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9

 

                  

sbit smg_q = P1^0;  //数码管千位引脚

sbit smg_b = P1^1; 

sbit smg_s = P1^2;

sbit smg_g = P1^3;

 

sbit key1=P3^7;                 //按键定义

sbit key2=P3^6;

sbit key3=P3^5;

sbit key4=P3^4;

 

 

void keyscan();                   //函数声明

void display(unsigned char hour,unsignedchar minute);

void delay(unsigned int timer);

void init();                                              


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

                                     主函数

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

void main()

{

         init();                                    

         while(1)

         {

                   if(tt==20)

                   {                          

                            tt=0;

                            second++;

                            if(second==60)

                            {

                                     second=0;

                                     minute++;

                                     if(minute==60)

                                     {       

                                               minute=0;

                                               hour++;

                                               if(hour==24)

                                                        hour=0;

                                     }

                            }

                   }

 

                   keyscan();

                   display(hour,minute);      

                   delay(1);

         }

}

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

                                     调时

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

void keyscan()

{

         if(key1==0)        //小时加1

         {

                   TR0=0;

                   hour++;

                            if(hour==24)

                                     hour=0;

                   delay(200)        ;

                   TR0=1;

         }

         if(key2==0)                 // 小时减

         {

                   TR0=0;

                   hour--;

                            if(hour<0)

                                     hour=23;

                   delay(200)        ;

                   TR0=1;

         }

 

         if(key3==0)                   // 分钟加

         {

                   TR0=0;

                   minute++;

                            if(minute==60)

                                     minute=0;

                   delay(200)        ;

                   TR0=1;

         }

 

                   if(key4==0)                    //        分钟减

         {

                   TR0=0;

                   minute--;

                            if(minute<0)

                                     minute=59;

                   delay(200)        ;

                   TR0=1;

         }

}

 

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

                                                初始化

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

void init()

{

         tt=0;

         position=0;               

         second=0; 

         minute=0;        

         hour=0;   

         smg_q=1;

         smg_b=1;

         smg_s=1;

         smg_g=1;

         key1=1;

         key2=1;

 

         TMOD=0X01;  

         TH0=(65536-50000)/256;        

         TL0=(65536-50000)%256;

         EA=1;                

         ET0=1;              

         TR0=1;              

}

 

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

                                                  定时器TO中断

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

void t0() interrupt 1

{

         TH0=(65536-50000)/256;        

         TL0=(65536-50000)%256;

         tt++;                                              

}

 

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

                                          显示

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

void display(unsigned char hour,unsignedchar minute)

{

         P0=0XFF;                             

         switch(position)

         {

         case0:              

                   smg_g=1;

                   smg_q=0;

                   P0=table[hour/10]; 

                   break;

 

         case1:

                   smg_q=1;        

                   smg_b=0;        

                   P0=table[hour%10];

 

                   if(tt>=10)

                            P0&=0x7f;                  //小数点以半秒的时间闪烁

                   break;

 

         case2:    

                   smg_b=1;                  

                   smg_s=0;                  

                   P0=table[minute/10];

                   break;

         case3:                       

                   smg_s=1;

                   smg_g=0;

                   P0=table[minute%10];

                   break;

         }

         position++;               

         if(position>3)

                   position=0;      

}

 

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

                                                 延时

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

void delay(unsigned int time)

{                

         unsignedint x,y;

         for(x=time;x>0;x--)

                   for(y=110;y>0;y--);

}
关键字:51单片机  4位数码管  电子钟 引用地址:51单片机4位数码管电子钟源程序

上一篇:51单片机定时器定时模式
下一篇:单片机电子琴汇编程序

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

51单片机在片设备与中断(1)
并行端口要点 MCS-51单片机内部有4个8位的并行I/O口P0、P1、P2、P3。其中P3口、P2口、P1口为准双向口,P0口为双向的三态数据线口。各端口均由端口锁存器、输出驱动器、输入缓冲器等构成。各端口除可进行字节的输入/输出外,每个位口线还可单独用作输入/输出,实际应用非常方便。 对并行I/O口的 读 修改 写 类指令(例如 CPL P0.0、ANL P1,#0FH等)实际是读出对应的端口锁存器的内容,执行修改后再写回到端口锁存器中。之所以是 读锁存器 而不是 读引脚 ,是为了避免因引脚外部电路的原因而使引脚的状态发生改变而造成误读。 P0口是一个三态双向I/O口,在需要进行外部ROM、RAM等扩展时,采用分时复用的
[单片机]
51单片机OLED12864 I2C接口使用教程
现在能买到的OLED12864显示屏大多为SPI和I2C接口的,I2C通信协议只需要两条总线就可以进行通信,下面介绍一下如何用51单片机使用I2C接口的OLED12864。 首先介绍一下I2C通信协议,I2C(Inter-Integrated Circuit)字面上的意思是集成电路之间,它其实是I2CBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。I2C的正确读法为“I平方C”( I-squared-C )。 I2C只使用两条双向漏极开路(Open Drain)(串行数据(SDA)及串行时钟频率(S
[单片机]
<font color='red'>51单片机</font>OLED12864 I2C接口使用教程
51单片机使用一个IO口做RC充放电来模拟ADC
AUXR DATA 08EH ;Auxiliary register P1M1 DATA 091H ;P1M1.N,P1M0.N =00--- Standard, 01--- push-pull P1M0 DATA 092H ; =10--- pure input, 11--- open drain P_RC BIT P1.0 ;RC port DLY_H DATA 30H ;Delay high byte DLY_M DATA 31H ;delay mid
[单片机]
51单片机OLED时钟显示
oled时钟单片机源程序如下: #include REG52.h #include oled.h #define uchar unsigned char #define uint unsigned int #include intrins.h sbit DQ = P3^6; //数据口define interface /***********************DS1302端口定义*******************************************/ sbit clock_rst=P3^5; //1302复位管脚定义 sbit clock_dat=P1^3; //13
[单片机]
51单片机实现流水灯操作
一、用移位操作 用左移指令和取反运算实现从第一个二极管到最后一个二极管的流水灯 #include reg52.h //间隔200毫秒的流水灯 void delayms(unsigned int xms)//带参数函数 { unsigned int i,j;//局部变量,需要时随时分配,不用时立即销毁 for(i=xms;i 0;i--) for(j=110;j 0;j--); } unsigned char k;//全局变量,占据固定RAM void main() { while(1) { for(k=0;k 8;k++) { P1=~(1 k);/*1即为0000 0001,
[单片机]
<font color='red'>51单片机</font>实现流水灯操作
51单片机-定时器
定时/计数器的结构和工作原理 定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。80C51单片机定时/计数器的工作是由两个特殊功能寄存器控制的。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能,低四位用于T0,高四位用于T1。TCON是控制寄存器,控制T0和T1的启动和停止及溢出标志,高四位与定时器有关,低四位与外部中断有关。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。 中断允许控制。CPU对中断系统所
[单片机]
<font color='red'>51单片机</font>-定时器
C51单片机发光二极管实例程序集
1、 程序实现功能:让8个排列的LED来回流动着亮1—》...——》8 1《——...《——8 箭头代表LED流动方向,先从1-8然后从8到1依次循环。程序已经测试过,运行正常//大家如果用此代码测试的话注意你的LED接在单片机的那个端口,本代码用的是P2口 #include reg52.h #define uint unsigned int #define uchar unsigned char uchar a,b; uchar code led_array ={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f }; //led显示编码数组,从0xfe——0x7f为从第一个led管到第8个
[单片机]
基于C8051单片机和FPGA实现导纳测量仪的系统设计
虚拟仪器的广泛应用,使得用户可以根据需求,设计自己的仪器系统。无源网络导纳测量仪即是虚拟仪器设计思想的一种具体运用,旨在实现对端口网络的导纳进行自动测量。测量仪是以C8051单片机为控制和处理核心,采用可编程逻辑器件EPF10K10,根据DDS原理产生信号源,将信号源连接到待测的网络上,对网络两端的电压和电流进行差分放大,使其输出电压尽可能达到ADC的最大输入电压,然后进行A/D采样,采样时,频率随信号频率而改变,一个周期内固定采32个点,用单片机的P1、P2直接接收数据,边采样边接收。对采样所得的电流、电压数据进行快速傅立叶变换(FFT),并分别求出其模值和相位,则导纳的模值为电流模值与电压模值之比,相位为电流与电压的相位之差。
[单片机]
基于C80<font color='red'>51单片机</font>和FPGA实现导纳测量仪的系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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