时钟程序.docx
- 文档编号:12798016
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:24
- 大小:31.40KB
时钟程序.docx
《时钟程序.docx》由会员分享,可在线阅读,更多相关《时钟程序.docx(24页珍藏版)》请在冰点文库上搜索。
时钟程序
jckwka|五级
A方案
--------------------------
外加一颗时钟芯片DS1302(非常准确)。
按键为单片机中断。
--------------------------
1、上电时自动显示时、分、秒;
实现方式:
上电时单片机去启动DS1202,然后读取里面的时间值,自动显示时、分、秒;
2、设置一个控制按键,按下按键,则时钟以秒为单位开始计时;
实现方式:
将DS1302此时的值暂时保存,最为计时开始的时间。
然后不停地读取DS1302里的新的时间值,
并将新的时间值-计时开始的时间=已计时数值
3、运行状态下可通过控制按键使时钟暂停,同时显示已计时数值;
实现方式:
显示步骤2里的已计时数值。
4、停止状态下(已上电),按下复位按钮,时钟复位(清零),并进入下一次计时状态。
实现方式:
计时开始的时间换成当前时间。
B方案
--------------------------
采用单片机内部定时器计时(不准)。
按键为单片机中断。
--------------------------
步骤类似,不用去读DS1302的时间,读自己内部的时间。
赞同
0
|评论
2011-1-2712:
28lyl_99|二级
A方案
--------------------------
外加一颗时钟芯片DS1302(非常准确)。
按键为单片机中断。
--------------------------
1、上电时自动显示时、分、秒;
实现方式:
上电时单片机去启动DS1202,然后读取里面的时间值,自动显示时、分、秒;
2、设置一个控制按键,按下按键,则时钟以秒为单位开始计时;
实现方式:
将DS1302此时的值暂时保存,最为计时开始的时间。
然后不停地读取DS1302里的新的时间值,
并将新的时间值-计时开始的时间=已计时数值
3、运行状态下可通过控制按键使时钟暂停,同时显示已计时数值;
实现方式:
显示步骤2里的已计时数值。
4、停止状态下(已上电),按下复位按钮,时钟复位(清零),并进入下一次计时状态。
实现方式:
计时开始的时间换成当前时间。
B方案
--------------------------
采用单片机内部定时器计时(不准)。
按键为单片机中断。
--------------------------
步骤类似,不用去读DS1302的时间,读自己内部的时间。
-------------------------------------------------------------------------------------------------------------------------------------------------------分割线。
--------------------------------------------------------------------------
楼上的方案是当前比较常见的方案了。
没有给出程序
先给出A方案程序如下。
。
。
。
//C语言编写。
*头文件*/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#definenop()_nop_()
sbitT_CLK=P1^4;/*实时时钟时钟线引脚*/
sbitT_IO=P1^5;/*实时时钟数据线引脚*/
sbitT_RST=P2^2;/*实时时钟复位线引脚*/
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbittime_en_port=P3^7;/*时间控制通道寄存器LE控制脚*/
sbitsled_en_port=P3^6;/*数码管控制通道寄存器LE控制脚*/
#definesled_dm_portP0/*定义数码管段码的控制脚*/
#definesled_wm_portP2/*定义数码管位码的控制脚*/
/*定义数码管显示字符跟数字的对应数组关系*/
ucharcodemun_to_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*0123456789abcdef*/
/*定义需要点亮的数码管*/
ucharcodesled_bit_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchardatasled_data[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};/*0-7号SLED缓冲值*/
uchardataled_lighten_bit=0;/*LED灯点亮标志位0-7*/
uchardatatime_data[8]={0x00,0x57,0x16,0x00,0x00,0x00,0x00,0x00};/*格式为:
秒分时日月星期年*/
/*-----------------------------------------------
显示部分程序,采用定时器0产生中断,1MS更新一次
------------------------------------------------*/
voidSLED_Disp()interrupt1using3
{
TH0=(65536-1000)/256;
TL0=(65536-1000)/256;
time_en_port=0;/*关闭时钟控制通道*/
sled_wm_port=sled_bit_table[led_lighten_bit];/*输出位码数据到数码管*/
sled_dm_port=sled_data[led_lighten_bit];/*输出段码数据到数码管*/
sled_en_port=1;/*打开数码管控制通道*/
sled_en_port=0;/*关闭数码管控制通道*/
sled_wm_port=0xdf;/*释放P2端口,同时关闭发光二极管显示*/
time_en_port=1;/*打开时钟控制通道*/
led_lighten_bit++;
if(led_lighten_bit>=8)led_lighten_bit=0;/*8位数码管全动态输出*/
}
voidT0_valueSet()/*定义中断方式,中断时间*/
{
TMOD=0x01;/*定时0,工作在方式1*/
TH0=(65536-1000)/256;
TL0=(65536-1000)/256;
TR0=1;/*启动计数*/
EA=1;/*开总中断*/
ET0=1;/*开定时器0中断*/
return;
}
/********************************************************************
函数名:
RTInputByte()
功能:
实时时钟写入一字节
说明:
往DS1302写入1Byte数据(内部函数)
入口参数:
d写入的数据
返回值:
无
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
voidRTInputByte(uchard)
{
uchari;
ACC=d;
for(i=8;i>0;i--)
{
T_IO=ACC0;/*相当于汇编中的RRC*/
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/********************************************************************
函数名:
RTOutputByte()
功能:
实时时钟读取一字节
说明:
从DS1302读取1Byte数据(内部函数)
入口参数:
无
返回值:
ACC
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
ucharRTOutputByte(void)
{
uchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;/*相当于汇编中的RRC*/
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
/********************************************************************
函数名:
W1302()
功能:
往DS1302写入数据
说明:
先写地址,后写命令/数据(内部函数)
调用:
RTInputByte(),RTOutputByte()
入口参数:
ucAddr:
DS1302地址,ucData:
要写的数据
返回值:
无
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
voidW1302(ucharucAddr,ucharucDa)
{
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);/*地址,命令*/
RTInputByte(ucDa);/*写1Byte数据*/
T_CLK=1;
T_RST=0;
}
/********************************************************************
函数名:
R1302()
功能:
读取DS1302某地址的数据
说明:
先写地址,后读命令/数据(内部函数)
调用:
RTInputByte(),RTOutputByte()
入口参数:
ucAddr:
DS1302地址
返回值:
ucData:
读取的数据
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
ucharR1302(ucharucAddr)
{
ucharucData;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);/*地址,命令*/
ucData=RTOutputByte();/*读1Byte数据*/
T_CLK=1;
T_RST=0;
return(ucData);
}
/********************************************************************
函数名:
BurstW1302T()
功能:
往DS1302写入时钟数据(多字节方式)
说明:
先写地址,后写命令/数据
调用:
RTInputByte()
入口参数:
pWClock:
时钟数据地址格式为:
秒分时日月星期年控制
8Byte(BCD码)1B1B1B1B1B1B1B1B
返回值:
无
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
voidBurstW1302T(uchar*pWClock)
{
uchari;
W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(0xbe);/*0xbe:
时钟多字节写命令*/
for(i=8;i>0;i--)/*8Byte=7Byte时钟数据+1Byte控制*/
{
RTInputByte(*pWClock);/*写1Byte数据*/
pWClock++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
函数名:
BurstR1302T()
功能:
读取DS1302时钟数据
说明:
先写地址/命令,后读数据(时钟多字节方式)
调用:
RTInputByte(),RTOutputByte()
入口参数:
pRClock:
读取时钟数据地址格式为:
秒分时日月星期年
7Byte(BCD码)1B1B1B1B1B1B1B
返回值:
无
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
voidBurstR1302T(uchar*pRClock)
{
uchari;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(0xbf);/*0xbf:
时钟多字节读命令*/
for(i=8;i>0;i--)
{
*pRClock=RTOutputByte();/*读1Byte数据*/
pRClock++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
函数名:
Set1302()
功能:
设置初始时间
说明:
先写地址,后读命令/数据(寄存器多字节方式)
调用:
W1302()
入口参数:
pClock:
设置时钟数据地址格式为:
秒分时日月星期年
7Byte(BCD码)1B1B1B1B1B1B1B
返回值:
无
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
voidSet1302(uchar*pClock)
{
uchari;
ucharucAddr=0x80;
EA=0;
W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
for(i=7;i>0;i--)
{
W1302(ucAddr,*pClock);/*秒分时日月星期年*/
pClock++;
ucAddr+=2;
}
W1302(0x8e,0x80);/*控制命令,WP=1,写保护?
*/
EA=1;
}
/********************************************************************
函数名:
Get1302()
功能:
读取DS1302当前时间
说明:
调用:
R1302()
入口参数:
ucCurtime:
保存当前时间地址。
当前时间格式为:
秒分时日月星期年
7Byte(BCD码)1B1B1B1B1B1B1B
返回值:
无
设计:
zhaojunjie日期:
2002-03-19
修改:
日期:
***********************************************************************/
voidGet1302(ucharucCurtime[])
{
uchari;
ucharucAddr=0x81;
EA=0;
for(i=0;i<7;i++)
{
ucCurtime[i]=R1302(ucAddr);/*格式为:
秒分时日月星期年*/
ucAddr+=2;
}
EA=1;
}
voiddelay_1ms(ucharx)
/*1MS为单位的延时程序*/
{
ucharj;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
voidmain()
{
T0_valueSet();
Set1302(time_data);
while
(1){
Get1302(time_data);
sled_data[0]=mun_to_char[time_data[2]/0x10];
sled_data[1]=mun_to_char[time_data[2]%0x10];
sled_data[3]=mun_to_char[time_data[1]/0x10];
sled_data[4]=mun_to_char[time_data[1]%0x10];
sled_data[6]=mun_to_char[time_data[0]/0x10];
sled_data[7]=mun_to_char[time_data[0]%0x10];
delay_1ms(200);
}
}
方案B.
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
sbitrs=P3^5;
sbitlcden=P3^4;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
sbitrd=P3^7;
ucharcount,s1num;
charmiao,shi,fen;
ucharcodetable[]="2007-7-30MON";
ucharcodetable1[]="00:
00:
00";
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
ucharnum;
dula=0;
wela=0;
lcden=0;
//fen=59;
//miao=53;
//shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidwrite_sfm(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidkeyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{s1num++;
while(!
s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
if(s1num!
=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1nu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 时钟 程序