单片机基于DS1302,1602的时间设定程序
提问者:JACK_shionpong2013-04-25 00:00
最佳答案
用Protues仿真的,看不清可以留个邮箱,我把整体发给你
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0; //数据、命令选择端
sbit lcden=P2^2; // 使能信号
sbit lcdew=P2^1; // 读写选择端
sbit s1=P1^5; //功能键设定
sbit s2=P1^6; // 增大键设定
sbit s3=P1^7; // 减小键设定
sbit beep=P3^3; // 蜂鸣器设定 */
sbit RST=P1^2; //ds1302 设定
sbit SCLK=P1^0;
sbit IO=P1^1;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar num[8],enter,shi,fen,miao,nian,yue,ri,week,shi1,fen1,flag1=0,flag2=0,flag3,choice,
time[]="20XX-XX-XX XXX ", //年月日字符数组
time1[]=" xx:xx:xx ", //时分秒字符数组
time3[]="@ NO 00:00:00"; //闹钟设定时显示的时间数组
void delay(uint z) //1ms延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=1;y>0;y--);
}
void di() //蜂鸣设定函数
{
beep=0;
delay(800);
beep=1;
}
uchar read(uchar x) //读ds1302数据
{
uchar i;
RST=0;
SCLK=0;
RST=1;
ACC=(x|0x01);
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=IO;
SCLK=1;
SCLK=0;
}
SCLK=1;
RST=0;
return ACC;
}
void write (uchar addr,uchar dat) //向ds1302写数据
{
uchar i;
RST=0;
SCLK=0;
RST=1;
ACC=addr;
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
ACC=dat;
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
SCLK=1;
RST=0;
}
void getnum() //接收ds1302的数据
{
uchar j;
for(j=0;j<7;j++)
{
num[j]=read(0x80+0x02*j);
}
time[2]=((num[6]&0x70)>>4)+'0';//年
time[3]=(num[6]&0x0f)+'0'; nian=((num[6]&0x70)>>4)*10+(num[6]&0x0f);
time[5]=((num[4]&0x70)>>4)+'0';//yue
time[6]=(num[4]&0x0f)+'0'; yue=((num[4]&0x70)>>4)*10+(num[4]&0x0f);
time[8]=((num[3]&0x70)>>4)+'0';//ri
time[9]=(num[3]&0x0f)+'0'; ri=((num[3]&0x70)>>4)*10+(num[3]&0x0f);
time[13]=(num[5]&0x0f)+'0';//week
week=(num[5]&0x0f);
switch(time[13]) //星期字符数组赋值
{
case '1': time[12]='S'; time[13]='u'; time[14]='n';
break;
case '2': time[12]='M'; time[13]='o'; time[14]='n';
break;
case '3': time[12]='T'; time[13]='u'; time[14]='e';
break;
case '4': time[12]='W'; time[13]='e'; time[14]='d';
break;
case '5': time[12]='T'; time[13]='h'; time[14]='u';
break;
case '6': time[12]='F'; time[13]='r'; time[14]='i';
break;
case '7': time[12]='S'; time[13]='a'; time[14]='t';
break;
}
time1[5]=((num[2]&0x70)>>4)+'0'; //shi
time1[6]=(num[2]&0x0f)+'0'; shi=((num[2]&0x70)>>4)*10+(num[2]&0x0f);
time1[8]=((num[1]&0x70)>>4)+'0'; //fen
time1[9]=(num[1]&0x0f)+'0'; fen=((num[1]&0x70)>>4)*10+(num[1]&0x0f);
time1[11]=((num[0]&0x70)>>4)+'0'; //miao
time1[12]=(num[0]&0x0f)+'0'; miao=((num[0]&0x70)>>4)*10+(num[0]&0x0f);
}
void write_com(uchar com) //写入lcd显示方式
{
rs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void write_data(uchar date) //向lcd1602写入数据
{
rs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void display() //显示数据
{
uchar i;
write_com(0x0c); //显示方式设定为:无光标,且不闪烁
if(flag2==1)
time1[0]='@'; //闹钟图标设定
else
time1[0]=' ';
if(flag1==0) //flag为0时正常显示年、月、日、时、分、秒等
{
write_com(0x80);
for(i=0;time[i]!='\0';i++)
{
write_data(time[i]);
}
write_com(0xc0);
for(i=0;time1[i]!='\0';i++)
{
write_data(time1[i]);
}
}
if(flag1==1) //flag为1时进入时间设定界面
{
time3[8]=fen1/10+'0'; time3[9]=fen1%10+'0';
time3[5]=shi1/10+'0';time3[6]=shi1%10+'0';
if(choice==0)
{
time3[2]='N';time3[3]='O';
}
if(choice==1)
{
time3[2]='O'; time3[3]='K';
}
write_com(0xc0);
for(i=0;time3[i]!='\0';i++)
{
write_data(time3[i]);
}
} }
void keyscan() // 扫描键盘
{
getnum();
if(s1==0) //功能键被按下 write_com(0x0c);
{
delay(10);
if(s1==0)
{
enter++; //记录摁下次数
if(flag1==1&&enter==6)
enter=2;
if(flag1==0&&enter==9)
enter=0;
while(s1==0); di(); //按键放下时响一下
}
}
switch(enter)
{
case 0: write_com(0x0c); break;
case 1: write_com(0xcc); write_com(0x0e); delay(7); //按秒 时 有光标
break;
case 2: write_com(0xc9); write_com(0x0e); delay(7); //分
break;
case 3: write_com(0xc6); write_com(0x0e); delay(7); //时
break;
case 4: if(flag1==0)
{
write_com(0x8e); write_com(0x0e); delay(7); //星期
}
if(flag1==1)
{
write_com(0xc3); write_com(0x0e); delay(7); //NO、OK选项闪烁
}
break;
case 5: if(flag1==0)
{
write_com(0x89); write_com(0x0e); delay(7); //日闪烁
}
if(flag1==1)
{
write_com(0xc0); write_com(0x0e); delay(7); //时钟标志闪烁
}
break;
case 6: write_com(0x86); write_com(0x0e); delay(7); //月
break;
case 7: write_com(0x83); write_com(0x0e); delay(7); //年
break;
case 8: write_com(0x0c);write_com(0xc0); write_data('@');
if(flag1==0) write_com(0xc0);
else write_com(0xc9); write_com(0x0e); delay(7); //闹钟
break;
}
if(enter!=0&&s2==0)
{
delay(10);
if(enter!=0&&s2==0)
{
switch(enter)
{
case 1: miao++; if(miao==60) miao=0;
write(0x80,(miao/10*0x10+miao%10)); //秒
break;
case 2: if(flag1==0)
{
fen++; if(fen==60) fen=0;
write(0x82,((fen/10)*0x10+fen%10)); //分
}
if(flag1==1)
{
fen1++; if(fen1==60) fen1=0;
}
break;
case 3: if(flag1==0)
{
shi++; if(shi==24) shi=0;
write(0x84,(shi/10*0x10+shi%10)); //时
}
if(flag1==1)
{
shi1++; if(shi1==24) shi1=0;
}
break;
case 4: if(flag1==0)
{
week++; if(week==8) week=1;
write(0x8a,(week/10*0x10+week%10)); //星期
}
if(flag1==1)
{
choice++; if(choice==2) choice=0;
}
break;
case 5: if(flag1==0)
{
ri++; if(ri==32) ri=1;
write(0x86,(ri/10*0x10+ri%10)); //日
}
if(flag1==1)
{
if(choice==0) flag2=0;
if(choice==1) flag2=1;
enter=0; flag1=0;
}
break;
case 6: yue++; if(yue==13) yue=1;
write(0x88,(yue/10*0x10+yue%10)); //月
break;
case 7: nian++; if(nian==99)nian=0;
write(0x8c,(nian/10*0x10+nian%10)); //年
break;
case 8: flag1=1; enter=2;display(); break; //进入闹钟设置界面
}
while(s2==0); di(); //按键放下时响一下
}
}
if(enter!=0&&s3==0)
{
delay(10);
if(enter!=0&&s3==0)
{
switch(enter)
{
case 1: miao--; if(miao==-1) miao=59;
write(0x80,(miao/10*0x10+miao%10)); //秒
break;
case 2:if(flag1==0)
{
fen--; if(fen==-1) fen=59;
write(0x82,((fen/10)*0x10+fen%10)); //分
}
if(flag1==1)
{
fen1--; if(fen1==-1) fen1=59;
}
break;
case 3: if(flag1==0)
{
shi--; if(shi==-1) shi=23;
write(0x84,(shi/10*0x10+shi%10)); //时
}
if(flag1==1)
{
shi1--; if(shi1==-1) shi1=23;
}
break;
case 4: if(flag1==0)
{
week--; if(week==0) week=7;
write(0x8a,(week/10*0x10+week%10)); //星期
}
if(flag1==1)
{
choice--; if(choice==-1) choice=1;
}
break;
case 5: if(flag1==0)
{
ri--; if(ri==0) ri=31;
write(0x86,(ri/10*0x10+ri%10)); //日
}
if(flag1==1)
{
if(choice==0) flag2=0;
if(choice==1) flag2=1;
enter=0; flag1=0;
}
break;
case 6: yue--; if(yue==0) yue=12;
write(0x88,(yue/10*0x10+yue%10)); //月
break;
case 7: nian--; if(nian==-1) nian=99;
write(0x8c,(nian/10*0x10+nian%10)); //年
break;
case 8: flag1=1; break; //进入闹钟设置界面
}
while(s3==0); di(); //按键放下时响一下
}
}
}
void init() //初始化
{
// beep=0;
lcden=0; // lcd信号使能端设定
lcdew=0; //lcd读写选择端设定
RST=0;
SCLK=1;
write_com(0x38);
write_com(0x0c);
write_com(0x06); // lcd初始化
write_com(0x01);
write_com(0x80); //显示“20”
write_data(time[0]); write_data(time[1]);
write_com(0x84); //显示“—”
write_data(time[4]);
write_com(0x87); //显示“—”
write_data(time[7]);
write_com(0xc7); //显示“:”
write_data(time1[7]);
write_com(0xca); //显示“:”
write_data(time1[10]);
}
void main()
{
init(); //初始化
while(1)
{
if(fen1!=fen) flag3=0;
getnum();
while(flag2==1&&enter==0&&shi1==shi&&fen1==fen&&flag3==0)
{
di();delay(200);di();delay(600);
getnum();display();
if(s1==0||s2==0||s3==0)
{
delay(10);
flag3=1;
while(s1==0||s2==0||s3==0) ;
}
enter=0;
}
display();
keyscan();
}
}
回答者:zhangshouli2016-04-25 00:00
DS 6相关问题
-
3000公里首保,6000公里二保.以后每五千公里速度上去再下来. 再上去 再下来.反复几次就好了. 别看时速. 看转数.
提问者:nuptwanglei2014-06-24
-
磨合2000公里以后跑高速路对车没有伤害。超车时达到150公里也不必担心.时间很短也没有多少磨损。 高速路上跑110公里既安全也不超速.用定速巡航还省油. 如果长时间高档低速或低档高速对发动机有伤害。短时间让发动机
提问者:卢灶月99582013-03-02
-
DS1302是个IIC协议 IIC可以对器件进行读写的操作 DS1302中有寄存器 他们都可以读写的嘛 至于你想给他加上时间调整功能的话在主函数中用个while(1)一直查询按键(或是中断也可以的)
提问者:天天学习好努力2013-11-28
-
这个问题之前也困扰了我好久,不过,功夫不负有心人,终于让我给搞定了,做了一个电子闹钟,按键+遥控,(加,减,模式选择,移位共4个键),
程序还是比较复杂,不是一两句能说的清楚,给你一个思路吧!
以分钟为例:
1.先
提问者:2013-11-16
-
显像管坏了,去找厂家维修。
提问者:Califepuple2013-06-12
-
您好,感谢向企业知道提问点击屏幕上的菜单按钮,选择日期印记,根据自己喜好点击日期或日期时间即可欢迎您再次向企业知道提问.祝您工作生活愉快~
提问者:爱Android2017-01-14
- DS 6热门车型
- DS 6同品牌车系
- 上市新车
- 即将上市新车