給大家參考下。美中不足的是,代碼延時有點小問題,按一下加或者減不是實時的,大家可以拿去調試。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (19.84 KB, 下載次數: 28)
下載附件
2017-11-8 02:50 上傳
0.png (45.52 KB, 下載次數: 30)
下載附件
2017-11-8 02:50 上傳
單片機源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar numh=21,numm=25,nums,hh,hl,mh,ml,sh,sl,ji;
- uchar code duan[]={
- 0xc0,0xF9,0xA4,0xB0,
- 0x99,0x92,0x82,0xF8,
- 0x80,0x90,0x88,0x83,
- 0xC6,0xA1,0x86,0x8E}; //數碼管段碼
- uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //數碼管位碼
- void init();
- void display(uchar hh,uchar hl,uchar mh,uchar ml,uchar sh,uchar sl);
- void main() //函數開始
- {
- init();//初始化程序
- while(1)
- {
- display(hh,hl,mh,ml,sh,sl);//時鐘顯示
- }
- }
- void init() //初始化函數
- {
- ji=0;
- TMOD=0X01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void display(uchar hh,uchar hl,uchar mh,uchar ml,uchar sh,uchar sl) //顯示函數
- {
- P0=duan[hh];
- P2=wei[7];
- P2=0xff;
-
- P0=duan[hl];
- P2=wei[6];
- P2=0xff; //顯示小時
-
- P0=0x40;
- P2=wei[5];
- P2=0xff; //顯示分隔
-
- P0=duan[mh];
- P2=wei[4];
- P2=0xff;
-
- P0=duan[ml];
- P2=wei[3];
- P2=0xff; //顯示分鐘
-
- P0=0x40;
- P2=wei[2];
- P2=0xff; //顯示分隔
-
- P0=duan[sh];
- P2=wei[1];
- P2=0xff;
-
- P0=duan[sl];
- P2=wei[0];
- P2=0xff; //顯示秒鐘
-
- }
- void time0() interrupt 1 //時鐘中斷
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ji++;
- if(ji==20) //時鐘刷新
- {
- ji=0;
- nums++; //秒鐘進位
- if(nums==60)
- {
- nums=0;
- numm++; //分鐘進位
- }
- if(numm==60)
- {
- numm=0;
- numh++; //小時進位
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
dzz1.rar
(62.97 KB, 下載次數: 43)
2017-11-7 12:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|