欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 基于51單片機(jī)數(shù)碼管顯示簡(jiǎn)易計(jì)算器程序設(shè)計(jì)與仿真 [打印本頁]

作者: 51mcu    時(shí)間: 2019-5-19 14:50
標(biāo)題: 基于51單片機(jī)數(shù)碼管顯示簡(jiǎn)易計(jì)算器程序設(shè)計(jì)與仿真
      這是一款基于51單片機(jī)數(shù)碼管顯示簡(jiǎn)易計(jì)算器程序設(shè)計(jì)與仿真,電路簡(jiǎn)單,數(shù)碼管為共陽數(shù)碼管。


#include "includes.h"

#define TIME0H 0xFC
#define TIME0L 0x18                //定時(shí)器0溢出時(shí)間:5ms

#define TIME1H 0x44
#define TIME1L 0x80                //定時(shí)器1溢出時(shí)間:48ms


//*************************************************************************************************
//*                                                                                                                                                                                                  *
//*                          ********************************全局變量******************************                          *
//*                                                                                                                                                                                                  *
//*************************************************************************************************

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器0定時(shí)刷新LED計(jì)數(shù)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned long ul_Number=0;                        //LCD實(shí)時(shí)顯示數(shù)字。

unsigned char uca_ShowCustom[6]={0x88,0x83,0xC6,0xA1,0x86,0x84};
                                                                        //存放自定義顯示字符。

unsigned char uc_DisCount=1;                //LCD時(shí)事刷新計(jì)數(shù)。

bit b_ShowMode=0;                                        //顯示模式標(biāo)志位。
                                                                        //0--數(shù)字模式,將要顯示的數(shù)字賦給ul_Number便可時(shí)事顯示數(shù)值,
                                                                        //                                默認(rèn)為數(shù)字模式;
                                                                        //1--自定義模式,該模式下自定義字符顯示。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器1計(jì)數(shù)刷新定時(shí)(計(jì)時(shí)模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uc_TimeCount=1;                //定時(shí)器1定時(shí)計(jì)數(shù)。

bit b_ClockStart=0;                                        //定時(shí)器1顯示計(jì)數(shù)標(biāo)志位。

extern bit b_ClockOppose;                        //TimeOppose.c

extern unsigned long ul_ClockOppose;


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動(dòng)標(biāo)志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

bit b_KeyShock=0;                                          //鍵盤防抖動(dòng)標(biāo)志位。
                                                                        //當(dāng)按鍵中斷產(chǎn)生時(shí),首先判斷此位。
                                                                        //0--執(zhí)行鍵盤掃描及鍵碼處理程序;1--不執(zhí)行。

bit b_KillShock=0;                                        //防抖標(biāo)志清除位:0--不清除;1--清除。

unsigned char uc_KillCount=1;                //抖動(dòng)標(biāo)志清除計(jì)數(shù),使用定時(shí)器1。


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD閃爍顯示報(bào)告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_LCDClean=0;                                          //通過設(shè)置b_LCDClean為1便可啟動(dòng)延時(shí)清空LCD顯示。

unsigned char uc_CleanCount=1;                  //延遲時(shí)間可在T1中斷中設(shè)定。


unsigned char uc_ReportSymbol;

bit b_ReportFlash=0;

unsigned char uca_FlashBlank[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};


//*************************************************************************************************
//*                                                                                                                                                                                                  *
//*                          ********************************主函數(shù)******************************                                  *
//*                                                                                                                                                                                                  *
//*************************************************************************************************
void main()
{
        P2=0x0F;                  //初始化鍵盤接口。

        TMOD=0x11;                  //定時(shí)器0:模式一;定時(shí)器0:模式一.


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器0,用于LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        TH0=TIME0H;
        TL0=TIME0L;
        TR0=1;                         //開啟定時(shí)器0
        ET0=1;                         //開定時(shí)器0中斷


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器1,用于1s計(jì)時(shí) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        TH1=TIME1H;
        TL1=TIME1L;
        TR1=1;                         //開啟定時(shí)器1
        ET1=1;                         //開定時(shí)器1中斷


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中斷0,用于執(zhí)行鍵盤掃描和鍵處理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>
        IT0=1;                         //外部中斷0,中斷方式:下降沿
        EX0=1;                         //開啟外部中斷0

        PT0=1;                         //把定時(shí)器0溢出中斷設(shè)為高優(yōu)先級(jí)。

        EA=1;                         //開啟總中斷

        while(1);
}



//*************************************************************************************************
//*                                                                                                                                                                                                  *
//*                ***************************外部中斷0,調(diào)用鍵盤掃描程序*************************                          *
//*                                                                                                                                                                                                  *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
        EX0=0;                                                         //在鍵掃描處理時(shí),關(guān)閉外部中斷0,防抖動(dòng)。

        if(b_KeyShock==0)
                {
                vKeyProcess(ucKeyScan());        //當(dāng)判斷有按鍵按下時(shí),掃描鍵盤,并把掃描結(jié)果進(jìn)行處理。
                b_KeyShock=1;                                        //設(shè)置防抖動(dòng)標(biāo)志。
                }
        else b_KeyShock=0;                                //如果有抖動(dòng)則不執(zhí)行鍵掃描,恢復(fù)防抖動(dòng)標(biāo)志。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<設(shè)置防抖動(dòng)清除標(biāo)志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
        if(b_KeyShock==1)
                b_KillShock=1;                                //如果防抖動(dòng)標(biāo)志位開啟則開啟防抖動(dòng)標(biāo)志清除位,
                                                                        //300ms后清除防抖動(dòng)標(biāo)志。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復(fù)鍵掃描處理前初始狀態(tài) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        P2=0x0F;                                                  //恢復(fù)P2口。
        EX0=1;                                                        //恢復(fù)按鍵中斷。
}


