新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機小鬧鐘

        51單片機小鬧鐘

        作者: 時間:2016-11-25 來源:網絡 收藏
        以前用51的時候,在Proteus里邊仿真過很多東西,51的一些基本功能都做過實驗,復雜點的東西雖然也有,但是都是隨性而來,需要什么用什么,程序顯得臃腫難讀,效率低下,且沒有及時把分析記錄下來

        本文引用地址:http://www.104case.com/article/201611/321542.htm

        有時間自己再做一遍鬧鐘,跟以前做的感覺差別很大,以前好像都是COPY,自己改動的很少,而且老覺得程序長,當自己去設計步驟時,出現的問題卻不在這個地方,雖然51對于很多人而言,已再熟悉不過,但是我覺得算法都一樣,在很熟悉的51上驗證算法是很有效率的

        功能:

        1:時鐘顯示

        2:時鐘可調

        3:可設鬧鐘

        4:鬧鐘隨時可關

        思路:

        1:時鐘用定時器1控制,每隔一秒,秒變量+1,

        數碼管掃描顯示時鐘

        2:設置2個可調時分按鍵,按鍵按下,對應時間變量+1

        3:設置模式鍵,奇數次按下,改變鬧鐘時分

        偶數次按下,改變時鐘時分

        不斷地查詢檢測,時鐘時分==鬧鐘時分?,如果等于,則相應鬧鈴

        4:設置關鬧鈴鍵,按下時關閉鬧鈴

        在這個地方會出現一個小問題,鬧鐘是否開啟需要一直掃描,關鬧鐘按鍵也需要一直掃描,

        當按鍵按下,在此刻關掉鬧鐘,但是,在這一分鐘之內,鬧鐘都有開啟的理由,故關了之后,

        再次檢測鬧鐘時,鬧鐘會再次打開,

        改善方法:設置標志量,當關鬧鐘之后的額定時間內,不再檢測鬧鐘,額定時間與鬧鐘的控制精度有關


        程序如下:


        #include

        #define uchar unsigned char
        #define uint unsigned int

        sbit beep=P3^1;
        sbit led=P3^0;

        sbit hour_key=P3^4;//調節小時鍵
        sbit minu_key=P3^5;//調節分鐘鍵

        sbit stopsounder_key=P3^3; //關鬧鐘按鍵

        bit sounder_flag=0;

        sbit mode_key=P3^7; //調節時鐘還是鬧鈴控制按鍵


        uchar mode_number;//模式計數

        uchar sec_count;

        uint a,b; //模式計數

        uchar minu0=1;
        uchar hour0,sec0, //鬧鐘

        hour1,minu1,sec1,//時鐘

        h1,h2,m1,m2,s1,s2,//顯示位

        k;//狀態轉換標志

        uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

        uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};



        void keyscan();
        void init();
        void delay(uchar z);
        void display(uchar,uchar,uchar);
        void mode_check();


        void init()
        {
        a=0;
        b=0;
        k=0;


        hour1=0;
        minu1=0;
        sec1=0;

        hour0=0;
        minu0=1;
        sec0=0;

        TMOD=0x11; //定時器0,1工作于方式1;賦初值

        TH0=(65536-5000)/256;
        TL0=(65536-5000)%6;

        TH1=(65536-50000)/256;
        TL1=(65536-50000)%6;



        EA=1;

        EX0=1;

        //ET0=0;
        ET1=1;

        IT0=1; //P3.2引腳下經沿產生外部中斷0

        //PX0=1;


        //TR0=1; //初始,秒表不工作

        TR1=1; //時鐘一開始工作


        }


        void delay(uchar z)
        {
        int x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }



        void ex0_int() interrupt 0
        {

        //作用待添加
        }


        上一頁 1 2 下一頁

        關鍵詞: 51單片機小鬧

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 太原市| 离岛区| 富川| 南昌县| 临清市| 保亭| 泰顺县| 阆中市| 商丘市| 苍溪县| 桃园市| 社会| 兴和县| 苍南县| 灵石县| 闻喜县| 图木舒克市| 南江县| 会昌县| 天镇县| 射洪县| 荆门市| 崇礼县| 潼关县| 贵定县| 叙永县| 长兴县| 九龙坡区| 东至县| 西充县| 称多县| 泸溪县| 塔城市| 天津市| 泰来县| 肥东县| 金溪县| 夏邑县| 利津县| 彭泽县| 湖州市|