仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg52.h>
- #define codport P0 //顯示段碼輸出口
- #define sitport P2 //顯示位碼輸出口
- sbit PB1=P1^0;
- sbit PB2=P1^1; // second 調整定義
- sbit PB3=P1^2;
- sbit PB4=P1^3; //second//minite 調整定義
- sbit PB5=P1^4;
- sbit PB6=P1^5; //hour 調整定義
- sbit PB7=P1^6; //暫停
- void delay(int); // 延時子程序
- void keyscan( ); // 按鍵作用
- unsigned char code ledcode[] /*顯示0~9的代碼*/
- ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char data hou,min,sec,num; //時分秒中斷數
- unsigned char data disbuf[]={0,0,0,0,0,0};
- //顯示數組,0元素為最高位
- void delay(int x)
- { int i,j;
- for(i=0;i<x;i++)
- for(j=0;j<120;j++);
- }
- void keyscan (void)
- {
- if(PB1==0) // 按鍵1 秒加
- {
- delay(200);
- {
- sec++;
- if(sec==60)
- {sec=0; }
- }
- }
- if(PB2==0) // 按鍵2 秒減
- {
- delay(200);
- {
- sec--;
- if(sec==-1)
- {sec=59;}
- }
- }
- if(PB3==0) // 按鍵3 分加
- {
- delay(200);
- {
- min++;
- if(min==60)
- {min=0; }
- }
- }
- if(PB4==0) // 按鍵4 分減
- {
- delay(200);
- {
- min--;
- if(min==-1)
- {min=59; }
- }
- }
-
- if(PB5==0) // 按鍵5 時加
- {
- delay(200);
- {
- hou++;
- if(hou==60)
- {hou=0;}
- }
- }
- if(PB6==0) // 按鍵7 暫停
- {
- delay(200);
- {
- hou--;
- if(hou==-1)
- {hou=23; }
- }
- }
- if(PB7==0) // 按鍵6 時減
- {
- delay(200);
- {
- EA=~EA;
- }
- }
- }
- void display() //顯示函數
- { unsigned int j; //j用于循環延時
- unsigned char i,scan; //scan為掃描碼
- scan=0x01;
- for(i=0;i<6;i++)
- { sitport=0xff; //先關閉各位
- codport=ledcode[disbuf[i]];
- //輸出顯示數的段碼
- sitport=~scan; //輸出位碼
- scan=(scan<<1); //指向下一個數位
- for(j=0;j<360;j++); //延時3ms
- } }
- void time0() interrupt 1 //定時器0中斷函數
- { TL0=55536%256; //給T0賦初值
- TH0=55536/256;
- num=num+1; //百分之一秒加1
- if(num>99)
- { num=0; sec++; //秒加1
- if(sec>59)
- { sec=0; min++; //分加1
- if(min>59)
- { min=0; hou++; //時加1
- if(hou>23) hou=0;
- } } //把時間變量分離成要顯示的各位
- disbuf[0]=hou/10; disbuf[1]=hou%10;
- disbuf[2]=min/10; disbuf[3]=min%10;
- disbuf[4]=sec/10; disbuf[5]=sec%10;
- } }
- void main() //主函數
- {
- TMOD=0x01; //設置T0以模式1定時
- TL0=55536%256; //設置T0定時10ms初值
- TH0=55536/256;
- ET0=1; //開T0中斷
- EA=1; //開總中斷
- TR0=1; //定時器0開運行
- hou=12; min=0; //時間初始化
- sec=0; num=0;
- while(1) //循環,并隨時處理中斷
- {
- display(); //調用數碼管進行掃描顯示
- keyscan( ); // 按鍵掃描
- } }
復制代碼
所有資料51hei提供下載:
電子表可加可減可暫停.rar
(16.96 KB, 下載次數: 24)
2019-12-10 17:05 上傳
點擊文件名下載附件
|