找回密码
 注册会员
img_loading
智能检测中
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

利用51单片机做时钟--对于初学者来说是一个很好的例子。

[复制链接]
admin 发表于 2012-8-24 11:30:18 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
215750rm6rqlejro6p6qqe.jpg


单片机做时钟,实现功能:
1、定时器一秒定时;
2、小时、分、秒显示 ;
3、按键设置时间,使用四个按键
步骤如下: 第一次按KEY-SET ,设置小时;第二次按KEY-SET ,设置分钟;第二次按KEY-SET ,设置秒。
在设置过程中,按UP循环加1;按down循环减1;按KEY-ENTER退出设置。
4、按键设置时间时相应的位闪烁:设置”小时“时,小时闪烁 12.20.30
设置”分钟“时,分钟闪烁 12.20.30
设置”秒“时,秒闪烁 12.20.30
这里闪烁我用红色代替。

我对51单片机的掌握还不是很熟练,有什么不懂和不足的地方还请大家多多指教。
本来是想把proteus仿真图上传上来的,可是因为很少发帖 不知道怎么弄(请大侠指教啊),所以只有截图了,大家可以自己去画下这个图,难度不大。
对于51我们大家也是要多看,多写,多练,多调试,多动手才是硬道理。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_set=P3^4;
sbit key_up=P3^5;
sbit key_down=P3^6;
sbit key_enter=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71,0x00};
uchar count,num,num1,hour,hour1,hour2,min,min1,min2,sec,sec1,sec2,shan;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar hour,uchar min,uchar sec)
{
hour1=hour/10;
hour2=hour%10;
min1=min/10;
min2=min%10;
sec1=sec/10;
sec2=sec%10;
if(shan==1)
{
if(count==1)
{
//TR0=0;
hour1=16;
hour2=16;
}
if(count==2)
{
//TR0=0;
min1=16;
min2=16;
}
if(count==3)
{
//TR0=0;
sec1=16;
sec2=16;
}
if(key_enter==0)
{
count=0;
shan=0;
TR0=1;

}

}
dula=1;
P0=table[hour1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
dula=1;
P0=table[hour2]|0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1;
P0=table[min1];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1;
P0=table[min2]|0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
dula=1;
P0=table[sec1];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);
dula=1;
P0=table[sec2];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}
void keyscan()
{
if(key_set==0) //key_set键的程序
{
delayms(5);
if(key_set==0)
{

count++;
TR0=0;
if(count==4)
count=1;
if(count<4)
{
TR1=1;

shan=1;
}
while(!key_set)
display(hour,min,sec);
}

}
if(key_up==0)
{
delayms(5);
if(key_up==0)
{
while(!key_up)
display(hour,min,sec);

if(count==1)
{
hour++;
if(hour==24)
hour=0;
}
if(count==2)
{
min++;
if(min==60)
min=0;

}
if(count==3)
{
sec++;
if(sec==60)
sec=0;
}
}
}

if(key_down==0)
{
delayms(5);
if(key_down==0)
{
while(!key_down)
display(hour,min,sec);

if(count==1)
{
hour--;
if(hour==255)
hour=23;
}
if(count==2)
{
min--;
if(min==255)
min=59;

}
if(count==3)
{
sec--;
if(sec==255)
sec=59;
}
}
}


if(key_enter==0)
{
delayms(5);
if(key_enter==0)
{
while(!key_enter)
display(hour,min,sec);

count=0;
shan=0;
TR0=1;
/* TR1=0;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;*/
}
}
}
void init()
{
TMOD=0x11;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
TH1=(65536-46080)/256;
TL1=(65536-46080)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
}
void main()
{
init();
while(1)
{
keyscan();
display(hour,min,sec);
}
}

void T0_time() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
num++;
if(num==20)
{
num=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
}
void T1_time() interrupt 3
{
TH1=(65536-46080)/256;
TL1=(65536-46080)%256;
num1++;
if(num1==10)
{
num1=0;
shan=~shan;
}
}






时钟.jpg (258.56 KB, 下载次数: 32)

仿真图
2156530eb76unnd93b7n9s.jpg
您需要登录后才可以回帖 登录 | 注册会员

*滑块验证:
img_loading
智能检测中
本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2025-6-19 14:42 , Processed in 0.062615 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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