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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5614|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)數(shù)碼管顯示簡易計(jì)算器程序設(shè)計(jì)與仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:34643 發(fā)表于 2019-5-19 14:50 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
      這是一款基于51單片機(jī)數(shù)碼管顯示簡易計(jì)算器程序設(shè)計(jì)與仿真,電路簡單,數(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)先級。

        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ù)碼管顯示簡易計(jì)算器程序設(shè)計(jì)與仿真.rar (440.83 KB, 下載次數(shù): 50)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区二区三区 | 最新国产在线 | 亚洲国产网址 | 中文字幕在线一区二区三区 | 免费国产黄网站在线观看视频 | 精品中文字幕一区二区 | 亚洲天堂一区二区 | 天堂一区在线观看 | 夜夜爽99久久国产综合精品女不卡 | 成人av影院 | 日韩毛片在线观看 | 国产第1页 | 三级在线免费观看 | 91av视频在线免费观看 | 国内精品久久久久久 | 国产日屁 | 欧美日韩在线免费观看 | 九九热在线视频免费观看 | 欧美精品首页 | 国产激情视频网站 | 国内精品在线视频 | 中文字幕亚洲一区 | 麻豆视频在线免费观看 | 一区二区视频在线 | 精品国产视频在线观看 | 日韩视频在线免费观看 | 999re5这里只有精品 | 九九久久国产精品 | 亚洲精品乱码久久久久久按摩观 | 国产精品18久久久久久白浆动漫 | 国产a级黄色录像 | 亚洲444kkkk在线观看最新 | 91精品国产91久久久久久三级 | 超碰在线人 | 国产精品久久7777777 | www.久久 | 久久99精品视频 | 欧美成人h版在线观看 | 国产超碰人人爽人人做人人爱 | 免费高清av| a久久久久久 |