單片機大數字時鐘仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (28.03 KB, 下載次數: 80)
下載附件
2020-7-6 00:46 上傳
單片機源程序如下:
- #include <reg51.h>
- #include "DS18B20.h"
- #include "DS1302.h"
- #include "LCD12864.h"
- char a;
- sbit KEY6=P3^4;
- sbit KEY2=P3^5;
- sbit KEY3=P3^6;
- sbit KEY4=P3^7;
- sbit KEY5=P3^3;
- bit flag=1; //進入/退出設置標志
- uchar choose=0x01; //切換標志
- 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)
- {
-
- if((a&0x0f)==0x0a) a=a+6;
- if(a==b) a=c;
- return a;
- }
- void digplay() {
- //時間
- ShowNumber16_32(2,0,TIME[2]>>4&0x03); //時 十位
- ShowNumber16_32(2,16, TIME[2]&0x0f);//時 個位
- ShowChina(2,33,18);
- ShowNumber16_32(2,48,TIME[1]>>4&0x07);//分 十位
- ShowNumber16_32(2,64, TIME[1]&0x0f);//分 個位
- ShowChina(2,81,18);
- ShowNumber16_32(2,96,TIME[0]>>4&0x07);//秒 十位 0000 0111
- ShowNumber16_32(2,112, TIME[0]&0x0f);//秒 個位
-
-
- //日期
- ShowNumber(0,0,2);
- ShowNumber(0,8,0);
- ShowNumber(0,16,TIME[6]>>4&0x0f);
- ShowNumber(0,24, TIME[6]&0x0f);//年
- ShowNumber(0,32,11);
-
- ShowNumber(0,40,TIME[4]>>4&0x01);
- ShowNumber(0,48, TIME[4]&0x0f);//月
- ShowNumber(0,56,11);
- ShowNumber(0,64,TIME[3]>>4&0x03);
- ShowNumber(0,72, TIME[3]&0x0f);//日
- ShowChina(0,112,(TIME[5]&0x07)-1);//周
- }
- void wendu() {
- //溫度
- a=Read_Temperature(); //讀取DS18B20的溫度
- if(a<0) //處理溫度正負
- {
- a = (-1)*a; // 取補
- ShowNumber(6,88,11); //溫度計圖標—
- }
- else
- {
- ShowNumber(6,88,12);//溫度計圖標+
- }
- ShowNumber(6,96,a/10%10); //顯示溫度中位
-
- ShowNumber(6,104,a%10); //顯示溫度低位
-
- ShowChina(6,112,8);//顯示 .C
- }
- void digplaystart() {//開機顯示
- uchar i=0;
- ShowChina(2,64-16*1.5,19);
- ShowChina(2,64-16*0.5,20);
- ShowChina(2,64+16*0.5,21);
- ShowChina(2,64+16*1.5,22);
- for (i=0;i<10;i++) {
- ShowNumber(4,32+8*i,16);
- delay5ms();
- delay5ms();
- }
- ClearScreen(0);//清屏
- }
- void InitTimer0(void) //1ms
- {
- TMOD = 0x01;
- TH0 = 0x0FC;
- TL0 = 0x18;
- EA = 1;
- ET0 = 1;
- TR0 = 0;
- }
- unsigned int count =0;
- void main(void)
- { char swh = 0;
- char year= 20;
- char week= 0x04;
- char month= 0x20;
- char day= 0x04;
- char hour= 0x20;
- char div= 0x04;
- char second= 0x20;
- char n_hour = 1;
- char n_div = 30;
- char n_falg=0;
- unsigned char month_x= 0,day_x=0,hour_x = 0 ,div_x = 0,year_x = 0;
- char djs_flag = 0;
- char djs_stop_flag=1;
- char djs = 60;
- int time=0;
- InitLCD(); //初始化LCD12864
- //Ds1302Init();//Ds1302初始化,并且附上設定的默認時間
- Ds1302ReadTime();
- Ds1302WriteTime();
- //set_DS1302_time(0x20,0x04,0x20, 0x04,0x20,0x04,0x20);
- //InitTimer0();
-
- while(1)
- {
- //ShowNumber(6,32,9);
- // wendu();
- //Ds1302ReadTime();
- //digplay();
- if ( KEY2 == 0 )
- {
- swh ++;
- while(!KEY2);
- }
- if(swh >8 ) swh = 0;
-
- if( swh == 0 )
- {
- ShowNumber(6,20,15);
- ShowNumber(6,32,11); ShowNumber(6,40,11);
- Ds1302ReadTime();
- digplay();
- //========判斷 鬧鐘
- if((TIME[2]>>4&0x03) == (n_hour/10) && (TIME[2]&0x0f) == n_hour%10 && (TIME[1]>>4&0x07) == n_div/10 && (TIME[1]&0x0f) == n_div%10)
- {
- {
- n_falg ++;
- if(n_falg%2==0 )
- {
- ShowNumber(6,75,n_hour/10); //時 十位
- ShowNumber(6,83,n_hour%10);//時 個位
- ShowNumber(6,91,10);
- ShowNumber(6,99,n_div/10);//分 十位
- ShowNumber(6,107,n_div%10);//分 個
- }
- if(n_falg%2==1 )
- {
- ShowNumber(6,73,n_hour/10); //時 十位
- ShowNumber(6,81,n_hour%10);//時 個位
- ShowNumber(6,89,10);
- ShowNumber(6,97,n_div/10);//分 十位
- ShowNumber(6,105,n_div%10);//分 個
- }
- }
- }
- }
-
-
- if(swh == 1 )//設置年
- {
- ShowChina(6,32,9);
- if(KEY3 == 0)
- {
- year ++;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- year --;
- while(!KEY4);
- }
- year = year >80?80:year;
- year = year <1?1:year;
- year_x =((year/10)<<4)|(year%10) ;
- // set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
- digplay();
- }
-
- if(swh == 2 )//設置星期
- {
- ShowChina(6,32,10);
- if(KEY3 == 0)
- {
- week ++;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- week --;
- while(!KEY4);
- }
- week= week > 7 ?7:week;
- week= week < 1 ?1:week;
- // set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
- digplay();
- }
-
- if(swh == 3 )//設置月
- {
- ShowChina(6,32,11);
- if(KEY3 == 0)
- {
- month ++;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- month --;
- while(!KEY4);
- }
- month = month >12?12:month;
- month = month <1?1:month;
- month_x=((month/10)<<4)|(month%10) ;
- // set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
- digplay();
- }
- if(swh == 4 )//設置日
- {
- ShowChina(6,32,12);
- if(KEY3 == 0)
- {
- day ++;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- day --;
- while(!KEY4);
- }
- day = day >31?31:day;
- day = day <1?1:day;
- day_x=((day/10)<<4)|(day%10) ;
- // set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
- digplay();
- }
- if(swh == 5 )//設置小時
- {
- ShowChina(6,32,13);
- if(KEY3 == 0)
- {
- hour ++;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- hour --;
- while(!KEY4);
- }
- hour = hour >24?24:hour;
- hour = hour <1?1:hour;
- hour_x=((hour/10)<<4)|(hour%10) ;
- // set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
- digplay();
- }
- if(swh == 6 )//設置分
- {
- ShowChina(6,32,14);
- if(KEY3 == 0)
- {
- div ++ ;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- div --;
- while(!KEY4);
- }
- div = div >60?60:div;
- div = div <1?1:div;
- div_x=((div/10)<<4)|(div%10) ;
- // set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
- digplay();
- }
- if(swh == 7 ) //設置 鬧鐘 時
- {
- ShowChina(6,32,13); ShowNumber(6,20,11);
- if(KEY3 == 0)
- {
- n_hour ++;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- n_hour --;
- while(!KEY4);
- }
- n_hour = n_hour >24?24:n_hour;
- n_hour = n_hour <1?1:n_hour;
- ShowNumber(6,75,n_hour/10); //時 十位
- ShowNumber(6,83,n_hour%10);//時 個位
- ShowNumber(6,91,10);
- ShowNumber(6,99,n_div/10);//分 十位
- ShowNumber(6,107,n_div%10);//分 個
- }
- if(swh == 8 ) //設置 鬧鐘 分
- {
- ShowChina(6,32,14); ShowNumber(6,20,11);
- if(KEY3 == 0)
- {
- n_div ++;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- n_div --;
- while(!KEY4);
- }
- n_div = n_div >60?60:n_div;
- n_div = n_div <1?1:n_div;
- ShowNumber(6,75,n_hour/10); //時 十位
- ShowNumber(6,83,n_hour%10);//時 個位
- ShowNumber(6,91,10);
- ShowNumber(6,99,n_div/10);//分 十位
- ShowNumber(6,107,n_div%10);//分 個
- }
- if(KEY6 == 0 )
- {
- set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
- while(!KEY6);
- }
-
-
-
-
-
-
-
-
-
-
-
- /*
- if( swh == 7 )//秒表設置時間
- {
- if(djs_flag == 0)
- {
- TR0 = 0;
- if(KEY3 == 0)
- {
- djs ++ ;
- while(!KEY3);
- }
- if(KEY4 == 0)
- {
- djs -- ;
- while(!KEY4);
- }
- djs = djs >100?100:djs;
- djs = djs <1?1:djs;
- count = 0;
- ShowNumber(6,32,djs/10); ShowNumber(6,40,djs %10);
- }
- if ( djs_flag == 1 ) //djs
- {
- TR0 = 1;
- time = djs - count/1000;
-
- ShowNumber(6,32,time/10); ShowNumber(6,40,time %10);
- } */
- /* if (djs_stop_flag == 1 )
- {
- TR0 = 1;
- }
- if (djs_stop_flag == 1 )
- {
- TR0 = 0;
- }*/
- /* }
- if( swh == 7 && KEY5 == 0 )
- {
- djs_flag ++ ;
- if( djs_flag >1 )djs_flag =0;
- while(!KEY5);
- }*/
- /* if( swh == 7 && KEY6 == 0 )
- {
- djs_stop_flag ++ ;
- if( djs_stop_flag >1 )djs_stop_flag =0;
- while(!KEY6);
- } */
- }
-
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x0FC;
- TL0 = 0x18;
- //add your code here!
- count ++ ;
- }
-
- // digplaystart();
- // delay5ms();
- // Ds1302Init();//Ds1302初始化,并且附上設定的默認時間
- // a=Read_Temperature(); //讀取DS18B20的溫度
- // ShowNumber(0,32,11);//-
- // ShowNumber(0,56,11);//-
- // ShowChina(0,96,7);//漢字周
- // ShowNumber16_32(2,32,10);//:
- // ShowNumber16_32(2,80,10);//:
- // ShowChina(6,112,8);//℃
-
-
-
- /* while(1)
- {
- wendu();//溫度顯示
- if(flag==1)
- Ds1302ReadTime();
- //讀取DS1302的時間
- else
- Ds1302WriteTime();
- 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);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
lcd12864-時鐘-秒表.zip
(139.14 KB, 下載次數: 347)
2020-7-4 17:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|