时钟系统.docx
- 文档编号:9184144
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:20
- 大小:16.89KB
时钟系统.docx
《时钟系统.docx》由会员分享,可在线阅读,更多相关《时钟系统.docx(20页珍藏版)》请在冰豆网上搜索。
时钟系统
时钟系统,采用计数器计时,用液晶1602显示,实现秒,分,时,年,月,日可调,利用at24c02实现断电保护,本程序采用tx-c单片机开发板,具体资料请访问
#include
#include
#include"24c02.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitwual=P2^7;
sbitdual=P2^6;
sbitrs=P3^5;//定义液晶的操作代码
sbitlcden=P3^4;
sbits1=P3^0;//定义键盘
sbits2=P3^1;
sbits3=P3^2;
sbitrd=P3^7;
sbitlcdwr=P3^6;
sbitbeer=P2^3;///蜂鸣器
ucharcount,s1num,flag;
charmiao,shi,fen,yue,ri,nian;//定义年月日,时分秒
voiddealyms(uintxms)//延时程序
{
uchari,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddi()//“滴滴”程序
{
beer=0;
dealyms(100);
beer=1;
}
bitlcd_busy()//液晶是否忙检查程序
{
bitresult;
rs=0;
lcdwr=1;
lcden=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
lcden=0;
returnresult;
}
voidwrite_com(ucharcom)//写命令程序
{while(lcd_busy());//不忙才进行,否则等待
rs=0;//rs=0说明是写操作命令,否则写数据
lcden=0;
lcdwr=0;
_nop_();
_nop_();
P0=com;//写入命令
_nop_();
_nop_();
_nop_();
_nop_();//短延时
lcden=1;
_nop_();
_nop_();
_nop_();
_nop_();
lcden=0;
}
voidwrite_date(uchardate)//写数据
{while(lcd_busy());
rs=1;//rs=1说明是写数据,否则写命令
lcden=0;
lcdwr=0;
_nop_();
_nop_();
P0=date;//写入数据
_nop_();
_nop_();
_nop_();
_nop_();
lcden=1;
_nop_();
_nop_();
_nop_();
_nop_();
lcden=0;
}
voidwrite_sfm(ucharadd,uchardate)//x写入时分秒函数
{
ucharshi,ge;
shi=date/10;
ge=date%10;/分解数据
write_com(0x80+0x40+add);//定位写数据的位置
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_nian(ucharadd,chardate)//写入年函数
{charshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_yue(ucharadd,uchardate)//写入月函数
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_ri(ucharadd,uchardate)//写入日函数
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidinit()//初始化函数
{rd=0;
dual=0;
wual=0;
lcden=0;
fen=0;
shi=0;
miao=0;
count=0;
s1num=0;
nian=12;//为了调节方便,所以调节后两位
yue=1;
ri=1;
init_24c02();
write_com(0x38);//1602的初始化
dealyms(5);
write_com(0x0c);
dealyms(5);
write_com(0x06);
dealyms(5);
write_com(0x01);
dealyms(5);
dealyms(5);
write_com(0x80+4);//在特定的位置写入‘-’
write_date('-');
_nop_();
_nop_();
_nop_();
_nop_();
write_com(0x80+7);
write_date('-');
_nop_();
_nop_();
_nop_();
_nop_();
write_com(0x80+7);
write_date('-');
_nop_();
_nop_();
_nop_();
_nop_();
write_com(0x80+0x40+6);//在特定位置写入':
'
write_date(':
');
_nop_();
_nop_();
_nop_();
_nop_();
write_com(0x80+0x40+9);
write_date(':
');
_nop_();
_nop_();
_nop_();
_nop_();
miao=read_add
(1);//从at24c02里面读取数据
fen=read_add
(2);
shi=read_add(3);
nian=read_add(6);
yue=read_add(5);
ri=read_add(4);
write_sfm(10,miao);//把秒写入液晶,下同
write_sfm(7,fen);
write_sfm(4,shi);
write_nian(2,nian);
write_yue(5,yue);
write_ri(8,ri);
write_com(0x80);//在第一位写入'2'
write_date('2');
write_com(0x80+1);//在第二位写入'0'
write_date('0');
TMOD=0x01;//定时器1方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;//写入计数初值
EA=1;//开总中断
ET0=1;
TR0=1;
di();
}
voidkeyscan()//键盘扫描
{
if(s1==0)//检查键盘功能键是否按下
{dealyms(10);
if(s1==0)
{s1num++;//功能键按下的次数
while(!
s1);
di();
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)//如果四次,则调整到日的位置,以下类似
{write_com(0x80+8);}
if(s1num==5)
{write_com(0x80+5);}
if(s1num==6)
{write_com(0x80+2);}
if(s1num==7)//第七次则开放定时器,同时清除s1num
{s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(s1num!
=0)//只有在s1num不为零的情况下,否则等待
{
if(s2==0)
{dealyms(10);
if(s2==0)
{while(!
s2);
di();
if(s1num==1)//秒调整
{miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);//写入液晶
write_com(0x80+0x40+10);//调整写入秒的位置
write_add(1,miao);//写入at24c02,下同
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
write_add(2,fen);
}
if(s1num==3)
{shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
write_add(3,shi);
}
if(s1num==4)
{ri++;
if(ri==31)
ri=1;
write_ri(8,ri);
write_com(0x80+8);
write_add(4,ri);
}
if(s1num==5)
{yue++;
if(yue==13)
yue=1;
write_yue(5,yue);
write_com(0x80+5);
write_add(5,yue);
}
if(s1num==6)
{
nian=nian+1;
if(nian==100)
nian=0;
write_nian(2,nian);
write_com(0x80+2);
write_add(6,nian);
}
}
}
if(s3==0)
{
dealyms(10);
if(s3==0)
{while(!
s3);
di();
if(s1num==1)
{miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
write_add(1,miao);
}
if(s1num==2)
{fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
write_add(2,fen);
}
if(s1num==3)
{shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
write_add(3,shi);
}
if(s1num==4)
{ri--;
if(ri==0)
ri=31;
write_ri(8,ri);
write_com(0x80+8);
write_add(4,ri);
}
if(s1num==5)
{yue--;
if(yue==0)
yue=12;
write_yue(5,yue);
write_com(0x80+5);
write_add(5,yue);
}
if(s1num==6)
{nian=nian-1;
if(nian==-1)
nian=99;
write_nian(2,nian);
write_com(0x80+2);
write_add(6,nian);
}
}
}
}
}
voidchange()
{if(flag==1)//一秒事件到则进行秒++
{flag=0;
miao++;
if(miao==60)
{miao=0;
fen++;//一秒时间到则fen++。
下同
if(fen==60)
{fen=0;
shi++;
if(shi==24)
{shi=0;
ri++;
if(ri==32)
{ri=1;
yue++;
if(yue==13)
{yue=1;
nian++;
write_nian(2,nian);//写入液晶
write_add(6,nian);//写入芯片,下同
}
write_yue(5,yue);
write_add(5,yue);
}
write_ri(8,ri);
write_add(4,ri);
}
write_sfm(4,shi);
write_add(3,shi);
}
write_sfm(7,fen);
write_add(2,fen);
}
write_sfm(10,miao);
write_add(1,miao);
}
}
voidmain()
{init();
while
(1)
{keyscan();
change();
}
}
voidtime0()interrupt1//中断服务程序
{
TH0=(65536-45872)/256;
TL0=(655536-45872)%256;
count++;
if(count==20)
{count=0;flag=1;}
}
#include
#defineucharunsignedchar
bitwrite=0;
sbitsda=P2^0;
sbitscl=P2^1;
voiddealy0()
{;;}
voidstart()
{sda=1;
dealy0();
scl=1;
dealy0();
sda=0;
dealy0();
}
voidstop()
{sda=0;
dealy0();
scl=1;
dealy0();
sda=1;
dealy0();
}
voidrespons()
{uchari;
scl=1;
dealy0();
while((sda==1)&&(i<250))i++;
scl=0;
dealy0();
}
voidinit_24c02()
{
sda=1;
dealy0();
scl=1;
dealy0();
}
voidwrite_byte(uchardate)
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
dealy0();
sda=CY;
dealy0();
scl=1;
dealy0();
}
scl=0;
dealy0();
sda=1;
dealy0();
}
ucharread_byte()
{
uchari,k;
scl=0;
dealy0();
sda=1;
dealy0();
for(i=0;i<8;i++)
{scl=1;
dealy0();
k=(k<<1)|sda;
scl=0;
}
returnk;
}
voidwrite_add(ucharaddress,uchardate)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
charread_add(ucharaddress)
{
uchardate;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
returndate;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 时钟 系统