|
51(STC89C52)单片机简易时钟程序电路设计(附源代码和电路图)
上一篇做了一个温湿度采集电路,觉得这东西玩起来还是挺有意思,然后就想做一个时钟,于是就有了下文
1.成品图
2.电路设计
电路设计如下这里蜂鸣器用led等替代了,我觉得无所谓吧
电路仿真工程文件
时钟电路仿真.rar
(53.5 KB, 下载次数: 51)
3.程序开发调试
程序
//****************************************************************//
//大男孩简易时钟
//单片机 STC89C52RC
//功能 简单时钟设计,按键调整时间和定闹钟
//****************************************************************//
#include <reg51.h>
#include <intrins.h>
//数据类型定义
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
//数码管显示io定义
sbit S1=P2^7;
sbit S2=P2^6;
sbit S3=P2^5;
sbit S4=P2^4;
//按键开关io定义
sbit KEY1=P1^0;
sbit KEY2=P1^1;
//蜂鸣器io定义
sbit BELL=P2^3;
//----------------------------------------------//
//----------------数码管数字 0--9---------------//
//----------------------------------------------//
U8 dat1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0X80,0X90,0xff,0xc6};
U8 dat2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0X00,0X10,0xff};//有小数点
//位选
U8 table[4]={0,0,2,1};
S8 flag=0;
S8 t=0;
S8 miao=0;
S8 xs=0;
S8 menu=0;
S8 feng=0,fens=0,shig=0,shis=0;
S8 nfeng=0,nfens=3,nshig=6,nshis=0;
S8 djsm=0,djsf=99;
S8 ksdjs=0;
S8 nkg=0;
S8 zdbs=0;
U8 count = 100;
//延时程序
void Delayms(U16 t)
{
U8 i;
while(t--)
for(i=0;i<100;i++);
}
//数码管显示
void display()
{
S1=0;S4=1;
P0=dat1[table[0]];
Delayms(2);
S4=0;S3=1;
P0=dat1[table[1]];
Delayms(2);
S3=0;S2=1;
if(flag>0)P0=dat2[table[2]];
else P0=dat1[table[2]];
Delayms(2);
S2=0;S1=1;
P0=dat1[table[3]];
Delayms(2);
}
void key()
{
if(BELL==0)
{
if(KEY2==0)
{
while(KEY2==0);
BELL=1;
nkg=0;
}
}
if(KEY1==0)
{
Delayms(10);
if(KEY1==0)
{
BELL=0;
while(KEY1==0);
BELL=1;
menu++;
if(menu==1){feng=table[0];fens=table[1];}
if(menu==2){shig=table[2];shis=table[3];}
if(menu==3){table[0]=nfeng;table[1]=nfens;table[2]=nshig;table[3]=nshis;}
if(menu==9){BELL=1;djsm=0;djsf=0;ksdjs=0;}
if(menu==10){table[0]=feng;table[1]=fens;table[2]=shig;table[3]=shis;menu=0;}
}
}
if(menu==1)//设置时间分
{
if(KEY2==0)
{
Delayms(10);
if(KEY2==0)
{
BELL=0;
while(KEY2==0);
BELL=1;
feng++;
if(feng==10)
{
feng=0;
fens++;
if(fens==6)fens=0;
}
}
}
}
if(menu==2)//设置时间时
{
if(KEY2==0)
{
Delayms(10);
if(KEY2==0)
{
BELL=0;
while(KEY2==0);
BELL=1;
shig++;
if(shig==10)
{
shig=0;
shis++;
}
if(shis==2 && shig==4)shig=shis=0;
}
}
}
if(menu==3)//设置闹钟分
{
if(KEY2==0)
{
Delayms(10);
if(KEY2==0)
{
BELL=0;
while(KEY2==0);
BELL=1;
nfeng++;
if(nfeng==10)
{
nfeng=0;
nfens++;
if(nfens==6)nfens=0;
}
}
}
}
if(menu==4)//设置闹钟时
{
if(KEY2==0)
{
Delayms(10);
if(KEY2==0)
{
BELL=0;
while(KEY2==0);
BELL=1;
nshig++;
if(nshig==10)
{
nshig=0;
nshis++;
}
if(nshis==2 && nshig==4)nshig=nshis=0;
}
}
}
if(menu==5)//开启关闭闹钟
{
if(KEY2==0)
{
Delayms(10);
if(KEY2==0)
{
BELL=0;
while(KEY2==0);
BELL=1;
nkg++;
if(nkg==2)nkg=0;
}
}
}
if(menu==6)//开启关闭整点报时
{
if(KEY2==0)
{
Delayms(10);
if(KEY2==0)
{
BELL=0;
while(KEY2==0);
BELL=1;
zdbs++;
if(zdbs==2)zdbs=0;
}
}
}
if(menu==7)//倒计时设置
{
if(KEY2==0)
{
Delayms(10);
if(KEY2==0)
{
BELL=0;
while(KEY2==0);
BELL=1;
djsf++;
if(djsf>99)djsf=0;
}
}
}
}
void init()
{
TMOD= 0x10;
TL1 = (65536-50000)%256; //设置定时初值
TH1 = (65536-50000)/256; //设置定时初值
ET1 = 1;
TR1 = 1;
EA = 1;
}
void main()
{
init();
while(1)
{
key();
display();
if(nkg==1)
{
if(table[0]==nfeng && table[1]==nfens && table[2]==nshig && table[3]==nshis)BELL=0;
else BELL=1;
}
if(zdbs==1)
{
if(table[0]==0 && table[1]==0 && miao<2)BELL=0;
else BELL=1;
}
}
}
void InitTimer1() interrupt 3 // 1毫秒@11.0592MHz
{
TL1 = (65536-50000)%256; //设置定时初值
TH1 = (65536-50000)/256; //设置定时初值
t++;
if(menu==0)
{
if(t==20)
{
t=0;
miao++;
if(miao==60)
{
miao=0;
table[0]++; //分个位加
if(table[0]==10)
{
table[0]=0;
table[1]++; //分十位加
if(table[1]==6)
{
table[1]=0;
table[2]++; //时个位加
if(table[2]==10)
{
table[2]=0;
table[3]++; //时十位加
}
if(table[3]==2 && table[2]==4)table[2]=table[3]=0;//满24时
}
}
}
}
}
if(menu==1)
{
if(t<10)
{
table[0]=feng;
table[1]=fens;
}
if(t<20 && t>=10)
{
table[0]=10;
table[1]=10;
}
if(t==20)t=0;
}
if(menu==2)
{
table[0]=feng;
table[1]=fens;
if(t<10)
{
table[2]=shig;
table[3]=shis;
}
if(t<20 && t>=10)
{
table[2]=10;
table[3]=10;
}
if(t==20)t=0;
}
if(menu==3)
{
if(t<10)
{
table[0]=nfeng;
table[1]=nfens;
}
if(t<20 && t>=10)
{
table[0]=10;
table[1]=10;
}
if(t==20)t=0;
}
if(menu==4)
{
table[0]=nfeng;
table[1]=nfens;
if(t<10)
{
table[2]=nshig;
table[3]=nshis;
}
if(t<20 && t>=10)
{
table[2]=10;
table[3]=10;
}
if(t==20)t=0;
}
if(menu==5)//开启关闭闹钟
{
table[0]=table[1]=table[2]=table[3]=nkg;
}
if(menu==6)//开启关闭整点报时
{
table[0]=table[1]=table[2]=table[3]=zdbs;
}
if(menu==7)//倒计时
{
table[0]=0;
table[1]=0;
table[2]=djsf%10;
table[3]=djsf/10;
}
if(menu==8)//倒计时
{
if(KEY2==0)//开始倒计时
{
t=0;
BELL=0;
while(KEY2==0);
BELL=1;
ksdjs=1;
djsm=59;
djsf=djsf-1;
}
if(t==20 && ksdjs==1)
{
t=0;
djsm--;
if(djsf==0 && djsm==0){BELL=0;ksdjs=0;}
if(djsm==-1)
{
djsm=59;
djsf--;
}
}
table[3]=djsf/10;
table[2]=djsf%10;
table[1]=djsm/10;
table[0]=djsm%10;
}
if(menu==9)
{
if(KEY2==0)//秒表开计时
{
t=0;
BELL=0;
while(KEY2==0);
BELL=1;
ksdjs++;
if(ksdjs==2)ksdjs=0;
}
if(t==20 && ksdjs==1)
{
t=0;
djsm++;
if(djsm==60)
{
djsm=0;
djsf++;
if(djsf>99){ksdjs==0;djsf==99;}
}
}
table[3]=djsf/10;
table[2]=djsf%10;
table[1]=djsm/10;
table[0]=djsm%10;
}
xs++;
if(xs==10)
{
xs=0;
flag=!flag;
}
}
源代码c语言程序
时钟程序设计.rar
(37.42 KB, 下载次数: 31)
电路调试制作焊接等
4.制作外壳
购买了手钻和亚克力板等,然后就简单制作了个外壳
然后顺便已给我的温湿度计也做了一个外壳,哈哈
|
评分
-
查看全部评分
|