本设计以AT89S51单片机为核心芯片,与型号为1602的液晶显示器构成数字电子时钟电路。AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4K Bytes ISP(In- programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及AT89C51引脚结构,芯片内集成了通用8位处理器和ISP Flash存储单元,功能强大的计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案.液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
51单片机的秒表时钟计时器设计——AT89S51
51单片机的秒表时钟计时器设计——AT89S51
51单片机的秒表时钟计时器设计——AT89S51
51单片机的秒表时钟计时器设计——AT89S51
#include
#define uint unsigned int
#define uchar unsigned char
it key1=P3^0;
it key2=P3^1;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar shi,fen,miao,num1 ,num2,num3,num4,num5,num6,num7;
void delayms (uint xms)
{uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}void miaodisplay (uchar num6,uchar num5)
{P2=0x00;
P2=0x80;
P1=table[num6];
delayms(5);
P2=0x00;
P2=0x40;
P1=table[num5];
delayms(5);
}void fendisplay(uchar num4,uchar num3)
{P2=0x00;
P2=0x10;
P1=table[num4];
delayms(5);
P2=0x00;
P2=0x08;
P1=table[num3];
delayms(5);
}void shidisplay(uchar num2,uchar num1)
{P2=0x00;
P2=0x02;
P1=table[num2];
delayms(5);
P2=0x00;
P2=0x01;
P1=table[num1];
delayms(5);
}void main ()
{TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
shi=0;
fen=0;
miao=0;
num7=0;
while (1)
{num1=shi/10;
num2=shi%10;
num3=fen/10;
num4=fen%10;
num5=miao/10;
num6=miao%10;
miaodisplay(num6,num5);
P2=0x00;
P2=0x20;
P1=0xbf;
delayms(5);
fendisplay(num4,num3);
P2=0x00;
P2=0x04;
P1=0xbf;
delayms(5);
shidisplay(num2,num1);
}}
void T0_time () interrupt 1
{TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num7++;
if(num7==20)
{num7=0;
miao++;
if(miao==60)
{miao=0;
fen++;
if(fen==60)
{fen=0;
shi++;
if(shi==24)
{shi=0;
fen=0;
miao=0;
}}
}}
}
说一下步骤吧:
1、数码管驱动电路设计。一般用三极管如9013或者锁存器如74HC573来驱动,使其能够正常亮灭。
2、使用动态扫描的方式让数码管能够显示你想要的数字,这个可以用中断来扫描也可以不用。
3、使用实时时钟芯片如DS1302来获得你想要的时间数据。这种网上有很多源程序,你可以搜索看。你要学会几点:(1)对芯片初始化;(2)获得时间数据;(3)知道怎么修改数据。
4、使用按键来修改时间数据。这个方法很多,尽提供参考的。使用三个按键,分别是:设置按键(这个是复用按键,按一次进入设置模式,并让某一位闪烁,再按则依次让下一位闪烁,表示被选择,直到要设置的数字完成再按则确认设置),+键和-键。这个不仅仅是修改数据那么简单,还需要涉及到对DS1302数据的修改,需要关闭DS1302的写保护功能,设置结束后再打开这个功能。
以上字字手打,希望对你有帮助
可以用1302做
我有现成的
LCD1602
显示的,51做的
基本思路是用单片机读取1302里面的信息,处理,然后送LCD1602显示。
有兴趣可以去我博客看,里面还上传了之前我做的实物和PCB,可以照着做。
#include
#include
#include
#define
unit
unsigned
int
#define
uchar
unsigned
char
//#define
HZ
12
it
key0=P0^0;
//
分钟调整
it
key1=P0^1;
//
小时调整
it
P2_0=P2^7;
//秒
指示灯
it
MN_RXD=P3^6;
it
MN_TXD=P3^7;
uchar
data
CLOCK[4]={0,0,0,12};//存放时钟时间(百分秒,秒,分,和时位)
//数码管显示表0-f
灭uchar
code
TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};
//
//模拟串口发送一个字节数据
函数
//
void
SendData(unsigned
char
senddata)
{unsigned
char
i;
for(i=0;i<8;i++)
{if((senddata&0x01)==0)
MN_RXD=0;
else
MN_RXD=1;
_nop_();
MN_TXD=0;
_nop_();
MN_TXD=1;
senddata=senddata>>1;
}}
//
//显示程序函数
//
void
display(void)
{//
unsigned
int
n;
uchar
temp;
temp=CLOCK[1];
temp=temp%10;
SendData(TABLE[temp]);
temp=CLOCK[1];
temp=temp/10;
SendData(TABLE[temp]);
temp=CLOCK[2];
temp=temp%10;
SendData(TABLE[temp]);
temp=CLOCK[2];
temp=temp/10;
SendData(TABLE[temp]);
temp=CLOCK[3];
temp=temp%10;
SendData(TABLE[temp]);
temp=CLOCK[3];
temp=temp/10;
SendData(TABLE[temp]);
/
for(n=0;n<5000;n++);
for(n=0;n<6;n++)
{SendData(TABLE[10]);
}/
}//
//按键控制函数
//
void
keycan()
{unsigned
int
n;
EA=0;
if(key0==0)
//
分钟调整
{for(n=0;n<10000;n++);
//延时去抖动
while(key0==0);
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60)
//到一时
{CLOCK[2]=0;
}display();
}if(key1==0)
//
小时调整
{for(n=0;n<10000;n++);
//延时去抖动
while(key1==0);
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{CLOCK[3]=0;
}display();
}EA=1;
}//
//T0中断服务函数
//
void
time0()
interrupt
1//using
1{
TH0=0xD8;
TL0=0xF0;
//重置初值
//
TH0=0xB1;
TL0=0xE0;
//时钟处理
CLOCK[0]=CLOCK[0]+1;
}//
//主函数
//
void
main()
{EA=1;
ET0=1;
TMOD=0x01;
//T0方式1定时
TH0=0xD8;
TL0=0xF0;
//D8F0
定时10ms
//
TH0=0xB1;
TL0=0xE0;
//定时
20ms
TR0=1;
for(;;)
{if(CLOCK[0]==100)
//到一秒
10ms100
{CLOCK[0]=0;
P2_0=~P2_0;
CLOCK[1]=CLOCK[1]+1;
if(CLOCK[1]==60)
//到一分
{CLOCK[1]=0;
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60)
//到一时
{CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{CLOCK[3]=0;
}}
}display();
}keycan();
}}
版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 836084111@qq.com 邮箱删除。