|
IMG_20160106_184748.gif (157.54 KB, 下載次數: 359)
下載附件
2016-1-6 19:01 上傳
截圖00.gif (209.75 KB, 下載次數: 384)
下載附件
設計的PCB
2016-1-6 19:01 上傳
截圖02.gif (169.16 KB, 下載次數: 395)
下載附件
設計的PCB
2016-1-6 19:00 上傳
由于經常用感光法做電路板,對曝光時間的控制非常重要,總是看表計時感到非常麻煩。于是用單片機做了個定時器,采用了6位數碼管顯示,前3位顯示分鐘,后2位顯示秒鐘,并已倒計時的方式顯示剩余時間,(靈感來自微波爐。)時間到蜂鳴器響,同時繼電器吸合,切斷曝光燈的電源。
源碼如下:
#include<reg51.h>
#define KeyPort P1
sbit Key_UP=P1^4;
sbit Key_DOWN=P1^5;
unsigned char KeyV,TempKeyV,num;
sbit P25=P2^5;//數碼管第1位
sbit P26=P2^4;//數碼管第2位
sbit P29=P2^3; //數碼管第3位
sbit gang=P2^0; ///分隔符
sbit P27=P2^1;//數碼管第3位
sbit P28=P2^2;// 數碼管第4位
sbit P12=P1^6;//時間加
sbit P13=P1^7; //時間減
sbit JDQ=P3^4;//繼電器
unsigned int js;
unsigned int ds=1000,x,y;//倒計時初始時間,加時,減時 30分鐘
unsigned char jsflag;
static unsigned int i;
unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
unsigned char KeyScan(void);//鍵盤掃描
void tiaojie(void);
void Delay(unsigned int ii) //1MS
{
unsigned int jj;
for(;ii>0;ii--)
for(jj=0;jj<125;jj++);
}
void main()
{
EA = 1; //允許CPU中斷
ET0 = 1; //定時器0中斷打開
ET1=1; //定時器1中斷打開
TMOD = 0x11; //設定時器0 1為模式1,16位模式
TH0=0xB8;
TL0=0x00; //設定時值為(20ms)
TH1=0xdc; //設定時值為(10ms)
TL1=0x00;
TR0 = 1;
TR1=1;
KeyV = 0;
TempKeyV = 0;
jsflag=0;
while(1);
}
//定時器0中斷外理中鍵掃描和顯示
void Key_Time0(void) interrupt 1 using 2
{
TH0=0xB8;
TL0=0x00; //設定時值為20000us(20ms)
if (!Key_UP)
KeyV = 1;
if (!Key_DOWN)
KeyV = 2;
if(P12==0)
{
Delay(20);
if(P12==0)
ds=ds+100;//定時加1分鐘 (調節精度)
while(!P12);
}
if(P13==0)
{
Delay(20);
if(P13==0)
ds=ds-100; //定時減1分鐘
while(!P13);
}
if (KeyV!= 0) //有鍵按下
{
Delay(10); //延時防抖 按下10ms再測
if (!Key_UP)
TempKeyV = 1;
if (!Key_DOWN)
TempKeyV = 2;
if (KeyV == TempKeyV) //兩次值相等為確定接下了鍵
{
if (KeyV == 1)
{
jsflag=0;
if(ds==0)
{
ds=100;
}
js=js+1;
JDQ=1; //繼電器吸合
if(js==50)
{
js=0;
ds=ds-1;
}
}
if(KeyV==2)
{
jsflag=1;
}
}
}
if(jsflag==1)
{
JDQ=0;
}
if(ds==0)
{
JDQ=0;
jsflag=1;
KeyV=0;
}
}
void disp_Time1(void) interrupt 3 using 3
{
TH1=0xdc;
TL1=0x00;
x=ds/10000;
P0=LEDDis[x]; //分鐘百位
P25=0;
Delay(2);
P25=1;
y=(ds%10000)/1000;//分鐘十位
P0=LEDDis[y];
P26=0;
Delay(2);
P26=1;
P0=LEDDis[((ds%10000)%1000)/100];//分鐘各位
P29=0;
Delay(2);
P29=1;
P0=0xbf; //分鐘與秒的間隔符
gang=0;
Delay(2);
gang=1;
P0=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
if(((ds%1000)%100)/10>=6) //滿60,百位減一
{
ds=ds-10;
P0=LEDDis[6];
}
P27=0;
Delay(2);
P27=1;
P0=LEDDis[(((ds%10000)%1000)%100)%10]; //秒個位
P28=0;
Delay(2);
P28=1;
}
綠色的為秒顯示,紅色的為分顯示,也可以隨自己喜歡重新定義,改一下I/O口就行了。
|
-
-
調試.rar
2016-1-6 19:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
18.76 KB, 下載次數: 271, 下載積分: 黑幣 -5
-
-
倒計時.rar
2016-1-6 19:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
43.38 KB, 下載次數: 303, 下載積分: 黑幣 -5
評分
-
查看全部評分
|