51單片機(jī)學(xué)習(xí)筆記,簡易時鐘
使用芯片STC89C52RC, 2個鎖存器
6個帶小數(shù)點共陰極數(shù)碼管顯示一個24時制時鐘
沒有時鐘芯片,所以掉電后時間會復(fù)位
原理圖為TX-1C開發(fā)板
暫時顯示了半小時,一秒不差,
未驗證有無其他bug,代碼貼上來,歡迎高手指點
==============================
最終顯示的<時.分.秒>是 16.31.37 形式
C代碼
#include
#include"MY51.H"
voidshow();
uint8shi=15;//初始時間15:45:00按復(fù)位按鈕對時
uint8fen=45;
uint8miao=0;
voidmain()
{
startT0(1000);//開始定時器
while(1)
{
show();
}
}
voidshow()//顯示時鐘
{
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ù)點位置
}
voidT0_Work()//T0定時器調(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)置類型
#defineTRUE1
#definetrue1
#defineFALSE0
#definefalse0
#defineopen1//open和close用于標(biāo)志打開和關(guān)閉狀態(tài)
#defineOPEN1
#defineclose0
#defineCLOSE0
#definelock0
#definestart1
#defineSTART1
#definestop0
#defineSTOP0
uint8dulaIndex=0;//數(shù)碼管0~F段編碼索引號
uint8welaIndex=0;//0~5位的數(shù)碼管位索引號
sbitdula=P2^6;//段選鎖存器控制控制筆段
sbitwela=P2^7;//位選鎖存器控制控制位置
#defineledP1//燈總線控制
sbitled0=P1^0;//8個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個獨立按鍵
sbitkeyS3=P3^5;
sbitkeyS4=P3^6;
sbitkeyS5=P3^7;
voiddisplaySMG(uint8one,uint8two,uint8three,uint8four,uint8five,uint8six,uint8dot);
voiddelayms(uint16ms);
voidT0_Work();
//////////////////////////////////////////////////////////////////////////
voiddelayms(uint16ms)//軟延時函數(shù)
{
uint16i,j;
for(i=83;i>0;i--)
{
for(j=ms;j>0;j--)
{}
}
}
///////////////////////////////////////////////////////////////////////////
#definedark0x11//也就是索引第17號元素0x00,共陰極數(shù)碼管正極全部輸入低電平
uint8codetable[]={//0~F外加小數(shù)點和空輸出的數(shù)碼管編碼
0x3f,0x06,0x5b,0x4f,//0123
0x66,0x6d,0x7d,0x07,//4567
0x7f,0x6f,0x77,0x7c,//89AB
0x39,0x5e,0x79,0x71,//CDEF
0x80,0x00//.空空時是第0x11號也就是第17號元素
};
/////////////////////////////////////////////////////////////////////////////
uint8TH0Cout=0;//初值
uint8TL0Cout=0;
uint16T0IntCout=0;//中斷計數(shù)
uint16T0IntCountAll=0;//(N-1)/65536+1;//總中斷次數(shù)
boolbT0Delay=false;//使用延時函數(shù)標(biāo)志,初始未用
boolbT0Over=false;//中斷處理函數(shù)執(zhí)行結(jié)果之一
voidstartT0(uint32ms)//開啟定時器
{