立即注册 登录
返回首页

uid:82008的个人空间

日志

C Language Program Design

已有 1286 次阅读2015-6-5 00:18 | Design

#include <reg51.h>
#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
        { }
 }
    }
  }
}



//测试通过

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部