标题:80C51单片机电子钟程序
只看楼主
六翅
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-12-6
结帖率:0
已结贴  问题点数:20 回复次数:3 
80C51单片机电子钟程序
遇到了一个重要的51单片机程序,但是看不大懂。有哪位高手能讲解一下吗?
void datadispProc(void);
uchar disp_data[8]={0};
uchar TimeIntCnt;
uchar Timehms[3]={20,59,50};
uchar Timerhm[2]={21,5};
bit secflag = 0;
uchar func = 0;

void main()
{
    uchar i,j,tmpdata;
   
    P2 = 0xff;                        //关闭所有数码管
    P1 = 0x00;
    //数码管测试   
    for( i = 0; i < 1; i++)
    {
        tmpdata = 0xfe;
        for( j = 0; j < 6; j++)
        {
            P2 = tmpdata;
            P1 = 0xff;
               delayms(100);
            tmpdata = _crol_(tmpdata, 1);
        }
   
    }        
    for( i = 0; i < 1; i++)
    {
        tmpdata = 0xdf;
        for( j = 0; j < 6; j++)
        {
            P2 = tmpdata;
            P1 = 0xff;
               delayms(100);
            tmpdata = _cror_(tmpdata, 1);
        }
   
    }
    //定时/计数器初始化
    TMOD = 0X10;
    TH1 = 0X3C;
    TL1 = 0XB0;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
    datadispProc();           
    TimeIntCnt = 0;
    while(1)
    {   
        //按键处理程序
        if(key1 == 0)
        {
            delayms(10);
            if(key1 == 0)
            {
                 if(func++ >= 4) func = 0;
                while(key1 == 0);
            }
        }
        //按键处理程序
        else if(key2 == 0)
        {
            delayms(10);
            if(key2 == 0)
            {
                 switch(func)
                {
                    case 1:  Timehms[0]++; break;
                    case 2:  Timehms[1]++; break;
                  case 3:  Timerhm[0]++; break;
                    case 4:  Timerhm[1]++; break;
                    default: func = func;
                }
                while(key2 == 0);
            }
        }
        //按键处理程序
           else if(key3 == 0)
        {
            delayms(10);
            if(key3 == 0)
            {
                 switch(func)
                {
                    case 1:  Timehms[0]--; break;
                    case 2:  Timehms[1]--; break;
                    case 3:  Timerhm[0]--; break;
                    case 4:  Timerhm[1]--; break;
                    case 5:  func =0 ; break;
                    default: func = func;
                }
                while(key3 == 0);
            }
        }
        //显示程序设计调用
        display();
    }
}
//显示数据处理程序
void datadispProc(void)
{

    if(func == 1 || func ==2 || func ==0)
    {
         disp_data[0] = Timehms[0]/10;
         disp_data[1] = Timehms[0]%10;
         disp_data[3] = Timehms[1]/10;
         disp_data[4] = Timehms[1]%10;
         disp_data[6] = Timehms[2]/10;
         disp_data[7] = Timehms[2]%10;
        disp_data[2] = 10;
        disp_data[5] = 10;
        if(func != 0)
        {
            if(secflag)
            {
                 switch(func)
                {
                     case 1:
                    {   
                        disp_data[0]=10;
                        disp_data[1]=10;
                    }break;
                    case 2:
                    {
                        disp_data[3]=10;
                        disp_data[4]=10;
                    }break;
                    
                }
            }   
        }
    }
    else if(func == 3 || func ==4 )
    {
         disp_data[0] = 11;
         disp_data[1] = 11;
         disp_data[3] = Timerhm[0]/10;
         disp_data[4] = Timerhm[0]%10;
         disp_data[6] = Timerhm[1]/10;
         disp_data[7] = Timerhm[1]%10;
        
        disp_data[5] = 10;
        if(func != 0)
        {
            if(secflag)
            {
                 switch(func)
                {
                     case 3:
                    {   
                        disp_data[3]=10;
                        disp_data[4]=10;
                    }break;
                    case 4:
                    {
                        disp_data[6]=10;
                        disp_data[7]=10;
                    }break;
                    
                }
            }   
        }
    }                        

}
//显示程序
void display(void)
{
    uchar  i;
    uchar  dis_digit;
    dis_digit = 0x01;
    for( i = 0; i < 8; i++)
    {
        P2 = dis_code[disp_data[i]];        //段码送P2口
        P1 = dis_digit;                 //位码送P1口
        delayms(1);
        P1 = 0x00;
        dis_digit = _crol_(dis_digit, 1);    //位选通左移,下次选通下一位         
    }
}

