|
程序初始化為系統(tǒng)時間,顯示于LCD1602,可以使用按鈕修改時間,并與系統(tǒng)同步。
程序可能有一點點缺陷,感興趣的朋友可以繼續(xù)完善。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
智能電子鐘
單片機源程序如下:
- #include<reg51.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code table[]= " 2019/07/17/Tue ";
- uchar code table1[]=" 12/05/10 ";
- uchar code table2[]={"Tus"};
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit E=P2^2;
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit RST=P2^5;
- sbit SCK=P2^6;
- sbit IO=P2^7;
- char shi,fen,miao,flag,dat,ri,yue,nian,xingqi;
- void write_ds(uchar add,uchar date);
- //延遲
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- //P0口寫操作,先寫地址,再寫數(shù)據(jù)
- void write_com(uchar com)
- {
- RS=0;
- RW=0;
- P0=com;
- E=1;
- delay(3);
- E=0;
- }
- void write_date(uchar date)
- {
- RS=1;
- RW=0;
- P0=date;
- E=1;
- delay(3);
- E=0;
- }
- //LCD顯示初始化
- void init_lcd()
- {
- uchar num;
- write_com(0X38);
- write_com(0X0C);
- write_com(0X06);
- write_com(0X80);
- for(num=0;num<16;num++)
- {
- write_date(table[num]);
- delay(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<20;num++)
- {
- write_date(table1[num]);
- delay(5);
- }
- }
- //LCD顯示
- void display1(uchar add,uchar date) //第一行顯示
- {
- uchar temp,shi,ge;
- temp=date;
- shi=temp/16;
- ge=temp%16;
- write_com(0x80+add);
- write_date(0x30+shi); //這里要注意,顯示的是ASCII碼!
- write_date(0x30+ge);
- }
- void display(uchar add,uchar date) //第二行顯示
- {
- uchar temp,shi,ge;
- temp=date;
- shi=temp/16;
- ge=temp%16;
- write_com(0x80+0x40+add);
- write_date(0x30+shi); //這里要注意,顯示的是ASCII碼!
- write_date(0x30+ge);
- }
- //鍵盤掃描
- void keyscan()
- {
- static unsigned char num;
- K1=0;
- //光標(biāo)移動(入口地址)
- if(K2==0)
- {
- delay(5);
- if(K2==0)
- {
- while(!K2);
- delay(5);
- while(!K2);
- num++;
- flag=1;
- }//異常重要!!!!
- if(num==1)
- {
- write_com(0X80+0X40+11);
- write_com(0X0F);
- }
- if(num==2)
- {
- write_com(0X80+0X40+8);
- write_com(0X0F);
- }
- if(num==3)
- {
- write_com(0X80+0X40+5);
- write_com(0X0F);
- }
- if(num==4)
- {
- write_com(0x80+10);
- write_com(0x0f);
- }
- if(num==5)
- {
- write_com(0x80+7);
- write_com(0x0f);
- }
- if(num==6)
- {
- write_com(0x80+4);
- write_com(0x0f);
- }
- if(num==7)
- {
- num=0;
- write_com(0X0C);
- write_ds(0x80,miao); //要在最后一次性寫入,時分和分針定時的時候秒針還在走。
- write_ds(0x82,fen);
- write_ds(0x84,shi);
- write_ds(0x86,ri);
- write_ds(0x88,yue);
- write_ds(0x8A,nian);
- flag=0;
- }
- }
- //修改時間,增加1
- if(K3==0)
- {
- delay(5);
- if(K3==0)
- {
- while(!K3);
- delay(5);
- while(!K3);
- //修改秒
- if(num==1)
- {
- uchar ge,shi;
- miao++;
- shi=miao/16;
- ge=miao%16;
- //秒的修整
- if(ge>=10)
- {
- ge=0;
- shi++;
- if(shi==6){shi=0;}
- }
- //顯示修整值
- miao=shi*16+ge;
- display(10,miao);
- write_com(0x80+0x40+11);//把光標(biāo)位置移回來。
- write_ds(0x80,miao);
- }
- //修改分鐘
- if(num==2)
- {
- uchar ge,shi;
- fen++;
- shi=fen/16;
- ge=fen%16;
- if(ge>=10)
- {
- ge=0;
- shi++;
- if(shi==6){shi=0;}
- }
- fen=shi*16+ge;
- display(7,fen);
- write_com(0x80+0x40+8);
- write_ds(0x82,fen);
- }
- //修改小時
- if(num==3)
- {
- uchar ge,shi1;
- shi++;
- shi1=shi/16;
- ge=shi%16;
- if(ge>=10)
- {
- ge=0;
- shi1++;
- }
- if((shi1==2)&&(ge==4))
- {
- shi1=0;
- ge=0;
- }
- shi=shi1*16+ge;
- display(4,shi);
- write_com(0x80+0x40+5);
- write_ds(0x84,shi);
- }
- }
- }
- //修改時間,減少1
- if(K4==0)
- {
- delay(5);
- if(K4==0)
- {
- while(!K4);
- delay(5);
- while(!K4);
- //修改秒
- if(num==1)
- {
- uchar ge,shi;
- miao--;
- shi=miao/16;
- ge=miao%16;
- //減法0之后應(yīng)該是9,而不是“?”
- if(ge==0x0f){ge=9;}
- //修改時間,當(dāng)?shù)竭_(dá)0后,再減的話是-1
- if(ge==-1)
- {
- shi=5;
- ge=9;
- }
- miao=shi*16+ge;
- display(10,miao);
- write_com(0x80+0x40+11);
- write_ds(0x80,miao);
- }
- //修改分鐘
- if(num==2)
- {
- uchar ge,shi;
- fen--;
- shi=fen/16;
- ge=fen%16;
- if(ge==0x0f){ge=9;}
- if(ge==-1)
- {
- shi=5;
- ge=9;
- }
- fen=shi*16+ge;
- display(7,fen);
- write_com(0x80+0x40+8);
- write_ds(0x82,fen);
- }
- //修改小時
- if(num==3)
- {
- uchar ge,shi1;
- shi--;
- shi1=shi/16;
- ge=shi%16;
- if(ge==0x0f){ge=9;}
- if(ge==-1)
- {
- shi1=2;
- ge=3;
- }
- shi=shi1*16+ge;
- display(4,shi);
- write_com(0x80+0x40+5);
- write_ds(0x84,shi);
- }
- }
- }
- }
- //DS1302
- void write_ds(uchar add,uchar date)
- {
- uchar num;
- RST=0;//復(fù)位
- delay(1);
- SCK=0;
- delay(1);
- RST=1;//關(guān)閉復(fù)位,開始傳輸
- delay(1);
- for(num=0;num<8;num++)
- {
- IO=add&0x01;//地址從低位開始傳送
- add>>=1;
- //date=date<<1;
- //IO=CY;
- SCK=1;
- delay(1);
- SCK=0;
- delay(1);
- }
- for(num=0;num<8;num++)
- {
- IO=date&0x01;//數(shù)據(jù)從低位開始傳送
- date>>=1;
- //date=date<<1;
- //IO=CY;
- SCK=1;
- delay(1);
- SCK=0;
- delay(1);
- }
- RST=0;//傳輸結(jié)束,復(fù)位
- delay(5);
- }
- uchar read_ds(uchar add)
- {
- uchar num,temp,date;
- RST=0;//復(fù)位
- delay(1);
- SCK=0;
- delay(1);
- RST=1;
- delay(1);
- for(num=0;num<8;num++)//先寫入地址
- {
- IO=add&0x01;//數(shù)據(jù)從低位開始傳送
- add>>=1;
- //date=date<<1;
- //IO=CY;
- SCK=1;
- delay(1);
- SCK=0;
- delay(1);
- }
- delay(2);
- for(num=0;num<8;num++)
- {
- temp=IO;
- date=(date>>1)|(temp<<7);
- SCK=1;
- delay(1);
- SCK=0;
- delay(1);
- }
- RST=0;
- delay(1);
- SCK=1;
- delay(1);
- IO=0;
- delay(1);
- IO=1;
- delay(1);
- return date;
- }
- //LCD初始更新為系統(tǒng)時間
- void init_ds()
- {
- miao=read_ds(0x81);
- display(10,miao);
- fen=read_ds(0x83);
- display(7,fen);
- shi=read_ds(0x85);
- display(4,shi);
- ri=read_ds(0x87);
- display1(9,ri);
- yue=read_ds(0x89);
- display1(6,yue);
- //xingqi=read_ds(0x8B);
- //display(12,table2[]);
- nian=read_ds(0x8D);
- display1(3,nian);
- }
- void set_time()
- {
- write_ds(0x80,0x10);//設(shè)置初始時間秒;
- write_ds(0x82,0x10);//設(shè)置初始時間分;
- write_ds(0x84,0x14);//設(shè)置初始時間時;
- write_ds(0x86,0x22);//設(shè)置初始時間日;
- write_ds(0x88,0x03);//設(shè)置初始時間月;
- write_ds(0x8a,0x03);//設(shè)置初始時間星期;
- write_ds(0x8c,0x15);//設(shè)置初始時間年;
- }
- void main()
- {
- flag=0;
- write_ds(0x8e,0x00);
- init_lcd();
- while(1)
- {
- keyscan();
- if(flag==0){init_ds();}
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
智能電子鐘.zip
(323.42 KB, 下載次數(shù): 125)
2019-9-18 21:16 上傳
點擊文件名下載附件
C51
|
|