希望對(duì)各位有所幫助
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
DU13VW57SOL~`{NE0ZR09]H.png (29.67 KB, 下載次數(shù): 33)
下載附件
2018-7-16 11:25 上傳
[FE%IFNC}C3@4`~@T8PB6VV.png (30.07 KB, 下載次數(shù): 17)
下載附件
2018-7-16 11:25 上傳
單片機(jī)源程序如下:
- #include "AT89X51.h"
- #define LEDS 4
- //#include "reg51.h"
- //led燈選通信號(hào)
- unsigned char code Select[]={0x01,0x02,0x04,0x08,0x10,0x20};
- //unsigned char code LED_CODES[]= {0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共陽
- unsigned char code LED_CODES[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //共陰
- #define TH0_BASE (65536-10000)
- struct{
- char CentiSecond;
- char Second;
- char Minute;
- char Hour;
- }Time;
- struct{
- char CentiSecond;
- char Second;
- char Minute;
- }Sec_Meter;
- unsigned char *Disp_fp,*Disp_fp_Set;
- unsigned char Mode = 0, Sec_Run =0, Time_Unit = 0;
- long delay_dat = 500;
-
- void delay(long time1)
- {
- while(time1--);
- return;
- }
- void Timer0_Int_Init(void)
- {
- TMOD = 0x01;
- TH0 = TH0_BASE / 256;
- TL0 = TH0_BASE % 256;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
- void Timer0_Int(void) interrupt TF0_VECTOR
- {
- static char Bit_flag = 0;
- char Bit_dat;
- //----回復(fù)定時(shí)器初值--------------
- TH0 = TH0_BASE / 256;
- TL0 = TH0_BASE % 256;
- //----時(shí)鐘計(jì)時(shí)--------------------
- Time.CentiSecond ++;
- if(Time.CentiSecond > 99)
- {
- Time.CentiSecond = 0;
- Time.Second ++;
- if(Time.Second > 59)
- {
- Time.Second = 0;
- Time.Minute ++;
- if(Time.Minute > 59)
- {
- Time.Minute = 0;
- Time.Hour ++;
- if(Time.Hour > 23) Time.Hour = 0;
- }
- }
- }
- if(Sec_Run == 1)
- {
- Sec_Meter.CentiSecond ++;
- if(Sec_Meter.CentiSecond > 99)
- {
- Sec_Meter.CentiSecond = 0;
- Sec_Meter.Second ++;
- if(Sec_Meter.Second > 59)
- {
- Sec_Meter.Second = 0;
- Sec_Meter.Minute ++;
- if(Sec_Meter.Minute > 59)
- {
- Sec_Meter.Minute = 0;
- }
- }
- }
- }
- //-----時(shí)間顯示------------------
- //注意:此處時(shí)間顯示每次中斷只顯示1位,下次中斷顯示第二位,依次循環(huán),由于中斷周期為10ms,故4每位顯示間隔為10ms,40ms一個(gè)循環(huán)
- if(Bit_flag == 0)
- {
- Bit_dat = *Disp_fp % 10;
- P3 = 0;
- P2=LED_CODES[Bit_dat];
- P3=Select[5-Bit_flag];
- Bit_flag = 1;
- //Disp_fp ++;
- }
- else if(Bit_flag == 1)
- {
- Bit_dat = *Disp_fp / 10;
- P3 = 0;
- P2=LED_CODES[Bit_dat];
- P3=Select[5-Bit_flag];
- Bit_flag = 2;
- Disp_fp++;
- }
- else if(Bit_flag == 2)
- {
- Bit_dat = *Disp_fp % 10;
- P3 = 0;
- if(Time.CentiSecond > 40)
- P2=LED_CODES[Bit_dat] | 0x80;
- else
- P2=LED_CODES[Bit_dat];
- P3=Select[5-Bit_flag];
- Bit_flag = 3;
- //Disp_fp++;
- }
- else if(Bit_flag == 3)
- {
- Bit_dat = *Disp_fp / 10;
- P3 = 0;
- P2=LED_CODES[Bit_dat];
- P3=Select[5-Bit_flag];
- Bit_flag = 4;
- Disp_fp++;
- }
- else if(Bit_flag == 4)
- {
- Bit_dat = *Disp_fp % 10;
- P3 = 0;
- if(Time.CentiSecond > 40)
- P2=LED_CODES[Bit_dat] | 0x80;
- else
- P2=LED_CODES[Bit_dat];
- P3=Select[5-Bit_flag];
- Bit_flag = 5;
- //Disp_fp++;
- }
- else if(Bit_flag == 5)
- {
- Bit_dat = *Disp_fp / 10;
- P3 = 0;
- P2=LED_CODES[Bit_dat];
- P3=Select[5-Bit_flag];
- Bit_flag = 0;
- Disp_fp = Disp_fp_Set;
- }
- //---------------------------------------------
- }
- void Display()
- {;}
- //----------------------------------------------------------------------------
- void main()
- {
- char i=0;
- long int j;
- P1 = 0xFF;
- Timer0_Int_Init();
- Disp_fp = (unsigned char *)&Time.Second;
- Disp_fp_Set = Disp_fp;
- while(1)
- {
-
- if(!P1_0)
- {
- while(!P1_0);
- Mode += 1;if(Mode > 2) Mode = 0;
- if(Mode == 0) //正常時(shí)鐘模式
- {
- Disp_fp = (unsigned char *)&Time.Second;
- Disp_fp_Set = Disp_fp;
- }
- else if(Mode == 1) //秒表模式
- {
- Disp_fp = (unsigned char *)&Sec_Meter.CentiSecond;
- Disp_fp_Set = Disp_fp;
- }
- else if(Mode == 2) //校時(shí)模式
- {
- Disp_fp = (unsigned char *)&Time.Second;
- Disp_fp_Set = Disp_fp;
- }
- }
- if(Mode == 1) //秒表模式
- {
- if(!P1_1)
- {
- while(!P1_1);
- Sec_Run ++; if(Sec_Run > 2)Sec_Run = 0;
- }
-
- if(Sec_Run == 0) //清表
- {
- Sec_Meter.CentiSecond = 0;
- Sec_Meter.Second = 0;
- Sec_Meter.Minute = 0;
- }
- else if(Sec_Run == 1); //計(jì)時(shí)
- else if(Sec_Run == 2); //停止
- }
- else if(Mode == 2) //校時(shí)模式
- {
- if(!P1_1)
- {
- while(!P1_1);
- Time_Unit ++; if(Time_Unit > 2)Time_Unit = 0;
- }
- if(!P1_2)
- {
- while(!P1_2);
- if(Time_Unit == 0) //校時(shí)
- {
- Time.Hour ++;if(Time.Hour > 23) Time.Hour = 0;
- }
- else if(Time_Unit == 1) //校分
- {
- Time.Minute ++;if(Time.Minute > 59) Time.Minute = 0;
- }
- else if(Time_Unit == 2) //校秒
- {
- Time.Second ++;if(Time.Second > 59) Time.Second = 0;
- }
- }
- if(!P1_3)
- {
- while(!P1_3);
- if(Time_Unit == 0) //校時(shí)
- {
- Time.Hour --;if(Time.Hour < 0) Time.Hour = 23;
- }
- else if(Time_Unit == 1) //校分
- {
- Time.Minute --;if(Time.Minute < 0) Time.Minute = 59;
- }
- else if(Time_Unit == 2) //校秒
- {
- Time.Second --;if(Time.Second < 0) Time.Second = 59;
- }
- }
-
- }
-
- //P2=0;
- /*
- i = Hour / 10;
- P2=LED_CODES[i];
- P3=Select[0];
- i = Hour % 10;
- P2=LED_CODES[i];
- P3=Select[1];
- P3 = 0;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
Proteus_51_Demo.rar
(53.53 KB, 下載次數(shù): 25)
2018-7-16 11:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|