找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12109|回復: 3
打印 上一主題 下一主題
收起左側(cè)

51單片機數(shù)碼管顯示60秒倒計時(C語言程序)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:903848 發(fā)表于 2021-7-2 00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 KeepYn 于 2021-7-2 07:30 編輯

基于普中51單片機開發(fā)板,運用定時器/計數(shù)器0和1,實現(xiàn)60秒的倒計時和LED燈0.5s間隔閃爍
本程序涉及中斷,定時器的配置,數(shù)碼管動態(tài)掃描知識。程序基于模塊化編寫。程序里有詳細的注解。

一、數(shù)碼管動態(tài)掃描
數(shù)碼管分為靜態(tài)和動態(tài)兩種顯示方法。一般多位數(shù)碼管選用動態(tài)顯示,這樣可以節(jié)約單片機的端口資源。但是需要外加數(shù)碼管驅(qū)動電路。在此用的是138譯碼器?梢院喎Q為38譯碼器,三通道輸入,八通道輸出。通過3通道即可控制8位數(shù)碼管。也就是說只用占用單片機的3個端口。
只用了解其真值表即可    A為控制端              Y為數(shù)碼管端。

數(shù)碼管動態(tài)掃描的原理是利用人肉眼的視覺殘留。在此需要說兩個概念位選和段選。位選就是用來控制那個數(shù)碼管顯示的。段選是用來控制顯示的內(nèi)容 的。在很短的時間內(nèi)送出段碼和控制未選來實現(xiàn)數(shù)碼管的動態(tài)顯示。
共陽數(shù)碼管段碼:
             char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  0~F
共陰數(shù)碼管段碼:
            char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  0~F


二、中斷、定時器/計數(shù)器
  中斷、定時器/計數(shù)器。的難點就在于對各種相關寄存器。
定時器/計數(shù)器的相關寄存器,定時器/計數(shù)器的實質(zhì)是加1計數(shù)器?梢詫ζ溥x擇是定時模式還是計數(shù)模式。

中斷號格式,可以參照這個來。
  中斷號0   外部中斷0中斷號
  中斷號1    定時計數(shù)器0中斷號
  中斷號2    外部中斷1中斷號
  中斷號3   定時計數(shù)器1中斷號
  中斷號4    串行口中斷序號
  中斷號5    定時計數(shù)器2中斷號


有很多的相關資料,我能力有限,對此我就不過多贅述了。程序里有詳細的注解。

現(xiàn)象視頻下面是一個我上傳到嗶哩嗶哩上十幾秒的程序現(xiàn)象小視頻 : https://b23.tv/IlFvwU


程序文件
程序源文件:https://download.csdn.net/download/qq_54311788/19976902

二、代碼
1.MAIN

/*****
"hardware.h"自創(chuàng)的頭文件、hardware翻譯為:五金器具; 計算機硬件; 武器裝備;
“”用于自己創(chuàng)建的頭文件、<>反之 例:<reg51.h>

******/
#include "hardware.h"  //此頭文件已包含了<reg51.h>頭文件
void main()
{
        TMOD = 0X11;       //設置定時器1和定時器0為工作方式1,16位定時器/計數(shù)器
        /****
        0X11>0001 0001
        0X11 設置的全部內(nèi)容為:設置定時器/計數(shù)器的啟動停止只由寄存器TRX(X=0或1)控制 >>> TRX為定時器X運行控制位
                               設置定時器/計數(shù)器為定時器模式
                               設置定時器0和定時器1為工作方式1,16位定時器/計數(shù)器
        *****/
        TH0 = (65536-45872)/256; //裝初值,11.0592M晶振,定時50ms,計數(shù)個數(shù) N = 45872(在計數(shù)時需要預先填裝初始計數(shù)個數(shù))
        TL0 = (65536-45872)%256; //...
        TH1 = (65536-45872)/256; //...
        TL1 = (65536-45872)%256; //同上
        /*****
        THX、TLX為高八位和低八位寄存器。用來儲存計數(shù)次數(shù)
        X=0或1
        計數(shù)個數(shù) N = 中斷時間 / 機器周期
        機器周期 = 12 * (1/時鐘頻率)
        例 ;時鐘頻率為11.0592MHz
             機器周期 = 12 * (1/110592) = 1.09 us (約)
             計數(shù)個數(shù) N = 50 * 1000 / 1.09 = 45872 (約)<需要換算單位 * 1000>        1秒=1000毫秒(ms)
    1秒=1,000,000 微秒(μs)
        1毫秒=1000微秒     
        ******/
        EA = 1; //全局中斷允許位 | 打開總中斷(相當于中斷的總開關,打開之后其他中斷發(fā)生時才能有效)
        ET0 = 1;//定時器/計數(shù)器0中斷允許位 | 打開
        ET1 = 1;//定時器/計數(shù)器1中斷允許位 | 打開
        TR0 = 1;//定時器0運行控制位 | 允許定時器0運行
        TR1 = 1;//定時器1運行控制位 | 允許定時器1運行
        while(1)  //主循環(huán) 不斷對數(shù)碼管服務函數(shù)掃描
        {
                 tube();//數(shù)碼管服務函數(shù)(不斷對數(shù)碼管進行掃描)
        }
}

