Ⅰ 求程序用AT89C51單片機......用六位數碼管實現數字時鍾,顯示時分秒,用兩個按鍵可分別調整時、分。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,miao,fen,shi;
sbit m=P3^0;
sbit n=P3^1;
uchar code table[]={ //數碼管編碼表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void display(uchar miao,uchar fen,uchar shi);
void delay(uint z);
void init();
void main()
{
init();//初始化子程序
miao=0;
shi=0;
fen=0;
while(1)
{
display(miao,fen,shi);
}
}void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}void display(uchar miao,uchar fen,uchar shi) // 顯示子函數
{
P0=0x00;
P0=table[miao%10];
P2=0x7f;
delay(1);
P0=0x00;
P0=table[miao/10];
P2=0xbf;
delay(1); P0=0x00;
P0=table[fen%10];
P2=0xdf;
delay(1);
P0=0x00;
P0=table[fen/10];
P2=0xef;
delay(1);
P0=0x00;
P0=table[shi%10];
P2=0xf7;
delay(1); P0=0x00;
P0=table[shi/10];
P2=0xfb;
delay(1);
}void init() // 初始化子函數
{
temp=0;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; //租茄並定時器初值,定時50ms(12M晶振),由於考慮MCU指令處理時間,此處賦初值位45872
EA=1;
ET0=1;
TR0=1;
}void timer0() interrupt 1 //定時計數器中納族斷
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; 、
aa++;
if(aa==20) //中斷2次位1S,秒加1
{
miao++;
aa=0;
if(miao==60)
{
fen++; // 滿60S, 分加1,秒清0
miao=0;
if(fen==60)
{
shi++; // 小時弊跡加1
fen=0;
if(shi==24) shi=0; //小時滿
}
}
}
if(m==0) // 調分
{
delay(2);
if(m==0) fen++;
if(fen==60) fen=0;
delay(2);
while(!m);
}
if(n==0) // 調小時
{
delay(2);
if(n==0) shi++;
if(shi==24) shi=0;
delay(2);
while(!n);
}
}
Ⅱ 鍗曠墖鏈哄備綍鐢6涓鍔ㄦ佹暟鐮佺¤捐′竴涓縐掕〃
鍗曠墖鏈虹敤6涓鍔ㄦ佹暟鐮佺¤捐′竴涓縐掕〃瀹氭椂鍣ㄧ紪鍐欑浉搴旇佹眰瀹氭椂鏃墮棿銆傚垵濮嬪寲涓哄伐浣滄ā寮1瀹氭椂鍣ㄥ畾鏃舵椂闂翠負20ms錛屼篃灝辨槸瀹氭椂鍣ㄦ瘡婧㈠嚭涓嬈$殑鏃墮棿涓20ms錛屽垯婧㈠嚭50嬈″嵆涓1縐掗挓銆傞氳繃鏌ヨ㈡孩鍑烘爣蹇椾綅鐨勫煎嵆鍙銆
Ⅲ 51單片機靜態顯示可以實現6位數碼管123456的顯示嗎
多位數碼管無法實現靜態顯示,物理上正備它們就存在沖突。除非每一位顯示的內容都相同……
如果執著於用靜態顯示,行卜可以用6個1位數碼管,缺點是需要大量的舉帶毀管腳來控制(可以用串擴並方案或地址映射擴展方案,成本上得不償失)。