找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10663|回复: 2
收起左侧

51单片机(定时器中断法时钟 、数码管显示)

[复制链接]
ID:145763 发表于 2016-11-2 18:43 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit duanxuan=P2^6;
sbit weixuan=P2^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0-9的数字码
uchar code weima[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   
uchar aa,bb,shishi,shige,fenshi,fenge,miaoge,miaoshi,temp,shi,fen,miao,k1num=0;

void delayms(uint ms)  //延时函数,数字是几代表时延时少毫秒
{
    uint i,j;
    for(i=ms;i>0;i--)
        for(j=112;j>0;j--);
}
void display(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6)     //数码管显示函数
{
    uchar temp=0x00,x1,x2,x3,x4,x5,x6;
    while(aa!=20)      //数码管循环扫描
    {
/////////////////////////////
        if(k1num=1)       //功能键按下       该为闪烁
        {
            x1=num1;
            if(bb<10)    //前500ms关闭第一个数码管
                num1=temp;
            else                 //后500ms显示第一个数码管的数
                num1=x1;   
        }            
        P0=duanma[num1];     //显示小时的十位
        duanxuan=1;
        duanxuan=0;
        P0=weima[1];
        weixuan=1;
        weixuan=0;
        delayms(2);
/////////////////////////////////////   
    if(k1num=1)
        {
            x2=num2;
            if(bb<10)    //前500ms关闭第二个数码管
                num2=temp;
            else          //后500ms显示第二个数码管的数
            num2=x2;   
        }
        P0=duanma[num2];    //显示小时的个位
        duanxuan=1;
        duanxuan=0;
        P0=weima[2];
        weixuan=1;
        weixuan=0;
        delayms(2);
/////////////////////////////////////////////////   
        P0=0X40;    //在右数第三个数码管输出“——”符号
        duanxuan=1;
        duanxuan=0;
        P0=weima[3];
        weixuan=1;
        weixuan=0;
        delayms(2);
        P0=0XFF;//清屏

////////////////////////////////////////
        if(k1num=2)
        {
            x3=num3;
            if(bb<10)    //前500ms关闭第四个数码管
                num3=temp;
            else            //后500ms显示第四个数码管的数
            num3=x3;   
        }     
        P0=duanma[num3];   //显示分钟的十位
        duanxuan=1;
        duanxuan=0;
        P0=weima[4];
        weixuan=1;
        weixuan=0;
        delayms(1);
///////////////////////////////
        if(k1num=2)
        {
            x4=num4;
            if(bb<10)    //前500ms关闭第五个数码管
                num4=temp;
            else              //后500ms显示第五个数码管的数
            num4=x4;   
        }      
        P0=duanma[num4];       //显示分钟的个位
        duanxuan=1;
        duanxuan=0;
        P0=weima[5];
        weixuan=1;
        weixuan=0;
        delayms(2);
///////////////////////////////////////
   
        P0=0x40;  //左数第6个数码管输出“——“ 符号
        duanxuan=1;
        duanxuan=0;
        P0=weima[6];
        weixuan=1;
        weixuan=0;
        delayms(2);
        P0=0xff;//清屏
///////////////////////////////
        if(k1num=3)
        {
            x5=num5;
            if(bb<10)    //前500ms关闭第七个数码管
                num5=temp;
            else            //后500ms显示第七数个码管的数
            num5=x5;   
        }   
        P0=duanma[num5];       //显示秒钟的十位
        duanxuan=1;
        duanxuan=0;
        P0=weima[7];
        weixuan=1;
        weixuan=0;
        delayms(2);
////////////////////////////////////////////
        if(k1num=3)
        {
            x6=num6;
            if(bb<10)    //前500ms关闭第八个数码管
                num6=temp;
            else          //后500ms显示第八个数码管的数
            num6=x6;   
        }
        P0=duanma[num6];    //显示秒钟的个位
        duanxuan=1;
        duanxuan=0;
        P0=weima[8];
        weixuan=1;
        weixuan=0;
        delayms(2);
     }

}
void init()     //中断初始化函数
{
    aa=0;
    miao=0;
    fen=10;
    shi=18;
    TMOD=0X01;
    TH0=(65536-46080)/256;  //晶振为11.05926MHZ   计50ms
    TL0=(65536-46080)%256;                    //0.05s=(1/晶振)*12*计数值,解得计数值=46080
    EA=1;    //开总中断
    ET0=1;    //允许定时器0中断
    TR0=1;     //定时器0开始工作
}
/*void guanbiao(uchar k1num,uchar numx)      //数码管位闪烁函数
{
    uchar k;
    if(k==k1num)       //功能键按下       该为闪烁
    {
        x1=num1;
        if(bb<10)    //前500ms关闭第一个数码管
            num1=temp;
        else                 //后500ms显示第一个数码管的数
            num1=x1;   
        }
} */
void scankey()
{
    if(k1==0)     //光标指示
    {
        delayms(5);
        if(k1==0)     //延时去抖
        {
            while(!k1);  //等待按键放开
            k1num=1;      //指示在小时两位
            if(k1==0)
            {
                delayms(5);
                if(k1==0)
                {
                    while(!k1);
                    k1num=2;       //指示在分钟两位
                    if(k1==0)
                    {
                        delayms(5);
                        if(k1==0)
                        {
                            while(!k1);
                            k1num=3;       //指示在秒钟两位
                        }
                    }
                }
            }   
        }
        if(k2==0)    //k2按下时加1   
        {
            delayms(5);
            if(k2==0)
            {
                while(!k2);
                if(k1num==1)   //光标在小时位
                {    shi++;
                    if(shi==24)
                        shi=0;
                }
                if(k1num==2)
                {
                    fen++;
                    if(fen==60)
                        fen=0;
                }
                if(k1num==3)
                {
                    miao++;
                    if(miao==60)
                        miao=0;
                }
            }
        }
/*        if(k3==0)    //k3按下时减1   
        {
            delayms(5);
            if(k3==0)
            {
                while(!k3);
                if(k1num==1)   //光标在小时位
                {    shi--;
                    if(shi==-1)
                        shi=23;
                }
                if(k1num==2)
                {
                    fen--;
                    if(fen==-1)
                        fen=59;
                }
                if(k1num==3)
                {
                    miao--;
                    if(miao==-1)
                        miao=59;
                }
            }
        } */
    }
}

void main()
{
    init();      //初始化
    while(1)
    {      
        if(aa==20)
        {
            aa=0;
            miao++;
            if(miao==60)
            {
                miao=0;
                fen++;
                if(fen==60)
                {   
                    fen=0;
                    shi++;
                    if(shi==24)
                        shi=0;
                }
            }
        }
        miaoshi=miao/10; //取十位
        miaoge=miao%10;        //取个位
        fenshi=fen/10;
        fenge=fen%10;
        shishi=shi/10;
        shige=shi%10;
        display(shishi,shige,fenshi,fenge,miaoshi,miaoge);   
    }  
}

void timer_() interrupt 1         //定时器中断函数  
{
    TH0=(65536-46080)/256;
    TL0=(65536-46080)%256;    //定时50ms
    aa++;
    bb++;//用于闪烁
    if(bb==20)
        bb=0;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:284307 发表于 2018-2-17 17:27 | 显示全部楼层
新新菜鸟一枚,请问uchar aa,bb,shishi,shige,fenshi,fenge,miaoge,miaoshi,temp,shi,fen,miao,k1num=0;
这一串都设定成什么意思?uchar temp=0x00,x1,x2,x3,x4,x5,x6;while(aa!=20)  这一段为什么这样做?
回复

使用道具 举报

ID:140489 发表于 2018-3-2 14:13 | 显示全部楼层
程序都没调好的就不要发到论坛来了,免得误导别人
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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