//*************************************************************************************************
//*                                                                                                                                                                                                  *
//*                ****************定時(shí)器1中斷,用于計(jì)時(shí)功能和防抖動(dòng)標(biāo)志清除以及顯示報(bào)告****************          *
//*                                                                                                                                                                                                  *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<計(jì)時(shí)模式計(jì)數(shù)刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        if(b_ClockStart==1)                                        //當(dāng)計(jì)時(shí)模式開啟式,如計(jì)時(shí)處于運(yùn)行狀態(tài)則執(zhí)行定時(shí)計(jì)數(shù)增加。
                {
                if(b_ClockOppose==0)                        //正常計(jì)時(shí)。
                        {
                        if(uc_TimeCount%21==0)
                                {
                                uc_TimeCount=1;
                                ul_Number++;
                                }
                        else uc_TimeCount++;
                        }
                else
                        {                                                          //倒計(jì)時(shí)模式。
                        if(uc_TimeCount%21==0)
                                {
                                uc_TimeCount=1;
                                if(ul_ClockOppose>0)
                                        {
                                        ul_ClockOppose--;
                                        ul_Number=ul_ClockOppose;
                                        }
                                else
                                        {
                                        b_ClockStart=0;
                                        uc_ReportSymbol=7;
                                        b_LCDClean=1;
                                        }
                                }
                        else uc_TimeCount++;
                        }
                }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動(dòng)標(biāo)志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        if(b_KillShock==1)
                {
                if(uc_KillCount%5==0)                         //當(dāng)防抖動(dòng)標(biāo)志位為1時(shí),計(jì)時(shí)300ms后清除抖動(dòng)標(biāo)志位。
                        {
                        b_KeyShock=0;
                        b_KillShock=0;
                        uc_KillCount=1;
                        }
                else uc_KillCount++;
                }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD顯示報(bào)告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        if(b_LCDClean==1)
                {
                        if(uc_CleanCount==1)
                                {
                                        EX0=0;                                                        //關(guān)閉鍵盤中斷,此時(shí)按鍵無效。
                                        vShowReport(uc_ReportSymbol);
                                        b_ShowMode=1;
                                }
                        if(uc_CleanCount%40==0)                                        //通過設(shè)置b_LCDClean為1便可啟動(dòng)延時(shí)清空LCD顯示。
                                {
                                        b_LCDClean=0;                                        //關(guān)閉清零標(biāo)志位,清零結(jié)束。
                                        uc_CleanCount=1;                                //恢復(fù)清零計(jì)數(shù)為初始值1.
                                        b_ShowMode=0;                                        //恢復(fù)顯示模式為默認(rèn)的數(shù)字模式。
                                        b_ReportFlash=0;
                                        EX0=1;                                                        //重新開啟鍵盤中斷。
                                }
                        else
                                {
                                //<<<<<<<<<<<<<<<<<<<<<<<<<實(shí)現(xiàn)閃爍報(bào)告功能>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                                if(uc_CleanCount%7==0)                                                                                                               
                                        {
                                                if(b_ReportFlash==0)
                                                        {
                                                                vCharCopy(uca_FlashBlank);
                                                                b_ReportFlash=1;
                                                        }
                                                else
                                                        {
                                                                vShowReport(uc_ReportSymbol);
                                                                b_ReportFlash=0;
                                                        }
                                         }
                        uc_CleanCount++;
                                }
                }

        TH1=TIME1H;
        TL1=TIME1L;

}


//*************************************************************************************************
//*                                                                                                                                                                                                  *
//*                ***************************定時(shí)器0,定時(shí)刷新LED*************************                                  *
//*                                                                                                                                                                                                  *
//*************************************************************************************************
void vTimer0(void) interrupt 1
{
        if(b_ShowMode==0)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<數(shù)字模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                {
                vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),6-uc_DisCount);           //在LCD上顯示1位數(shù)字。
                if(uc_DisCount==5)
                uc_DisCount=0;                                                //定時(shí)器0在每次被觸發(fā)時(shí),改變LCD顯示。
                else uc_DisCount++;                                        //從第一位到第六位循環(huán)顯示。
                }
        else
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<自定義模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                {
                vShowCustom(uca_ShowCustom[uc_DisCount],uc_DisCount);
                if(uc_DisCount==5)
                uc_DisCount=0;                                                //定時(shí)器0在每次被觸發(fā)時(shí),改變LCD顯示。
                else uc_DisCount++;                                        //從第一位到第六位循環(huán)顯示。
                }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復(fù)定時(shí)器0初始狀態(tài) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        TH0=TIME0H;        
        TL0=TIME0L;
}

全部資料51hei下載地址:
基于51單片機(jī)數(shù)碼管顯示簡(jiǎn)易計(jì)算器程序設(shè)計(jì)與仿真.rar (440.83 KB, 下載次數(shù): 50)





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1