Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380207
  • 博文数量: 81
  • 博客积分: 1290
  • 博客等级: 中尉
  • 技术积分: 821
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-17 07:48
个人简介

Just do IT.

文章分类

全部博文(81)

分类: 嵌入式

2011-08-02 18:35:32

//上篇

/*485通信**EEPROM READ&WRITE SAMPLE*/

/* blog.sina.com.cn/suzhoumcu */

#include
#include

sbit gz  =P1^0;
sbit led =P1^2;
sbit fjqd =P1^3;
sbit CON485 =P1^4; /*485片选*/
sbit ee_si =P1^5; /*EEPROM 数据入*/
sbit ee_sck =P1^6; /*EEPROM 时钟*/
sbit ee_so =P1^7; /*EEPROM 数据出*/
sbit ee_cs =P3^7; /*EEPROM 片选*/

/*******************************************************************/
/*寄存器参数定义*/
data unsigned char sen_cnt; /*发送指针*/
data unsigned char sen_cnt1;
data unsigned char rec_cnt; /*接收指针*/
data unsigned char dqsd;
data unsigned char count;
data unsigned char time_count;
data unsigned char  sdsd;
data unsigned char  ys;
data unsigned char  test_sdsd;
data unsigned char test_dqsd;
data unsigned char day;
data unsigned char hour;

data unsigned char tmp_hour;
data unsigned char tmp_speed;
data unsigned char bak_speed;

data unsigned int  t_s;
data unsigned int  first_time;

data unsigned int  ee_addr;
idata unsigned char  set_para[30];
idata unsigned char  send[5]; /*发送信息缓冲器*/
idata unsigned char  reci[15]; /*接收信息缓冲器*/

/*******************************************************************/
/*位定义*/
bdata unsigned char flag0;
sbit run =flag0^0;
sbit stop =flag0^1;
sbit speed =flag0^2;
sbit error =flag0^3;
sbit addr =flag0^4;
sbit status =flag0^5;
sbit test_run =flag0^6;
sbit test_stop =flag0^7;

bdata unsigned char flag1;
sbit gzbz =flag1^0;
sbit firsttime =flag1^1;
sbit gld =flag1^2;
sbit t_1ms =flag1^3;
sbit t_100us =flag1^4;
sbit fjqdyx =flag1^5;
sbit fjqdyx1 =flag1^6;
sbit f_auto =flag1^7;

bdata unsigned char flag2;
sbit g_sd =flag2^0;
sbit g_addr =flag2^1;
sbit s_addr =flag2^2;
sbit w_addr =flag2^3;
sbit s_auto =flag2^4;
sbit wr_auto =flag2^5;
sbit w_auto =flag2^6;
sbit b_auto   =flag2^7;

bdata unsigned char flag3;
sbit mm0 =flag3^0;
sbit mm1 =flag3^1;
sbit mm2 =flag3^2;
sbit mm3 =flag3^3;
sbit mm4 =flag3^4;
sbit mm5 =flag3^5;
sbit mm6 =flag3^6;
sbit mm7 =flag3^7;

bdata unsigned char flag4;
sbit send_end =flag4^0;
sbit g_start =flag4^1;
sbit g_stop  =flag4^2;

/*******************************************************************/
void cf(void) interrupt 0 using 3
{
gld=1;
}

void timer0(void) interrupt 1 using 1
{
TH0=-(100/256)-1;
TL0=-(100%256);

if(ee_cs){ee_cs=0;_nop_();ee_cs=1;}

ys=0;
t_100us=1;
if((gld==1)&&(fjqdyx==1)&&(fjqd==1)&&(time_count<100)){
 time_count++;
 if(time_count==100)ys=1;
 }

if((gld==1)&&(ys==0)&&(fjqdyx==1)&&(fjqd==1)&&(time_count==100)){
 fjqd=0;ys=1;
 }

if((gld==1)&&(ys==0)&&(fjqdyx==1)&&(fjqd==0)&&(time_count==100)){
 fjqd=1;gld=0;time_count=dqsd;
 }

if((gld==1)&&(fjqdyx1==1)&&(fjqd==1)&&(time_count<100)){
 time_count++;
 if(time_count==100)ys=1;
 }

if((gld==1)&&(ys==0)&&(fjqdyx1==1)&&(fjqd==1)&&(time_count==100)){
 fjqd=0;ys=1;
 }

if((gld==1)&&(ys==0)&&(fjqdyx1==1)&&(fjqd==0)&&(time_count==100)){
 fjqd=1;gld=0;time_count=test_dqsd;
 }

count++;
if(count==10){
 t_1ms=1;
 count=0;
 t_s++;
 if(t_s==1000){
  t_s=0;
  if((dqsd>sdsd)&&(fjqdyx==1))dqsd--;
  if((dqsd  if((test_dqsd>test_sdsd)&&(fjqdyx1==1))test_dqsd--;
  if((test_dqsd  if(dqsd==50&&sdsd==50){fjqdyx=0;sdsd=60+set_para[2]/3;}
  }
 }
}


/*******************************************************************/
void serial() interrupt 4 using 2/*信息串发送和接收子程序*/
{
unsigned char y,m;
ES=0;
if(TI==1){ /*信息串发送子程序*/
 CON485=1;
 TI=0;
 sen_cnt++;
 if(sen_cnt if(sen_cnt==sen_cnt1){ /*发送结束,指针清零*/
  sen_cnt=0;
  sen_cnt1=0;
  CON485=0;
  if(send[1]==0x20)g_start=1;
  if(send[1]==0x21)g_stop=1;
  if(send[1]==0x22)g_sd=1;
  else if(send[1]==0x25)g_addr=1;
  else if(send[1]==0x27)w_addr=1;
  else if(send[1]==0x46&&send_end){wr_auto=1;send_end=0;}
  }
 }


if(RI==1){ /*信息串接收子程序*/
 CON485=0;
 RI=0;
 reci[rec_cnt]=SBUF;

 if(rec_cnt>2){
  if(y>0){y--;rec_cnt++;}
  if(y==0){
   m=0;
   if(reci[1]==0x25&&(reci[2]!=set_para[4]
    ||reci[3]!=set_para[5]||reci[4]!=set_para[6]
    ||reci[5]>=32))reci[1]=0xff;
   for(y=0;y   rec_cnt=0;
   if(m==0){ /*校验正确*/
    if(reci[1]==0x20){run=1;set_para[3]=0x1;}
    //else if(reci[1]==0x21){fjqdyx=0;set_para[3]=0x0;stop=1;}
    else if(reci[1]==0x21){sdsd=50;set_para[3]=0x0;stop=1;}
    else if(reci[1]==0x22){speed=1;tmp_speed=reci[3];}
    else if(reci[1]==0x23)error=1;
    else if(reci[1]==0x25){addr=1;set_para[1]=reci[5];}
    else if(reci[1]==0x26)status=1;
    else if(reci[1]==0x27){
     set_para[4]=reci[2];
     set_para[5]=reci[3];
     set_para[6]=reci[4];
     s_addr=1;
     }
    else if(reci[1]==0x80){
     test_sdsd=60+reci[2]/3;test_dqsd=93;
     test_run=1;
     }
    else if(reci[1]==0x50){
     for(y=0;y<11;y++){set_para[7+y]=reci[3+y];}
     send_end=1;f_auto=1;
     }
    else if(reci[1]==0x51){
     for(y=0;y<11;y++){set_para[18+y]=reci[3+y];}
     send_end=1;f_auto=1;
     }
    else if(reci[1]==0x47){
     day=reci[2];hour=reci[3];
     w_auto=1;
     }
    else if(reci[1]==0x4a){
     if(reci[3]==1){
      w_auto=1;t_s=0;
      day=reci[4];hour=reci[5];
      }
     else if(reci[3]==0){
      w_auto=0;t_s=0;
      tmp_speed=set_para[2];
      sdsd=60+set_para[2]/3;
      bak_speed=0;tmp_speed=0;
      }
     dqsd=85;time_count=dqsd;
     b_auto=1;
     }
    }
   }
  }
 else if(rec_cnt==2){ /*进行风机号的比较*/
  y--;
  if(reci[2]==set_para[1]&&reci[2]<32)rec_cnt=3;
  else if(reci[1]==0x25)rec_cnt=3;
  else if(reci[1]==0x80)rec_cnt=3;
  else if(reci[1]==0x81&&reci[2]==0xd5){fjqdyx1=0;test_stop=1;rec_cnt=0;}
  else if(reci[1]==0x27||reci[1]==0x47)rec_cnt=3;
  else rec_cnt=0;
  }
 else if(rec_cnt==1){ /*将在reci[1]后还须接收的字节个数写入变量x*/
  switch(reci[1]){
   case 0x81:y=1;rec_cnt=2;break;
   case 0x20:
   case 0x21:
   case 0x23:
   case 0x26:
   case 0x80:y=2;rec_cnt=2;break;
   case 0x22:
   case 0x47:y=3;rec_cnt=2;break;
   case 0x27:y=4;rec_cnt=2;break;
   case 0x25:
   case 0x4a:y=5;rec_cnt=2;break;
   case 0x50:
   case 0x51:y=13;rec_cnt=2;break;
   default:rec_cnt=0;break;
   }
  }
 /*如果收到的第一个字节不是0xaa则视为干扰信息丢弃*/
 else if(rec_cnt==0){
  if(reci[0]==0xaa)rec_cnt=1;
  else rec_cnt=0;
  }
 }
ES=1;
}

 

//下篇

/*******************************************************
OPR_EE
EE_CODE:操作指令
EECODE=3,=11,读数据
EECODE=6,写允许
EECODE=2,=10,写数据
EECODE=1,写寄存器
*******************************************************/

#define WREN 0x06 /*设置写使能锁存器*/
#define WRDI 0x04 /*复位写使能锁存器*/
#define RDSR 0x05 /*读状态寄存器*/
#define WRSR 0x01 /*写状态寄存器*/
#define READ 0x03 /*读数据*/
#define WRITE 0x02 /*写数据*/

void wt_byte(unsigned char eecode) /*写入一个字节*/
/*在25045的时钟下降沿将数据送入到SI线上,并在上升沿被锁存*/
{
idata unsigned char i;
for(i=0;i<8;i++){
 ee_sck=0;
 eecode=eecode<<1;
 ee_si=CY;
 ee_sck=1;
 }
ee_si=0;
}

unsigned char rd_byte()  /*读取一个字节*/
/*数据由25045的时钟下降沿输出到SO线上*/
{
idata unsigned char i;
idata unsigned char eecode=0;

for(i=0;i<8;i++){
 ee_sck=1;
 ee_sck=0;
 eecode=eecode<<1;
 if(ee_so)eecode++;
 }
return(eecode);
}

void wip_poll()
/*检查写入过程是否结束*/
{
data unsigned char i,j;
for(j=0;j<99;j++){
 ee_sck=0;
 ee_cs=0;
 wt_byte(RDSR);
 i=rd_byte();
 ee_sck=0;
 ee_cs=1;
 i&=0x1;
 if(i==0)break;
 _nop_();
 }
}

void ee_init() /*25045初始化*/
{
 ee_sck=0;
 ee_cs=0;
 wt_byte(WRSR);
 _nop_();
 wt_byte(0x0);
 ee_sck=0;
 ee_cs=1;
  _nop_();

 wip_poll();
 ee_sck=0;
 ee_cs=0;
 wt_byte(WREN);
 ee_sck=0;
 ee_cs=1;
 _nop_();

 wip_poll();
 ee_sck=0;
 ee_cs=0;
 wt_byte(WRSR);
 _nop_();
 wt_byte(0x0);
 ee_sck=0;
 ee_cs=1;
}

void ee_read()
/*从25045中读取程序,连续读出*/
{
data unsigned char x,i;
for(i=0;i<35;i++){
 ee_sck=0;
 ee_cs=0;
 wt_byte(READ);
 wt_byte(i);
 if(i>4)set_para[i-5]=rd_byte();
 else rd_byte();
 ee_sck=0;
 ee_cs=1;
        for(x=0;x<250;x++)
  {_nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();_nop_();}
 }
}

void ee_write()
/*向25045中写入程序*/
{
data unsigned char x,i;
for(i=5;i<35;i++){
 wip_poll();
 ee_sck=0;
 ee_cs=0;
 wt_byte(WREN);
 ee_sck=0;
 ee_cs=1;
 _nop_();
 ee_sck=0;
 ee_cs=0;
 wt_byte(WRITE);
 wt_byte(i); /*地址*/
 wt_byte(set_para[i-5]);
 ee_sck=0;
 ee_cs=1;
 wip_poll();
 _nop_();
 for(x=0;x<250;x++)
  {_nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();_nop_();}
 _nop_();
 }
}

/*******************************************************/
void data_init(void)
{
        set_para[0] = 0x55; /*校验起始位*/
 set_para[1] = 32; /*风机号*/
 set_para[2] = 100; /*风机速度*/
 set_para[3] = 0; /*自动运行标志*/
 set_para[4] = 0xff; /*内部编号*/
 set_para[5] = 0xff; /*内部编号*/
 set_para[6] = 0xff; /*内部编号*/
 set_para[7] = 0; /*周日自动运行时间*/
 set_para[8] = 0; /*周日自动运行时间*/
 set_para[9] = 0; /*周日自动运行时间*/
 set_para[10] = 0; /*周1自动运行时间*/
 set_para[11] = 0; /*周1自动运行时间*/
 set_para[12] = 0; /*周1自动运行时间*/
 set_para[13] = 0; /*周2自动运行时间*/
 set_para[14] = 0; /*周2自动运行时间*/
 set_para[15] = 0; /*周2自动运行时间*/
 set_para[16] = 0; /*周3自动运行时间*/
 set_para[17] = 0; /*周3自动运行时间*/
 set_para[18] = 0; /*周3自动运行时间*/
 set_para[19] = 0; /*周4自动运行时间*/
 set_para[20] = 0; /*周4自动运行时间*/
 set_para[21] = 0; /*周4自动运行时间*/
 set_para[22] = 0; /*周5自动运行时间*/
 set_para[23] = 0; /*周5自动运行时间*/
 set_para[24] = 0; /*周5自动运行时间*/
 set_para[25] = 0; /*周6自动运行时间*/
 set_para[26] = 0; /*周6自动运行时间*/
 set_para[27] = 0; /*周6自动运行时间*/
 set_para[28] = 0; /*自动运行时间速度*/
 set_para[29] = 0xaa; /*校验终止位*/
 ee_write();
}


/*******************************************************/
void main (void)
{
ES=1;  /*允许串行口中断*/
TMOD=0x21; /*定时器0: 16位定时器  定时器1:串行口波特率发生器*/
TH1=0xFa; /*11.0592MHZ , 9.6K*/
TL1=0xFa; /*11.0592MHZ , 9.6K*/
PCON=0x80; /*波特率加倍**/
SCON=0x50; /*10位异步,允许串行口接收*/

TR1=1;
TR0=1;
IT0=1;

EA=1;
ES=1;
ET0=1;
EX0=1;
PT0=1;

sen_cnt=0;
rec_cnt=0;
firsttime=0;

ee_init();
ee_read();
if(set_para[0]!=0x55||set_para[29]!=0xaa)data_init(); /*25045数据初始化*/

CON485=0;
fjqdyx=0;
fjqdyx1=0;
first_time=0;

/*初始化发送数据*/
if((set_para[2]>=1)&&(set_para[2]<=100))sdsd=60+set_para[2]/3;
dqsd=93;
fjqd=1;
CON485=0;

/*循环程序*/
time_count=dqsd;
while(1){
 
 if(g_start){ee_write();g_start=0;}
 if(g_stop){ee_write();g_stop=0;}

 if(set_para[3]==0x1){
  if(fjqdyx==0){
   fjqdyx=1;dqsd=85;
   }
  }
 else if(set_para[3]==0x0)fjqdyx=0;
 
 if(fjqdyx==1){
  if(gz==1){
   if(first_time==33000){
    gzbz=1;
    fjqdyx=0;
    fjqd=1;
    led=0;
    first_time=0;
    }
   else first_time++;
     }
  }
 else {
  if(gz==0){
   if(first_time==33000){
    gzbz=1;
    fjqdyx=0;
    fjqd=1;
    led=0;
    first_time=0;
    }
   else first_time++;
     }
   }

 if((gz==0)&&(fjqdyx==1)){
  gzbz=0;led=1;
  }

 if(run){
  send[0]=0xaa;send[1]=0x20;
  send[2]=~(send[0]+send[1])+1;
  if(sdsd>50){fjqdyx=1;dqsd=85;}
  sen_cnt1=3;run=0;
  CON485=1;
  SBUF=send[0];
  }
 if(test_run){
  send[0]=0xaa;send[1]=0x80;
  send[2]=~(send[0]+send[1])+1;
  fjqdyx1=1;
  test_dqsd=85;
  sen_cnt1=3;test_run=0;
  CON485=1;
  SBUF=send[0];
  }
 if(stop){
  send[0]=0xaa;send[1]=0x21;
  send[2]=~(send[0]+send[1])+1;
  sen_cnt1=3;stop=0;
  CON485=1;
  SBUF=send[0];
  }
 if(test_stop){
  send[0]=0xaa;send[1]=0x81;
  send[2]=~(send[0]+send[1])+1;
  sen_cnt1=3;test_stop=0;
  CON485=1;
  SBUF=send[0];
  }
 if(speed){
  send[0]=0xaa;send[1]=0x22;
  send[2]=~(send[0]+send[1])+1;
  sen_cnt1=3;speed=0;
  CON485=1;
  SBUF=send[0];
  }
 if(error){
  send[0]=0xaa;
  if(gzbz)send[1]=0x23;
  else send[1]=0x24;
  send[2]=set_para[1];
  send[3]=~(send[0]+send[1]+send[2])+1;
  sen_cnt1=4;error=0;
  CON485=1;
  SBUF=send[0];
  }
 if(addr){
  send[0]=0xaa;send[1]=0x25;
  send[2]=~(send[0]+send[1])+1;
  sen_cnt1=3;addr=0;
  CON485=1;
  SBUF=send[0];
  }
 if(s_addr){
  send[0]=0xaa;send[1]=0x27;
  send[2]=~(send[0]+send[1])+1;
  sen_cnt1=3;s_addr=0;
  CON485=1;
  SBUF=send[0];
  }
 if(status){
  send[0]=0xaa;send[1]=0x26;
  send[2]=set_para[1];
  send[3]=0;
  if(gzbz)send[3]|=0x1;
  if(fjqdyx)send[3]|=0x80;
  send[4]=~(send[0]+send[1]+send[2]+send[3])+1;
  sen_cnt1=5;status=0;
  CON485=1;
  SBUF=send[0];
  }
 if(f_auto){
  send[0]=0xaa;send[1]=0x46;
  send[2]=set_para[1];
  send[3]=~(send[0]+send[1]+send[2])+1;
  sen_cnt1=4;f_auto=0;
  CON485=1;
  SBUF=send[0];
  }
   if(b_auto){
  send[0]=0xaa;send[1]=0x4a;
  send[2]=~(send[0]+send[1])+1;
  sen_cnt1=3;b_auto=0;
  CON485=1;
  SBUF=send[0];
  }
 if(g_sd){
  g_sd=0;
  set_para[2]=tmp_speed;
  ee_write();
  sdsd=60+set_para[2]/3;
  }
 if(g_addr){
  g_addr=0;
  ee_write();
  }
 if(w_addr){
  w_addr=0;
  ee_write();
  }
 if(wr_auto){
  wr_auto=0;
  ee_write();
  }
 if(w_auto){
  tmp_hour=0;
  if(hour>=0&&hour<8)flag3=set_para[7+day*3];
  else if(hour>=8&&hour<16){flag3=set_para[8+day*3];tmp_hour=hour-8;}
  else if(hour>=16&&hour<23){flag3=set_para[9+day*3];tmp_hour=hour-16;}
  tmp_speed=set_para[28];

  s_auto=0;
  switch(tmp_hour){
   case 0:if(mm7)s_auto=1;break;
   case 1:if(mm6)s_auto=1;break;
   case 2:if(mm5)s_auto=1;break;
   case 3:if(mm4)s_auto=1;break;
   case 4:if(mm3)s_auto=1;break;
   case 5:if(mm2)s_auto=1;break;
   case 6:if(mm1)s_auto=1;break;
   case 7:if(mm0)s_auto=1;break;
   }

  if(s_auto){
   if(w_auto){
    if(!gzbz)fjqdyx=1;
    if(bak_speed!=tmp_speed){
     sdsd=60+tmp_speed/3;
     bak_speed=tmp_speed;
     }
    }
   }
  else fjqdyx=0;
  s_auto=0;
  }
 }
}

阅读(6250) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~