📄 18.c
字号:
/*
*********************************************************************************************************
*
* 倒计时牌源代码
*
* CPU :AT89C2051
*
* FILE : 18.C
* By : CC
* DATE : 2008-04-05
* VERSION : 1.0
* 修改记录 :
*********************************************************************************************************
*/
#include<REG2051.H>
#include<X5045.H>
#define uchr unsigned char
#define uint unsigned int
#define T100MS 90//100ms
#define T500MS 420//500ms
#define T1S 1000//1000ms
#define TMAX 20000//20s
#define DISP_0 0xFC
#define DISP_1 0x0C
#define DISP_2 0xDA
#define DISP_3 0xF2
#define DISP_4 0x66
#define DISP_5 0xB6
#define DISP_6 0xBE
#define DISP_7 0xE0
#define DISP_8 0xFE
#define DISP_9 0xF6
#define DISP_10 0x01
sbit LE = P3^7;
sbit p17 = P1^7;
bit freset = 0;//复位标志
bit frcntdstart = 0;//红倒计时开始标志
bit fgcntdstart = 0;//绿倒计时开始标志
bit frpulsechk = 0;//红脉宽检查开始标志
bit fgpulsechk = 0;//绿脉宽检查开始标志
bit frcntdend = 0;//红倒计时结束标志
bit fgcntdend = 0;//绿倒计时开始标志
bit frcomp = 0;//红倒计时比较标志
bit fgcomp = 0;//绿倒计时比较标志
bit frdisp = 0;//红倒计时显示标志
bit fgdisp = 0;//绿倒计时显示标志
uchr rcountdn[20] = 0;//红倒计时
uchr gcountdn = 0;//绿倒计时
uchr rcntdtim = 0;//红倒计时计数器
uchr gcntdtim = 0;//绿倒计时计数器
uint rchktim = 0;//红脉宽计数器
uint gchktim = 0;//红脉宽计数器
uint r1stim = 0;//红1秒计数器
uint g1stim = 0;//红1秒计数器
/*uint tt2=0;
uint tt1=0;
uint tt0=0;
uint tt[10]={0};*/
//T0:16位,1ms
void t0int() interrupt 1
{
TL0=0x66;
TH0=0xFC;
//tt0++;
if(frpulsechk)
{
rchktim++;
if(rchktim>=T1S)
{
frpulsechk=0;
rchktim=0;
if(frcntdstart)
{
frcntdend=1;
}
}
}
if(fgpulsechk)
{
gchktim++;
if(gchktim>=T1S)
{
fgpulsechk=0;
gchktim=0;
if(fgcntdstart)
{
fgcntdend=1;
}
}
}
if(frcntdstart)
{
if(frcntdend==0)
{
r1stim++;
rcntdtim++;
if(r1stim>=T1S)
{
r1stim=0;
frdisp=1;
}
if(rcntdtim>=TMAX)
{
frcomp=1;
frcntdstart=0;
frcntdend=0;
frdisp=0;
}
}
else
{
frcomp=1;
frcntdstart=0;
frcntdend=0;
frdisp=0;
}
}
if(fgcntdstart)
{
if(fgcntdend==0)
{
g1stim++;
gcntdtim++;
if(g1stim>=T1S)
{
g1stim=0;
fgdisp=1;
}
if(gcntdtim>=TMAX)
{
fgcomp=1;
fgcntdstart=0;
fgcntdend=0;
fgdisp=0;
}
}
else
{
fgcomp=1;
fgcntdstart=0;
fgcntdend=0;
fgdisp=0;
}
}
}
void rint() interrupt 0
{
frpulsechk=1;
p17=!p17;
/* tt1++;
if(tt1>=100)
{
tt2++;
tt[tt2]=tt0;
tt0=0;
tt1=0;
}
if(tt2=10) tt2=0;
*/
if (frcntdstart==0)
{
if(rchktim>T100MS && rchktim<T500MS)//如果时间大于100ms并且小于500ms,准备开始计数
{
rcntdtim=rchktim;//延时计数器
r1stim=rchktim;//
frcntdstart=1;//延时开始标志
}
}
rchktim=0;//清0脉宽计数器
}
void gint() interrupt 2
{
fgpulsechk=1;
if (fgcntdstart==0)
{
if(gchktim>T100MS && gchktim<T500MS)//如果时间大于100ms并且小于500ms,准备开始计数
{
gcntdtim=gchktim;//延时计数器
g1stim=gchktim;//
fgcntdstart=1;//延时开始标志
}
}
gchktim=0;//清0脉宽计数器
}
void disp(uchr num)
{
P1=0xFF;
LE=0;
switch(num%10)
{
case 0:P1 = P1 & DISP_0; break;
case 1:P1 = P1 & DISP_1; break;
case 2:P1 = P1 & DISP_2; break;
case 3:P1 = P1 & DISP_3; break;
case 4:P1 = P1 & DISP_4; break;
case 5:P1 = P1 & DISP_5; break;
case 6:P1 = P1 & DISP_6; break;
case 7:P1 = P1 & DISP_7; break;
case 8:P1 = P1 & DISP_8; break;
case 9:P1 = P1 & DISP_9; break;
default: break;
}
if(num>=10) P1&=DISP_10;
LE=1;
delay();
LE=0;
}
void main(void)
{
uchr rdisptim=0;
uchr gdisptim=0;
uchr tmp=0,i=0;
P1=0xFF;
LE=0;
EA=1;
//外部中断允许,下降沿触发
EX0=1;
PX0=1;
IT0=1;
EX1=1;
PX1=1;
IT1=1;
//T0:16位,10ms
TMOD=0X11;
ET0=1;
TL0=0x66;
TH0=0xFC;
TR0=1;
//x5045ini();
while(1)
{
if(frdisp==1)
{
frdisp=0;
if(rdisptim>1)
{
rdisptim--;
disp(rdisptim);
}
else
{
P1=0;
LE=1;
delay();
LE=0;
}
}
if(fgdisp)
{
fgdisp=0;
if(gdisptim)
{
disp(gdisptim);
gdisptim--;
}
}
if(frcomp)
{
frcomp=0;
tmp=(rcntdtim-T1S)/1000;
if(((rcntdtim-T1S)%1000)/100 >= 5) tmp++;
if(rcountdn!=tmp)
{
rcountdn[i]=tmp;
i++;
}
rdisptim=rcountdn;
}
if(fgcomp)
{
fgcomp=0;
tmp=(gcntdtim-T1S) / 1000;
if(((gcntdtim-T1S) % 1000)/100 >= 5) tmp++;
if(gcountdn!=tmp)
{
gcountdn=tmp;
}
gdisptim=gcountdn;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -