本帖最后由 cy009 于 2020-9-20 23:20 編輯
學習單片機動態數碼管顯示,數字時鐘是最好的案例,本仿真案例有以下特點。
1.使用定時器0,方式2,可以減小定時器的誤差;
2.調時、調分按鍵具有連加功能,與常見的按鍵松手檢測有區別;
3.具有秒點顯示功能,若制作實物案例,可購買帶秒點的數碼管。
本仿真案例推薦使用Proteus 8.6以上版本。
51hei圖片20200920173659.png (65.61 KB, 下載次數: 57)
下載附件
2020-9-20 17:40 上傳
參考程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit w1=P2^2;
sbit w2=P2^3;
sbit w3=P2^4;
sbit w4=P2^5;
sbit s1=P1^3;
sbit s2=P1^4;
sbit s3=P1^5;
uint shi,fen,sec;
uint num,s1num,keynum;
uchar m;
void delay(uint);
void keyscan();
void time_adj();
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共陰代碼
void display() //數碼管顯示
{
w1=1;w2=1;w3=1;w4=1;
P0=~tab[shi/10%10];
if((s1num==2)|(shi/10%10==0)){w1=1;}
else{w1=0;}
delay(5);
w1=1;
if(num<2000)
{P0=~(tab[shi%10]|0x80); } //秒點顯示
else
{P0=~tab[shi%10];}
if(s1num==2){w2=1;}
else{w2=0;}
delay(5);
w2=1;
P0=~tab[fen/10%10];
if(s1num==1){w3=1;}
else{w3=0;}
delay(5);
w3=1;
P0=~tab[fen%10];
if(s1num==1){w4=1;}
else{w4=0;}
delay(5);
w4=1;
}
void keyscan() //功能鍵函數
{
if(s1==0)
{
delay(5); //消抖
if(s1==0)
{
while(!s1)display();
s1num++;
if(s1num==3)
{
s1num=0;
}
}
}
}
void time_adj() //加、減鍵時間調整函數
{
if(s1num!=0)
{
if(s2==0)
{
keynum++;
if(keynum>18) //連加延時
{
switch(s1num)
{
case 1:
shi++;
if(shi>23)
{shi=0;}
keynum=0;
break;
case 2:
fen++;
if(fen>59)
{fen=0;}
keynum=0;
break;
}
}
}
if(s3==0)
{
keynum++;
if(keynum>18)
{
switch(s1num)
{
case 1:
shi--;
if(shi<0)
{shi=23;}
keynum=0;
break;
case 2:
fen--;
if(fen<0)
{fen=59;}
keynum=0;
break;
}
}
}
}
}
void main()
{
shi=12;fen=0;sec=0;num=0;
TMOD=0x02;
TH0=0x06;
TL0=0x06;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();
time_adj();
display();
if(sec>59)
{
sec=0;
fen++;
if(fen>59)
{
fen=0;
shi++;
if(shi>23)
{
shi=0;
}
}
}
}
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void Timer0() interrupt 1 //定時器服務
{
num++;
if(num==4000){num=0;sec++;}
}
51hei.png (12.87 KB, 下載次數: 68)
下載附件
2020-9-20 17:45 上傳
全部資料51hei下載地址:
4位數字時鐘(定時器方式2, 按鍵連加).rar
(63.03 KB, 下載次數: 71)
2020-9-20 17:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|