精华内容
下载资源
问答
  • 请问51单片机肿么编写程序8个数码管显示时间(时分秒)
    2021-05-25 08:15:55

    //*******时间程序**************//

    //*******2010-7-14 00:31:39 *******//

    //******* Z X C ******************//

    //*******晶体振荡器 12.000MHZ 共阳数码管***//

    //*******头文件*********************//

    #include

    #define uchar unsigned char

    #define uint unsigned int

    sbit H_KEY=P1^0; //时调整键

    sbit M_KEY=P1^1; //分调整键

    sbit S_KEY=P1^2; //秒调整键

    void sec_tiao(); //秒调整函数

    void min_tiao(); //分调整函数

    void hou_tiao(); //时调整函数

    //********数码管显示与数组关系******//

    char DATA_sled[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

    /* 0 1 2 3 4 5 6 7 8 9 */

    uchar hour=21, min=00, sec=00; //时间初始化

    uchar deda=0;

    void delay(uchar count); //延时模块

    void zhh(); //走时模块

    void disp(); //十进制转换模块

    /***采用定时器0中断,50MS更新一次***/

    void init_timer()

    {

    TMOD=0x01;

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    IE=0x82;

    TR0=1;

    }

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

    void T0_srv(void) interrupt 1

    {

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    deda++;

    }

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

    函 数 名:hou_tiao

    功 能:时调整

    说 明:

    入口参数:无

    返 回 值:无 ************/

    //*******秒调整模块 S***********//

    void sec_tiao()

    {

    while(!S_KEY) disp(); //等待秒调整键松开

    deda=0;sec++; //毫秒清零、秒加1

    if(sec==60) sec=0; //如果秒等于60,秒变0

    }

    //*******分调整模块 M***********//

    void min_tiao()

    {

    while(!M_KEY) disp(); //等待分调整键松开

    sec=0;min++; //秒清零、分加1

    if(min==60) min=0; //如果分等于60,分变0

    }

    //*******时调整模块 H***********//

    void hou_tiao()

    {

    while(!H_KEY) disp(); //等待时调整键松开

    sec=0;hour++; //秒清零,时加1

    if(hour==24) hour=0; //如果时等于24,时变0

    }

    /*********程序**************/

    void zhh()

    {

    if(deda>=20){sec++;deda=0;}

    if(sec==60){min++;sec=0;}

    if(min==60){hour++;min=0;}

    if(hour==24){hour=0;}

    }

    //******十进制转换模块*****//

    void disp()

    {

    P0=DATA_sled[hour/10]; P2=0xfe; delay(1);

    P0=DATA_sled[hour%10]; P2=0xfd; delay(1);

    P0=DATA_sled[min/10]; P2=0xfb; delay(1);

    P0=DATA_sled[min%10]; P2=0xf7; delay(1);

    P0=DATA_sled[sec/10]; P2=0xef; delay(1);

    P0=DATA_sled[sec%10]; P2=0xdf; delay(1);

    }

    //*******延时模块************//

    void delay(uchar count)

    {

    uchar i,j;

    for(i=0;i

    for(j=0;j<120;j++);

    }

    //*******主程序*************//

    void main()

    {

    init_timer(); //定时模块

    while(1) //无限循环

    {

    if(!H_KEY) hou_tiao(); //时调整模块

    if(!M_KEY) min_tiao(); //分调整模块

    if(!S_KEY) sec_tiao(); //秒调整模块

    zhh(); //走时模块

    disp(); //十进制转换模块

    }

    }

    此程序已经硬件调试通过,希望采纳!

    取消

    评论

    更多相关内容
  • 简易时钟的电路图,程序。可以实现时分秒的计时,通过数码管显示
  • 名称:定时器控制数码管动态显示 说明:8 个数码管上分两组动态显示年月日与时分秒,本例的位显示延时用定时器实现
  • 一篇 BlogBlogBlog 主要记录了一些简单的外部中断和定时器使用,在那个时候我们还只会让指定的数码管显示同一数字,在这篇博文中,我们就记录一下几种让不同数码管显示不同数字(也叫做动态显示)的办法。...

    上一篇 B l o g Blog Blog 主要记录了一些简单的外部中断和定时器的使用,在那个时候我们还只会让指定的数码管显示同一个数字,在这篇博文中,我们就记录一下几种让不同数码管显示不同数字(也叫做动态显示)的办法。

    一、动态显示思路的萌芽

    我们试想:因为现在我们不是只会一次只能显示某一个数字嘛,那么,如果我们实现这样的效果:(以下描述规定在某一时刻只能亮一个数码管)第一秒第一个数码管亮“1”,第二秒第二个数码管亮 “2”、、、第六秒第六个数码管亮“6”,接着重复上面的循环。

    如果间隔的时间不是1s,而是几毫秒甚至几微秒,那么人眼就会分辨不出来,看起来就像是同一时间6个数码管分别显示 “123456” 的效果。

    我们可以如何实现上述思想呢?—— 通过定时器!我们可以让定时器计时,每到了规定时间,就往后移动一位。下面,我们看看代码部分:

    1.1 代码和实验部分

    代码如下:

    #include<reg52.h>
    #define uchar unsigned char   //宏定义
    #define uint unsigned int
    
    sbit WELA = P2^7;   //定义位选
    sbit DULA = P2^6;   //定义段选
    
    uchar number,position,t;
    //number表示需要显示什么数,position表示数字显示的位置,t 表示定时器计时时间
    
    uchar code table_DUAN[] = {0x06,0x5b,0x4f,
                               0x66,0x6d,0x7d,0x07,
                               0x7f,0x6f,0x77,0x7c,
                               0x39,0x5e,0x79,0x71};  //定义段选信号编码表(从1开始)
    
    uchar code table_WEI[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //定义位选信号编码表
    
    void init();   //初始化函数,完成诸如启动定时器、赋初值等一系列操作
    
    void main()
    {
    	init();
    	while(1)
    	{
      		if(t == 1)      
     		{
       			t = 0;
       			if(number == 6)     //因为我们最多显示到6
       			{
        				number = 0;
       			}
       			if(position == 6)  
       			{
        				position = 0;
       			}
    
       			DULA = 1;
       			P0 = table_DUAN[number];
      			DULA = 0;
       			number++;
     
       			P0 = 0xff;   //为了防止前面的段选信号在一瞬间会对下面的位选信号产生影响
     
       			WELA = 1;
       			P0 = table_WEI[position];
       			WELA = 0;
       			position++;
      	       }
     	}
    }
    
    void init()
    {
    	t = 0;
     	number = position = 0;
    
    	TH0 = (65536-1000)/256;
    	TL0 = (65536-1000)%256;
    
    	TMOD = 0x01;
    
    	EA = 1;
    	ET0 = 1;
    
    	TR0 = 1;
    }
    
    void timer0() interrupt 1
    {
     	TH0 = (65536-1000)/256;
     	TL0 = (65536-1000)%256;
     	t++;
    }
    
    

    二、用delay()函数实现任意数字的显示

    不过,大家注意到了吗:用上面的代码,如果想显示任意给定的数字,那么似乎有些麻烦,下面我们介绍一种通用方法:

    如果给定了一个数字(假设是两位数),那么,我们可以直接把它的每一位(比如个位、十位、、、)分离出来,然后在一个while(1) 大循环里面显示了十位、延迟一小段时间,又去显示个位,再延迟一段时间。在这样的无限循环中,我们肉眼看到的就是“静止”的两位数了。

    注意:如果想显示的是三位数,那么uchar类型就不再适用了,因为 uchar最大就是256,需要使用int

    2.1 代码和实验部分

    #include<reg52.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    
    sbit WELA = P2^7;
    sbit DULA = P2^6;
    
    uchar t,temp,shi,ge;
    
    uchar code table_DUAN[] = {0x06,0x5b,0x4f,
                0x66,0x6d,0x7d,0x07,
                0x7f,0x6f,0x77,0x7c,
                0x39,0x5e,0x79,0x71}; 
    
    void delay(uint);
    
    void main()
    {
    	temp = 45;
     	shi = temp/10;
     	ge = temp%10;
    
    	while(1)
    	{
    		DULA = 1;
      		P0 = table_DUAN[shi-1];
    		DULA = 0;
    		
    		P0 = 0xff;
    
    		WELA = 1;
      		P0 = 0xfe;
      		WELA = 0;
    
    		delay(5);
    
    		DULA = 1;
      		P0 = table_DUAN[ge-1];
      		DULA = 0;
    
    		P0 = 0xff;
    
    		WELA = 1;
      		P0 = 0xfd;
      		WELA = 0;
    
    		delay(5);
    	}
    }
    
    void delay(uint z)
    {
     	uint x,y;
     	for(x=z;x>0;x--)
      		for(y=100;y>0;y--);
    }
    
    

    三、进阶部分

    如果你觉得只是单纯显示一个数不够过瘾,那么我们现在看一个有趣的例子:我们给定一个数字,让这个数字每隔一秒减少一次,当减到100的时候,我们就让数码管保持在100这个数

    那么,这个题目我们就可以通过第二节讲到的利用 delay() 显示任何数,以及定时器定时1s控制递减

    #include<reg52.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    
    sbit WELA = P2^7;
    sbit DULA = P2^6;
    
    uchar t,bai,shi,ge;
    uint temp;
    
    uchar code table_DUAN[] = {0x3f,0x06,0x5b,0x4f,
                		   0x66,0x6d,0x7d,0x07,
                		   0x7f,0x6f,0x77,0x7c,
                		   0x39,0x5e,0x79,0x71}; 
    
    void init();
    void delay(uint);
    void display(uint temp);
    
    void main()
    {
     	init();
     	temp = 145;
     	while(1)
     	{
      		if(t == 20)     //每经过1s,数字就递减一次
      		{
       			t = 0;
       			temp--;
       			if(temp == 100)    
       			{
        				TR0 = 0;   //当减小到100时,我们把计数器关了,他自然就不会递减
       			}
      		}
      		display(temp);   //普通的动态显示,和第二节类似,只不过我们现在把它封装在了函数里面   
     	}
    }
    
    void init()
    {
     	WELA = 0;
     	DULA = 0;
     	
     	t = 0;
     	TH0 = (65536-50000)/256;
     	TL0 = (65536-50000)%256;
     	
     	TMOD = 0x01;
     	
     	EA = 1;
     	ET0 = 1;
     	
     	TR0 = 1;
    }
    
    void delay(uint z)
    {
     	uint x,y;
     	for(x=z;x>0;x--)
      		for(y=100;y>0;y--);
    }
    
    void display(uint temp)
    {
     	bai = temp/100;
     	shi = (temp-100*bai)/10;
     	ge = temp%10;
    
     	DULA = 1;
     	P0 = table_DUAN[bai];
     	DULA = 0;
    
    	P0 = 0xff;
    
    	WELA = 1;
    	P0 = 0xfe;
    	WELA = 0;
    
    	delay(1);
    
     	DULA = 1;
     	P0 = table_DUAN[shi];
     	DULA = 0;
    
    	P0 = 0xff;
    
     	WELA = 1;
     	P0 = 0xfd;
     	WELA = 0;
    
    	delay(1);
    
    	DULA = 1;
     	P0 = table_DUAN[ge];
    	DULA = 0;
    
    	P0 = 0xff;
    
    	WELA = 1;
     	P0 = 0xfb;
     	WELA = 0;
     	
    	dealy(1);
    
    void timer0() interrupt 1
    {
     	TH0 = (65536-50000)/256;
     	TL0 = (65536-50000)%256;
     	t++;
    }

    【补充二】:我们现在想实现这样的功能:数码管一开始显示765410,用定时器 T0 控制,每隔1s递减1次,同时,T0控制LED 以每隔0.5s的速度控制流水灯。当 765410递减到 765398 的时候让数码管保持现在的值,同时流水灯停止,并且全部闪烁,当闪烁持续3s之后,数码管显示 “HELLO”

    这个题目的代码我晚点会上传到github,继续贴在着就有点长了。

    好啦,这就是本次 B l o g Blog Blog 的全部内容啦!我们学习了数码管的动态操作,对定时器的使用进一步深化,希望能够大家带来帮助!

    展开全文
  • //8位数码管动态显示时间,可调节,//调节时间时,调节的数闪烁显示;//比较两种闪烁的方法;本文引用地址:...

    //8位数码管动态显示时间,可调节,

    //调节时间时,调节的数闪烁显示;

    //比较两种闪烁的方法;本文引用地址:http://www.eepw.com.cn/article/201611/315589.htm

    #include#define uint unsigned int

    #define uchar unsigned char

    sbit tiaojie=P1^0;

    sbit jia=P1^1;

    sbit jian=P1^2;

    uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

    0x80,0x90,0xbf};

    uchar a,b,num1,num2,flag100ms,flag1s,flagtj;

    uchar miao,fen,shi,flagjia,flagjian;

    bit flag_1s;

    uchar code wela[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

    uchar dula[8]={0,0,1,1,2,2,3,3};

    void delay(uint z);

    void intc();

    void keyscan();

    void disp();

    void main()

    {intc();

    while(1)

    {

    keyscan();

    disp();

    }

    }

    //================

    void intc()

    {

    TMOD=0x01;

    TH0=(65536-10000)/256;

    TL0=(65536-10000)%256;

    ET0=1;

    EA=1;

    TR0=1;

    }

    void timer0() interrupt 1

    {

    TH0=(65536-10000)/256;

    TL0=(65536-10000)%256;

    a++;

    if(a==10)

    {flag100ms=1;}

    if(a==100)

    {a=0,flag1s=1,miao++;flag_1s=~flag_1s;}

    if(miao==60)

    {miao=0,fen++;}

    if(fen==60)

    {fen=0,shi++;

    if(shi>12)

    shi=1;}

    }

    //====================

    void disp()

    {uchar i,n;

    dula[7]=miao%10;

    dula[6]=miao/10;

    dula[5]=0x0a;

    dula[4]=fen%10;

    dula[3]=fen/10;

    dula[2]=0x0a;

    dula[1]=shi%10;

    dula[0]=shi/10;

    for(i=0;i<8;i++)

    {

    switch(flagtj)

    {

    case 1 : n=6;

    break;

    case 2 : n=3;

    break;

    case 3 : n=0;

    break;

    default:break;

    }

    if(flagtj!=0)

    if((n==i)||(n+1==i))

    {if(flag_1s==1)

    P0=0xff;

    else

    P0=table[dula[i]];}

    else

    P0=table[dula[i]];

    if(flagtj==0)

    P0=table[dula[i]];

    P2=wela[i];

    delay(5);

    P0=0xff;

    }

    /*第二种显示的方法。相对来说比较代码长些

    for(i=0;i<8;i++)

    {

    switch(flagtj)

    {

    case 1:

    if(i>5&&i<8)

    {if(flag_1s==1)

    P0=0xff;

    else

    P0=table[dula[i]];}

    else

    P0=table[dula[i]];break;

    case 2:

    if(i>2&&i<5)

    {if(flag_1s==1)

    P0=0xff;

    else

    P0=table[dula[i]];}

    else

    P0=table[dula[i]];break;

    case 3:

    if(i>=0&&i<2)

    {if(flag_1s==1)

    P0=0xff;

    else

    P0=table[dula[i]];}

    else

    P0=table[dula[i]];break;

    case 0:

    P0=table[dula[i]];break;

    }

    P2=wela[i];

    delay(10);

    P0=0xff;

    }

    */

    }

    //=====================

    void delay(uint z)

    {

    uint x;

    uchar y;

    for(x=0;x for(y=0;y<112;y++);

    }

    //===========================

    void keyscan()

    {

    if(tiaojie==0)

    delay(100);

    if(tiaojie==0)

    {while(!tiaojie);

    flagtj++;

    if(flagtj>3)

    flagtj=0;

    }

    if(jia==0)

    delay(100);

    if(jia==0)

    {while(!jia);

    flagjia=1;

    }

    if(jian==0)

    delay(100);

    if(jian==0)

    {while(!jian);

    flagjian=1;

    }

    if(flagtj!=0)

    switch(flagtj)

    { case 1: if(flagjia==1)

    {flagjia=0;miao++;

    if(miao>60)

    miao=0;

    }

    if(flagjian==1)

    {flagjian=0;

    if(miao<1)

    miao=1;

    miao--;

    }

    break;

    case 2: if(flagjia==1)

    {flagjia=0;fen++;

    if(fen>60)

    fen=0;

    }

    if(flagjian==1)

    {flagjian=0;

    if(fen<1)

    fen=1;

    fen--;

    }

    break;

    case 3: if(flagjia==1)

    {flagjia=0;shi++;

    if(shi>12)

    shi=1;

    }

    if(flagjian==1)

    {flagjian=0;

    if(shi<1)

    shi=1;

    shi--;

    }

    break;

    }

    }

    //===============

    展开全文
  • 使用51单片机在8位数码管以飞入效果显示动态的时//信息,每次飞入一位,不能覆盖已飞入数据,直到时//信息完整显示8位数码管,使编译产生的可执行文件尽量小。

    8位8段数码管飞入显示时/分/秒(51单片机)

    使用51单片机在8位数码管上以飞入效果显示动态的时/分/秒信息,每次飞入一位,不能覆盖已飞入数据,直到时/分/秒信息完整显示到8位数码管上,使编译产生的可执行文件尽量小。
    效果入图所示:
    8位数码管飞入显示时/分/秒

    问题分析

    实现飞入效果并不难,难点在于如何使编译产生的可执行文件尽量小。

    算法分析

    动态时/分/秒信息就直接采用51单片机内部定时器实现。

    typedef struct {            // 时间
         unsigned char hour;    // 时
         unsigned char miunte;  // 分
         unsigned char second;  // 秒
         unsigned char count;   // 50ms
    } time_t;
    

    使用pos记录飞入数据的位置,len记录已飞入数据的数量。8位8段数码管从左至右编号7-0,使用pos记录当前正在飞入的字符位置,len的初始值为0,表示还未飞入数据,len的最大值为7,表示所有数据都已经飞入。代码篇幅比较短,就不多赘述细节了(代码脑内运行!!!),飞入效果的实现主要都在定时中断函数t0()内的LED8_FLY标签段,主函数主要负责将pos和len进行显示前的映射并显示。
    本算法用C语言写编译产生的可执行文件是695字节,使用汇编能降到485字节。
    欢迎感兴趣的伙伴一起思考更优秀的算法或实现方式。

    typedef struct {        // 控制飞入
        unsigned char pos;  // 飞入位置
        unsigned char len;  // 飞入字符数
    } fly_t;
    

    C代码

    屏蔽掉的代码基本是初始化寄存器,不是废代码,只是在不影响飞入效果的情况下,使编译产生的可执行文件尽量小。

    #include <reg51.h>
    
    #define LED8_CTRL_PORT P2  // 位码端口
    #define LED8_DATA_PORT P0  // 段码端口
    #define CLEAR          11  // 熄灭数码管
    #define CONNECT        10  // 连接符号'-'
    
    typedef struct {        // 控制飞入
        unsigned char pos;  // 飞入位置
        unsigned char len;  // 飞入字符数
    } fly_t;
    
    typedef struct {            // 时间
         unsigned char hour;    // 时
         unsigned char miunte;  // 分
         unsigned char second;  // 秒
         unsigned char count;   // 50ms
    } time_t;
    
    fly_t data fly;
    time_t data time;
    
    /*******************************************************************************
    * 函 数 名:main
    * 函数功能:主函数
    * 输    入:void
    * 输    出:void
    * 说    明:none
    *******************************************************************************/
    void main(void)
    {
        unsigned char data buf[8];  // 显示内容
        unsigned char data i, j;
        unsigned char data ctrl_code;   // 位码
        unsigned char code LED8_DATA_CODE[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0x00 };  // 共阴段码0~9,'-','NULL'
    
        fly.pos = 7;  // 初始化飞入相关信息
    //    fly.len = 0;  // 屏蔽赋初值代码,默认初值为0
    
    //    time.hour = 13;  // 初始化时间
    //    time.miunte = 14;
    //    time.second = 52;
    //    time.count = 0;
    
    //    TL0 = 0xb0;   // 计时50ms
    //    TH0 = 0x3c;
        TMOD = 0x01;  // 定时器T0工作与方式1
        IE = 0x82;
        TR0 = 1;      // 启动定时器
    
        while (1) {
            ACC = time.second;  // 数据拆分
            B = 10;
            buf[1] = ACC / B;
            buf[0] = B;
            buf[2] = CONNECT;
            ACC = time.miunte;
            B = 10;
            buf[4] = ACC / B;
            buf[3] = B;
            buf[5] = CONNECT;
            ACC = time.hour;
            B = 10;
            buf[7] = ACC / B;
            buf[6] = B;
    
            buf[fly.pos] = buf[fly.len];  // 取飞入的字符
            for (i = fly.len; i != 8; i++) {  // 清除
                if(i != fly.pos) {
                    buf[i] = CLEAR;
                }
            }
    
            ctrl_code = 0x80;  // 数码管显示
            for (i = 0; i != 8; i++) {
                LED8_CTRL_PORT = ~ctrl_code;  // 给位码
                LED8_DATA_PORT = LED8_DATA_CODE[buf[i]];  // 给段码
                ctrl_code >>= 1;
                while(j++);
    //            LED8_DATA_PORT = 0x00;  // 消隐
            }
        }
    }
    
    /*******************************************************************************
    * 函 数 名:t0
    * 函数功能:50ms中断计时
    * 输    入:void
    * 输    出:void
    * 说    明:none
    *******************************************************************************/
    void t0(void) interrupt 1
    {
    //    TL0 = 0xb0;
    //    TH0 = 0x3c;
    
        time.count++;             // 计时
        if (time.count != 15) {   // 约1秒
            return;
        }
        time.count = 0;
        time.second++;
        if (time.second != 60) {  // 1分
            goto LED8_FLY;
        }
        time.second = 0;
        time.miunte++;
        if (time.miunte != 60) {  // 1小时
            goto LED8_FLY;
        }
        time.miunte = 0;
        time.hour++;
        if(time.hour != 24) {     // 1天
            goto LED8_FLY;
        }
        time.hour = 0;
    
    LED8_FLY:
        fly.pos--;  // 飞入字符移位
        if(fly.pos != (fly.len - 1)) {  // 飞入下一个字符
            return;
        }
        fly.pos = 7;
        fly.len++;
        if(fly.len == 8) {   // 所有字符飞入完成
            fly.len = 0;
        }
    }
    

    汇编代码

    屏蔽掉的代码基本是初始化寄存器,不是废代码,只是在不影响飞入效果的情况下,使编译产生的可执行文件尽量小。

    LED8_CTRL_PORT EQU  P2  ; 位码端口
    LED8_DATA_PORT EQU  P0  ; 段码端口
    CLEAR          EQU  11  ; 熄灭数码管
    CONNECT        EQU  10  ; 连接符号'-'
    
    pos            EQU 41H  ; 飞入位置
    len            EQU 40H  ; 飞入字符数
    hour           EQU  R7  ; 时
    miunte         EQU  R6  ; 分
    second         EQU  R5  ; 秒
    count          EQU  R4  ; 50ms
    ; 50H    51H    52H      53H    54H    55H      56H    57H    58H(多余项)
    ; 秒个位 秒十位 连接符号 分个位 分十位 连接符号 时个位 时十位 连接符号
    buf            EQU 50H  ; 显示内容
    
    ORG 0000H
    AJMP MAIN
    ORG 000BH
    AJMP T0_INTERRUPT
    ORG 0030H
    MAIN:
    MOV pos, #7  ; 初始化
    ; MOV len, #00H  ; 屏蔽赋初值代码,默认初值为0
    ; MOV hour, #13
    ; MOV miunte, #14
    ; MOV second, #52
    ; MOV count, #0
    ; MOV TL0, #0B0H
    ; MOV TH0, #3CH
    ; MOV SP, #30H
    MOV TMOD, #01H
    MOV IE, #82H
    SETB TR0
    
    LOOP:  ; 循环
    MOV R0, #buf  ; 数据拆分
    MOV R1, #05H  ; second(R5)地址
    DATA_SPLIT:
    MOV A, @R1
    MOV B, #10
    DIV AB
    MOV @R0, B
    INC R0
    MOV @R0, A
    INC R0
    MOV @R0, #CONNECT  ; 最末的CONNECT字符不影响
    INC R0
    INC R1
    CJNE R1, #08H, DATA_SPLIT
    
    MOV A, pos  ; 取飞入的字符
    ADD A, #buf
    MOV R0, A
    MOV A, len
    ADD A, #buf
    MOV R1, A
    MOV A, @R1
    MOV @R0, A
    
    MOV R0, len  ; 清除
    CLEAR1:
    MOV A, R0
    CJNE A, pos, CLEAR2
    CLEAR3:
    INC R0
    CJNE R0, #8, CLEAR1
    AJMP DISPLAY
    CLEAR2:
    ADD A, #buf
    MOV R1, A
    MOV @R1, #CLEAR
    AJMP CLEAR3
    
    DISPLAY:  ; 数码管显示
    MOV A, #7FH
    MOV R0, #buf
    OUTPUT:
    MOV LED8_CTRL_PORT, A  ; 给位码
    MOV A, @R0
    INC R0
    MOV DPTR, #LED8_DATA_CODE
    MOVC A, @A+DPTR
    MOV LED8_DATA_PORT, A  ; 给段码
    DELAY:
    DJNZ R2, DELAY
    ; MOV LED8_DATA_PORT, #00H  ; 消隐
    MOV A, LED8_CTRL_PORT
    RR A
    CJNE R0, #58H, OUTPUT
    AJMP LOOP
    
    T0_INTERRUPT:  ; 50ms中断计时
    PUSH ACC
    PUSH B
    ; MOV TH0, #3CH
    ; MOV TL0, #0B0H
    CLR A
    INC count  ; 计时
    CJNE count, #15, RETURN
    MOV count, A
    INC second  ; 约1秒
    CJNE second, #60, LED8_FLY
    MOV second, A
    INC miunte  ; 1分
    CJNE miunte, #60, LED8_FLY
    MOV miunte, A
    INC hour  ; 1小时
    CJNE hour, #24, LED8_FLY
    MOV hour, A
    
    LED8_FLY:
    DEC pos  ; 飞入字符移位
    MOV A, pos  ; 飞入下一个字符
    MOV B, len
    DEC B
    CJNE A, B, RETURN
    MOV pos, #7
    INC len
    MOV A, len  ; 所有字符飞入完成
    CJNE A, #8, RETURN
    MOV len, #0
    RETURN:
    POP B
    POP ACC
    RETI
    
    LED8_DATA_CODE:  ; 共阴段码0~9, '-', 'NULL'
    DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
    DB 7DH, 07H, 7FH, 6FH, 40H, 00H
    
    END
    
    展开全文
  • Proteus 仿真电路图: C51代码: #include<reg51.h> typedef unsigned char uchar; typedef unsigned int uint; uchar code num[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 0~...
  • 就是利用51单片机做一秒表,本来单片机是有P0,P1,P2,P3共计32I/O口可以的,但是因为实验箱内单片机做了外部扩展,所以端口不够,改成利用C51单片机外扩8255实现数字秒表。 思考 因为外部做了扩展,所以在...
  • DS1302数码管显示时----(按键可修改时间)

    千次阅读 多人点赞 2020-01-01 14:06:18
    反思:此项目在做的时候我是直接单片机引脚去驱动数码管(P1口控制段选,P3口控制位选),发现单片机引脚不能直接控制驱动数码管,所以我在思考后加了74HC138和74HC573来驱动,138控制位选,573控制段选。...
  • # 本程序加载了STM32F103内部的RCC时钟设置,并加入了利用滴答定时器延时函数。 功能: 数码管时钟显示 年月日时间可调 可设置闹钟,到点蜂鸣器响 温度监控,设定温度值达到,蜂鸣器报警,继电器工作 注意: ...
  • 这是我们设计的单片机电子钟/计时器学习板,它采用6位LED数码管显示时、,以24小时计时方式。可以通过按键实现时分调整、秒表/时钟功能转换、省电(关闭显示)等功能。我们能提供的完整的汇编语言源程序清单及...
  • 定时器的工作过程实际是对时钟脉冲计数)因工作需要,定时器除了占有自己编号的存储器位外,还占有一设定值寄存器(字),一当前值寄存器(字)。设定值寄存器(字)存储编程时赋值的计时时间设定值。当前值...
  • //------------------------------------------------------------------------//名称:按键调节数码管显示//------------------------------------------------------------------------//说明:// 按MOD键一次,时间...
  • #include //定义共阳极字型码0123456789-unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};unsigned char time[]={0,0,0,0,0,0,0,0};//用来储存时间unsigned char date[]={...
  • 利用8位数码管显示时间,原理4位数码管显示的基本一样仿真图:本文引用地址:http://www.eepw.com.cn/article/201611/323550.htm程序源代码:作者:胡琴联系qq:1257394091本程序版本规本人所有可以任意转载:技术...
  • 源工程文件(Keil uVision4文件)和课程设计报告电子时钟的设计—单片机综合设计报告目录1任务内容2系统框图3硬件电路图4软件流程图5结束语附录1:实际效果图附录2:源程序参考文献1任务内容设计一基于单片机的电子...
  • 51系列数码管显示时间

    千次阅读 2020-04-05 18:53:49
    利用数码管显示时间(非当前时间) #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit dula=P2^6; ...
  • 2.编写程序让接在P0口的数码管显示时分秒数每加一 3.要求1时间间隔使用定时器中断实现 4.七段数码管的位选和段选通过74HC595控制 5.要求可以通过按键设置时间值以及切换日期显示 6.不添加按键的代码相比更好...
  • A 由数码管作为显示器,可通过开关设置年月日星期等时间; 程序设计1 #include <reg51.h> #define uchar unsigned char uchar code tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};...
  • 1)实验平台:正点原子新起点V2开发板 ...3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 ...第三十一章RTC实时时钟数码管显示实验 PCF8563是一款多功能时钟/日历芯片。因其功耗低、控制简单、封装小而
  • 定时器的工作过程实际是对时钟脉冲计数)因工作需要,定时器除了占有自己编号的存储器位外,还占有一设定值寄存器(字),一当前值寄存器(字)。设定值寄存器(字)存储编程时赋值的计时时间设定值。当前值...
  • 这是我自己做的关于LED显示电子钟的制作。 目录 摘要: 1 关键词:单片机;LED点阵;数字时钟 1 1.电路设计的目的、任务、指标指标及工艺要求 2 1.1 课程设计的目的 2 1.2 课程设计的任务 2 1.3 课程设计的指标 3 ...
  • 51单片机AT89C52数码管电子钟proteus仿真实验。用延时函数实现的电子钟,没有使用定时器用延时的方法实现
  • 单片机电子时钟的设计(期末课程设计)

    万次阅读 多人点赞 2021-03-20 15:00:36
    设计一时钟,可以正常显示时分秒,也可以通过按键改变分钟和小时,且有整点提醒功能 1、能够正常计时并且能够显示小时、分钟、,10。 (1)正常显示秒,2 (2)正常显示分,2 (3)正常显示时,2 ...
  • 电路图: 汇编代码: ORG 0000H LJMP MAIN ORG 000BH LJMP TIME ORG 0100H ;宏定义 ;键位 K0 BIT 20H.0 K1 BIT 20H.1 K2 BIT 20H.2 K3 BIT 20H.3 K4 BIT 20H.4 ;暂存区 ST ...
  • 《89C51单片机秒表的设计.doc》由会员分享,可免费在线阅读全文,更多《89C51单片机秒表的设计》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。...延时ms子程序MOVR,D;D:MOVR...

空空如也

空空如也

1 2 3 4 5
收藏数 92
精华内容 36
关键字:

8 个数码管上分两组动态显示年月日与时分秒,显示延时用定时器实现,电路如何连接?程序如何修改?

友情链接: mathlab.zip