|
以前发过一个用51单片机做的定时开关,用的40脚的89C52芯片.一是体积太大,而是不需要那么多的IO。所以决定把程序移植到体积小一些的单片机,最后选择了28脚的STC15F204EA,一是利用单片机的推挽输出直接驱动共阴数码管显示,省去了驱动三极管。并且使用单片机内部自带的晶振,体积大大缩小,电路板面积只有25*100MM。
/////STC15F204EA 4位共阳数码管定时器
#include "STC15F2K.h"
#define KeyPort P1/////定义按键在P1
unsigned char KeyV,TempKeyV,num;
//定义数码管
sbit DS2=P3^7; //数码管第2位 分十位
sbit DS3=P3^6; //数码管第3位 分个位
sbit DS4=P3^5; //数码管第3十位
sbit DS5=P3^4; // 数码管第4 秒个位
//定义按键
sbit STAR=P1^1; /// 启动
sbit STOP=P1^3; /// 停止
sbit PA=P1^2; /// 时间加
sbit PB=P1^0; /// 时间减
//定义输出
sbit JDQ=P1^5; // 继电器
sbit FMQ=P1^6; // 蜂鸣器
sbit LED1=P1^7; // LED指示灯 开始
sbit LED2=P1^4; // LED指示灯 停止
unsigned int js;
unsigned int ds=100,x,y;//倒计时初始时间,100=1分钟
unsigned char jsflag;
static unsigned int i;
unsigned char code LEDDis[]={
0xBF,/*0*/
0x86,/*1*/
0xDB,/*2*/
0xCF,/*3*/
0xE6,/*4*/
0xED,/*5*/
0xFD,/*6*/
0x87,/*7*/
0xFF,/*8*/
0xEF,/*9*/
};//共阴带小数点字模 ,使用时钟数码管。
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 (!STAR)
KeyV = 1;
if (!STOP)
KeyV = 2;
if(PA==0)
{
Delay(20);
if(PA==0)
ds=ds+100;//定时加1分钟 ,100=1分钟,(调节精度)
while(!P12);
}
if(PB==0)
{
Delay(20);
if(PB==0)
ds=ds-100; //定时减1分钟, 100=1分钟,
while(!P13);
}
if (KeyV!= 0) //有键按下
{
Delay(10); //延时防抖 按下10ms再测
if (!STAR)
TempKeyV = 1;
if (!STOP)
TempKeyV = 2;
if (KeyV == TempKeyV) //两次值相等为确定接下了键
{
if (KeyV == 1)
{
jsflag=0;
if(ds==0)
{
ds=100;
}
js=js+1;
JDQ=0; //继电器吸合
FMQ=1; //蜂鸣器不响
LED1=1; //LED不亮
LED2=0; //LED亮
if(js==50)
{
js=0;
ds=ds-1;
}
}
if(KeyV==2)
{
jsflag=1;
}
}
}
if(jsflag==1)
{
JDQ=1; //继电器断开
FMQ=0; //蜂鸣器响
LED1=0; //LED亮
LED2=1; //LED不亮
}
if(ds==0)
{
JDQ=1; //继电器断开
FMQ=0; //蜂鸣器响
LED1=0; //LED亮
LED2=1; //LED不亮
jsflag=1;
KeyV=0;
}
}
void disp_Time1(void) interrupt 3 using 3
{ P2M1 = 0x00;
P2M0 = 0xFF; //// 设P2口为推挽模式
TH1=0xdc;
TL1=0x00;
x=ds/10000;
y=(ds%10000)/1000;//分钟十位
P2=LEDDis[y];
DS2=0;
Delay(2);
DS2=1;
P2=LEDDis[((ds%10000)%1000)/100];
//分钟个位
DS3=0;
Delay(2);
DS3=1;
P2=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
if(((ds%1000)%100)/10>=6) //满60,百位减一
{
ds=ds-10;
P2=LEDDis[6];
}
DS4=0;
Delay(2);
DS4=1;
P2=LEDDis[(((ds%10000)%1000)%100)%10]; //秒个位
DS5=0;
Delay(2);
DS5=1;
} |
-
原理图
-
PCB
-
PCB2
-
显影后的电路板
-
丝印
-
阻焊
-
侧面
-
正面
-
装在自己做的曝光台上
评分
-
1
查看全部评分
-
|