#include <reg51.h> sbit dula=P2^6; sbit wela=P2^7; sbit P34=P3^4; char Tab [10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極數(shù)碼管0到f的短編碼 unsigned char Dat[4]={0xf7,0xfb,0xfd,0xfe}; unsigned char Second=0; unsigned long i,c=0; void main() { char t; char b[2]; TMOD=0x01; TR0=1; TH0=(65536-46080)/256; TL0=(65536-46080)%256; ET0=1; //允許T0中斷 EA=1; //允許所有中斷 while(1) { b[3]=c/1000; //千 b[2]=c/100%10; //百 b[1]=c/10%10; //十 b[0]=c%10; //個(gè) for(t=0;t<2;t++){ //t是多少個(gè)數(shù)碼管顯示 P0=Tab[b[t]]; dula=1;dula=0; P0=Dat[t]; wela=1;wela=0; for(i=0;i<2;i++); P0=0xFF; }}} /*定時(shí)器0中斷服務(wù)子程序*/ void time0() interrupt 1 { TH0= (65536-46080)/256; TL0= (65536-46080)%256; i++; if(i==1){ i=0; c++; if(c>=20) c=0; //計(jì)數(shù)到20秒自動(dòng)回0 } }
數(shù)碼管原理(顯示)及編碼(段碼)
常用的7段數(shù)碼管由發(fā)光二極管(組合)構(gòu)成,如下圖:
分為:共陽(yáng)極和共陰極(如上圖)
如果顯示“0”,共陽(yáng)極為:abcdefg dp ,dp為對(duì)應(yīng)最高位,a為對(duì)應(yīng)最低位,編碼:11000000 ,16進(jìn)制0xC0,共陰極正好相反:00111111,16進(jìn)制0x3f。
以此類推。
共陽(yáng)極數(shù)碼管的0 到f的段編碼:
0xc0,0xf9,0xa4,0xb0,//0~3
0x99,0x92,0x82,0xf8,//4~7
0x80,0x90,0x88,0x83,//8~b
0xc6,0xa1,0x86,0x8e //c~f
共陰極數(shù)碼管0到f的短編碼:
0x3f,0x06,0x5b,0x4f, //0~3
0x66,0x6d,0x7d,0x07, //4~7
0x7f,0x6f,0x77,0x7c, //8~b
0x39,0x5e,0x79,0x71 //c~f
這段代碼是一個(gè)基于單片機(jī)的數(shù)字時(shí)鐘,具體實(shí)現(xiàn)了以下功能:
- 通過(guò)四個(gè)共陰數(shù)碼管顯示當(dāng)前時(shí)刻,每秒更新一次;
- 使用定時(shí)器0作為計(jì)時(shí)器,每隔50ms產(chǎn)生一次中斷,從而實(shí)現(xiàn)秒表計(jì)時(shí)功能;
- 將計(jì)時(shí)結(jié)果(單位為秒)以“xx.xx”形式顯示在第一個(gè)數(shù)碼管上,最多可以計(jì)時(shí)20秒。
下面是對(duì)這段代碼的詳細(xì)分析:
首先,在 main 函數(shù)中,定義了一些變量,包括:
- Tab:數(shù)字 0~9 在數(shù)碼管上的顯示碼表;
- Dat:數(shù)碼管控制位模式表;
- Second:用于存儲(chǔ)當(dāng)前時(shí)間的秒數(shù),初始值為 0;
- i:用于計(jì)時(shí)的計(jì)數(shù)器,初始值為 0;
- c:用于秒表計(jì)時(shí)的計(jì)數(shù)器,初始值為 0。
接著,在 main 函數(shù)中,初始化定時(shí)器0,并開啟 T0 中斷和全局中斷使能。
隨后進(jìn)入主循環(huán),其中先通過(guò)將計(jì)數(shù)值 c 格式化為四個(gè)數(shù)字,存儲(chǔ)在數(shù)組 b 中。循環(huán)遍歷數(shù)組 b,依次將每個(gè)數(shù)字通過(guò)選擇相應(yīng)的碼表值和數(shù)碼管控制位模式,發(fā)送給數(shù)碼管進(jìn)行顯示。
在 T0 中斷服務(wù)子程序 time0 中,首先重新加載定時(shí)器初值,然后每隔一定周期執(zhí)行一次計(jì)時(shí)操作:將計(jì)數(shù)值 i 加 1,如果 i 達(dá)到指定閾值(50ms),則將當(dāng)前秒表計(jì)數(shù)值 c 加 1,并判斷是否超過(guò)20秒,如果超過(guò)則將其清零。
需要注意的是,此代碼僅僅是一個(gè)簡(jiǎn)單的實(shí)現(xiàn),還存在一些問(wèn)題。例如,由于使用了延時(shí)函數(shù),這會(huì)影響程序的實(shí)時(shí)性。而且,由于只在主循環(huán)中更新時(shí)鐘顯示,如果程序在處理其他任務(wù)時(shí)比較繁忙,則可能導(dǎo)致時(shí)鐘顯示出現(xiàn)明顯的卡頓或錯(cuò)誤。因此,在實(shí)際應(yīng)用中需要對(duì)代碼進(jìn)行進(jìn)一步的優(yōu)化和改進(jìn)。