#include "Detec_Ac.h"
//#include "Detec_Ac52.h"
#define uchar unsigned char
#define uint unsigned int
#define schar signed char
sbit R3Led = P3^5;
schar h;
uchar i,j,k;
uchar address=0;
uchar int_count;
bit state=0,send_data_flag=0;
bit baochi_time;
uint Time, baochi_time_count;
bit ru_3ltor=1,ru_3rtol=0,ru_all_r,ru_4ltor,ru_4rtol,ru_secol;
delayfirst(uchar time);
uchar code slave[]={0,1,2,3,4,5,6,7,8,9};
uchar code color_P[]={ //访问片内数据存储器idata比片外数据存储器code相对要快一些,但用code定义的是常量,因此不能在中断函数中去改变它的值
0x9f,0x93,0x90, 0x50,0x48,0x4a, 0x2a,0x26,0x25,
0xc5,0xd9,0xda, 0x7a,0x6e,0x6f, 0x6d,0x75,0xb5, 0xb7,
0xbf,0xff, 0xfc,0xf0,0x90, 0x92,0x8a,0x4a, 0x49,0x45,
0x25, 0x90, 0x50,0x88,0x92,0x90, 0x92,0x98,0xd0,0x90,
0xd0,0x98,0x92,0x90, 0x93,0x8c,0x70,0x90, 0x70,0x8c,
0x93,0x90, 0x91,0x94,0xb0,0x90, 0xb0,0x94,0x91,0x90,
0x93,0x9c,0xf0,0x90, 0xf0,0x9c,0x93,0x90, 0x91,0x84,
0x30,0x90, 0x30,0x84,0x91,0x90, 0x90,0x4a,0x25,0xda,
0xb5,0x6f,0xff
};//主机,把idata改为code数组就可以大量扩充, code 存储在flash中,只读
uchar code color_R3[]={
0x01,0x01,0x01,0x01, 0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x01,0x01, 0x00,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01, 0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x01,0x01,0x00, 0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x00, 0x01,0x01,0x01,0x01,0x01,
0x00,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x00,0x01,
0x01,0x01,0x01,0x01,0x00,0x01,0x01,0x00,0x00,0x01,
0x01,0x00,0x01
};
void com_initialize(void)//
{
P1=0;
R3Led=0;
PCON = 0x00;
SCON = 0x80;//方式2,不允许接收
TMOD |= 0x01;//定时器工作方式1
TH0=0xff;
TL0=0x9c; //定时100us,串口发送出去的波形是大约每隔75us一次
ET0=1;
ES=0;
EA=1;
acdef();
delayfirst(2);
TR0=1;
}
void main(void)
{
com_initialize();
while(1)
{
if((~baochi_time)&(send_data_flag))
{
uchar send_data;
send_data_flag=0;
if(i==0)
{
TB8=1;
send_data=address;
}
else
{ TB8=0; }
if(i==1)
{
send_data=slave[h];
}
if(i==2)
{
send_data=color_P[j];
//P1=color_P[j];
}
if(i==3)
{
send_data=color_R3[k];
//R3Led=color_R3[k];
}
SBUF=send_data;
while(!TI);
TI=0;
i++;
if(i>=4)
{
i=0;
if(((h==0)&(j==29))|(address==0xaa)) //
{
Time=20000;//
}
else
Time=900; //
baochi_time=1;
}
}
if(state)
{
j++; //指针加1
k++;
if(j%3==0) //(原写成j>=3,这样就出问题了)
{
j-=3; //又从头开始
k-=3;
if(ru_3ltor)
{
h++;//从机地址加1,指向下一地址
if(h>=10)//全跑完
{
h=0; //又回到第一地址,此时要加3,开始另一个state
j+=3; //从第3、6个开始
k+=3;
if(j%15==0) //
{
h=10;
ru_3ltor=0;
ru_3rtol=1;
}
}
}
if(ru_3rtol)
{
h--;//从机地址减1,指向下一地址
if(h<0)
{
h=9; //又回到最后地址,此时要加3,开始另一个state
j+=3; //从第18、21、24、27个state开始
k+=3;
if(j%30==0) //15个state运行完,从头开始,如此循环
{
ru_3rtol=0;
ru_all_r=1;
}
}
}
}
if(ru_all_r)// 30
{
if(j==30)
{
address=0xaa;
}
else
{
address=0;
ru_all_r=0;
ru_4ltor=1;
}
}
/*if(ru_4ltor)
{
h=0;
j=0;
k=0;
P1=0x02;
ru_3ltor=1;
ru_4ltor=0;
}
if(ru_4ltor) //从31开始
{
if((j-35)%4==0)
{
h++;
j-=4; //state又从31开始
k-=4;
if(h==10)
{
j+=4; //state从35开始
k+=4;
if(j==74)
{
h=0;
ru_4ltor=0;
ru_4rtol=0;
ru_secol=1;
}
else
{
ru_4ltor=0;
ru_4rtol=1;
}
}
}
}
if(ru_4rtol)
{
if((j-35)%4==0)
{
h--;
j-=4; //state又从35开始
k-=4;
if(h==0)
{
j+=4; //state从39开始
k+=4;
ru_4ltor=1;
ru_4rtol=0;
}
}
}
if(ru_secol)
{
if(j>=81)
{
h=0;
j=0;
k=0;
ru_3ltor=1;
ru_secol=0;
}
}*/
state=0;
baochi_time=0;
}
}
}
void timer0() interrupt 1 using 1
{
send_data_flag=1;
int_count++;
if(int_count==199)
{
acdeb();
int_count=0;
}
if(baochi_time)
{
baochi_time_count++;
if(baochi_time_count>=Time)
{
baochi_time_count=0;
state=1;
}
}
TH0=0xFF;
TL0=0x9c;
}
delayfirst(uchar time)
{
uchar h,i,j,k,m;
for(i=0;i<time;i++)
{
for(j=0;j<0x08;j++)
{
for(h=0;h<0x28;h++)
{ } //wait about 60us 40*3=120个机器周期*0.5us=60us
acdeb();//检测大约1至2个毫秒
for(m=0; m<18; m++) //18*384us=6912us=6.9ms
{
for(k=0;k<0xff;k++) // 256*3*0.5=384us
{ }
}
}
}
}
//测试通过