STC89C52+DS12C887原理图以及C程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
sbit fm=P2^3;
sbit duan=P2^6;
sbit wei=P2^7;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit irq=P3^3;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit rd=P3^7;
sbit cs=P1^1;
sbit as=P1^2;
sbit wr=P1^3;
sbit ds=P1^4;
uchar code sz1[]={"20 - - "}; //初始化时候显
示
uchar code sz2[]={" : : "};
uchar code aa[10]={"0123456789"}; //定义一个液晶的数字字符数组
uchar code dd[]={"MONTUEWEDTHUFRISATSUN"}; //定义一个星期显示数组
uchar code zz[]={0,1,2,1,0,1,0,1,1,0,1,0,1}; //定义一个区别大月小月和二月的数组
uchar num,bb; //定义全局变量
uint cc; //该变量用于功能键的自动退出
char shi,fen,miao,yue,ri,xq,nian1,yue1,ri1,wc,hh,nian,nm,tnnd; //定义带符号的变量void ds_write(uchar a,uchar b) //向DS12C887写入数据
{
cs=0;
as=1;
ds=1;
wr=1;
P0=a;
as=0;
wr=0;
P0=b;
wr=1;
as=1;
cs=1;
}
void ys(uint x) //延时函数{
uint z,y;
for(z=x;z>0;z--)
for(y=110;y>0;y--);
}
void xqsd(char a) //星期设定函数,在调整月份和年份的时候刷新星期的数字
{
if(a==8)
xq=1;
else if(a==9)
xq=2;
else if(a==10)
xq=3;
else if(a==11)
xq=4;
else if(a==12)
xq=5;
else if(a==13)
xq=6;
else if(a==0)
xq=7;
else if(a==-1)
xq=6;
else if(a==-2)
xq=5;
else if(a==-3)
xq=4;
else if(a==-4)
xq=3;
else if(a==-5)
xq=2;
else if(a==-6)
xq=1;
ri1=1;
}
void fmq() //蜂鸣器小小的响一下函数
{
fm=0;
ys(100);
fm=1;
}
void lcdsd(uchar temp) //设定子函数
{
lcdrs=0; //当lcdrs=0时,允许写入指令
P0=temp;
ys(5);
lcden=1;
ys(5);
lcden=0;
}
void lcdxs(uchar temp) //显示子函数
{
lcdrs=1; //当lcdrs=1时,允许写入显示
P0=temp;
ys(5);
lcden=1; //lcden高脉冲将P0口数据读走
ys(5);
lcden=0;
}
void sr_sj(uchar a,uchar b) //输入时间函数,第一个参数为光标指针,第二个为数字
{
lcdsd(0x80+0x40+a-1);
lcdxs(aa[b/10]);
lcdxs(aa[b%10]);
}
void sr_rq(uchar a,uchar b) //输入日期函数
{
lcdsd(0x80+a-1);
lcdxs(aa[b/10]);
lcdxs(aa[b%10]);
}
void sr_xq(uchar a,uchar b) //输入星期{
lcdsd(0x80+a-1);
if(b==1)
b=0;
else if(b==2)
b=3;
else if(b==3)
b=6;
else if(b==4)
b=9;
else if(b==5)
b=12;
else if(b==6)
b=15;
else if(b==7)
b=18;
lcdxs(dd[b]);
lcdxs(dd[b+1]);
lcdxs(dd[b+2]);
}
void key() //按键检测函数
{
if(s1==0) //检测功能键是否被按下
{
ys(5); //去抖延时
if(s1==0) //再次检测功能键是否被按下
{
bb++; //记录功能键被按下多少次
cc=0; //当有按键按下时将cc清零
tnnd=1; //有按键按下的时候让tnnd等于1,等退出时间设定的时候向时钟芯片写入数据
while(!s1) //按键松手检测
{
ys(10); //去抖延时
}
fmq(); //蜂鸣器小小的响一下
if(bb==1) //当功能键被按下一次时
{
TR0=0; //关闭定时器
lcdsd(0x80+0x40+0x0b); //光标指针指向秒的个位
lcdsd(0x0f); //显示光标并且闪烁
}
if(bb==2) //当功能键被按下两次时