📄 1.c
字号:
/*
*********************************************************************************************************
* 倒计时牌源代码
*
* CPU :AT89C2051
*
* FILE : 18.C
* By : CC
* DATE : 2008-04-05
* VERSION : 1.0
* 修改记录 :
*********************************************************************************************************
*/
#include<REG2051.H>
#define uchr unsigned char
#define uint unsigned int
#define T100MS 180//100ms
#define T500MS 500//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
#define WIP 0x01 //X5045 写操作忙标志位掩码
#define WEL 0x02 //X5045 写保护标志位掩码
#define WDT 0x00 //X5045 看门狗时间:1.4s
//#define WDT 0x10 //X5045 看门狗时间:600ms
//#define WDT 0x20 //X5045 看门狗时间:200ms
//#define WDT 0x30 //X5045 关闭看门狗
#define BLA 0x00 //X5045 ROM块锁定范围:无
//#define BLA 0x04 //X5045 ROM块锁定范围:180H-1FFH
//#define BLA 0x08 //X5045 ROM块锁定范围:100H-1FFH
//#define BLA 0x0C //X5045 ROM块锁定范围:000H-1FFH
#define WREN 0x06 //允许X5045写操作
//#define WRDS 0x04 //禁止X5045写操作
#define RDSR 0x05 //读X5045状态寄存器
#define WRSR 0x01 //写X5045状态寄存器
sbit LE = P3^7;
sbit p17 = P1^7;
//X5045 PINS
sbit cs = P3^4;
sbit sck = P3^0;
sbit si = P3^1;
sbit so = P3^5;
extern bit freset = 0;
extern bit frcntdstart = 0;
//extern bit fgcntdstart = 0;
extern bit frpulsechk = 0;
//extern bit fgpulsechk = 0;
extern bit frcntdend = 0;
//extern bit fgcntdend = 0;
extern bit frcomp = 0;
//extern bit fgcomp = 0;
extern bit frdisp = 0;
//extern bit fgdisp = 0;
extern bit frdispstr = 0; //////////////
//extern uchr gcountdn = 0;
extern uint rcntdtim = 0; /////////////////
//extern uchr gcntdtim = 0;
extern uint rchktim = 0;
//extern uint gchktim = 0;
extern uint r1stim = 0;
//extern uint g1stim = 0;
extern uchr rcountdn = 0;
void rint(void);
void t0int(void);
void disp(uchr num);
void closedisp(void);
void delay(void);
void delay1(void);
void send(uchr tx);
void x5045ini(void);
//void 2051initi(void);
void main(void)
{
uchr rdisptim=0;
//uchr gdisptim=0;
uchr tmp=0,i=0;
P1=0xFF;
LE=0;
EA=1;
//外部中断允许,下降沿触发
PX0=1;
IT0=1;
PT0=0;
TMOD=0x11;
TL0=0x66;
TH0=0xFC;
TR0=1;
x5045ini();
delay1();
EX0=1;
ET0=1;
while(1)
{
cs=0;
cs=1;
if(frdispstr==1)//显示标志置1///
{
if(frdisp==1)//显示更新标志置1//
{
frdisp=0;//清显示更新标志//
if(rdisptim>2) { rdisptim--; disp(rdisptim); }
else closedisp();
}
}
else closedisp();
if(frcomp)
{
frcomp=0;
tmp=(rcntdtim-T1S)/1000;
if(((rcntdtim-T1S)%1000)/100 >= 5) tmp++;
if(rcountdn!=tmp) rcountdn=tmp;
rdisptim=rcountdn-1;
}
}
}
//////外部中断0服务程序///////////////////////////////////////////////////////////////////////////////
void rint(void) interrupt 0
{
if (frcntdstart==0)////触发脉冲还没有来到时//
{
if((rchktim>T100MS)&&(rchktim<T500MS))//如果时间大于100ms并且小于500ms,/////检测到触发脉冲////////准备开始计数
{
//p17=!p17;
rcntdtim=rchktim; //延时计数器
r1stim=rchktim; //用于处理1秒钟后要更新显示的问题//
frcntdstart=1; //触发脉冲来到标志
frdispstr=1; //显示开始标志
}
}
frpulsechk=1;//保证在红灯亮的前提下让定时器0开始计数//否则定时器0进入中断只是重置初值而不计数//
rchktim=0;//清0脉宽计数器
}
////////////定时器0中断服务程序///////////////////////////////////////////////////////////////////////
//T0:16位,1ms//11.0592MHZ晶振////////////////////
void t0int(void) interrupt 1
{
TL0=0x66;
TH0=0xFC;
// tt0++;
if(frpulsechk==1)////在红灯亮的前提下///
{
rchktim++;
if(rchktim>=T1S)////判断学习结束//学习时间结束后的1S//
{
frpulsechk=0;//红灯已经熄灭没有脉冲了//
rchktim=0;
if(frcntdstart==1) frcntdend=1;//置学习时间结束标志///
}
}
if(frcntdstart==1)////触发脉冲来到之后///
{
if(frcntdend==0)////如果学习时间还没有结束//
{
r1stim++;///从触发脉冲来到的时刻起一直在计算时间///
rcntdtim++;///从触发脉冲来到的时刻起延时计数器也一直在计算时间///
if(r1stim>=T1S)/////从触发脉冲来到的时刻起每隔1秒的时间//置显示更新标志
{
r1stim=0;///清0//
frdisp=1;///每隔1秒的时间置显示更新标志//
}
if(rcntdtim>=TMAX) frcntdend=1; ///包含触发脉冲共20S后认为结束//
}
else////学习结束///
{
frcomp=1;//比较标志置1///
frcntdstart=0;
frcntdend=0;
frdisp=0;
frdispstr=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 closedisp(void)
{
P1=0;
LE=1;
delay();
LE=0;
}
//////////////////////////
void delay()
{
uchr i;
for(i=0;i<10;i++)
{;}
}
///////////////////////////////////////////////////////
void delay1()
{
uint i;
for(i=0;i<1000;i++)
{;}
}
//////////////////////////////////////////////////////
void send(uchr tx)
{
uchr i;
uchr tmp=0x80;
for(i=0;i<8;i++)
{
sck = 0 ;
if(tx & tmp)si = 1;
else si = 0;
tmp = tmp >> 1;
delay();
sck = 1;
delay();
}
}
///////////////////////////////////////////////////////////
void x5045ini(void)
{
cs = 1;
delay();
cs = 0;
delay();
send(WREN);
cs = 1;
delay();
cs = 0;
delay();
send(WRSR);
send(WDT);//设置X5045
cs = 1;
delay1();
}
////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -