51单片机学习笔记,简易时钟
扫描二维码
随时随地手机看文章
使用芯片STC89C52RC, 2个锁存器
6个带小数点共阴极数码管显示一个24时制时钟
没有时钟芯片,所以掉电后时间会复位
原理图为TX-1C开发板
暂时显示了半小时,一秒不差,
未验证有无其他bug,代码贴上来,欢迎高手指点
==============================
最终显示的<时.分.秒>是 16.31.37 形式
C代码
#include
#include"MY51.H"
voidshow();
uint8shi=15;//初始时间15:45:00按复位按钮对时
uint8fen=45;
uint8miao=0;
voidmain()
{
startT0(1000);//开始定时器
while(1)
{
show();
}
}
voidshow()//显示时钟
{
uint8oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela;//oneWela是最左边的数码管
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小数点位置
}
voidT0_Work()//T0定时器调用的工作函数
{
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++的内置类型
#defineTRUE1
#definetrue1
#defineFALSE0
#definefalse0
#defineopen1//open和close用于标志打开和关闭状态
#defineOPEN1
#defineclose0
#defineCLOSE0
#definelock0
#definestart1
#defineSTART1
#definestop0
#defineSTOP0
uint8dulaIndex=0;//数码管0~F段编码索引号
uint8welaIndex=0;//0~5位的数码管位索引号
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)//软延时函数
{
uint16i,j;
for(i=83;i>0;i--)
{
for(j=ms;j>0;j--)
{}
}
}
///////////////////////////////////////////////////////////////////////////
#definedark0x11//也就是索引第17号元素0x00,共阴极数码管正极全部输入低电平
uint8codetable[]={//0~F外加小数点和空输出的数码管编码
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;//中断计数
uint16T0IntCountAll=0;//(N-1)/65536+1;//总中断次数
boolbT0Delay=false;//使用延时函数标志,初始未用
boolbT0Over=false;//中断处理函数执行结果之一
voidstartT0(uint32ms)//开启定时器
{