|
本帖最后由 KeepYn 于 2021-7-2 07:30 編輯
基于普中51單片機(jī)開發(fā)板,運(yùn)用定時(shí)器/計(jì)數(shù)器0和1,實(shí)現(xiàn)60秒的倒計(jì)時(shí)和LED燈0.5s間隔閃爍
本程序涉及中斷,定時(shí)器的配置,數(shù)碼管動(dòng)態(tài)掃描知識(shí)。程序基于模塊化編寫。程序里有詳細(xì)的注解。
一、數(shù)碼管動(dòng)態(tài)掃描
數(shù)碼管分為靜態(tài)和動(dòng)態(tài)兩種顯示方法。一般多位數(shù)碼管選用動(dòng)態(tài)顯示,這樣可以節(jié)約單片機(jī)的端口資源。但是需要外加數(shù)碼管驅(qū)動(dòng)電路。在此用的是138譯碼器。可以簡(jiǎn)稱為38譯碼器,三通道輸入,八通道輸出。通過3通道即可控制8位數(shù)碼管。也就是說(shuō)只用占用單片機(jī)的3個(gè)端口。
只用了解其真值表即可 A為控制端 Y為數(shù)碼管端。
1.png (111.79 KB, 下載次數(shù): 83)
下載附件
2021-7-2 04:40 上傳
數(shù)碼管動(dòng)態(tài)掃描的原理是利用人肉眼的視覺殘留。在此需要說(shuō)兩個(gè)概念位選和段選。位選就是用來(lái)控制那個(gè)數(shù)碼管顯示的。段選是用來(lái)控制顯示的內(nèi)容
2.jpg (100.31 KB, 下載次數(shù): 79)
下載附件
2021-7-2 04:40 上傳
的。在很短的時(shí)間內(nèi)送出段碼和控制未選來(lái)實(shí)現(xiàn)數(shù)碼管的動(dòng)態(tài)顯示。
共陽(yáng)數(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í)器/計(jì)數(shù)器
中斷、定時(shí)器/計(jì)數(shù)器。的難點(diǎn)就在于對(duì)各種相關(guān)寄存器。
定時(shí)器/計(jì)數(shù)器的相關(guān)寄存器,定時(shí)器/計(jì)數(shù)器的實(shí)質(zhì)是加1計(jì)數(shù)器。可以對(duì)其選擇是定時(shí)模式還是計(jì)數(shù)模式。
3.jpg (145.24 KB, 下載次數(shù): 86)
下載附件
2021-7-2 04:40 上傳
4.jpg (80.49 KB, 下載次數(shù): 81)
下載附件
2021-7-2 04:40 上傳
中斷號(hào)格式,可以參照這個(gè)來(lái)。
中斷號(hào)0 外部中斷0中斷號(hào)
中斷號(hào)1 定時(shí)計(jì)數(shù)器0中斷號(hào)
中斷號(hào)2 外部中斷1中斷號(hào)
中斷號(hào)3 定時(shí)計(jì)數(shù)器1中斷號(hào)
中斷號(hào)4 串行口中斷序號(hào)
中斷號(hào)5 定時(shí)計(jì)數(shù)器2中斷號(hào)
5.jpg (78.04 KB, 下載次數(shù): 75)
下載附件
2021-7-2 04:40 上傳
有很多的相關(guān)資料,我能力有限,對(duì)此我就不過多贅述了。程序里有詳細(xì)的注解。
現(xiàn)象視頻下面是一個(gè)我上傳到嗶哩嗶哩上十幾秒的程序現(xiàn)象小視頻 : https://b23.tv/IlFvwU
程序文件
程序源文件:https://download.csdn.net/download/qq_54311788/19976902
二、代碼
1.MAIN
/*****
"hardware.h"自創(chuàng)的頭文件、hardware翻譯為:五金器具; 計(jì)算機(jī)硬件; 武器裝備;
“”用于自己創(chuàng)建的頭文件、<>反之 例:<reg51.h>
******/
#include "hardware.h" //此頭文件已包含了<reg51.h>頭文件
void main()
{
TMOD = 0X11; //設(shè)置定時(shí)器1和定時(shí)器0為工作方式1,16位定時(shí)器/計(jì)數(shù)器
/****
0X11>0001 0001
0X11 設(shè)置的全部?jī)?nèi)容為:設(shè)置定時(shí)器/計(jì)數(shù)器的啟動(dòng)停止只由寄存器TRX(X=0或1)控制 >>> TRX為定時(shí)器X運(yùn)行控制位
設(shè)置定時(shí)器/計(jì)數(shù)器為定時(shí)器模式
設(shè)置定時(shí)器0和定時(shí)器1為工作方式1,16位定時(shí)器/計(jì)數(shù)器
*****/
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; //...
TH1 = (65536-45872)/256; //...
TL1 = (65536-45872)%256; //同上
/*****
THX、TLX為高八位和低八位寄存器。用來(lái)儲(chǔ)存計(jì)數(shù)次數(shù)
X=0或1
計(jì)數(shù)個(gè)數(shù) N = 中斷時(shí)間 / 機(jī)器周期
機(jī)器周期 = 12 * (1/時(shí)鐘頻率)
例 ;時(shí)鐘頻率為11.0592MHz
機(jī)器周期 = 12 * (1/110592) = 1.09 us (約)
計(jì)數(shù)個(gè)數(shù) N = 50 * 1000 / 1.09 = 45872 (約)<需要換算單位 * 1000> 1秒=1000毫秒(ms)
1秒=1,000,000 微秒(μs)
1毫秒=1000微秒
******/
EA = 1; //全局中斷允許位 | 打開總中斷(相當(dāng)于中斷的總開關(guān),打開之后其他中斷發(fā)生時(shí)才能有效)
ET0 = 1;//定時(shí)器/計(jì)數(shù)器0中斷允許位 | 打開
ET1 = 1;//定時(shí)器/計(jì)數(shù)器1中斷允許位 | 打開
TR0 = 1;//定時(shí)器0運(yùn)行控制位 | 允許定時(shí)器0運(yùn)行
TR1 = 1;//定時(shí)器1運(yùn)行控制位 | 允許定時(shí)器1運(yùn)行
while(1) //主循環(huán) 不斷對(duì)數(shù)碼管服務(wù)函數(shù)掃描
{
tube();//數(shù)碼管服務(wù)函數(shù)(不斷對(duì)數(shù)碼管進(jìn)行掃描)
}
}
2.中斷定時(shí)相關(guān)程序代碼
/*****
"software.h"自創(chuàng)的頭文件、software.h翻譯為:(計(jì)算機(jī))軟件;
******/
#include "software.h"
uchar num , num1; //定義num , num1的數(shù)據(jù)類型為無(wú)符號(hào)字符型類型
num2 = 60; //初始化此變量的值
void delayms(uint xms) //簡(jiǎn)單延時(shí)
{
uint a , b;
for(a=xms; a>0; a--)
for(b=110; b>0; b--);
}
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;
num++; //mun變量自加1
if(num == 10) //判斷定時(shí)時(shí)間是否等于0.5s 為真之后 LED燈的電平狀態(tài)轉(zhuǎn)換
{
num = 0; //清零,好判斷下次計(jì)時(shí)
LED =~ LED;//電平狀態(tài)取反
}
}
void TimerI_Routine(void) interrupt 3 //中斷號(hào) 定時(shí)器/計(jì)數(shù)器1中斷 1為定時(shí)器/計(jì)數(shù)器0的中斷號(hào) (重要)
{
TH1 = (65536-45872)/256; //方式1需要重裝初值
TL1 = (65536-45872)%256;
num1++; //mun1變量自加1
if(num1 == 20) //判斷定時(shí)時(shí)間是否等于1s
{
num1 = 0; //清零,好判斷下次計(jì)時(shí)
num2--; //mun2變量自減1 mun2的初始值為60
if(num2 == 0) //判斷是否計(jì)時(shí)結(jié)束
num2 = 60; //重新賦值,以便重新計(jì)時(shí)
}
}
3.數(shù)碼管LED燈相關(guān)程序代碼
/*****
"hardware.h"自創(chuàng)的頭文件、hardware翻譯為:五金器具; 計(jì)算機(jī)硬件; 武器裝備;
“”用于自己創(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}; //定義無(wú)符號(hào)字符型類型數(shù)組來(lái)儲(chǔ)存段碼
void tube() //數(shù)碼管掃描函數(shù)
{
uchar i; //定義i變量
for(i=0;i<2;i++)
{
switch(i)
{
case(0): //位選,第一個(gè)數(shù)碼管
LSA=1;
LSB=1;
LSC=1;
P0 = block[num2/10]; //十位數(shù)拆分
break;
case(1): //位選,第一個(gè)數(shù)碼管
LSA=0;
LSB=1;
LSC=1;
P0 = block[num2%10]; //個(gè)位數(shù)拆分
break;
}
// P0 = block[num%10];
delayms(5); //延時(shí)一會(huì)(視覺殘留)
P0=0x00; //消影
}
}
4.相關(guān)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單片機(jī)頭文件
//#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(類型定義) 用來(lái)給無(wú)符號(hào)整型類型數(shù)據(jù) unsigned int 定義新名字 uint
typedef unsigned char uchar; //用來(lái)給無(wú)符號(hào)字符型類型數(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é)
首先我也是一個(gè)單片機(jī)入門的小白,編寫文章不易。如果我的文章對(duì)大家有所幫助,我感到很開心。其次有很多的不足之處,希望大家多多包涵。另外,如果大家有什么好的意見,歡迎大家留言討論。一起共同進(jìn)步!
程序下載地址:
數(shù)碼管60s倒計(jì)時(shí)(模塊化).rar
(335.45 KB, 下載次數(shù): 31)
2021-7-1 23:59 上傳
點(diǎn)擊文件名下載附件
利用中斷和定時(shí)器簡(jiǎn)單的實(shí)現(xiàn)數(shù)碼管60秒的倒計(jì)時(shí)顯示 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|