自己完成的設計,拿出來分享一下
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (25.87 KB, 下載次數: 45)
下載附件
2021-7-16 03:42 上傳
51hei.png (35.82 KB, 下載次數: 42)
下載附件
2021-7-16 03:42 上傳
51hei.png (11.54 KB, 下載次數: 53)
下載附件
2021-7-16 03:43 上傳
單片機源程序如下:
- #include <reg51.h>
- #include "DS1302.h"
- #include "LCD12864.h"
- #include "string.h"
- char a;
- sbit KEY1=P3^4; //LCD12864液晶顯示,也就是屏幕上總共有64x128個點,
- sbit KEY2=P3^5;
- sbit KEY3=P3^6;//++
- sbit KEY5=P3^7;//--
- sbit KEY4=P2^7;
- sbit KEY6=P3^3;
- sbit beep=P2^6;
- int i;
- int riqi;
- uchar TIME1[7] = {0x12, 0x12, 0x12, 0x01, 0x07, 0x07, 0x21};
- uchar TIME3[7] = {0x12, 0x13, 0x12, 0x01, 0x07, 0x07, 0x21};
- bit flag=1; //進入/退出設置標志
- bit flag1=1;//顯示名字的標志位
- bit flag2=1; //顯示日期標志位
- bit flag3=1; //顯示鬧鐘標志位
- uchar choose=0x01; //切換標志
- void dela(int i)//100代表1ms,也就是每一個單位代表10us
- {while(i--);
- }
- void delay10(void) //延時10ms
- {
- unsigned char i,j;
- for(i=0;i<255;i++)
- for(j=0;j<200;j++);
- }
- void delay5ms(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=19;b>0;b--)
- for(a=130;a>0;a--);
- }
- //設置時ds1302寄存器值循環 如秒寄存器59時加一變為00
- unsigned char conver(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
- {
- //右邊這個a為10的意思
- if((a&0x0f)==0x0a) a=a+6; //進位為10進制 ,+
- if(a==0xff) a=d; //限制255
- if((a&0x0f)==0x0f) a=a-6; //進位為10進制, _
- if(a==0x00&&c!=0x00) a=d;
- if(a==b) a=c; //還原
- // ShowNumber(6,72,a/1000);
- // ShowNumber(6,80,a/100%10);
- // ShowNumber(6,88,a/10%10);
- // ShowNumber(6,96,a%10);
- return a;
- }
- void digplay() {
- //時間,顯示數組里面的時間數據
- ShowNumber16_32(2,0,TIME[2]>>4&0x03); //時 十位
- ShowNumber16_32(2,16, TIME[2]&0x0f);//時 個位
- ShowNumber16_32(2,48,TIME[1]>>4&0x07);//分 十位
- ShowNumber16_32(2,64, TIME[1]&0x0f);//分 個位
- ShowNumber16_32(2,96,TIME[0]>>4&0x07);//秒 十位
- ShowNumber16_32(2,112, TIME[0]&0x0f);//秒 個位
-
-
- //日期
- ShowNumber(0,0,2);
- ShowNumber(0,8,0);
- ShowNumber(0,16,TIME[6]>>4&0x0f);//先移動4位然后屏蔽低4位
- ShowNumber(0,24, TIME[6]&0x0f);//年
-
- ShowNumber(0,40,TIME[4]>>4&0x01);
- ShowNumber(0,48, TIME[4]&0x0f);//月
-
- ShowNumber(0,64,TIME[3]>>4&0x03);
- ShowNumber(0,72, TIME[3]&0x0f);//日
- ShowChina(0,112,(TIME[5]&0x07)-1);//周
- }
- void digplaystart(void) {//開機顯示
- uchar i=0;
- ShowChina(2,64-16*1.5,19);
- delay10();
- ShowChina(2,64-16*0.5,20);
- delay10();
- ShowChina(2,64+16*0.5,21);
- delay10();
- ShowChina(2,64+16*1.5,22);
- delay10();
-
- for (i=0;i<10;i++) {
- ShowNumber(4,32+8*i,16);
- delay10();
-
- }
- ClearScreen(0);//清屏
- }
- void alarm()
- { if(KEY6==0)//設置鬧鐘時間
- { choose==0;
- flag3=1;
- for( i=0;i<16;i++){ShowNumber(2,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(3,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(4,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
-
-
- ClearScreen(0);
- ShowChina(6,48,13);
- ShowChina(6,0,16);//顯示設置
- ShowChina(6,16,17);
- ShowNumber(6,32,10);
- ShowChina(6,48,14);
- ShowChina(4,0,48);
- ShowChina(4,16,49);
- ShowChinadog(0,0,0);//顯示圖案
-
-
- while(flag3)
- { ShowNumber(2,0,TIME3[2]>>4&0x03); //時 十位
- ShowNumber(2,8, TIME3[2]&0x0f);//時 個位
- ShowNumber(2,16,17);
- ShowNumber(2,24,TIME3[1]>>4&0x07);//分 十位
- ShowNumber(2,30, TIME3[1]&0x0f);//分 個位
-
-
- if(KEY1==0) //按鍵1--處理設定時間和返回
- {
- delay10();
- if(KEY1==1)
- {
- delay10();
- flag3=~flag3;
- for( i=0;i<16;i++){ShowNumber(2,8*i,15);}//清除
- for( i=0;i<16;i++){ShowNumber(3,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(4,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(6,8*i,15);}
- ShowChina(2,64-16*1.5,50);
- delay10();
- ShowChina(2,64-16*0.5,51);
- delay10();
- ShowChina(2,64+16*0.5,52);
- delay10();
- ShowChina(2,64+16*1.5,53);
- delay10();
- for (i=0;i<5;i++)
- {
- ShowNumber(4,32+8*i,16);
- delay10();}
- for( i=0;i<16;i++){ShowNumber(2,8*i,15);}//清除
- for( i=0;i<16;i++){ShowNumber(3,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(4,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(6,8*i,15);}
- ShowNumber16_32(2,32,10);//:
- ShowNumber16_32(2,80,10);//:還原原來的點號
-
-
- }
-
-
-
-
- if(flag3==0) {
- for( i=0;i<8;i++) {
- ShowNumber(6,8*i,15);
- }
- }
- }
- if(KEY2==0) //按鍵2--處理選擇設定時間的項目
- {
- delay10();
- if(KEY2==1)
- {
- delay10();
- choose++;
- if(choose==2)
- choose=0x00;
- ShowChina(6,48,13+choose);
-
- }
- }
- if(KEY3==0)//++
- { delay10();//這個必須有,否則檢測不到高電平
- if(KEY3==1)
- {delay10();
- switch(choose)
- {
-
- case 0: TIME3[2]++; TIME3[2]=conver(TIME3[2],0x24,0x00,0x23);break;//時
- case 1: TIME3[1]++; TIME3[1]=conver(TIME3[1],0x60,0x00,0x59);break;//分
-
- }
- }
- }
-
- if(KEY5==0)//--
- {
- delay10();
- if(KEY5==1)
- {delay10();
- switch(choose)
- {
-
- case 0: TIME3[2]--; TIME3[2]=conver(TIME3[2],0x24,0x00,0x23);break;//時
- case 1: TIME3[1]--; TIME3[1]=conver(TIME3[1],0x60,0x00,0x59);break;//分
-
- }
-
- }
-
-
-
-
-
- }
- }
- }
- }
- void main(void)
- {
- uchar i;
- InitLCD(); //初始化LCD12864
- digplaystart();
- ClearScreen(0);//清屏
- ShowChinaduolaameng(0,0,0);
- delay10();
- delay10();
- delay10();
- delay10();
- ClearScreen(0);
- for( i=0;i<16;i++){ShowNumber(0,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(1,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
- for( i=0;i<16;i++){ShowNumber(6,8*i,15);}
-
- delay5ms();
- Ds1302Init();//Ds1302初始化,并且附上設定的默認時間
-
- ShowNumber(0,32,11);//-
- ShowNumber(0,56,11);//-
-
- ShowChina(0,98,7);//漢字周
- ShowNumber16_32(2,32,10);//:
- ShowNumber16_32(2,80,10);//:
- while(1)
- { if(TIME3[1]==TIME[1]&&TIME3[2]==TIME[2]){beep=0;dela(10000000);beep=1;dela(100000000);beep=0;dela(100000000);beep=1;dela(10000);beep=0;}else beep=1;//蜂鳴器報警
-
-
-
-
- if(KEY4==0){ for( i=0;i<5;i++)delay10();flag1=~flag1;
- if(flag1==0){
- ShowChina(6,0,23);ShowChina(6,16,24);ShowChina(6,32,25);ShowChina(6,48,26);ShowChina(6,64,27);ShowChina(6,80,28);ShowChina(6,96,29);ShowChina(6,112,30);}
- else for( i=0;i<16;i++) {ShowNumber(6,8*i,15);}
- }
- if(flag2==1)riqi=(TIME[3]>>4)*10+(TIME[3]&0x0f)+(TIME[4]>>4)*1000+(TIME[4]&0x0f)*100;//&比加號低級所以需要括號
- switch(riqi)//節日顯示
- { case 0:break;
- case 101:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,37);ShowChina(6,96,38);ShowChina(6,112,47);riqi=0;flag2=0;break;
- case 308:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,39);ShowChina(6,96,40);ShowChina(6,112,47);riqi=0;flag2=0;break;
- case 405:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,41);ShowChina(6,96,42);ShowChina(6,112,47);riqi=0;flag2=0;break;
- case 501:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,45);ShowChina(6,96,46);ShowChina(6,112,47);riqi=0;flag2=0;break;
- case 601:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,31);ShowChina(6,96,32);ShowChina(6,112,33);riqi=0;flag2=0;break;
- case 910:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,43);ShowChina(6,96,44);ShowChina(6,112,47);riqi=0;flag2=0;break;
- case 1001:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,34);ShowChina(6,96,35);ShowChina(6,112,36);riqi=0;flag2=0;break;
- default:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}riqi=0;flag2=0;
- }
- // ShowNumber(6,72,riqi/1000);
- // ShowNumber(6,80,riqi/100%10);
- // ShowNumber(6,88,riqi/10%10);
- // ShowNumber(6,96,riqi%10);
-
-
- alarm();
- if(KEY1==0) //按鍵1--處理設定時間和返回
- {
- delay10();
- if(KEY1==1)
- {
- delay10();
- flag=~flag;
-
- if(flag==0) {
- ShowChina(6,48,9);
- ShowChina(6,0,16);//顯示設置
- ShowChina(6,16,17);
- ShowNumber(6,32,10);
- }
-
- if(flag==1) {
- for( i=0;i<8;i++) {
- ShowNumber(6,8*i,15);
- }
- }
- }
- }
- if(KEY2==0) //按鍵2--處理選擇設定時間的項目
- {
- delay10();
- if(KEY2==1)
- {
- delay10();
- choose++;
- ShowChina(6,48,8+choose);
- if(choose==7)
- choose=0x00;
- }
- }
- if(KEY3==0)//++
- { delay10();
- if(KEY3==1)
- {
- //delay10();//降低
- switch(choose)
- {
- case 1: TIME[6]++; TIME[6]=conver(TIME[6],0xa0,0x00,0x59);break;//年
- case 2: TIME[5]++; TIME[5]=conver(TIME[5],0x08,0x01,0x07);break;//周
- case 3: TIME[4]++; TIME[4]=conver(TIME[4],0x13,0x01,0x12);break;//月
- case 4: TIME[3]++; TIME[3]=conver(TIME[3],0x32,0x01,0x31);break;//日
- case 5: TIME[2]++; TIME[2]=conver(TIME[2],0x24,0x00,0x23);break;//時
- case 6: TIME[1]++; TIME[1]=conver(TIME[1],0x60,0x00,0x59);break;//分
- case 7: TIME[0]++; TIME[0]=conver(TIME[0],0x60,0x00,0x59);break;//秒
- }
-
-
-
-
- digplay();
- }
- }
- if(KEY5==0) //--
- { delay10();
- if(KEY5==1)
- {
-
- switch(choose)
- {
- case 1: TIME[6]--; TIME[6]=conver(TIME[6],0xa0,0x00,0x09);break;//年
- case 2: TIME[5]--; TIME[5]=conver(TIME[5],0x08,0x01,0x07);break;//周
- case 3: TIME[4]--; TIME[4]=conver(TIME[4],0x13,0x01,0x12);break;//月
- case 4: TIME[3]--; TIME[3]=conver(TIME[3],0x32,0x01,0x31);break;//日
- case 5: TIME[2]--; TIME[2]=conver(TIME[2],0x24,0x00,0x23);break;//時
- case 6: TIME[1]--; TIME[1]=conver(TIME[1],0x60,0x00,0x59);break;//分
- case 7: TIME[0]--; TIME[0]=conver(TIME[0],0x60,0x00,0x59);break;//秒
- }
-
-
-
-
- digplay();
- }
- }
- if(TIME1[3]!=TIME[3]||TIME1[4]!=TIME[4]) flag2=1;
- for(i=3;i<5;i++)TIME1[i]=TIME[i];
- if(flag==1)
- {Ds1302ReadTime();} //讀取DS1302的時間
- else
- Ds1302WriteTime(); //寫入DS1302的時間
- digplay();
- }
- }
復制代碼
仿真程序資料51hei提供下載:
顯示屏 整合 1.7z
(102.09 KB, 下載次數: 44)
2021-7-16 03:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|