2路信号是循环输出,1-> 2 -> 1。。。倒计时根据采集到到的1、2路信号时间,第二周期显示输出。。。。
请教以下,以下的程序那里出错了,怎么跟踪不了的呢?或如何修改的呢?
#include<reg52a.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag=0;
uchar rece_count=0;
uchar dbuffer=0; /*学习过程时间变量*/
uchar rece=0; /*显示允许标志位*/
uchar data1=0,data0=0,data2=0,data3=0;
uchar idata countint=0;
static bdata uchar adconin; /*74HC595段码输出用变量*/
uchar time=0,time2=0;
uchar ten,fir; /*显示转换BCD子函数用变量*/
sbit CPRS=P1^1; /*74HC595段码输出用变量*/
sbit CPLA=P1^0;
sbit DS = P1^2;
sbit ISDA=P3^7; /*看门狗变量*/
sbit adconin7 = adconin^7; /*74HC595段码输出用变量*/
code uchar dtable[11]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde,0x00};/*段码表*/
void RETWDT(void) /*看门狗定时器复位*/
{
ISDA=0;
_nop_();
ISDA=1;
}
void outbyt(void) //个位显示函数
{
uchar i;
CPLA = 0;
for(i=0;i<8;i++)
{
CPRS = 0;
_nop_();
DS = adconin7;
_nop_();
CPRS = 1;
adconin<<=1;
}
CPLA = 1;
}
void outbyt1(void) //十位显示函数
{
uchar i;
for(i=0;i<8;i++)
{
CPRS = 0;
_nop_();
DS = adconin7;
_nop_();
CPRS = 1;
adconin<<=1;
}
CPLA = 1;
}
void timer0() interrupt 1 /*50ms*/
{
TL0=0x00;
time2++;
if(time2==20) //1s定时器
{
time2=0;
dbuffer++; //学习过程中时间自加
if((flag==0)&&(rece==1)) //赋1路信号时间给countint
{
countint--; //显示时间自减
if(countint<0)
{
flag = 1;
}
}
if((flag==1)&&(rece==1)) //赋2路信号时间给countint
{
countint--; //显示时间自减
if(countint<0)
{
flag = 0;
}
}
}
TH0=0x4c;
RETWDT(); //50ms喂狗
}
main()
{
P3_0=1;
P3_1=1;
rece=0;
adconin = 0x00;
outbyt1();
adconin = 0x00;
outbyt();
TMOD=0x01; /*T0计数状态,方式2*/
TH0=0x4c; /*50ms*/
TL0=0x00;
IE=0x82; /*开中断,允许T0*/
RETWDT();
while (1)
{
if(P3_1!=0) //1路信号 (P3_0 = 0)表示1路有信号
{
if(P3_1!=0)
{
if(rece_count==0)
{
TR0=1;
data1=dbuffer;
time2=0;
if((data0<=(data1+2))&&(data0>=(data1-2))) //显示学习到的时间
{
countint=data0;
rece=1;
flag = 0; //赋1路时间给countint
}
if((data0>(data1+2))||(data0<(data1-2))) //学习过程
{
data0=data1; //转存第一次学习到的时间
rece=0;
}
dbuffer=0; //清空学习时间变量
rece_count=1; //到2路信号执行
}
}
}
if(P3_0!=0) //2路信号 (P3_1 = 0)表示1路有信号
{
if(P3_0!=0)
{
if(rece_count==1)
{
TR0=1;
data3=dbuffer;
time2=0;
if((data2<=(data3+2))&&(data2>=(data3-2))) //显示学习到的时间
{
countint=data2;
rece=1; //开显示
flag = 1; //赋2路时间给countint
}
if((data2>(data3+2))||(data2<(data3-2))) //学习过程
{
data2=data3; //转存第一次学习到的时间
rece=0;
}
dbuffer=0; //清空学习时间变量
rece_count=0; //回到绿灯信号执行
}
}
}
if((countint>0)&&(rece!=0)) //允许显示rece!=0
{
ten=countint/10;
fir=countint%10;
if(ten==0) //若十位数据等于0,关十位显示
{
adconin = 0x00;
outbyt1();
adconin = dtable[fir];
outbyt();
}
else
{
adconin = dtable[ten];
outbyt1();
adconin = dtable[fir];
outbyt();
}
RETWDT();
}
else //若rece==0时,不允许输出,显示黑屏
{
adconin = 0x00;
outbyt1();
adconin = 0x00;
outbyt();
}
RETWDT();
}
}
|