• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 可以調(diào)整時間的電子時鐘-C語言

    可以調(diào)整時間的電子時鐘-C語言

    作者: 時間:2012-09-17 來源:網(wǎng)絡 收藏

    使用stc89c52單片機,電路很簡單,采用八位共陽數(shù)碼管,p0口為數(shù)碼管的段選,p2口為位選. 通過key1-key3來

    本文引用地址:http://www.czjhyjcfj.com/article/170847.htm

    重點:

    1、函數(shù)的模塊化

    2、中斷

    #includereg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit p2_0=P2^0;
    sbit p2_1=P2^1;
    sbit p2_2=P2^2;
    sbit p2_3=P2^3;
    sbit p2_4=P2^4;
    sbit p2_5=P2^5;
    sbit p2_6=P2^6;
    sbit p2_7=P2^7;
    sbit key0=P3^2;
    sbit key1=P3^3;
    sbit key2=P3^4;
    sbit key3=P3^5;
    sbit p17=P1^7;
    uint t=0;
    uint key=0;
    uchar set=0;
    uchar second=00,minter=55,hour=11;
    uchar second_1,second_2,minter_1,minter_2,hour_1,hour_2;
    const uchar tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf} ; //0~~9數(shù)碼表

    void delay() //延時延時子程序
    { uint i;

    for(i=0;i240;i++);

    }
    void time_0(void) interrupt 1 using 0 //內(nèi)部定時器0內(nèi)部定時50ms
    {
    TH0=0x3c;
    TL0=0xb0;
    t++; // t是記定時次數(shù)
    }


    void display(uchar secondd,uchar minterr,uchar hourr) //顯示始終的子程序
    {
    second_1=secondd/10;
    second_2=secondd%10;
    minter_1=minterr/10;
    minter_2=minterr%10;
    hour_1=hourr/10;
    hour_2=hourr%10;
    P0=tab[second_2];
    p2_0=0;
    delay();
    p2_0=1;
    P0=tab[second_1];
    p2_1=0;
    delay();
    p2_1=1;

    p2_2=0;
    P0=0xbf;
    delay();
    p2_2=1;

    P0=tab[minter_2];
    p2_3=0;
    delay();
    p2_3=1;
    P0=tab[minter_1];
    p2_4=0;
    delay();
    p2_4=1;

    p2_5=0;
    P0=0xbf;
    delay(); //延時 是為了使— “——”顯示出來,否則太快,—
    p2_5=1;

    P0=tab[hour_2];
    p2_6=0;
    delay();
    p2_6=1;
    P0=tab[hour_1];
    p2_7=0;
    delay();
    p2_7=1;
    }
    void time()
    {

    //定時1s的時間是否到?
    if(t==19) //1s到,則加一秒
    { t=0;
    second++;
    if(second==60) // 是否為60秒 ,是秒清零,分加一秒,不到則跳出
    {
    second=0;
    minter++;
    if(minter==60) // 分是否為60分,是 ,分清零,時加一;不是則跳出
    { minter=0;
    hour++;
    if(hour==24)
    {

    hour=0;
    }
    }
    }
    }

    display(second,minter,hour); //調(diào)用顯示函數(shù) 來顯示時間時間
    }

    uint scan_key() //時間 按鍵 掃描 函數(shù)
    { //延時
    delay(); //判斷 如果按鍵 按key3下則返回1 來調(diào)用 時間函數(shù),不為零則返回0 不變不調(diào)整
    if(key0==0)
    set=1;
    if(key0==1)
    set=0;
    return set;
    }

    void set_time() //調(diào)整時間函數(shù)
    { uchar m;
    if(key1==0) delay(); //調(diào)整小時,確定key1健按下
    if(key1==0) hour++; // x小時數(shù)遞增
    if(hour==24) hour=0; //小時數(shù)到24,從零開始
    for(m=0;m20;m++) //循環(huán)20次
    { time(); //調(diào)用顯示函數(shù) 來顯示時間時間

    }
    if(key2==0) delay(); //調(diào)整分鐘
    if(key2==0) minter++;
    if(minter==60) minter=0;
    delay();
    time(); //調(diào)用時間函數(shù) 來顯示時間時間
    if(key0==0)

    time();

    }
    void main() //主函數(shù) 設定 內(nèi)部時間定時
    {
    TMOD=0X01;
    TH0=0X10;
    TL0=0X00;
    EA=1;
    ET0=1;
    TR0=1;
    P2=0xff;

    while(1)
    {
    if(key0==0) // p判斷 調(diào)整時間的按鍵是否按下 即 是否需要 調(diào)整時間
    {
    p17=0;
    delay();
    delay();

    delay();
    p17=1;
    delay();
    delay();
    key=scan_key();

    }

    switch(key)
    { //定時1s的時間是否到?
    case 0: time(); break;
    case 1: set_time();break;
    default :break;
    }
    }

    }



    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 砀山县| 宁明县| 白朗县| 嘉义市| 凌源市| 泽州县| 滨海县| 疏勒县| 新密市| 绥芬河市| 徐汇区| 屏山县| 宾川县| 德保县| 巴中市| 利辛县| 高碑店市| 察雅县| 朝阳市| 黎川县| 布尔津县| 布拖县| 全南县| 亚东县| 会泽县| 贵定县| 四平市| 台江县| 政和县| 新津县| 曲麻莱县| 镇平县| 昌黎县| 万载县| 新乡市| 安新县| 尚志市| 邳州市| 威信县| 富蕴县| 页游|