找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)獨(dú)立按鍵數(shù)碼管(模塊化)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:903848 發(fā)表于 2021-7-6 21:55 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 KeepYn 于 2021-7-6 21:58 編輯

51單片機(jī)獨(dú)立按鍵數(shù)碼管
基于普中51單片機(jī)開(kāi)發(fā)板,運(yùn)用定時(shí)器/計(jì)數(shù)器0。按鍵控制數(shù)碼管,實(shí)現(xiàn)60秒計(jì)時(shí),數(shù)值加減清零。

前言

本程序涉及中斷,定時(shí)器的配置,數(shù)碼管動(dòng)態(tài)掃描,獨(dú)立按鍵。程序基于模塊化編寫(xiě)。詳細(xì)的注解,適合小白服用。
原文件下載按鍵控制數(shù)碼管實(shí)現(xiàn)顯示數(shù)值加減]:[按鍵控制數(shù)碼管實(shí)現(xiàn)顯示數(shù)值加減](https://download.csdn.net/download/qq_54311788/20048437)
嗶哩嗶哩演示視頻[按鍵+數(shù)碼管](https://www.bilibili.com/video/BV1Cv411J7Ch/)


一、獨(dú)立按鍵
獨(dú)立按鍵比較簡(jiǎn)單,它們各自與獨(dú)立的輸入線相連接
4 條輸入線接到單片機(jī)的 I/O 口上,當(dāng)按鍵 K1 按下時(shí),+5V 通過(guò)電阻 R1 然后再通過(guò)按鍵 K1 最終進(jìn)入 GND 形成一條通路,那么這條線路的全部電壓都加到了 R1 這個(gè)電阻上,KeyIn1 這個(gè)引腳就是個(gè)低電平。當(dāng)松開(kāi)按鍵后,線路斷開(kāi),就不會(huì)有電流通過(guò),那么 KeyIn1和+5V 就應(yīng)該是等電位,是一個(gè)高電平。我們就可以通過(guò) KeyIn1 這個(gè) IO 口的高低電平來(lái)判斷是否有按鍵按下。

在按鍵被按下的短暫一瞬間,由于硬件上的抖動(dòng),往往會(huì)產(chǎn)生幾毫秒的抖動(dòng),在這時(shí)候若采集信號(hào),勢(shì)必導(dǎo)致誤操作,甚至系統(tǒng)崩潰;同樣,在釋放按鍵的那一刻,硬件上會(huì)相應(yīng)的產(chǎn)生抖動(dòng),會(huì)產(chǎn)生同樣的后果。因此,在模擬或者數(shù)字電路中,我們要避免在最不穩(wěn)定的時(shí)候采集信號(hào),進(jìn)行操作。因此需要對(duì)獨(dú)立按鍵進(jìn)行一個(gè)消抖處理。
### 其他相關(guān)
有關(guān)數(shù)碼管,可以去看我的另一篇博文[51單片機(jī)數(shù)碼管顯示60秒倒計(jì)時(shí)(C語(yǔ)言)]51單片機(jī)數(shù)碼管顯示60秒倒計(jì)時(shí)(C語(yǔ)言程序) - 51單片機(jī) (51hei.com)
下面咱們直接上代碼,我分為主函數(shù)部分硬件部分和軟件部分代碼
二、代碼
1.MAIN

#include "hardware.h"
#include "software.h"
void main()
{   
        timing(); //初始化定時(shí)函數(shù)
        while(1)
        {
        tube();//數(shù)碼管服務(wù)函數(shù)(不斷對(duì)數(shù)碼管進(jìn)行掃描)
        KEY();//獨(dú)立按鍵服務(wù)函數(shù)(不斷對(duì)獨(dú)立按鍵進(jìn)行掃描)
        }
}


2.硬件部分代碼

//按鍵、數(shù)碼管
#include "hardware.h"
#include "software.h"  //調(diào)用此函數(shù)的變量(因此包含此文件)
//共陰數(shù)碼管段碼
uchar code block[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //定義無(wú)符號(hào)字符型類(lèi)型數(shù)組來(lái)儲(chǔ)存段碼
void tube()    //數(shù)碼管掃描函數(shù)
{
  uchar i;  //定義i變量
        for(i=2;i<4;i++)
        {
                switch(i)        
                {                                                                                                                 
                   case(0):                         //位選,第一個(gè)數(shù)碼管        
                                LSA=1;
                                LSB=1;
                                LSC=1;
                         P0 = block[num/1000%10];  //千位數(shù)拆分
                                 break;
                        case(1):          //位選,第一個(gè)數(shù)碼管
                                LSA=0;
                                LSB=1;
                                LSC=1;
                         P0 = block[num/100%10];  //百位數(shù)拆分   
                                 break;
                        case(2):
                                LSA=1;
                                LSB=0;
                                LSC=1;
                         P0 = block[num/10%10];  //十位數(shù)拆分
                             break;
                        case(3):        
                                LSA=0;
                                LSB=0;
                                LSC=1;
                        P0 = block[num/1%10];  //個(gè)位數(shù)拆分
                                 break;
                }
                delayms(5);   //延時(shí)一會(huì)(視覺(jué)殘留)
                P0=0x00;      //消影
        }
}
//獨(dú)立按鍵
void KEY()
{
        if(K1 == 0)   //判斷按鍵是否按下
         delayms(5);  //消抖
    if(K1 == 0)          //確認(rèn)按鍵按下,執(zhí)行
        {
          num++;
        if(num == 60)
                num = 0;
    while(!K1);          //檢測(cè)按鍵是否松開(kāi)
        }
        
        if(K2 == 0)  //判斷按鍵是否按下
         delayms(5); //消抖
    if(K2 == 0)         //確認(rèn)按鍵按下,執(zhí)行
        {
          num--;
        if(num == 0)
        num = 60;
    while(!K2);         //檢測(cè)按鍵是否松開(kāi)
        }
        
        if(K3 == 0)  //判斷按鍵是否按下
         delayms(5); //消抖
    if(K3 == 0)         //確認(rèn)按鍵按下,執(zhí)行
        {
        num = 0;
    while(!K3);         //檢測(cè)按鍵是否松開(kāi)
        }
        
        if(K4 == 0)  //判斷按鍵是否按下
         delayms(5); //消抖
    if(K4 == 0)         //確認(rèn)按鍵按下,執(zhí)行
        {
    while(!K4);         //檢測(cè)按鍵是否松開(kāi)
        TR0=~TR0;
        }
        
}


3.軟件部分代碼


#include "software.h"
uchar numm;  //定義數(shù)據(jù)類(lèi)型為無(wú)符號(hào)字符型類(lèi)型
uchar num;   //定義數(shù)據(jù)類(lèi)型為無(wú)符號(hào)字符型類(lèi)型   

void delayms(uint xms)   //簡(jiǎn)單延時(shí)
{
        uint a , b;
        for(a=xms; a>0; a--)
         for(b=110; b>0; b--);
}

void timing()  //初始化定時(shí)器函數(shù)
{
        TMOD = 0X01;
        TH0 = (65536-45872)/256; //裝初值,11.0592M晶振,定時(shí)50ms,計(jì)數(shù)個(gè)數(shù) N = 45872(在計(jì)數(shù)時(shí)需要預(yù)先填裝初始計(jì)數(shù)個(gè)數(shù))
        TL0 = (65536-45872)%256;
        EA = 1;
        ET0 = 1;
}

void Timer0_Rountine(void) interrupt 1  //中斷號(hào) 定時(shí)器/計(jì)數(shù)器0中斷  1為定時(shí)器/計(jì)數(shù)器0的中斷號(hào)(重要)
{
        TH0 = (65536-45872)/256;      //方式1需要重裝初值
        TL0 = (65536-45872)%256;
        numm++;      //mun變量自加1
        if(numm == 20)  //判斷定時(shí)時(shí)間是否等于1s 為真之后 LED燈的電平狀態(tài)轉(zhuǎn)換
        {
                numm = 0;   //清零,好判斷下次計(jì)時(shí)
                LED =~ LED;//電平狀態(tài)取反
                num++;
                if(num == 60)
                   num = 0;               
        }
}


4.相關(guān)H文件程序代碼

#ifndef __HARDWARE_H__
#define __HARDWARE_H__

#include <reg51.h>  //51單片機(jī)頭文件
//數(shù)碼管    138譯碼器
sbit LSA=P2^2;        
sbit LSB=P2^3;        
sbit LSC=P2^4;
//LED燈
sbit LED=P2^0;
//獨(dú)立按鍵
sbit K1 =P3^1;  //定義按鍵1
sbit K2 =P3^0;
sbit K3 =P3^2;
sbit K4 =P3^3;

typedef unsigned int uint;          // typedef(類(lèi)型定義) 用來(lái)給無(wú)符號(hào)整型類(lèi)型數(shù)據(jù) unsigned int 定義新名字 uint
typedef unsigned char uchar;  //用來(lái)給無(wú)符號(hào)字符型類(lèi)型數(shù)據(jù) unsigned char 定義新名字 uchar
extern uint;    //聲明給外部函數(shù)使用
extern uchar;   //聲明給外部函數(shù)使用
extern void tube(void);    //數(shù)碼管掃描函數(shù)
extern void KEY();
#endif


#ifndef __SOFTWARE_H__
#define __SOFTWARE_H__

#include <hardware.h>  //包含此頭文件,以便在此C文件中調(diào)用

extern void delayms(uint xms);   //簡(jiǎn)單延時(shí)
extern void timing();  //初始化定時(shí)器函數(shù)
extern uchar num;  //聲明給外部函數(shù)使用
#endif





按鍵+數(shù)碼管.rar

51.9 KB, 下載次數(shù): 28, 下載積分: 黑幣 -5

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表