//延时程序
void delayms(unsigned int ms)            //延时子程序(晶振12M)
{                        
    uchar i;
    while(ms--)
    {
        for(i = 0; i < 120; i++);
    }
}
//定时器中断函数
void Time1Ser(void) interrupt 3
{
     TH1 = 0X3C;
    TL1 = 0XB0;
    if( TimeIntCnt++ >= 15)
    {
        secflag = ~secflag;
         TimeIntCnt = 0;
        if(Timehms[2]++ >=59)
        {
             Timehms[2] = 0;
            if(Timehms[1]++ >=59)
            {
                Timehms[1] = 0;
               if(Timehms[0]++ >=23)
               {
                    Timehms[0] = 0;
               }
            }            
        }
        //定时控制按键
        if(key4 == 0)
        {
            if((Timehms[0] == Timerhm[0]) && (Timehms[1] == Timerhm[1]))
            {
                 led = 0;
            }
            else
            {
                 led = 1;
            }
        }
        else
        {
             led = 1;   
        }
        //调用显示数据处理程序        
        datadispProc();         
    }  
}
搜索更多相关主题的帖子: void for while case break 
2019-03-03 22:14
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
得分:10 
这个论坛估计回答不了你这个问题。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2019-03-04 16:04
Mr_doge
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:159
专家分:385
注 册:2018-6-28
得分:10 
    C51编程是在一个无系统的平台上编程的,程序所能使用的只有极其有限的少数由硬件层面提供支持的汇编命令和简单的功能实现,只是因为逻辑用汇编写着麻烦,才会用C编写,然后编译器将一些逻辑再编译成繁琐的汇编命令实现

    但是在涉及到接口命令的时候,很多时候都是使用位操作来进行的,这些部分你不了解C51的具体命令和接口、机制的话会完全看不懂,哪怕它是C的语法编写的东西,这个程序涉及到的东西有C51的命令与接口,基础的C语法,包括变量,赋值,常用运算符,以及一点点数组的使用和数学的东西(加法和除法),并且没有为了性能而进行各种优化和魔改,相当简洁明了易懂的程序

    如果外部设备不同可能会有指令差异,确切来说就是发送出去的命令会不同,同样得去了解具体的资料或者电路设计图,仅仅有程序没有配套的电路概览是不能直接下定论的。

    这个论坛能帮你的人没空管你,确切来说是估计都没空逛论坛,有空的都没兴趣自己查C51的书籍来满足你的请求,因为  1,很麻烦  2,颇有难度 3,没有好处。哪怕对C很熟悉,但是不熟悉汇编和C51的命令、电路针脚和部分特有机制的话,也是无法裸答你的请求的(有dalao可能会觉得太简单了懒得理你这个另说)

    如果是出于学习的目的,建议自己找C51的书好好学习下C51的物理构成、接口、命令以及具体的实现方式,C51的命令真的很少,所以可调用的函数和指令自然不多,只要对接口和各种实现的注意事项熟悉了,其实这代码想看懂不难,它也确实只是个钟罢了,各个部分原理相当简单,虽然很简单,不过时间计算因为使用了定时器,应该算是比较准确的(大概)....硬要说有啥问题的话估计也就延时设定不太靠谱....但是延时都是用在按钮消抖上,所以大概大概就ok啦...

    没学熟C编程,并且对《汇编语言》完全看不懂的话自然一头雾水,先摸懂汇编语言的原理和C的基本语法再说,恕我直言连我这种蠢货都能看懂部分,其实本身理论并没啥难度,不要被吓倒了,不去了解汇编就想写好C51程序是非常不可取的,想搞通这个代码,你需要有一点点的C编程功底(会写hello world不够),并且具备一点点的底层构成原理的知识(知道电脑里有CPU 内存 硬盘 主板...不够),然后学习C51编程(教材应包括构成概览,接口概览,各种编写细节和注意事项的说明,以及最重要的,C51的汇编命令,然后还要有良好的开发教程,当然这些都是一本书就能讲完的,至于学不学得完不在讨论范围)

    如果不是出于学习目的而是实际应用或需求需要增加、修改功能,而且你无法投入太多学习的时间成本还有一定的质量要求的话,请去论坛顶部交易发包,也可以去C51的贴吧论坛之类的地方发包,或者去某些商业型外包网站发包,将你的需求、目的、心理底线确定好,这样可以更快解决你的问题,而不是浪费时间等着别人的"热心帮助"
2019-03-08 20:52
六翅
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-12-6
得分:0 
回复 3楼 Mr_doge
谢谢你了
2019-03-27 23:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-493400-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028207 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved