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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4068|回復: 2
收起左側

6位數碼管電子鐘單片機程序

[復制鏈接]
ID:214602 發表于 2017-6-26 14:19 | 顯示全部樓層 |閱讀模式
#include "reg52.h"
#include "eeprom52.h"
#include "Nixie tube.h"
//宏定義
#define uchar unsigned char
#define uint  unsigned int

//按鍵定義
sbit key_1 = P1^0;          //定義設置時間
sbit key_2 = P1^3;          //定義鬧鈴設置
sbit key_3 = P1^1;          //定義數據加
sbit key_4 = P1^2;          //定義數據減
sbit beep  = P3^5;    //蜂鳴器設置
sbit dp    =P2^7;     //數碼管小數點定義

uchar code ss[]=
{
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80                                        //0-9不包括小數點
};        
uchar code ss1[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x80};  //0,1,2,3,4,5,6,7,8,9,小數點亮其他滅  0-9包括小數點

uchar put[8],sec,min,hour,N_hour,N_min,ms,state,state1,time;                        //定義鬧鈴、時間變量

bit mode,s1,beep1,beep2,beep3;

/********************************************************************
* 名稱 : delay()
* 功能 : 小延時。                                                                                                         
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay(uint ys)
{
        while(ys--);
}
/********************************************************************
* 名稱 : show()
* 功能 : 數碼管顯示程序                                                                                                         
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void show()
{        
        uchar i;               
        if(mode==0)         //當前時間顯示
        {
                if(state==1&s1==1) //設置閃爍處理
                  {
                        put[7]=10;
                        put[6]=10;               
                    }
                else
                  {
                        put[7]=hour/10%10;  //小時顯示暫存數據
                        put[6]=hour%10;
                  }
                put[5]=0x40;
                if(state==2&s1==1)        //設置閃爍處理
                  {
                        put[4]=10;
                        put[3]=10;
                  }
                else
                  {
                        put[4]=min/10%10;  //分鐘顯示暫存數據
                        put[3]=min%10;
                  }
                put[2]=0x40;
                if(state==3&s1==1)        //設置閃爍處理
                  {
                        put[1]=10;
                        put[0]=10;
                  }
                else
                  {
                        put[1]=sec/10%10;  //秒顯示暫存數據
                        put[0]=sec%10;
                  }
               
                 Nixietube(ss1[put[7]],ss1[put[6]],ss1[put[4]],ss1[put[3]],ss[put[1]],ss[put[0]]) ;            //顯示時間
                 
        

        }
        else
        {        dp=0;
                put[7]=0xF7;
                put[6]=0xB8;
                put[5]=0x40;
                if(state1==1&s1==1)        //設置閃爍處理
                  {
                        put[4]=10;
                        put[3]=10;
                  }
                else
                  {
                        put[4]=N_hour/10%10;        //鬧鐘小時顯示暫存數據
                        put[3]=N_hour%10;
                   }
                 put[2]=0x40;
                if(state1==2&s1==1)         //設置閃爍處理
                  {
                        put[1]=10;
                        put[0]=10;
                  }
                else
                  {
                        put[1]=N_min/10%10;        //鬧鐘分鐘顯示暫存數據
                        put[0]=N_min%10;
                  }        
                 Nixietube(put[7],put[6],ss1[put[4]],ss1[put[3]],ss[put[1]],ss[put[0]]) ;        //顯示鬧鈴                 
        }

}
/********************************************************************
* 名稱 : key()
* 功能 : 按鍵控制程序                                                                                                         
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void key()
{
        if(!key_1)//判斷按鍵是否按下
        {
                delay(1000);         //按鍵延時去抖
                if(!key_1)         //在次判斷按鍵是否按下
                {
                        while(!key_1) show();  //按鍵判斷釋放  并調用顯示程序   作用:使按按鍵是數碼管顯示無異常
                        if(mode==0)                   //執行按鍵對應的控制內容
                        {
                                state=(state+1)%4;        //切換設置項
                        }
                }
        }        

        if(!key_2)    //判斷按鍵是否按下
        {
                delay(1000);  //按鍵延時去抖
                if(!key_2)    //在次判斷按鍵是否按下
                {
                        while(!key_2) show();   //按鍵判斷釋放  并調用顯示程序   作用:使按按鍵是數碼管顯示無異常
                        if(state==0)                  //執行按鍵對應的控制內容
                        {
                                state1=(state1+1)%3; //模式切換    設置鬧鐘時間
                                if(state1==0)
                                {
                                        mode=0;
                                }else
                                {
                                        mode=1;
                                }
                        }
                }
        }        

        if(!key_3)        //判斷按鍵是否按下
        {
                delay(1000);         //按鍵延時去抖
                if(!key_3)    //在次判斷按鍵是否按下
                {
                        while(!key_3) show();   //按鍵判斷釋放  并調用顯示程序   作用:使按按鍵是數碼管顯示無異常
                        if(mode==0)                 //執行按鍵對應的控制內容
                        {
                                switch(state)           //根據當前的模式和設置項  設置值的大小并保存
                                {
                                        case 1:
                                                hour++;
                                                if(hour>23) hour=0;
                                                SectorErase(0x2400);         //保存數據到單片機EEPROM中
                                                byte_write(0x2400,hour);
                                        break;

                                        case 2:
                                                min++;
                                                if(min>59) min=0;
                                                SectorErase(0x2200);         //保存數據到單片機EEPROM中
                                                byte_write(0x2200,min);
                                        break;

                                        case 3:
                                                sec++;
                                                if(sec>59) sec=0;
                                        break;
                                }
                        }else
                        {
                                switch(state1)                   //根據當前的模式和設置項  設置值的大小并保存
                                {
                                        case 1:
                                                N_hour++;
                                                if(N_hour>23) N_hour=0;
                                                SectorErase(0x2600);         //保存數據到單片機EEPROM中
                                                byte_write(0x2600,N_hour);
                                        break;

                                        case 2:
                                                N_min++;
                                                if(N_min>59) N_min=0;
                                                SectorErase(0x2800);         //保存數據到單片機EEPROM中
                                                byte_write(0x2800,N_min);
                                        break;
                                }
                        }
                }
        }        

        if(!key_4)//判斷按鍵是否按下
        {
                delay(1000);           //按鍵延時去抖
                if(!key_4)          //在次判斷按鍵是否按下
                {
                        while(!key_4) show();         //按鍵判斷釋放  并調用顯示程序   作用:使按按鍵是數碼管顯示無異常
                        beep1=0;                         //執行按鍵對應的控制內容
                        if(mode==0)                  //根據當前的模式和設置項  設置值的大小并保存
                        {
                                switch(state)
                                {
                                        case 1:
                                                if(hour!=0)hour--;
                                                else hour=23;
                                                SectorErase(0x2400);         //保存數據到單片機EEPROM中
                                                byte_write(0x2400,hour);
                                        break;

                                        case 2:
                                                if(min!=0)min--;
                                                else min=59;
                                                SectorErase(0x2200);         //保存數據到單片機EEPROM中
                                                byte_write(0x2200,min);
                                        break;

                                        case 3:
                                                if(sec!=0)sec--;
                                                else sec=59;
                                        break;
                                }
                        }else
                        {                                                 //根據當前的模式和設置項  設置值的大小并保存
                                switch(state1)
                                {
                                        case 1:
                                                if(N_hour!=0)N_hour--;
                                                else N_hour=23;
                                                SectorErase(0x2600);         //保存數據到單片機EEPROM中
                                                byte_write(0x2600,N_hour);
                                        break;

                                        case 2:
                                                if(N_min!=0)N_min--;
                                                else N_min=59;
                                                SectorErase(0x2800);         //保存數據到單片機EEPROM中
                                                byte_write(0x2800,N_min);
                                        break;
                                }
                        }
                }
        }        
}
/********************************************************************
* 名稱 : main()
* 功能 : 主程序                                                                                                         
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
        TMOD=0x01;           //定時器0配置   模式0
        TH0=0x3c;                    //定時50ms   賦初值
        TL0=0xb0;
        EA=1;                    //打開總中斷
        ET0=1;                    //定時器0中斷
        TR0=1;                    //定時器0啟動定時
        min=byte_read(0x2200);        //讀取單片機EEPROM中保存的數據
        hour=byte_read(0x2400);
        N_hour=byte_read(0x2600);
        N_min=byte_read(0x2800);

        if(sec>59||min>59||hour>23||N_hour>23||N_min>59)        //判斷讀出的數據是否正確    如果不正確
        {
                hour=15;                                                  //則重新賦值
                min=30;
                sec=0;
                N_hour=14;
                N_min=30;
        }
        SectorErase(0x2200);         //保存數據到單片機EEPROM中
        byte_write(0x2200,min);
        SectorErase(0x2400);         //保存數據到單片機EEPROM中
        byte_write(0x2400,hour);
        SectorErase(0x2600);         //保存數據到單片機EEPROM中
        byte_write(0x2600,N_hour);
        SectorErase(0x2800);        //保存數據到單片機EEPROM中
        byte_write(0x2800,N_min);

        while(1)
        {
                show();            //調用數碼管顯示程序
                key();            //調用按鍵控制程序
                if(state==0&&mode==0)   //鬧鐘報警處理部分
                {
                        if(min==N_min&&hour==N_hour)
                        {
                                if(beep3==0)
                                {
                                        beep3=1;
                                        beep1=1;
                                }
                        }else
                        {
                                beep3=0;
                                beep1=0;
                        }
                }

        }
}

void init_1() interrupt 1    //定時器0中斷服務程序
{
        TH0=0x3c;                //重新賦值
        TL0=0xb0;
        ms++;                 //計時變量計時

        if(ms%5==0)
        {
                if(beep1==1||beep2==1)//蜂鳴器報警處理
                {
                        beep=!beep;
                }else
                {
                        beep=1;
                }
        }
        if(ms%10==0) s1=!s1;   //數碼管設置閃爍處理
        if(ms>19)                            //1s定時
        {
                ms=0;
                if(time!=0) time--;          //倒計時
                else beep2=0;
                if(state==0)sec++;         //非設置狀態計時
                if(sec>59)                  //1min  定時   整點鬧鈴
                {
                        sec=0;
                        min++;
                        SectorErase(0x2200);         //保存數據到單片機EEPROM中
                        byte_write(0x2200,min);
                        if(min>59)                    //1hour  定時
                        {
                                time=2;
                                beep2=1;                                //蜂鳴器標志
                                min=0;
                                SectorErase(0x2200);        //保存數據到單片機EEPROM中
                                byte_write(0x2200,min);
                                hour++;
                                SectorErase(0x2400);        //保存數據到單片機EEPROM中
                                byte_write(0x2400,hour);
                                if(hour>23)
                                {
                                        hour=0;
                                        SectorErase(0x2400);         //保存數據到單片機EEPROM中
                                        byte_write(0x2400,hour);
                                }
                        }
                }
        }
}

回復

使用道具 舉報

ID:215240 發表于 2017-6-28 11:24 | 顯示全部樓層
有硬件搭配嗎
回復

使用道具 舉報

ID:242298 發表于 2019-11-22 04:02 | 顯示全部樓層
求硬件電路圖謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品视频一区 | 欧美 日韩 中文 | 日韩三级一区 | 久久人爽 | 国产高清久久 | av在线一区二区三区 | 久久久久国产精品 | 日韩精品成人av | 黄色片免费在线观看 | 欧美成人精品一区二区三区 | 精品亚洲一区二区三区四区五区高 | 精品免费视频 | 天天射网站| www.久久影视 | 亚洲国产一区二区三区 | 免费特级黄毛片 | 黄视频国产 | 九九热久久免费视频 | 精品欧美久久 | 日韩视频在线观看一区二区 | 成人三级网址 | 欧美成人影院 | 51ⅴ精品国产91久久久久久 | www.久久久.com | 丝袜 亚洲 另类 欧美 综合 | 正在播放国产精品 | 羞羞视频网站在线观看 | 日日操日日舔 | 欧美一区二区三区久久精品 | 日本一区二区不卡视频 | 国产欧美精品一区二区 | 国产精品爱久久久久久久 | 高清成人av | 2021狠狠干| 福利色导航 | 毛片久久久 | 中文字幕日本一区二区 | 高清视频一区二区三区 | 免费毛片网| 日韩a级片| 色爱区综合|