#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
{ }
}
}
}
}
//測試通過