單片機基于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相關問題
-
這個問題之前也困擾了我好久,不過,功夫不負有心人,終于讓我給搞定了,做了一個電子鬧鐘,按鍵+遙控,(加,減,模式選擇,移位共4個鍵),
程序還是比較復雜,不是一兩句能說的清楚,給你一個思路吧!
以分鐘為例:
1.先
提問者:2013-11-16
-
樓主你好:DS1302有主副電源,當切斷主電源時副電源會繼續給DS1302供電,這就是為什么短時間斷電時間不變的原因;當長時間斷電后,你的時間還是12-20,那是因為你的程序重新從主函數的第一步開始執行,因為你初始化DS
提問者:n1lp12017-01-10
-
顯像管壞了,去找廠家維修。
提問者:Califepuple2013-06-12
-
3000公里首保,6000公里二保.以后每五千公里速度上去再下來. 再上去 再下來.反復幾次就好了. 別看時速. 看轉數.
提問者:nuptwanglei2014-06-24
-
你在DS1302的6腳(IO)加個10K的上拉電阻就搞定了.
提問者:exwstwz1712013-05-01
-
您好,感謝向企業知道提問點擊屏幕上的菜單按鈕,選擇日期印記,根據自己喜好點擊日期或日期時間即可歡迎您再次向企業知道提問.祝您工作生活愉快~
提問者:愛Android2017-01-14
- DS 6熱門車型
- DS 6同品牌車系
- 上市新車
- 即將上市新車