久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11166|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精精国产xxxx视频在线野外 | 玖玖久久 | 日韩欧美在线视频播放 | 精品二区 | 欧美久久久久久 | 日韩精品一区二区三区在线播放 | 久久久久成人精品 | 亚洲国产精品成人无久久精品 | 天天干b| 国产日韩欧美在线观看 | 最新中文字幕 | 区一区二在线观看 | 伊人伊人伊人 | 欧洲精品码一区二区三区免费看 | av网站在线看 | 亚洲欧美成人影院 | 国产成人精品免高潮在线观看 | 99国产视频 | 国产精品海角社区在线观看 | 中国美女撒尿txxxxx视频 | 国产精品久久久久久久久久久久 | 国产成人精品免费视频大全最热 | 久久久精品一区二区 | av中文在线观看 | 欧美一区二区免费 | www.4虎影院 国产999精品久久久影片官网 | 国产精品亚洲一区二区三区在线观看 | 日本一区二区三区四区 | 麻豆久久 | 久久伊人精品 | 久久久久亚洲精品 | 精品久久一区 | 亚洲一区二区三区桃乃木香奈 | 国产一区二区三区视频 | 国产精品视频一二三 | 一区二区三区欧美大片 | 欧美一区在线视频 | 亚洲综合无码一区二区 | 日韩成人性视频 | 中文字幕 在线观看 | 高清成人av |