電子秒表顯示器C51仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (184.52 KB, 下載次數: 32)
下載附件
2022-5-20 16:06 上傳
單片機源程序如下:
- #include "reg51.h"
- #include "stdio.h"
- #define uint unsigned int
- #define uchar unsigned char
- uchar data second=23,minute=10,hour=4;
- uchar data disbuf[6]={0};
- uchar bdata FLAG=0;
- sbit H_M=FLAG^1; //小時 分鐘切換標志位 啟動后默認為分鐘設置狀態
- sbit P1_0=P1^0; //增1鍵
- sbit P3_2=P3^2; //小時,分鐘切換鍵
- //定義共陰段碼 0-9
- uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //計數變量
- uchar data count=0;
- //定時器0的中斷服務程序 50ms
- void timer0(void) interrupt 1 using 1
- {TH0=-50000/256;
- TL0=-50000%256;
- count++;
- if(count==20)
- {count=0;
- second++;
- if(second==60)
- {second=0;
- minute++;
- if(minute==60)
- {minute=0;
- hour++;
- if(hour==24)
- {hour=0;}
- }
- }
- }
- return;
- }
- //延時程序
- void dlms(void)
- {uchar i;
- for(i=2000;i>0;i--){}
- }
- //外部中斷0的中斷服務程序
- void int0(void) interrupt 0 using 2
- {
- while(!P3_2) //等待按鍵彈起
- {
- dlms();
- }
- dlms( );
- if(P3_2) //按鍵彈起
- H_M=!H_M;
- }
- //顯示程序
- void disp(void)
- {uchar i,j;
- uchar bdata sel;
- disbuf[0]=second%10;
- disbuf[1]=second/10;
- disbuf[2]=minute%10;
- disbuf[3]=minute/10;
- disbuf[4]=hour%10;
- disbuf[5]=hour/10;
- P2=0XFF; //關閉所示數碼管顯示
- sel=0x01;
- for(i=0;i<6;i++)
- {j=disbuf[i];
- P2=(sel^0xff); //得到位選
- P0=table[j]; //送段碼
- dlms();
- P2=0XFF;
- sel=sel<<1; //位選左移1位
- }
- }
- //加1處理程序
- void increa(void)
- {if(H_M) //H_M為1 表示小時設置
- {hour++;
- if(hour==24)
- {hour=0;
- disbuf[4]=0;
- disbuf[5]=0;
- }
- }
- else //H_M為0 表示分鐘設置
- {minute++;
- if(minute==60)
- {minute=0;
- disbuf[2]=0;
- disbuf[3]=0;
- }
- }
- }
- int main( )
- {
- TCON=0x01;
- TMOD=0x01;
- TH0=-50000/256;
- TL0=-50000%256;
- EA=1;
- ET0=1;
- EX0=1;
- TR0=1;
- while(1)
- {disp();
- if(!P1_0)
- {while(!P1_0)
- dlms();
- if(P1_0)
- increa();
- }
- }
- }
復制代碼 本人初學,僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬,文件下載:
Keil代碼與Proteus8.8仿真下載::
實驗4-電子鐘.7z
(35.15 KB, 下載次數: 29)
2022-5-20 11:00 上傳
點擊文件名下載附件
內涵源碼和proteus仿真8.6 下載積分: 黑幣 -5
|