51單片機(jī)學(xué)習(xí)筆記,簡(jiǎn)易時(shí)鐘
使用芯片STC89C52RC, 2個(gè)鎖存器
6個(gè)帶小數(shù)點(diǎn)共陰極數(shù)碼管顯示一個(gè)24時(shí)制時(shí)鐘
沒(méi)有時(shí)鐘芯片,所以掉電后時(shí)間會(huì)復(fù)位
原理圖為T(mén)X-1C開(kāi)發(fā)板
暫時(shí)顯示了半小時(shí),一秒不差,
未驗(yàn)證有無(wú)其他bug,代碼貼上來(lái),歡迎高手指點(diǎn)
==============================
最終顯示的<時(shí).分.秒>是 16.31.37 形式
C代碼
#include
#include"MY51.H"
voidshow();
uint8shi=15;//初始時(shí)間15:45:00按復(fù)位按鈕對(duì)時(shí)
uint8fen=45;
uint8miao=0;
voidmain()
{
startT0(1000);//開(kāi)始定時(shí)器
while(1)
{
show();
}
}
voidshow()//顯示時(shí)鐘
{
uint8oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela;//oneWela是最左邊的數(shù)碼管
sixWela=miao%10;
fiveWela=miao/10;
foreWela=fen%10;
threeWela=fen/10;
twoWela=shi%10;
oneWela=shi/10;
displaySMG(oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela,0xf5);//0xf5小數(shù)點(diǎn)位置
}
voidT0_Work()//T0定時(shí)器調(diào)用的工作函數(shù)
{
miao++;
if(miao>59)
{
miao=0;
fen++;
}
if(fen>59)
{
fen=0;
shi++;
}
if(shi>23)
{
shi=0;
}
}
C代碼
#ifndef_MY51_H_
#define_MY51_H_
#include
#include
typedefintint16;
typedefintINT16;
typedefunsignedintuint16;
typedefunsignedintUINT16;
typedefunsignedshortuint;
typedefunsignedshortUINT;
typedefunsignedshortword;
typedefunsignedshortWORD;
typedefunsignedlonguint32;
typedefunsignedlongUINT32;
typedefunsignedlongDWORD;
typedefunsignedlongdword;
typedefsignedlongint32;
typedefsignedlongINT32;
typedeffloatfloat32;
typedefdoubledouble64;
typedefsignedcharint8;
typedefsignedcharINT8;
typedefunsignedcharbyte;
typedefunsignedcharBYTE;//WINDOWS的windef.h里面是這么定義的
typedefunsignedcharuchar;
typedefunsignedcharUCHAR;
typedefunsignedcharUINT8;
typedefunsignedcharuint8;
typedefunsignedcharBOOL;//windows中定義BOOL為int
typedefunsignedcharbool;//bool是c++的內(nèi)置類(lèi)型
#defineTRUE1
#definetrue1
#defineFALSE0
#definefalse0
#defineopen1//open和close用于標(biāo)志打開(kāi)和關(guān)閉狀態(tài)
#defineOPEN1
#defineclose0
#defineCLOSE0
#definelock0
#definestart1
#defineSTART1
#definestop0
#defineSTOP0
uint8dulaIndex=0;//數(shù)碼管0~F段編碼索引號(hào)
uint8welaIndex=0;//0~5位的數(shù)碼管位索引號(hào)
sbitdula=P2^6;//段選鎖存器控制控制筆段
sbitwela=P2^7;//位選鎖存器控制控制位置
#defineledP1//燈總線控制
sbitled0=P1^0;//8個(gè)led燈
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;
sbitled6=P1^6;
sbitled7=P1^7;
sbitkeyS2=P3^4;//4個(gè)獨(dú)立按鍵
sbitkeyS3=P3^5;
sbitkeyS4=P3^6;
sbitkeyS5=P3^7;
voiddisplaySMG(uint8one,uint8two,uint8three,uint8four,uint8five,uint8six,uint8dot);
voiddelayms(uint16ms);
voidT0_Work();
//////////////////////////////////////////////////////////////////////////
voiddelayms(uint16ms)//軟延時(shí)函數(shù)
{
uint16i,j;
for(i=83;i>0;i--)
{
for(j=ms;j>0;j--)
{}
}
}
///////////////////////////////////////////////////////////////////////////
#definedark0x11//也就是索引第17號(hào)元素0x00,共陰極數(shù)碼管正極全部輸入低電平
uint8codetable[]={//0~F外加小數(shù)點(diǎn)和空輸出的數(shù)碼管編碼
0x3f,0x06,0x5b,0x4f,//0123
0x66,0x6d,0x7d,0x07,//4567
0x7f,0x6f,0x77,0x7c,//89AB
0x39,0x5e,0x79,0x71,//CDEF
0x80,0x00//.空空時(shí)是第0x11號(hào)也就是第17號(hào)元素
};
/////////////////////////////////////////////////////////////////////////////
uint8TH0Cout=0;//初值
uint8TL0Cout=0;
uint16T0IntCout=0;//中斷計(jì)數(shù)
uint16T0IntCountAll=0;//(N-1)/65536+1;//總中斷次數(shù)
boolbT0Delay=false;//使用延時(shí)函數(shù)標(biāo)志,初始未用
boolbT0Over=false;//中斷處理函數(shù)執(zhí)行結(jié)果之一
voidstartT0(uint32ms)//開(kāi)啟定時(shí)器
{