電路圖很簡單,數碼管是用2片573 接到p2口,通過p0.0 和P0.1鎖存控制,詳見單片機開發板上面的電路:http://www.zg4o1577.cn/f/51hei-5.pdf , 大家可以按里面的圖接,只需要端口要改為本程序中的即可.可通過按鍵實現設置定時的時間.小時分秒設置等等.
//////////////////包含頭文件及宏定義//////////////////////////////////////
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/////////////////////////////////////////////////////////////////////////
////////////////繼電器響應動作指示燈//////////////////////////////////////
sbit light=P1^0;
sbit int0_ok=P3^2;
sbit int1_ok=P3^3;
/////////////////數碼管的段位鎖存////////////////////////////////////////
sbit duan=P0^0;
sbit wei=P0^1;
uchar bit1,bit2,bit3,bit4,bit5,bit6;///////////////小時 分鐘 秒鐘顯示碼
uchar fen=0;// 分鐘緩存
uchar miao=0;//秒緩存
uchar shi=0;//小時緩存
uchar key_temp;/////按鍵暫存
//uchar key_old;
uchar key_count;//按鍵計數
uchar key_back;/////按鍵備份
uchar key_data;//////按鍵數值
uchar key_con;////
uchar key_ok;
uchar int0_function=0;///功能0,做調節始終
uchar int1_function=0;///功能1,做運行停止用
uchar time;////定時常數
uchar t2time;
#define KEYDELAY 25 /*首鍵延遲次數*/
#define KEYLOOP 10 /*連續鍵間隔次數,需小于KEYDELAY*/
void shanshuo(uchar aa,uchar ii);
void init();
void sign(uchar i);
////////////////毫秒級的延時////////////////////////////////////////////////
void delayms(uint i) //誤差 0us
{
uint c;
unsigned char a,b;
for(c=i;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/////////////////////////////數碼管的段位碼///////////////////////////////
uchar code tableduan[]={ //共陽極數碼管段碼
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8, 0x80,0x90,//0-9
//0x88,0x83,0xc6,0xa1,0x86,0x8E//A-F
0xbf//-
};
uchar code tablewei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位碼
uchar code welcom[]={0xbf,0xbf,0xc0,0x8c,0x86,0xc8,0xbf,0xbf};//--OPEN-- 1
uchar code on[]={0xbf,0xbf,0xbf,0xc0,0xc8,0xbf,0xbf,0xbf};//---on--- 2
uchar code off[]={0xbf,0xbf,0xc0,0x8e,0x8e,0xbf,0xbf,0xbf};//--off--- 3
uchar code closed[]={0xbf,0xc6,0xc7,0xc0,0x92,0x86,0xf8,0xbf};//-closed- 4
/////////////////////////////////數碼管顯示程序///////////////////////////////////////
void display(uchar duan1,uchar wei1)
{
P2=0xff;
duan=0;
wei=0;
P2=tableduan[duan1];
duan=1;
duan=0;
P2=tablewei[wei1];
wei=1;
wei=0;
delayms(1);
}
/////////////////////////////////數碼管顯示程序///////////////////////////////////////
//////////////////////////////////////數碼管顯示位計算/////////////////////////////////
void jisuan()
{
bit1=shi/10;
bit2=shi%10;
bit3=fen/10;
bit4=fen%10;
bit5=miao/10;
bit6=miao%10;
/*
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);*/
}
//////////////////////////////////////數碼管顯示位計算/////////////////////////////////////////////////
//////////////////////////////////////單擊按鍵鍵值表////////////////////////////////////////////////////////
uchar key_data_jisuan(uchar dat)
{
uchar key;
switch(dat)
{
case 0xfb:key=1;break;
case 0xf7:key=2;break;
case 0xef:key=3;break;
case 0xdf:key=4;break;
case 0xbf:key=5;break;
case 0x7f:key=6;break;
default:key=0;break;
}
return key;
}
//////////////////////////////////////長按按鍵鍵值表////////////////////////////////////////////////////////
/*uchar key_data_con_jisuan(uchar dat)
{
uchar key;
switch(dat)
{
case 0xef:key=5;break;
case 0xdf:key=6;break;
default:key=0;break;
}
return key;
}
*/
/////////////////////////////////////////鍵盤掃描//////////////////////////////////////////////////////
void key_scan()
{
P3=0xff;
if((P3&0xff)!=0xff)
{
delayms(10);
key_temp=P3;
if(key_temp==key_back)
{
delayms(10);
key_count++;
if (key_count==KEYDELAY) //連續鍵,不要則把此if屏蔽
{
key_ok=0;
key_data=key_data_jisuan(key_temp); //鍵*
key_count=KEYDELAY-KEYLOOP;
}
}
else
{
key_count=0;
key_back=key_temp;
}
//key_ok=1;
}
else
{
if(key_count)
{
key_count=0;
key_data=key_data_jisuan(key_temp);
}
key_temp=0;
key_ok=1;
}
}
/////////////////定時器0的初始化///////////////////////////
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0x0B0;
ET0 = 1;
//TR0 = 1;
//EA = 1;
}
void InitTimer1(void)
{
TMOD = 0x10;
TH1 = 0x3C;
TL1 = 0x0B0;
EA = 1;
// ET1 = 1;
// TR1 = 1;
}
////////////////////////////主函數開始///////////////////////////
void main()
{
uchar ss;
InitTimer0();
// InitTimer1();
while(1)
{
key_scan();
if(key_data==1)
{
key_data=0;
int0_function++;
if(int0_function==5)
{
int1_function=0;
ss=0;
int0_function=1;
}
}
if(key_data==2)
{
key_data=0;
int1_function++;
if(int1_function>=3)int1_function=1;
}
if(int0_function==0)
{
sign(1);
}
////////////////////小時設定///////////////////////////
if(int0_function==1)
{
TR0 = 0;
EA = 0;
// ET1 = 1;
// TR1 = 1;
light=1;
// shanshuo(0,1);
if(key_data==3)
{
key_data=0;
shi++;if(shi==24)shi=0;
}
if(key_data==4)
{
key_data=0;
shi--;if(shi==0)shi=23;
}
jisuan();
shanshuo(0,1);
for(ss=10;ss>0;ss--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
for(ss=10;ss>0;ss--)
{
// display(bit1,0);
// display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
}
/////////////////分鐘設定/////////////////////////
if(int0_function==2)
{
TR0 = 0;
EA = 0;
// ET1 = 1;
// TR1 = 1;
light=1;
if(key_data==3)
{
key_data=0;
fen++;if(fen==60)fen=0;
}
if(key_data==4)
{
key_data=0;
fen--;if(fen==0)fen=59;
}
jisuan();
// shanshuo(0,2);
for(ss=10;ss>0;ss--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
for(ss=10;ss>0;ss--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
// display(bit3,3);
// display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
}
//////////////////////秒數設定////////////////////////////
if(int0_function==3)
{
TR0 = 0;
EA = 0;
// ET1 = 1;
// TR1 = 1;
light=1;
if(key_data==3)
{
key_data=0;
miao++;if(miao==60)miao=0;
}
if(key_data==4)
{
key_data=0;
miao--;if(miao==0)miao=59;
}
jisuan();
// shanshuo(0,3);
for(ss=10;ss>0;ss--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
for(ss=10;ss>0;ss--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
// display(bit5,6);
// display(bit6,7);
}
}
if(int0_function==4)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
//if(int0_function==6)
//{
// sign(6);
//}
///////////////////////////計時開始/////////////////////
if(int1_function==1)
{
TR0 = 1;
EA = 1;
int0_function=4;
// ET1 = 0;
// TR1 = 0;
if((shi==0)&&(fen==0)&&(miao==0))
{
light=0;
}
jisuan();
shanshuo(0,0);
}
////////////////計時結束,關掉定時器和繼電器/////////////////
if(int1_function==2)
{
TR0 = 0;
EA = 0;
// ET1 = 1;
// TR1 = 1;
light=1;
int0_function=0;
int1_function=0;
jisuan();
sign(4);
}
// jisuan();
//shanshuo(0,0);
}
}
/////////////////定時器0的中斷服務///////////////////////////
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x3C;
TL0 = 0x0B0;
//add your code here!
time++;
if(time==20)
{
time=0;
if(miao>0)miao--;
if((miao==0)&&(fen>0)){miao=59;fen--;}
if((fen==0)&&(shi>0)){fen=59;shi--;}
}
}
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x3C;
TL1 = 0x0B0;
//add your code here!
t2time++;
if(t2time==20)t2time=0;
}
void shanshuo(uchar aa,uchar i)///如果i=1 是小時閃爍 ,如果i=2 是 分鐘閃爍,如果i=3 是秒鐘閃爍
{
//uchar i;//閃爍頻率
if(aa==4|aa==0)
{
for(i;i>0;i--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
}
if(aa==1)
{
for(i;i>0;i--)
{
// display(bit1,0);
// display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
}
if(aa==2)
{
for(i;i>0;i--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
// display(bit3,3);
// display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
}
if(aa==3)
{
for(i;i>0;i--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
// display(bit5,6);
// display(bit6,7);
}
}
for(i;i>0;i--)
{
display(bit1,0);
display(bit2,1);
display(10,2);
display(bit3,3);
display(bit4,4);
display(10,5);
display(bit5,6);
display(bit6,7);
}
}
/////////////////閃爍程序/////////////////////////////////////////////////////////////
void sign(uchar i )// 1, 顯示open,顯示on 3,顯示off 4,顯示 closed
{
uchar bb;
if(i==0)
{
P2=0x00;
P0=0x03;
}
if(i==1)
{
for(bb=0;bb<8;bb++)
{
P2=0xff;
duan=0;
wei=0;
P2=welcom[bb];
duan=1;
//delayms(1);
duan=0;
P2=tablewei[bb];
wei=1;
//delayms(1);
wei=0;
delayms(1);
}
}
if(i==2)
{
for(bb=0;bb<8;bb++)
{
P2=0xff;
duan=0;
wei=0;
P2=on[bb];
duan=1;
//delayms(1);
duan=0;
P2=tablewei[bb];
wei=1;
//delayms(1);
wei=0;
delayms(1);
}
}
if(i==3)
{
for(bb=0;bb<8;bb++)
{
P2=0xff;
duan=0;
wei=0;
P2=off[bb];
duan=1;
//delayms(1);
duan=0;
P2=tablewei[bb];
wei=1;
//delayms(1);
wei=0;
delayms(1);
}
}
if(i==4|i==0)
{
for(bb=0;bb<8;bb++)
{
P2=0xff;
duan=0;
wei=0;
P2=closed[bb];
duan=1;
//delayms(1);
duan=0;
P2=tablewei[bb];
wei=1;
//delayms(1);
wei=0;
delayms(1);
}
}
}