找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1416|回复: 1
收起左侧

带详细注释单片机单片机时钟跑表程序

[复制链接]
ID:439830 发表于 2018-12-10 21:29 | 显示全部楼层 |阅读模式
#include<reg51.h> //包含51单片机的头文件
#define uchar unsigned char //定义一个无符号字符,使用这一句话有个好处就是:在后面的程序中就可以直接使用uchar等词了。
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0-9的数组,我在思考是否能将控制数组也能像数据数组一样集中控制呢?
char num,miao,fen,shi;//定义了一个num 和一个 miao fen shi
sbit key1=P1^0; //暂停、开始
sbit key2=P1^1; //分位+
sbit key3=P1^2; //分位-
sbit key4=P1^3; //十位+
sbit key5=P1^4; //十位-
void keyprint();
void delay(uchar z) //延时子函数
{
while(z--);
}



void shuma(char miao,fen,shi) //数码管显示子程序
{
P2=0x01;
P0=table[miao%10]; //显示秒钟的个位
delay(100);
P2=0x02;
P0=table[miao/10]; //显示秒钟的十位
delay(100);

P2=0x04;
P0=0xBF; //中间的点
delay(100);

P2=0x08;
P0=table[fen%10]; //分钟的个位
delay(100);
P2=0x10;
P0=table[fen/10]; //分钟的十位
delay(100);

P2=0x20;
P0=0xBF; //中间的点
delay(100);

P2=0x40;
P0=table[shi%10]; //小时的个位
delay(100);
P2=0x80;
P0=table[shi/10]; //小时的十位
delay(100);

}
void main() //主函数
{
TMOD=0x10; //TMOD是工作方式寄存器,这里的1是管的是T1,0是管的T0,T1用1后就将M0,M1置于16位计数器。最高可计数2的16次方(65536)。
TH1=(65536-50000)/256; //TH1是T1的高8位。
TL1=(65536-50000)%256; //TL1是T1的低8位。
EA=1; //EA是中断的总开关,EA=1是中断允许的前提条件,如果EA=0,则禁止所有的中断。
ET1=1; //ET1是定时器/计数器1的中断允许控制位。ET1=1则说明允许定时器1中断,如果ET1=0,则禁止定时器1中断。
TR1=1; //TR1是定时器1的启动位。定时器1要工作,TR1肯定要等于1.等于0则关闭定时器1.
while(1)
{
keyprint();
shuma(miao,fen,shi);
}
}
void T1_time()interrupt 3 //中断子函数。其中interrupt是定义一个中断函数的标志。3是中断序号(0,1,2,3,4)。
{ TH1=(65536-50000)/256; //重装定时数据。因为在第一遍中断完了过后,里面的数据会发生错乱,因此在这里必须重新设定参数。
TL1=(65536-50000)%256;
num++; //定时的数据每隔0.05s 就自动加1
if(num==2) //如果定时数据(num)=2了。
{num=0; //如果num=20 则num就自动清零
miao++; //同时显示的数据自动加1
if(miao==60) //如果显示的数字达到了60
{
miao=0; //秒回0
fen++; //分钟加1
if(fen==60) //分钟到了60
{
fen=0; //分钟回0
shi++; //时钟加1
if(shi==24) //小时显示到了24
shi=0; //小时回0
}
}
}
}
void keyprint()
{
if(key1==0)
{delay(2000);
if(key1==0)
TR1=~TR1;
}

if(TR1==0)
{
if(key2==0)
{delay(200);
if(key2==0)
{fen++;
if(fen==60)
fen=0;
while(!key2);
}
}
if(key3==0)
{delay(2000);
if(key3==0)
{fen--;
if(fen==-1)
fen=59;
while(!key3);
}
}
}
if(key4==0)
{delay(2000);
if(key4==0)
{shi++;
if(shi==24)
shi=0;
while(!key4);
}
}
if(key5==0)
{delay(2000);
if(key5==0)
{shi--;
if(shi==-1)
shi=23;
while(!key5);
}
}
}



回复

使用道具 举报

ID:1 发表于 2018-12-10 22:51 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表