很久沒玩單片機了,最近收拾東西又找到很多以前在網(wǎng)上買的東西,感覺浪費了可惜。想做個東西玩玩好多東西都忘了,搜資料的過程中發(fā)現(xiàn)這個論壇感覺壇友都好厲害。又有學(xué)單片機的沖動了,以前做的東西都拆掉了。我就分享個我以前做的東西。電路圖仿真通過。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (23.29 KB, 下載次數(shù): 73)
下載附件
2019-6-21 03:54 上傳
單片機源程序如下:
- #include<reg52.h>
- #include"ds1302.h"
- #include"e2prom.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit Jdq=P2^2;
- bit S_flag;
- uchar k1num,k4num,Al_num,Sh_num,num,shi,fen,miao;
- char A_shi,A_fen,A_miao,S_shi,S_fen,S_miao;
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
- 0x82,0xf8,0x80,0x90,0xbf,0xff,0x88,0xc7,0x89};
- void delayms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void Time0_init()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void Display(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2)
- {
- P1=0x01;
- P0=table[shi1];
- delayms(2);
- P1=0x02;
- P0=table[shi2];
- delayms(2);
- P0=table[11];//消隱
- P1=0x04;
- P0=table[10];//間隔
- delayms(2);
- P0=table[11];//消隱
- P1=0x08;
- P0=table[fen1];
- delayms(2);
- P1=0x10;
- P0=table[fen2];
- delayms(2);
- P0=table[11];//消隱
- P1=0x20;
- P0=table[10];//間隔
- delayms(2);
- P0=table[11];//消隱
- P1=0x40;
- P0=table[miao1];
- delayms(2);
- P1=0x80;
- P0=table[miao2];
- delayms(2);
- P0=table[11];//消隱
-
- }
- void Shan_Display()
- {
- switch(k4num)
- {
- case 1: //開鬧鐘時間顯示
- switch(Al_num)
- {
- case 1: //小時閃爍
- if(S_flag)
- Display(11,11,A_fen/10,A_fen%10,12,13);
- else
- Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);
- break;
- case 2: //分鐘閃爍
- if(S_flag)
- Display(A_shi/10,A_shi%10,11,11,12,13);
- else
- Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);
- break;
- default :
- Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);
- }
- break;
- case 2: //關(guān)鬧鐘時間顯示
- switch(Sh_num)
- {
- case 1: //小時閃爍
- if(S_flag)
- Display(11,11,S_fen/10,S_fen%10,5,14);
- else
- Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);
- break;
- case 2: //分鐘閃爍
- if(S_flag)
- Display(S_shi/10,S_shi%10,11,11,5,14);
- else
- Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);
- break;
- default : Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);
- }
- break;
- default: //當前時間顯示
- switch(k1num)
- {
- case 1: //小時閃爍
- if(S_flag)
- Display(11,11,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
- else
- Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
- break;
- case 2: //分鐘閃爍
- if(S_flag)
- Display(now[2]/16,now[2]%16,11,11,now[0]/16,now[0]%16);
- else
- Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
- break;
- case 3: //秒閃爍
- if(S_flag)
- Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,11,11);
- else
- Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
- break;
- default : Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
- }
-
- }
- }
- void Mode_keyscan()
- {
- if(k4==0)
- {
- delayms(10);
- if(k4==0)
- {
- k4num++;
- if(k4num>=3)k4num=0;
- switch(k4num)
- {
- case 1:k1num=0;
- break;
- case 2:Al_num=0;
- break;
- default:Sh_num=0;
- }
-
- while(!k4);
-
- }
- }
- }
- void Move_keyscan()
- {
- if(k1==0)
- {
- delayms(10);
- if(k1==0)
- {
- if(k4num==0)
- {
- k1num++;
- if(k1num>=4)k1num=0;
- }
- else if(k4num==1)
- {
- Al_num++;
- if(Al_num>=3)Al_num=0;
- }
- else if(k4num==2)
- {
- Sh_num++;
- if(Sh_num>=3)Sh_num=0;
- }
- while(!k1);
-
- }
- }
- }
- void Add_keyscan()
- {
- if(k2==0)
- {
- delayms(10);
- if(k2==0)
- {
- switch(k4num)
- {
- case 1:
- switch(Al_num)
- {
- case 1:
- A_shi++;
- if(A_shi>=24)
- A_shi=0;
- while(!k2);
- SectorErase(0x2000);
- byte_write(0x2000,A_shi);
- break;
- case 2:
- A_fen++;
- if(A_fen>=60)
- A_fen=0;
- while(!k2);
- SectorErase(0x2200);
- byte_write(0x2200,A_fen);
- break;
-
- }
- break;
- case 2:
- switch(Sh_num)
- {
- case 1:
- S_shi++;
- if(S_shi>=24)
- S_shi=0;
- while(!k2);
- SectorErase(0x2400);
- byte_write(0x2400,S_shi);
- break;
- case 2:
- S_fen++;
- if(S_fen>=60)
- S_fen=0;
- while(!k2);
- SectorErase(0x2600);
- byte_write(0x2600,S_fen);
- break;
-
- }
- break;
- default:
- switch(k1num)
- {
- uchar dat ;
- case 1:
- dat=DS1302_ReadData(0x85);
- shi=dat+1;
- if((shi&0x0f)>9)shi=shi+6;
- if(shi>=0x24)shi=0;
- while(!k2);
- DS1302_WriteData(0x8e, 0x00);//允許寫操作
- DS1302_WriteData(0x84,shi);
- DS1302_WriteData(0x8e, 0x80);//寫保護
- break;
- case 2:
- dat=DS1302_ReadData(0x83);
- fen=dat+1;
- if((fen&0x0f)>9)fen=fen+6;
- if(fen>=0x60)fen=0;
- while(!k2);
- DS1302_WriteData(0x8e, 0x00);//允許寫操作
- DS1302_WriteData(0x82,fen);
- DS1302_WriteData(0x8e, 0x80);//寫保護
- break;
- case 3:
- dat=DS1302_ReadData(0x81);
- miao=dat+1;
- if((miao&0x0f)>9)miao=miao+6;
- if(miao>=0x60)miao=0;
- while(!k2);
- DS1302_WriteData(0x8e, 0x00);//允許寫操作
- DS1302_WriteData(0x80,miao);
- DS1302_WriteData(0x8e, 0x80);//寫保護
- break;
- }
- break;
-
- }
- }
-
- }
-
- }
- void Reduce_keyscan()
- {
- if(k3==0)
- {
- delayms(10);
- if(k3==0)
- {
- switch(k4num)
- {
- case 1:
- switch(Al_num)
- {
- case 1:
- A_shi--;
- if(A_shi==-1)
- A_shi=23;
- while(!k3);
- SectorErase(0x2000);
- byte_write(0x2000,A_shi);
- break;
- case 2:
- A_fen--;
- if(A_fen==-1)
- A_fen=59;
- while(!k3);
- SectorErase(0x2200);
- byte_write(0x2200,A_fen);
- break;
- }
- break;
- case 2:
- switch(Sh_num)
- {
- case 1:
- S_shi--;
- if(S_shi==-1)
- S_shi=23;
- while(!k3);
- SectorErase(0x2400);
- byte_write(0x2400,S_shi);
- break;
- case 2:
- S_fen--;
- if(S_fen==-1)
- S_fen=59;
- while(!k3);
- SectorErase(0x2600);
- byte_write(0x2600,S_fen);
- break;
- }
- break;
- default:
- switch(k1num)
- {
- uchar dat ;
- case 1:
- dat=DS1302_ReadData(0x85);
- if(dat==0)
- shi=0x23;
- else
- shi=dat-1;
- if((shi&0x0f)>9)shi=shi-6;
- while(!k3);
- DS1302_WriteData(0x8e, 0x00);//允許寫操作
- DS1302_WriteData(0x84,shi);
- DS1302_WriteData(0x8e, 0x80);//寫保護
- break;
- case 2:
- dat=DS1302_ReadData(0x83);
- if(dat==0)
- fen=0x59;
- else
- fen=dat-1;
- if((fen&0x0f)>9)fen=fen-6;
- while(!k3);
- DS1302_WriteData(0x8e, 0x00);//允許寫操作
- DS1302_WriteData(0x82,fen);
- DS1302_WriteData(0x8e, 0x80);//寫保護
- break;
- case 3:
- dat=DS1302_ReadData(0x81);
- if(dat==0)
- miao=0x59;
- else
- miao=dat-1;
- if((miao&0x0f)>9)miao=miao-6;
- while(!k3);
- DS1302_WriteData(0x8e, 0x00);//允許寫操作
- DS1302_WriteData(0x80,miao);
- DS1302_WriteData(0x8e, 0x80);//寫保護
- break;
- }
- break;
- }
- }
-
- }
-
- }
- void AL_SHRead()
- {
- A_shi=byte_read(0x2000);
- A_fen=byte_read(0x2200);
- S_shi=byte_read(0x2400);
- S_fen=byte_read(0x2600);
- }
- void AL_SHCheck()
- {
- uchar j;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
電路圖.zip
(80.85 KB, 下載次數(shù): 120)
2019-6-21 00:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序.zip
(44.51 KB, 下載次數(shù): 145)
2019-6-21 00:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|