2.中斷定時相關程序代碼

/*****
"software.h"自創(chuàng)的頭文件、software.h翻譯為:(計算機)軟件;

******/
#include "software.h"
uchar num , num1; //定義num , num1的數(shù)據(jù)類型為無符號字符型類型
num2 = 60;        //初始化此變量的值

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

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

void TimerI_Routine(void) interrupt 3  //中斷號 定時器/計數(shù)器1中斷  1為定時器/計數(shù)器0的中斷號 (重要)
{
        TH1 = (65536-45872)/256;  //方式1需要重裝初值
        TL1 = (65536-45872)%256;
        num1++;   //mun1變量自加1
        if(num1 == 20)   //判斷定時時間是否等于1s
        {
                num1 = 0;   //清零,好判斷下次計時
                num2--;     //mun2變量自減1  mun2的初始值為60
                if(num2 == 0) //判斷是否計時結(jié)束
                   num2 = 60; //重新賦值,以便重新計時
        }
        
}


3.數(shù)碼管LED燈相關程序代碼

/*****
"hardware.h"自創(chuàng)的頭文件、hardware翻譯為:五金器具; 計算機硬件; 武器裝備;
“”用于自己創(chuàng)建的頭文件、<>反之 例:<reg51.h>

******/
#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};  //定義無符號字符型類型數(shù)組來儲存段碼

void tube()    //數(shù)碼管掃描函數(shù)
{
  uchar i;  //定義i變量
        for(i=0;i<2;i++)
        {
                switch(i)        
                {                                                                                                                 
                   case(0):                         //位選,第一個數(shù)碼管        
                                LSA=1;
                                LSB=1;
                                LSC=1;
                        P0 = block[num2/10];  //十位數(shù)拆分
                                 break;
                        case(1):          //位選,第一個數(shù)碼管
                                LSA=0;
                                LSB=1;
                                LSC=1;
                            P0 = block[num2%10];  //個位數(shù)拆分
                                 break;
                }
//                P0 = block[num%10];
                delayms(5);   //延時一會(視覺殘留)
                P0=0x00;      //消影
        }
}

4.相關H文件程序代碼

#ifndef __SOFTWARE_H__  
#define __SOFTWARE_H__

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

extern void delayms(uint xms);    // extern(外部的) 聲明此函數(shù)給外部調(diào)用
extern num2;                      //聲明此變量給外部函數(shù)調(diào)用
#endif



#ifndef __HARDWARE_H__
#define __HARDWARE_H__

#include <reg51.h>    //51單片機頭文件
//#include <software.h>


//數(shù)碼管    138譯碼器
sbit LSA=P2^2;        
sbit LSB=P2^3;        
sbit LSC=P2^4;
//LED燈
sbit LED=P2^0;

typedef unsigned int uint;          // typedef(類型定義) 用來給無符號整型類型數(shù)據(jù) unsigned int 定義新名字 uint
typedef unsigned char uchar;  //用來給無符號字符型類型數(shù)據(jù) unsigned char 定義新名字 uchar
extern uint;    //聲明給外部函數(shù)使用
extern uchar;   //聲明給外部函數(shù)使用
extern void tube(void);   // extern(外部的) 聲明此函數(shù)給外部調(diào)用

#endif



以下是編譯的結(jié)果:


Rebuild target 'porject'
assembling STARTUP.A51...
compiling main.c...
compiling hardware.c...
compiling software.c...
linking...
Program Size: data=14.0 xdata=0 code=529
creating hex file from ".\Objects\porject"...
".\Objects\porject" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:01

提示:模塊化編程很重要,如果有不了解的小伙伴推薦大家去看這篇文章寫得很好:https://blog.csdn.net/weixin_30764137/article/details/96185151

總結(jié)

  首先我也是一個單片機入門的小白,編寫文章不易。如果我的文章對大家有所幫助,我感到很開心。其次有很多的不足之處,希望大家多多包涵。另外,如果大家有什么好的意見,歡迎大家留言討論。一起共同進步!

程序下載地址:
數(shù)碼管60s倒計時(模塊化).rar (335.45 KB, 下載次數(shù): 31)



評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:328014 發(fā)表于 2021-7-2 15:39 | 只看該作者
好資料很詳細,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:903848 發(fā)表于 2021-7-2 22:28 | 只看該作者
51hei團團 發(fā)表于 2021-7-2 15:39
好資料很詳細,51黑有你更精彩!!!

多謝支持。。
回復

使用道具 舉報

地板
ID:58647 發(fā)表于 2021-7-6 16:45 | 只看該作者
講解的詳細,學習。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表