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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2650|回復: 2
打印 上一主題 下一主題
收起左側

可調單片機數字時鐘的設計

[復制鏈接]
跳轉到指定樓層
樓主
軟件設計:
#include<reg51.h>
#define ulong unsigned long
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數碼管數字碼
char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共陽數碼管數字碼(帶小數點)
#define LED P0    //P0為數碼管的段選
#define LIGHT P1  //P1為時分秒位的指示燈
#define WS P2  //P2為數碼管的位選
sbit time_change=P3^0;  //P3^0為“調時”按鍵
sbit time_choose=P3^1;  //P3^1為“選擇時分秒”按鍵
sbit time_inc=P3^2;  //P3^2為“增加”按鍵
sbit time_red=P3^3;         //P3^3為“減小”按鍵
sbit time_ok=P3^4;  //P3^4為“完成”按鍵
ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定義秒,分,時,秒的個位,十位,分的個位,十位,時的個位,十位
int choose_n;  //按下“選擇時分秒”按鍵的次數
int flag;    //定義“調時”按鍵的標志位
void init();
void display();
void delay(int);
void time_modify();
void main()
{
     init();
     while(1)
     {
         TR0=1;
         display();
         time_modify();
     }
}
void init()
{
     WS=t=LIGHT=choose_n=0;
     sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
     TMOD=0x01;        //定義定時器0工作與方式1
     TH0=(65536-5536)/256;    //定時器賦初值
     TL0=(65536-5536)%256;
     EA=1;    //開總中斷和T0中斷
     ET0=1;
}
//--------延時子函數-------------------//
void delay(int x)
{
     int i,j;
     for(i=x;i>0l;i--)
     for(j=255;j>0;j--);
}
//-------------顯示子函數---------------//
void display()
{
     int i=0;
     if(TF0==1)    //如果定時器溢出
     {
         TF0=0;    //清中斷標志位
         t++;
         if(t==10)
         {
             t=0;
             sec++;    //秒加1
                         if(sec==60)  //如果秒為60,則清零,分加1
             {
                sec=0;
                min++;
             }
             if(min==60)    //如果分為60,則清零,時加1
             {
                 min=0;
                 hour++;
             }
             if(hour==24)    //如果時為24,則清零
             {
                hour=0;
             }
         }
     }
     sec_ge=sec%10;    //秒的個位和十位
     sec_shi=sec/10;
     min_ge=min%10;    //分的個位和十位
     min_shi=min/10;
     hour_ge=hour%10;  //時的個位和十位
     hour_shi=hour/10;
     WS=0x20;    //循環掃描
     LED=tab[sec_ge];
     delay(1);
     WS=0x10;
     LED=tab[sec_shi];
     delay(1);
     WS=0x08;
     LED=tab_dp[min_ge];
     delay(1);
     WS=0x04;
     LED=tab[min_shi];
     delay(1);
     WS=0x02;
     LED=tab_dp[hour_ge];
     delay(1);
     WS=0x01;
     LED=tab[hour_shi];
     delay(1);
}
//----------------調時子程序----------------------//
void time_modify()
{
     if(time_change==0)    //如果“調時”按鍵按下
     {
         delay(5);      //延時去抖
         if(time_change==0)
         {
             flag=1;    //標志位置1
             while(flag)    //當標志位為1時才能進行時間調整
             {
                 TR0=0;  //定時器停止
                 display();  //顯示停止時的時間
                 if(time_ok==0)  //如果“完成”按鍵按下
                 {
                      delay(15);    //延時去抖
                      if(time_ok==0)
                      {
                          flag=0;  //標志位清零
                      }
                 }
                 if(time_choose==0)  //如果“時分秒選擇”按鍵按下
                 {
                     delay(30);  //延時去抖
                     if(time_choose==0)
                     {
                          ++choose_n;  //按下的次數增加
                           if(choose_n==4)  //如果次數達到4次
                           {
                               choose_n=1;  //次數清零
                           }
                           if(choose_n==1)  //如果次數為1,秒指示燈亮
                           {
                               LIGHT=0x03;
                           }
                           else if(choose_n==2) //如果次數為2,分指示燈亮
                           {
                               LIGHT=0x0c;
                           }
                           else if(choose_n==3)  //如果次數為3,時指示燈亮
                           {
                               LIGHT=0x30;
                           }
                     }
                }
                if(time_inc==0)      //如果“增加”按鍵按下
                {
                    delay(30);    //延時去抖
                    if(time_inc==0)
                    {
                        switch(choose_n)  //分支結構,根據choose_n的值來判斷哪一位加1
                        {
                            case 1:    //如果choose_n為1,秒加1,到60清零
                            {
                                 sec++;
                                 if(sec==60)
                                 sec=0;
                                 break;
                            }
                            case 2:      //如果choose_n為2,分加1,到60清零
                            {
                                min++;
                                if(min==60)
                                min=0;
                                break;
                             }
                             case 3:    //如果choose_n為3,時加1,到24清零
                            {
                                hour++;
                                if(hour==24)
                                hour=0;
                                break;
                            }
                            default:break;
                            }
                     }
                }  
                            if(time_red==0)      //如果“減小”按鍵按下
                {
                    delay(30);    //延時去抖
                    if(time_red==0)
                    {
                        switch(choose_n)  //分支結構,根據choose_n的值來判斷哪一位加1
                        {
                            case 1:    //如果choose_n為1,秒減1,到0清零
                            {
                                 sec--;
                                 if(sec==0)
                                 sec=60;
                                 break;
                            }
                            case 2:      //如果choose_n為2,分減1,到0清零
                            {
                                min--;
                                if(min==0)
                                min=60;
                                break;
                            }
                            case 3:    //如果choose_n為3,時減1,到0清零
                            {
                                 hour--;
                                 if(hour==0)
                                 hour=24;
                                 break;
                            }
                            default:break;
                        }
                    }
                }
            }
       }
   }
}
硬件設計:


捕獲.PNG (42.08 KB, 下載次數: 77)

可調數字時鐘的設計

可調數字時鐘的設計

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:317383 發表于 2020-3-21 21:16 | 只看該作者
感覺不錯
回復

使用道具 舉報

板凳
ID:738471 發表于 2020-4-26 14:09 | 只看該作者
要是想加一個定時器應該怎么辦大佬
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清久久久 | 精品国产欧美一区二区三区成人 | 亚洲一区视频在线 | 亚洲理论在线观看电影 | 欧美一区 | 国产999精品久久久久久 | 国产女人与拘做受视频 | 久久国产一区二区 | 欧美日韩一区二区三区四区五区 | 国产精品永久 | 欧美一二区 | 欧美日韩亚洲一区 | 91在线一区| 亚洲精品一区中文字幕乱码 | www.日本三级 | 免费视频久久 | 一色一黄视频 | 一区二区在线 | 一区二区三区视频在线观看 | 亚洲午夜精品在线观看 | 狠狠躁夜夜躁人人爽天天高潮 | 一区二区免费高清视频 | 欧美a在线 | 精品国产一级 | 高清av在线 | 国产高潮好爽受不了了夜色 | 成人在线中文字幕 | 青青草在线视频免费观看 | 国产一区二 | 国产在线观看一区二区 | 91在线电影| 日本在线中文 | 国产精品免费观看 | 国产精品欧美一区二区三区不卡 | 国产精品毛片无码 | 久久久久精| 久久国产免费 | 中文字幕一区在线观看视频 | 国产视频三区 | 日本色综合 | 精品一区二区电影 |