萬年歷單片機電路及程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code digit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char data year,month,day,hour,min,sec,sec100,n;//年、月、日、時、分、秒、百分之一秒
- sbit TS = P2^4; //調整鍵調時
- sbit SS = P2^5; //調整鍵上升
- sbit XJ = P2^6; //調整鍵下降
- sbit TW = P2^7; //調整鍵調位
- void delay1ms( uint x); //延時程序
- void pro_timedate();//時間和日期處理程序
- bit leap_year();//閏年的計算
- void display_Year(year); //顯示年
- void display_Month(month);//顯示月
- void display_Day(day);//顯示日
- void display_Hour(hour);//顯示時
- void display_Min(min);//顯示分
- void display_Sec(sec);//顯示秒
- void dispaly_time();//時間顯示
- void TSkeypros(); //調時按鍵掃描
- void pro_key(); // 設置按鍵處理程序
- void year_adjust(); // 年調整程序
- void month_adjust(); // 月調整程序
- void day_adjust(); // 日調整程序
- void hour_adjust(); // 時調整程序
- void min_adjust(); // 分調整程序
-
- // 延時程序
- void delay1ms( uint x)
- {
- uchar i,j;
- for(i=x;i>0;i--)
- for(j=124;j>0;j--);
- }
- //Timer0中斷處理程序,秒的產生
- void timer0() interrupt 1
- {
- TH0=0xdc; //Timer0置10ms定時初值dc00H(2^16=65536D,dc00H=56320D)
- TL0=0x00; //定時時間=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)
- sec100++;
- n++;
- if(n>=2) //1秒時間 (100*10ms=1000ms=1s)
- {n = 0;
- dispaly_time();//調用時間顯示程序
- }
- if(sec100 >= 100) //1秒時間 (100*10ms=1000ms=1s)
- {sec100 = 0;
-
- pro_timedate();//調用時間和日期處理程序
- }
- }
- //時間和日期處理程序
- void pro_timedate()
- {
- sec++;
- if(sec > 59)
- {sec = 0;
- min++;
- if(min>59)
- {min=0;
- hour++;
- if(hour>23)
- {hour=0;
- day++;
- if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
- if (day>31) {day=1;month++;} //大月31天
- if (month==4||month==6||month==9||month==11)
- if (day>30) {day=1;month++;} //小月30天
- if (month==2)
- {if( leap_year()) //閏年的條件
- {if (day>29) {day=1;month++;}} //閏年2月為29天
- else
- {if (day>28) {day=1;month++;}} //平年2月為28天
- }
- if (month>12) {month=1;year++;}
- if (year>99) year=0;
- }
- }
- }
- }
- //閏年的計算
- bit leap_year()
- {
- bit leap;
- if((year%4==0&&year%100!=0)||year%400==0)//閏年的條件
- leap=1;
- else
- leap=0;
- return leap;
- }
- //主程序,初始化及初值設定
- void main()
- {
- P0=0;
- P1=0;
- hour=10;min=30;sec=0; //開機時的時,分,秒顯示
- year=11; month=5;day=9; //開機時的年,月,日,星期顯示
- IE = 0x8f; //CPU開中斷,INT0,INT1,Timer0,Timer1開中斷
- IP = 0x04; //設置INT0為中斷最高優(yōu)先級
- IT0=0;IT1=0; //外部INT0,INT1設置為電平觸發(fā)方式(注意,觸發(fā)不要選邊沿方式,易誤動)
- TMOD = 0x11; //Timer0,Timer1工作于模式1, 16位定時方式
- TH0 = 0xdc;TL0 = 0x00; //Timer0置10ms定時初值
- TH1 = 0xff;TL1 = 0x00; //Timer1置初值
- TR0 = 1; //Timer0啟動
- TR1 = 0;
- while(1)
- {
- TSkeypros();
- }
- }
- void display_Year(year) //顯示年
- {
- uchar i,j;
- i=year/10;
- j=year%10;
- P0=digit[2];
- P1=0;
- delay1ms(4);
- P0=0;
- P0=digit[0];
- P1=1;
- delay1ms(4);
- P0=0;
- P0=digit[i];
- P1=2;
- delay1ms(4);
- P0=0;
- P0=digit[j];
- P1=3;
- delay1ms(4);
- P0=0;
- }
- void display_Month(month) //顯示月
- {
- uchar i,j;
- i=month/10;
- j=month%10;
- P0=digit[i];
- P1=4;
- delay1ms(4);
- P0=0;
- P0=digit[j];
- P1=5;
- delay1ms(4);
- P0=0;
- }
- void display_Day(day) //顯示日
- {
- uchar i,j;
- i=day/10;
- j=day%10;
- P0=digit[i];
- P1=6;
- delay1ms(4);
- P0=0;
- P0=digit[j];
- P1=7;
- delay1ms(4);
- P0=0;
- }
- void display_Hour(hour) //顯示時
- {
- uchar i,j;
- i=hour/10;
- j=hour%10;
- P0=digit[i];
- P1=8;
- delay1ms(4);
- P0=0;
- P0=digit[j];
- P1=9;
- delay1ms(4);
- P0=0;
- }
- void display_Min(min) //顯示分
- {
- uchar i,j;
- i=min/10;
- j=min%10;
- P0=digit[i];
- P1=10;
- delay1ms(4);
- P0=0;
- P0=digit[j];
- P1=11;
- delay1ms(4);
- P0=0;
- }
- void display_Sec(sec) //顯示秒
- {
- uchar i,j;
- i=sec/10;
- j=sec%10;
- P0=digit[i];
- P1=12;
- delay1ms(4);
- P0=0;
- P0=digit[j];
- P1=13;
- delay1ms(4);
- P0=0;
- }
- void dispaly_time()//時間顯示
- {
- display_Year(year);
- display_Month(month);
- display_Day(day);
- display_Hour(hour);
- display_Min(min);
- display_Sec(sec);
- P0=0;
- }
- void TSkeypros() //調時按鍵掃描
- {
- if(TS==0) //檢測按鍵TS是否按下
- {
- delay1ms(10); //消除抖動10ms
- if(TS==0) //再次判斷按鍵是否按下
- {
- while(!TS); //檢測按鍵是否松開
- }
- pro_key(); // 調用設置按鍵處理程序
- }
- }
- void pro_key() // 設置按鍵處理程序
- {
- year_adjust();
-
- }
- void year_adjust() // 年調整程序
- {
- if (SS==0)
- {
- delay1ms(10); //消除抖動10ms
- if(SS==0) //再次判斷按鍵是否按下
- {
- while(!SS); //檢測按鍵是否松開
- }
- year++;
- if (year> 99) year= 0;
- }
- else
- {if (XJ==0)
- {
- delay1ms(10); //消除抖動10ms
- if(XJ==0) //再次判斷按鍵是否按下
- {
- while(!XJ); //檢測按鍵是否松開
- }
- year--;
- if (year>100) year= 99;
- }
- }
- if (TW==0)
- {
- delay1ms(10); //消除抖動10ms
- if(TW==0) //再次判斷按鍵是否按下
- {
- while(!TW); //檢測按鍵是否松開
- }
- month_adjust();
- }
- year_adjust();
- }
- void month_adjust() // 月調整程序
- {
- if (SS==0)
- {
- delay1ms(10); //消除抖動10ms
- if(SS==0) //再次判斷按鍵是否按下
- {
- while(!SS); //檢測按鍵是否松開
- }
- month++;
- if (month> 12) month= 1;
- }
- else
- {if (XJ==0)
- {
- delay1ms(10); //消除抖動10ms
- if(XJ==0) //再次判斷按鍵是否按下
- {
- while(!XJ); //檢測按鍵是否松開
- }
- month--;
- if (month<1) month= 12;
- }
- }
- if (TW==0)
- {
- delay1ms(10); //消除抖動10ms
- if(TW==0) //再次判斷按鍵是否按下
- {
- while(!TW); //檢測按鍵是否松開
- }
- day_adjust();
- }
- month_adjust();
- }
- void day_adjust() // 日調整程序
- {
- if (SS==0)
- {
- delay1ms(10); //消除抖動10ms
- if(SS==0) //再次判斷按鍵是否按下
- {
- while(!SS); //檢測按鍵是否松開
- }
- day++;
- if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
- if (day>31) day=1; //大月31
- if (month==4||month==6||month==9||month==11)
- if (day>30) day=1; //小月30
- if (month==2)
- {
- if(leap_year()) // 閏年條件
- {
- if (day>29) day=1; // 閏年29
- }
- else
- {
- if (day>28) day=1; //平年28
- }
- }
- }
- else
- {if (XJ==0)
- {
- delay1ms(10); //消除抖動10ms
- if(XJ==0) //再次判斷按鍵是否按下
- {
- while(!XJ); //檢測按鍵是否松開
- }
- day--;
- if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
- if (day<1) day=31; //大月31
- if (month==4||month==6||month==9||month==11)
- if (day<1) day=30; //小月30
- if (month==2)
- {
- if(leap_year()) // 閏年條件
- {
- if (day<1) day=29; // 閏年29
- }
- else
- {
- if (day<1) day=28; //平年28
- }
- }
- }
- }
- if (TW==0)
- {
- delay1ms(10); //消除抖動10ms
- if(TW==0) //再次判斷按鍵是否按下
- {
- while(!TW); //檢測按鍵是否松開
- }
- hour_adjust();
- }
- day_adjust();
- }
- void hour_adjust() // 時調整程序
- {
- if (SS==0)
- {
- delay1ms(10); //消除抖動10ms
- if(SS==0) //再次判斷按鍵是否按下
- {
- while(!SS); //檢測按鍵是否松開
- }
- hour++;
- if (hour> 23) hour= 0;
- }
- else
- {if (XJ==0)
- {
- delay1ms(10); //消除抖動10ms
- if(XJ==0) //再次判斷按鍵是否按下
- {
- while(!XJ); //檢測按鍵是否松開
- }
- hour--;
- if (hour>100) hour= 23;
- }
- }
- if (TW==0)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
wnl.rar
(147.53 KB, 下載次數: 49)
2018-4-22 18:22 上傳
點擊文件名下載附件
|