找回密碼
         注冊(cè)會(huì)員
        搜索附件  
        MCU資訊論壇 附件中心 單片機(jī)論壇 51單片機(jī)論壇 5_48645_7c451befb905abb.jpg

        5_48645_7c451befb905abb.jpg

         

        電子鐘請(qǐng)教:
        各位大師你們好!本人剛學(xué)習(xí)單片機(jī),很多東西不明白,特來向各位請(qǐng)教!QQ:664967791 lhfplc@126.com
        資料說明:時(shí)鐘電路板是在一收舊販購(gòu)得,見圖片。上有時(shí)鐘數(shù)碼管4位,AT89C52等,12M晶振。
        圖紙說明:照實(shí)物測(cè)繪無誤,見PDF文件。


        問題是:怎樣從P0口分離出P0^0,讓秒點(diǎn)閃爍。
        問題說明:秒點(diǎn)D5、D6由P0口的P0^0控制輸出,D5在DIG.3位,D6在DIG.4位,也就是圖中的Q3、Q4控制的個(gè)位和十位
        圖片:








        程序說明:網(wǎng)上下載,修改如下
        #include<reg52.h>
        #define uchar unsigned char
        #define uint unsigned int
        #define sled_dm_port P0 /*定義P0口為段碼控制口*/
        #define sled_wm_port P1 /*定義P1口為位碼控制口*/
        sbit fm=P1^0; /*蜂鳴器輸出聲明*/
        sbit dula=P1^1; /*運(yùn)行指示燈聲明*/
        sbit s1=P2^0; /*設(shè)置鍵聲明*/
        sbit s2=P2^1; /*加一鍵聲明*/
        sbit s3=P2^2; /*減一鍵聲明*/
        sbit s4=P2^3; /*鬧鐘鍵聲明*/

        uchar data count; /*50MS信號(hào)變量*/
        uint data flag_count; /*1MS到5S的變量*/
        uchar data flag; /*累加到5S的啟動(dòng)標(biāo)志位*/
        char data sec=0,min=0,hou=12; /*時(shí)鐘的秒分時(shí)計(jì)數(shù)器*/
        char data nz_sec=0,nz_min=0,nz_hou=0; /*鬧鐘的秒分時(shí)計(jì)數(shù)器*/
        uchar data set_count,nz_count,dr; /*設(shè)置鍵按下次數(shù)變量,鬧鐘鍵按下次數(shù)變量,緩沖數(shù)組偏移變量*/
        uchar data dis_buff[8]; /*段碼緩沖數(shù)組*/
        uchar code num_table[10]={0x10,0xba,0x48,0x44,0x86,0x24,0x20,0x56,0x00,0x04};
        /* 0 1 2 3 4 5 6 7 8 9 .*/
        uchar data lighten_bit_table[4]={0xfb,0xf7,0xef,0xdf};/*定義每次掃描時(shí)需點(diǎn)亮的數(shù)碼管*/

        void TimerValueSet(); /*定時(shí)器初始化程序*/
        void key_scan(); /*設(shè)置鍵s1和鬧鐘鍵s4掃描程序*/
        void set_time(); /*時(shí)間設(shè)置程序*/
        void set_disp(); /*時(shí)間設(shè)置時(shí)的顯示程序*/
        void display(); /*無鍵按下時(shí)的顯示程序*/
        void set_nz(); /*鬧鐘設(shè)置程序*/
        void nzset_disp(); /*鬧鐘設(shè)置時(shí)的顯示程序*/
        void alarm(); /*鬧鐘報(bào)警程序*/
        set_add(uchar n); /*按鍵加1程序*/
        set_sub(char n); /*按鍵減1程序*/
        void delay_1ms(uint x); /*1ms為單位的延時(shí)程序*/

        /*主程序*/
        void main()
        {
        TimerValueSet();
        while(1)
        {
        key_scan();
        set_time();
        set_nz();
        if(set_count==0&nz_count==0)
        alarm();
        }
        }
        /*定時(shí)器初始化程序*/
        void TimerValueSet()
        {
        TMOD=0x11;
        IE=0x8a;
        IP=0x08;
        TH0=0x4c; /*載入50ms定時(shí)初值*/
        TL0=0x00;
        TH1=0xfc; /*載入1ms定時(shí)初值*/
        TL1=0x67;
        TR0=1;
        TR1=1;
        }
        /*設(shè)置鍵s1和鬧鐘鍵s4掃描程序*/
        void key_scan()
        {
        if(s1==0&nz_count==0) /*設(shè)置鍵按下且之前沒有按下鬧鐘鍵*/
        {
        delay_1ms(20);
        if(s1==0)
        {
        while(!s1);
        set_count++;
        if(set_count==3) /*設(shè)置鍵按下3次則清零退出設(shè)置*/
        set_count=0;
        }
        }
        if(s4==0&set_count==0) /*鬧鐘鍵按下且之前沒有按下設(shè)置鍵*/
        {
        delay_1ms(20);
        if(s4==0)
        {
        while(!s4);
        nz_count++;
        if(nz_count==3) /*鬧鐘鍵按下3次則清零退出設(shè)置*/
        nz_count=0;
        }
        }
        }
        /*時(shí)間設(shè)置程序*/
        void set_time()
        {
        if(set_count!=0)
        {
        flag=1;
        while(s2&s3)
        {
        key_scan();
        if(flag_count>=5000)
        {
        set_count=0; /*5S內(nèi)無鍵按下則退出設(shè)置*/
        break;
        }
        }
        flag_count=0;
        flag=0;
        }
        if(set_count==1)
        {
        hou=set_add(hou);
        if(hou==24)
        hou=0;
        hou=set_sub(hou);
        if(hou<0)
        hou=23;
        }
        if(set_count==2)
        {
        min=set_add(min);
        if(min==60)
        min=0;
        min=set_sub(min);
        if(min<0)
        min=59;
        }
        }
        /*鬧鐘設(shè)置程序*/
        void set_nz()
        {
        if(nz_count!=0)
        {
        flag=1;
        while(s2&s3)
        {
        key_scan();
        if(flag_count>=5000)
        {
        nz_count=0; /*5S內(nèi)無鍵按下則退出鬧鐘設(shè)置*/
        break;
        }
        }
        flag_count=0;
        flag=0;
        }
        if(nz_count==1)
        {
        nz_hou=set_add(nz_hou);
        if(nz_hou==24)
        nz_hou=0;
        nz_hou=set_sub(nz_hou);
        if(nz_hou<0)
        nz_hou=23;
        }
        if(nz_count==2)
        {
        nz_min=set_add(nz_min);
        if(nz_min==60)
        nz_min=0;
        nz_min=set_sub(nz_min);
        if(nz_min<0)
        nz_min=59;
        }
        }
        /*無鍵按下時(shí)的顯示程序*/
        void display()
        {
        dis_buff[1]=num_table[min/10];
        dis_buff[0]=num_table[min%10];
        dis_buff[3]=num_table[hou/10];
        dis_buff[2]=num_table[hou%10];
        if(set_count==0&nz_count==0) /*無鍵按下時(shí)的顯示*/
        {
        sled_wm_port=0xff;
        if(dr==2&count<10)
        sled_dm_port=dis_buff[dr]&0x7f;
        else
        { if(dr==3&dis_buff[3]==0xc0) /*若時(shí)變量的十位為零是則不顯示*/
        sled_dm_port=0xff;
        else
        sled_dm_port=dis_buff[dr];
        }
        sled_wm_port=lighten_bit_table[dr];
        }
        if(set_count!=0) /*設(shè)置鍵按下調(diào)用設(shè)置顯示程序*/
        set_disp();
        if(nz_count!=0) /*鬧鐘鍵按下調(diào)用鬧鐘顯示程序*/
        nzset_disp();
        dr++;
        if(dr==4) /*將dr改為4,段碼緩沖數(shù)組元素個(gè)數(shù)改為4可提高掃描亮度*/
        dr=0;
        }
        /*時(shí)間設(shè)置時(shí)的顯示程序*/
        void set_disp()
        {
        if(set_count==1)
        {
        sled_wm_port=0xff;
        switch(dr)
        {
        case 0:
        case 1:sled_dm_port=dis_buff[dr];break;
        case 2:if(count<10)sled_dm_port=dis_buff[dr]&0x7f;else sled_dm_port=0x7f;break;
        case 3:if(count<10&dis_buff[3]!=0xc0)sled_dm_port=dis_buff[dr];else sled_dm_port=0xff;break;
        default:sled_dm_port=0xff;break;
        }
        sled_wm_port=lighten_bit_table[dr];
        }
        if(set_count==2)
        {
        sled_wm_port=0xff;
        switch(dr)
        {
        case 0:
        case 1:if(count<10)sled_dm_port=dis_buff[dr];else sled_dm_port=0xff;break;
        case 2:sled_dm_port=dis_buff[dr]&0x7f;break;
        case 3:if(dis_buff[3]!=0xc0)sled_dm_port=dis_buff[dr];else sled_dm_port=0xff;break;
        default:sled_dm_port=0xff;break;
        }
        sled_wm_port=lighten_bit_table[dr];
        }
        }
        /*鬧鐘設(shè)置時(shí)的顯示程序*/
        void nzset_disp()
        {
        if(nz_count==1)
        {
        sled_wm_port=0xff;
        switch(dr)
        {
        case 0: sled_dm_port=num_table[nz_min%10];break;
        case 1: sled_dm_port=num_table[nz_min/10];break;
        case 2: if(count<10)
        sled_dm_port=num_table[nz_hou%10]&0x7f;else sled_dm_port=0xff;break;
        case 3: if(count<10&num_table[nz_hou/10]!=0xc0)
        sled_dm_port=num_table[nz_hou/10];else sled_dm_port=0xff;break;
        default:sled_dm_port=0xff; break;
        }
        sled_wm_port=lighten_bit_table[dr];
        }
        if(nz_count==2)
        {
        sled_wm_port=0xff;
        switch(dr)
        {
        case 0: if(count<10)
        sled_dm_port=num_table[nz_min%10];else sled_dm_port=0xff;break;
        case 1: if(count<10)
        sled_dm_port=num_table[nz_min/10];else sled_dm_port=0xff;break;
        case 2: if(count<10)
        sled_dm_port=num_table[nz_hou%10]&0x7f;else sled_dm_port=num_table[nz_hou%10];break;
        case 3: if(num_table[nz_hou/10]!=0xc0)
        sled_dm_port=num_table[nz_hou/10];else sled_dm_port=0xff;break;
        default:sled_dm_port=0xff;break;
        }
        sled_wm_port=lighten_bit_table[dr];
        }
        }
        /*鬧鐘報(bào)警程序*/
        void alarm()
        {
        if(hou==nz_hou&min==nz_min)
        {
        if(sec%2==0&sec<30)
        {
        fm=0;
        delay_1ms(300);
        fm=1;
        delay_1ms(100);
        fm=0;
        delay_1ms(400);
        fm=1;
        delay_1ms(200);
        }
        }
        }
        /*按鍵加1程序*/
        set_add(uchar n)
        {
        if(s2==0)
        {
        delay_1ms(20);
        if(s2==0)
        {
        n++;
        while(!s2);
        }
        }
        return n;
        }
        /*按鍵減1程序*/
        set_sub(uchar n)
        {
        if(s3==0)
        {
        delay_1ms(20);
        if(s3==0)
        {
        n--;
        while(!s3);
        }
        }
        return n;
        }
        /*定時(shí)器T0中斷處理*/
        void Timer0() interrupt 1
        {
        TH0=0x4c;
        TL0=0x00;
        count++;
        if(count==20)
        {
        count=0;
        sec++;
        if(sec==60)
        {
        sec=0;
        min++;
        if(min==60)
        {
        min=0;
        hou++;
        if(hou==24)
        hou=0;
        }
        }
        }
        }
        /*定時(shí)器T1中斷處理*/
        void Timer1() interrupt 3
        {
        TH1=0xfc;
        TL1=0x67;
        if(flag)
        flag_count++;
        display();
        }
        /*1ms位單位的延時(shí)程序*/
        void delay_1ms(uint x)
        {
        uchar i;
        while(x--)
        for(i=0;i<125;i++);
        }
        5_48645_7c451befb905abb.jpg

        QQ|手機(jī)版|MCU資訊論壇 ( 京ICP備18035221號(hào)-2 )|網(wǎng)站地圖

        GMT+8, 2025-5-3 20:08 , Processed in 0.040564 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        返回頂部
        日韩免费不卡视频| 亚洲国产精品成熟老女人| 亚洲精品国产美女久久久| 青青草国产精品| 88国产精品无码一区二区三区 | 精品性影院一区二区三区内射| 国产成人精品一区二区秒拍| 亚洲国产精品久久久久婷婷软件| 精品无码人妻一区二区三区不卡| 免费高清资源黄网站在线观看| 1000部精品久久久久久久久| 国产精品偷窥熟女精品视频| 成人亚洲欧美日韩在线观看| 四虎国产精品永久地址99新强| 日韩亚洲精品福利 | 国产精品亚洲产品一区二区三区| 最新国产在线精品观看| heyzo高无码国产精品| 精品国产高清在线拍| 亚洲午夜国产精品无码| 青青青青久久精品国产h| 四虎精品免费永久免费视频| 国内精品久久久久影院日本| 国产精品无码v在线观看| 亚洲精品无码久久久久去q| 88国产精品无码一区二区三区| 先锋影音资源男人| 影音先锋国产精品国语对白| 日韩在线不卡中文字幕视频| 亚洲精品成人av在线| 好紧好爽太大了h视频| 香蕉久久夜色精品国产小说| 欧美free嫩交video| 成人精品一区二区三区在线观看| 黄色影院免费观看| 国产vA免费精品高清在线观看| 日产精品久久久一区二区| 国产精品日韩深夜福利久久| 无码囯产精品一区二区免费| 久久久精品视频免费观看| 中文字幕亚洲精品无码|