仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (90.25 KB, 下載次數: 55)
下載附件
2021-11-1 05:27 上傳
proteus.png (242.93 KB, 下載次數: 59)
下載附件
2021-11-1 02:14 上傳
keil.png (184.24 KB, 下載次數: 66)
下載附件
2021-11-1 02:15 上傳
單片機源程序如下:
- #include <AT89X52.h> //調用51單片機的頭文件
- #define uint unsigned int
- #define uchar unsigned char
- sbit LS164_DATA = P3^0; //74LS164數據線
- sbit LS164_CLK = P3^1; //74LS164時鐘線
- sbit LS164_MR = P3^3; //74LS164使能
- sbit HOUR_A = P1^0;
- sbit HOUR_S = P1^1;
- sbit MINUTE_A = P1^2;
- sbit MINUTE_S = P1^3;
- sbit SECOND_A = P1^4;
- sbit SECOND_S = P1^5;
- sbit CLOCK_ON = P1^6;
- sbit CLOCK_OFF = P1^7;
- //---------------------------------------
- //數碼管字形表,供顯示時查詢
- unsigned char code LED[11]=
- { //定義表格一定要使用code,這樣會做到程序存儲區中
- 0x3F, //"0"的字形表,0B00111111
- 0x06, //"1"的字形表,0B00000110
- 0x5B, //"2"的字形表,0B01011011
- 0x4F, //"3"的字形表,0B01001111
- 0x66, //"4"的字形表,0B01100110
- 0x6D, //"5"的字形表,0B01101101
- 0x7D, //"6"的字形表,0B01111101
- 0x07, //"7"的字形表,0B00000111
- 0x7F, //"8"的字形表,0B01111111
- 0x6F, //"9"的字形表,0B01101111
- 0x40, //"-", 0B01000000
- };
- uint miao=0; //秒
- uint fen=15; //分
- uint shi=12; //時
- uint n=0; //計數
- uint i=0;
- uint state=0;
- uint date[6]={0,0,0,0,0,0}; //定義一個有6個地址的數組,分別存時分秒的個位和十位
- //---------------------------------------
- //8位數碼管相關I/O設置
- //P2.0-P2.2為3-8譯碼器U16的3個輸入,P2=0x00 0x01 0x02 0x03最大為 0x07
- //可以不用定義三個位,直接寫P2=0X即可
- //---------------------------------------
- //x為段選數據,y為位選0x00 0x01 0x02 0x03最大為 0x07
- void tube_display(uint x,uint y)
- {
- P2=y;
- // P0=LED[x];
- LS164_MR=1;
- state=LED[x];
- for(i=0;i<8;i++) //循環寫8位擴展引腳狀態
- {
- LS164_CLK = 0;
- if(state & 0x80)
- {
- LS164_DATA = 1;
- }
- else
- {
- LS164_DATA = 0;
- }
- LS164_CLK = 1;
- state = state<<1;
- }
- }
- //延時函數
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=50;y>0;y--);
- }
- //定時器初始化
- void time_init(void) //定時器初始化函數
- {
- TMOD=0x02; //選擇方式2
- TH0=156; //重裝初值為156 100us
- TL0=156; //運行值為156
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- TR0=1; //開定時器0
- }
- //外部中斷初始化
- void INT0_init(void) //定時器初始化函數
- {
- IT0=1; //INT0負跳變沿觸發
- EX0=1; //外部中斷0使能
- EA=1; //總中斷使能
- }
- void display(void)
- {
- tube_display(10,0x02);
- delay(1);
- tube_display(10,0x05);
- delay(1);
-
- tube_display(date[0],0x07);
- delay(1);
-
- tube_display(date[1],0x06);
- delay(1);
-
- tube_display(date[2],0x04);
- delay(1);
-
- tube_display(date[3],0x03);
- delay(1);
-
- tube_display(date[4],0x01);
- delay(1);
-
- tube_display(date[5],0x00);
- delay(1);
- }
- /*************************** main code ******************************/
- void main(void) //主函數,單片機開機后就是從這個函數開始運行
- {
- time_init();
- INT0_init();
- while(1) //死循環,單片機初始化后,將一直運行這個死循環
- {
- display();
- }
- }
- /********************************************************************/
- /*定時器中斷*/
- void timer() interrupt 1 //定時器0中斷
- {
- n++;
- if(n==10000) //當n=10000時,表示1s到了
- {
- n=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- }
- }
- date[0]=miao%10;
- date[1]=miao/10;
- date[2]=fen%10;
- date[3]=fen/10;
- date[4]=shi%10;
- date[5]=shi/10;
- }
- }
- /*按鍵中斷*/
- void INT0_ISR(void) interrupt 0
- {
- EX0=0;
- delay(1);
- if(HOUR_A==0)
- {
- shi++;
- while(HOUR_A==0);
- }
- else if(HOUR_S==0)
- {
- shi--;
- while(HOUR_S==0);
- }
- else if(MINUTE_A==0)
- {
- fen++;
- while(MINUTE_A==0);
- }
- else if(MINUTE_S==0)
- {
- fen--;
- while(MINUTE_S==0);
- }
- else if(SECOND_A==0)
- {
- miao++;
- while(SECOND_A==0);
- }
- else if(SECOND_S==0)
- {
- miao--;
- while(SECOND_S==0);
- }
- else if(CLOCK_ON==0)
- {
- TR0=1;
- while(CLOCK_ON==0);
- }
- else if(CLOCK_OFF==0)
- {
- TR0=0;
- while(CLOCK_OFF==0);
- }
- date[0]=miao%10;
- date[1]=miao/10;
- date[2]=fen%10;
- date[3]=fen/10;
- date[4]=shi%10;
- date[5]=shi/10;
- IE0=0;
- EX0=1;
- }
復制代碼
Proteus8.8仿真工程文件51hei附件下載:
8Wei_Time.zip
(152.58 KB, 下載次數: 71)
2021-11-1 02:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|