找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机计时和点亮灯的功能没法同时发生

查看数: 2094 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-6-10 00:03

正文摘要:

这是我自己设计的计时和点亮三个小灯的设计,现在发现计时和点亮小灯没法同时实现. 遇到的问题如下: 1.假如我把led_display程序发在while语句最后一行,会发生数码管前五位会随着小灯一起闪烁 ...

回复

ID:264029 发表于 2018-6-10 18:53
wulin 发表于 2018-6-10 06:43
因为你使用delay处理两个程序,就会产生互相干扰。你把数码管动态显示放在中断里,中断时间改为1ms就不会互 ...

问题解决了,谢谢解答。
ID:168971 发表于 2018-6-10 14:58
放在中断里试试,弄个标志位,应该可以
ID:213173 发表于 2018-6-10 06:43
因为你使用delay处理两个程序,就会产生互相干扰。你把数码管动态显示放在中断里,中断时间改为1ms就不会互相干扰了。
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int

uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};   /*七段共阴管显示定义*/

uchar seconde=0;   /*定义并初始化变量*/
uchar minite=0;
uchar hour=0;
uint mstcnt=0;

/*函数声明*/
void delay(uchar k );             //延时子程序
void time_pro( );          //时间处理子程序
void display( );           //显示子程序
void keyscan( );           //键盘扫描子程序
void led_display( );           // led闪烁程序

/*****************************/
/*led灯闪烁程序*/
/****************************/
void led_display(void)
{
        delay(50);     //led灯闪烁三次后熄灭
        P2=0x07;       //赋初始值
        delay(50);
        P2=0x00;
        delay(50);
        P2=0x07;
        delay(50);
        P2=0x00;
        delay(50);
        P2=0x07;
        delay(50);
        P2=0x00;  
}

/*****************************/
/*延时子程序*/
/****************************/
void delay (uchar k)
{
        uchar j;
        while((k--)!=0)
        {
                for(j=0;j<125;j++)
                {;}
        }
}

/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
        if(seconde==60)                  //秒钟设为60进制
        {
                seconde=0;
                minite++;
                if(minite==60)              //分钟设为60进制
                {
                        minite=0;
                        hour++;
                        if(hour==24)              //时钟设为24进制       
                        {
                                hour=0;
                        }
                }
        }
}

/*****************************/
/* 显示子程序*/
/*****************************/
void display()
{
        static uchar i=0;
        P0=0x00; //消隐
        switch(i)
        {
                case 0: P1=0xfe;
                                P0=dispcode[hour/10];//显示小时的十位
                                i++;
                                break;

                case 1: P1=0xfd;
                                P0=(dispcode[(hour%10)])|0X80;//显示小时的个位
                                i++;
                                break;

                case 2: P1=0xfb;
                                P0=dispcode[minite/10];//显示分的十位
                                i++;
                                break;

                case 3: P1=0xf7;
                                P0=(dispcode[minite%10])|0X80;//显示分的个位
                                i++;
                                break;

                case 4: P1=0xef;
                                P0=dispcode[seconde/10];//显示秒的十位
                                i++;
                                break;

                case 5: P1=0xdf;
                                P0=dispcode[seconde%10];//显示秒的个位
                                i=0;
                                break;
        }
}


/**************************/
/*主函数*/
/**************************/
void main(void)
{   
        P1=0xff;                //初始化p1口,全设为1  
        TMOD=0x01;            //time0为定时器,方式1
        TH0=0xfc;               //预置计数初值1ms
        TL0=0x18;
        EA=1;
        ET0=1;
        TR0=1;
        while (1)
        {      
                led_display( );         //led灯闪烁
                time_pro( );   //时间处理
//                display( );    //显示时间
        }
}
void timer0(void) interrupt 1 using 0     //定时器0方式1,50ms中断一次
{
        TH0=0xfc;               //重置计数初值1ms
        TL0=0x18;
        mstcnt++;
        if(mstcnt>=1000)
        {
                seconde++;
                mstcnt=0;   
        }               
        display( );    //显示时间
}



小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表