#include<stc89.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void sendchar(char ch) ; //发送数据
void Timer0Init(void); //中断
sbit LED1=P4^1;
sbit LED2=P2^7;
sbit KEY1=P0^4;
sbit KEY2=P0^5;
sbit KEY3=P0^6;
sbit KEY4=P0^7;
sbit KEY5=P0^2;
sbit KEY6=P0^3;
sbit DSA=P1^6;
sbit DSB=P1^7;//模拟串口数据发送端
sbit CLK=P1^3;//模拟时钟控制端
sbit WX1=P2^0;
sbit WX2=P2^1;
sbit WX3=P2^2;
sbit WX4=P2^3;
sbit JDQ=P2^5;
bit key_change_flg = 0; //按键按下的标志 0表示没有按下,1表示有按键按下
bit time_over_flg = 0; //时间溢出标志位,0为初始,1表示溢出,执行中断。
bit cnt_change_flg = 1; //继电器动作标志,0代表断开, 1代表吸合
bit one_sec_OK_Flg = 0; //一秒中断标志,1秒的中断结束。
//bit start_JDQCnt = 1;//1表示吸合,0表示断开
bit start_EN = 0; //为1 开始按照设置时间进行吸合 和 断开 0:不进行吸合和断开
bit stop_yunxing = 1;//
unsigned char one_sec_cnt = 0;//计数变量,从0加到200,完成1秒钟的时间。
unsigned char keyNum = 0;//当前按下的按键代号 ,0表示没有,按键号从key1-6
uint startTimeSec = 0; //要启动的时间标准
//uint startTimeCnt = 0; //启动计数
uint stopTimeSec = 0; //要停止的时间标准
//uint stopTimeCnt = 0; //停止计数
uint showNum = 0; //要显示的数字
char code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};//0-9全灭 //
void sendchar(char ch) //把代码发送到移位寄存器
{
uchar i;
DSA=1;
for(i=0;i<8;i++)//8位数据传输完毕后才给数码管显示
{
DSB=ch&0x01; //P1^7=0000000x,DAT一直保持该状态,等时钟脉冲触发传递数值
CLK=0;
CLK=1; //这两句制造一个上升沿 CLK=1;
ch>>=1;//DAT=ch&0x01和ch》》=1的功能是一次取出八位二进制ch的每一位赋值给74hc164
}
DSA = 0;
//Delay20us();
}
void Delay20us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 7;
while (--i);
}
void Delay3ms() //@12.000MHz
{
unsigned char i, j;
i = 6;
j = 211;
do
{
while (--j);
} while (--i);
}
void display(uint number)//数码管显示函数
{
uint qian,bai,shi,ge;
number = number%10000;//这句话的意思?number的数值范围65535,五位数取余,将number限定在个位
qian=number/1000;
sendchar(tab[qian]);
WX4 = 0;
Delay3ms();
WX4 = 1;
bai=number%1000/100;
sendchar(tab[bai]);
WX3 = 0;
Delay3ms();
WX3 = 1;
shi=number%100/10;
sendchar(tab[shi]);
WX2 = 0;
Delay3ms();
WX2 = 1;
ge=number%10;
sendchar(tab[ge]);
WX1 = 0;
Delay3ms();
WX1 = 1;
}
//扫描一次按键
void readKey(void)
{
if(0==KEY1)
{
Delay20us();//延时20us
if(0==KEY1)//再次判断是0
{
while(0==KEY1);//等待按键抬起来
}
key_change_flg = 1;//按键按下的标志
keyNum = 1; //当前按键按下的代号,这里为什么要加个这个代号?
}
else if(0==KEY2)
{
Delay20us();//延时20us
if(0==KEY2)//再次判断是0
{
while(0==KEY2);//等待按键抬起来
}
key_change_flg = 1;
keyNum = 2;
}
else if(0==KEY3)
{
Delay20us();//延时50us
if(0==KEY3)//再次判断是0
{
while(0==KEY3);//等待按键抬起来
}
key_change_flg = 1;
keyNum = 3;
}
else if(0==KEY4)
{
Delay20us();//延时20us
if(0==KEY4)//再次判断是0
{
while(0==KEY4);//等待按键抬起来
}
key_change_flg = 1;
keyNum = 4;
}
else if(0==KEY5)
{
Delay20us();//延时20us
if(0==KEY5)//再次判断是0
{
while(0==KEY5);//等待按键抬起来
}
key_change_flg = 1;
keyNum = 5;
}
else if(0==KEY6)
{
Delay20us();//延时20us
if(0==KEY6)//再次判断是0
{
while(0==KEY6);//等待按键抬起来
}
key_change_flg = 1;
keyNum = 6;
}
}
//按键按下后的处理
void keyCmd(void) //按键执行的任务函数
{
switch(keyNum)
{
case 0://没有按键按下
break;
case 1://1号按键按下,启动时间+
startTimeSec++;
if(startTimeSec>120)
{
startTimeSec = 0; //这里让时间从0开始累加
}
showNum = startTimeSec; //显示时间为当前的值
break;
case 2: //启动时间-
if(startTimeSec>0)
{
startTimeSec--;
}
showNum = startTimeSec;
break;
case 3:
if(stopTimeSec>0) //停止时间-
{
stopTimeSec--;
}
showNum = stopTimeSec;
break;
case 4: //停止时间+
stopTimeSec++;
if(stopTimeSec>120)
{
stopTimeSec = 0;
}
showNum = stopTimeSec;
break;
case 5: //my 启动继电器吸合动作按键
start_EN = 1;
showNum = startTimeSec;
JDQ = 1;//缺继电器吸合
LED1 = 0;
LED2 = 1;
one_sec_cnt = 0;
one_sec_OK_Flg = 0;
break;
case 6: //my 关闭继电器动作
start_EN = 0;
JDQ=0;
LED1 = 1;
LED2 = 0;
break;
default:
break;
}
//display(startTimeSec);
}
/* Timer2 interrupt routine */
void tm2_isr() interrupt 5
{
TF2 = 0;
time_over_flg = 1;//时间溢出标志
one_sec_cnt++; //1秒定时变量
if(one_sec_cnt>=200)
{
one_sec_cnt = 0;
one_sec_OK_Flg = 1;//立1秒到的标志
}
}
void Timer2Init(void) //5毫秒@12.000MHz
{
T2MOD = 0; //初始化模式寄存器
T2CON = 0; //初始化控制寄存器
TL2 = 0x78; //设置定时初始值
TH2 = 0xEC; //设置定时初始值
RCAP2L = 0x78; //设置定时重载值
RCAP2H = 0xEC; //设置定时重载值
TR2 = 1; //定时器2开始计时
ET2 = 1; //enable timer2 interrupt
EA = 1; //open global interrupt switch
}
void main()
{
Timer2Init();
JDQ = 0;
LED1 = 1;
LED2 = 0;
WX1=1;
WX2=1;
WX3=1;
WX4=1;
showNum = 0000;
while(1)
{
/***********数码管扫描**************/
if(1==time_over_flg)
{
time_over_flg = 0;
display(showNum);
}
readKey(); //读取按键
if(1==key_change_flg) //按键处理
{
key_change_flg = 0;
keyCmd();
}
if(1==start_EN)//if(1==start_JDQCnt) //继电器吸合 关闭控制
{
if(one_sec_OK_Flg)
{
one_sec_OK_Flg = 0;
if(1==cnt_change_flg)//吸合区间 //计数--
{
if(showNum>0)
{
showNum--;
}
else
{
showNum = stopTimeSec;
cnt_change_flg = 0;
LED1 = 1;
JDQ = 0;//缺继电器断开
}
}
else //断开区间
{
if(showNum>0)
{
showNum--;
}
else
{
showNum = startTimeSec;
cnt_change_flg = 1;
LED1 = 0;
JDQ = 1;//缺继电器吸合
}
}
}
}
}
}