标题:
基于单片机的电子时钟proteus仿真设计
[打印本页]
作者:
tim2017
时间:
2017-8-17 16:20
标题:
基于单片机的电子时钟proteus仿真设计
有proteus的仿真,还有源程序。
有兴趣的朋友可以一起学习!!
0.png
(23.66 KB, 下载次数: 119)
下载附件
2017-8-17 18:03 上传
0.png
(55.36 KB, 下载次数: 114)
下载附件
2017-8-17 18:03 上传
单片机源程序如下:
#include <reg52.h>
#include "ds1302.h"
#include "key.h"
#define uchar unsigned char
#define uint unsigned int
bit WATCH_TIME=1; //数码管显示时间标志位,默认情况下显示时间
bit WATCH_DATE=0; //数码管显示日期标志位
bit SET_TIME=0; //数码管显示调时时的在调时间
bit SET_DATE=0; //数码管显示在调日期
bit SET_CLOK=0; //数码管显示在调闹钟的数值
bit CLK; //开闹钟标志位
sbit led=P2^1;
sbit wela=P2^2;
sbit dula=P2^3;
sbit beef=P2^4;
sbit tom=P2^0;
//uchar tab_date[14]="2012-11-06 TUE";//表示年月日星期
//uchar tab_time[8]="00:00:00";//表示时分秒
uchar tab_t[6],tab_c[6],tab_d[6],date[6],time[6]; //用来显示调节时间、闹钟、日期时显示相应数据
uchar tiao,second;//调时或设置闹钟时,相应的时分秒跳动
uchar code tabdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*共阴极数*/
uchar code tabwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar keyval,tiao=2;
uchar hour,min,sec;
uchar year,month,day;
uchar clkh,clkm,clks;
void delay(uint t)
{
uint x,y;
for(x=0;x<t;x++)
for(y=0;y<40;y++);
}
//------------------------------------------
// 数据转换
//------------------------------------------
void trans()
{
date[0]=tab_1302[6]/10; //年十位
date[1]=tab_1302[6]%10; //年个位
date[2]=tab_1302[4]/10; //月十位
date[3]=tab_1302[4]%10; //月个位
date[4]=tab_1302[3]/10; //日十位
date[5]=tab_1302[3]%10; //日个位
time[0]=tab_1302[2]/10; //小时十位
time[1]=tab_1302[2]%10; //小时个位
time[2]=tab_1302[1]/10; //分十位
time[3]=tab_1302[1]%10; //分个位
time[4]=tab_1302[0]/10; //秒十位
time[5]=tab_1302[0]%10; //秒个位
}
void Getval(uchar hour1,uchar min1,uchar sec1)
{
tab_t[0]=hour1/10;
tab_t[1]=hour1%10;
tab_t[2]=min1/10;
tab_t[3]=min1%10;
tab_t[4]=sec1/10;
tab_t[5]=sec1%10;
}
void Getdate(uchar year1,uchar month1,uchar day1)
{
tab_d[0]=year1/10;
tab_d[1]=year1%10;
tab_d[2]=month1/10;
tab_d[3]=month1%10;
tab_d[4]=day1/10;
tab_d[5]=day1%10;
}
void clkinit()
{
tab_c[0]=2;
tab_c[1]=4;
tab_c[2]=0;
tab_c[3]=0;
tab_c[4]=0;
tab_c[5]=0;
}
void Getclok()
{
tab_c[0]=clkh/10;
tab_c[1]=clkh%10;
tab_c[2]=clkm/10;
tab_c[3]=clkm%10;
tab_c[4]=clks/10;
tab_c[5]=clks%10;
}
void dsptime() //显示实时时间
{
uchar i;
led=0;
for(i=0;i<6;i++)
{
P3=tabwe[i];
P0=tabdu[time[i]];
delay(5);
}
}
void dspdate() //显示日期
{
uchar i;
led=1;
for(i=0;i<6;i++)
{
P3=tabwe[i];
P0=tabdu[date[i]];
delay(5);
}
}
void setdisp(uchar tab_set[]) //数码管显示当前设置相应的数值并跳动
{
uchar i;
for(i=0;i<6;i++)
{
switch(tiao)
{
case 0:if(i==0||i==1)
{
if(second<8)
{
P3=tabwe[i];
P0=tabdu[tab_set[i]];
}
}
else
{
P3=tabwe[i];
P0=tabdu[tab_set[i]];
}break;
case 1:if(i==2||i==3)
{
if(second<8)
{
P3=tabwe[i];
P0=tabdu[tab_set[i]];
}
}
else
{
P3=tabwe[i];
P0=tabdu[tab_set[i]];
}break;
case 2:if(i==4||i==5)
{
if(second<8)
{
P3=tabwe[i];
P0=tabdu[tab_set[i]];
}
}
else
{
P3=tabwe[i];
P0=tabdu[tab_set[i]];
}break;
}
delay(5);
}
}
void settime() //设置时间
{
SET_TIME=1;
SET_DATE=0;
WATCH_TIME=0;
hour=time[0]*10+time[1];
min=time[2]*10+time[3];
sec=time[4]*10+time[5];
while(1)
{
keyval=Getkey();
switch(keyval)
{
case KEY_MU:tiao++;tiao=tiao%3;break; //调时
case KEY_UP:if(tiao==0){hour++;if(hour==24) hour=0;}
if(tiao==1){min++;if(min==60) min=0;}
if(tiao==2){sec++;if(sec==60) sec=0;};
break;
case KEY_DN:if(tiao==0){hour--;if(hour==255) hour=23;}
if(tiao==1){min--;if(min==255) min=59;}
if(tiao==2){sec--;if(sec==255) sec=59;};
break;
case KEY_OK:tab1_1302[2]=hour;tab1_1302[1]=min;tab1_1302[0]=sec;ds1302_init();SET_TIME=0;WATCH_TIME=1;tiao=1;return;break;
case KEY_BK:SET_TIME=0;WATCH_TIME=1;tiao=1;return;
}
}
}
void setdate() //设置日期
{
uchar keyval;
SET_TIME=0;
SET_DATE=1;
WATCH_DATE=0;
year=date[0]*10+date[1];
month=date[2]*10+date[3];
day=date[4]*10+date[5];
while(1)
{
keyval=Getkey();
switch(keyval)
{
case KEY_MU:tiao++;tiao=tiao%3;break;
case KEY_UP:if(tiao==0){year++;if(year==100) year=0;}
if(tiao==1){month++;if(month==13) month=0;}
if(tiao==2){day++;if(day==32) day=0;};
break;
case KEY_DN:if(tiao==0){year--;if(year==255) year=99;}
if(tiao==1){month--;if(month==0) month=12;}
if(tiao==2){day--;if(day==0) day=31;};
break;
case KEY_OK:tab1_1302[6]=year;tab1_1302[4]=month;tab1_1302[3]=day;
ds1302_init();SET_DATE=0;WATCH_TIME=1;tiao=2;led=0;return;
break;
case KEY_BK:SET_DATE=0;WATCH_TIME=1;tiao=2;led=0;return;
}
}
}
void setclok() //设置闹钟
{
clkh=tab_c[0]*10+tab_c[1];
clkm=tab_c[2]*10+tab_c[3];
clks=tab_c[4]*10+tab_c[5];
SET_CLOK=1;
tiao=0;
while(1)
{
keyval=Getkey();
switch(keyval)
{
case KEY_MU:tiao++;tiao=tiao%2;break;
case KEY_UP:if(tiao==0){clkh++;if(clkh>=24) clkh=0;}
if(tiao==1){clkm++;if(clkm==60) clkm=0;};
break;
case KEY_DN:if(tiao==0){clkh--;if(clkh==255) clkh=23;}
if(tiao==1){clkm--;if(clkm==255) clkm=59;};
break;
case KEY_OK:SET_CLOK=0;WATCH_TIME=1;CLK=1;tiao=1;return;break;
case KEY_BK:clkh=24;clkm=0;clks=0;SET_CLOK=0;CLK=0;WATCH_TIME=1;tiao=1;return;
}
}
}
void smg()
{
if(WATCH_TIME)
dsptime(); //显示时间
else if(WATCH_DATE)
dspdate(); //显示日期
else if(SET_TIME)
{
Getval(hour,min,sec);
setdisp(tab_t); //显示在调时间
}
else if(SET_DATE)
{
Getdate(year,month,day);
setdisp(tab_d); //显示在调日期
}
else if(SET_CLOK)
{
Getclok();
setdisp(tab_c); //显示在调闹钟
}
}
void dealkey(uchar key)
{
switch(key)
{
case KEY_MU:if(WATCH_DATE)
{
led=1;
setdate();
}
else
settime();
break;
case KEY_CK:WATCH_TIME=0;WATCH_DATE=0;setclok();break;
case KEY_TD:WATCH_TIME=~WATCH_TIME;WATCH_DATE=~WATCH_DATE;break;//时间与日期的切换
}
}
void feng()//闹钟
{
if(clkh==tab_1302[2]&&clkm==tab_1302[1])
tom=0;
if(KEY_CK==Getkey())
{
tom=1;
CLK=0;
}
}
void main()
{
uchar num;
TMOD=0X01; //T0工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; //10毫秒中断一次
EA=1;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于单片机的电子时钟仿真.7z
(43.07 KB, 下载次数: 71)
2017-8-17 16:20 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
tao87512
时间:
2017-8-21 16:01
小白来学习一下,谢谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1