英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: PIC16F73片子作232通讯的问题 [打印本页]

作者: winnie    时间: 2009-3-28 11:18
标题: PIC16F73片子作232通讯的问题
由于需要我用两块PIC16F73片子作232通讯,一块片子主要作9位LED显示;另一块片子作数据处理,以中断方式接收外部232数据,再以模拟串口方式传给显示片子。我用的是CCS,不知是不是中断用的不对,为什么我老是接受不到啊,偶尔能接收一下,为什么啊,
处理片子程序如下:
#include <16F73.h>
#use delay(clock=4000000)
#define uchar unsigned char
#define DDD 95
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5)
unsigned int8 ch[9]={0x00,0x00,0x00,0x66,0xfe,0xb6,0X00,0X00,0X00}; //  显示数码存储
int1 yy=1;
int8 value232;
int8 jia=0;
int8 biao232=0;
#byte RCREG=0X1A
#int_RDA          file://处中断接收
RDA_isr()
{
value232=RCREG;
  if(value232==0x23)
   {
     biao232=0;
     jia=1;
    }
  else
    {  
      if(biao232<9)
   {         
         if(value232==0x2b)
   {
             ch[biao232]=0x00;
   }
         if(value232==0x2d)
   {
             ch[biao232]=0x02;
   }
         if(value232==0x30)
   {
            ch[biao232]=0xfc;
   }
         if(value232==0x31)
   {
            ch[biao232]=0x60;
   }
         if(value232==0x32)
   {
            ch[biao232]=0xda;
   }
         if(value232==0x33)
   {
            ch[biao232]=0xf2;
   }
         if(value232==0x34)
   {
            ch[biao232]=0x66;
   }
         if(value232==0x35)
   {
            ch[biao232]=0xb6;
   }
         if(value232==0x37)
   {
            ch[biao232]=0xe0;
   }
         if(value232==0x38)
   {
            ch[biao232]=0xfe;
   }
         if(value232==0x39)
   {
            ch[biao232]=0xe6;
   }
          biao232+=1;
   }
         else
        {
           jia=0;
        }
  }   
}

unsigned int8 dispbmp[16]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6,0x9C,0X6E,0x7A};  // 实际显示数码存
int8  ii;
int8  iii;
int16 kk;
int8  aa;
int8  biao_xian=0;
void send_send();
void cha();
void csend();                //  485函数
void senddisp();             //  232函数
void send(int8 ch);          //  端口模拟发送
void delay();

//...........................................................................
void main()
{      
   int32 lno;
   int16 wad;
   int8 pp,delay=0;   
   port_b_pullups(TRUE);   
   disable_interrupts(INT_RDA);  
   set_tris_b(0xf0);        file://设b口方向
   delay_ms(2);
   delay_ms(1000);
   output_low(pin_c1);
   output_low(pin_c2);
   output_low(pin_c3);
   output_low(pin_c0);
   output_high(pin_b0);
   while(1)                 //循环
   {
            enable_interrupts(INT_RDA);   //开中断
            enable_interrupts(global);
            delay_ms(100);
            disable_interrupts(global);  //关中断
            send(0x23);                       //发模拟串口数据
            for(ii=0;ii<9;)
           {
              send(ch[ii]);
              ii+=1;
            }
            delay_ms(200);
            enable_interrupts(global);   
   }
}
file://-------------------------------------------
void send(int8 ch)         file://端口模拟发送,pic间的通讯
{
   int8 tt;
   tt=ch;
   output_low(PIN_C4);     file://发送起始位
   delay_us(DDD);      // 延时
   tt=ch&0x01;             file://发送8位
   if(tt==0)
   {
      output_low(PIN_C4);
    }
   else
   {
         delay_us(1);
      output_high(PIN_C4);
      }
   delay_us(DDD);
   tt=ch&0x02;             file://发送7位
   if(tt==0)
   {
      output_low(PIN_C4);
      }
   else
   {
      delay_us(1);
      output_high(PIN_C4);
      }
   delay_us(DDD);
   tt=ch&0x04;             file://发送6位
   if(tt==0)
   {
      output_low(PIN_C4);
      }
   else
   {
            delay_us(1);
      output_high(PIN_C4);
      }
   delay_us(DDD);
   tt=ch&0x08;          file://5
   if(tt==0)
   {
      output_low(PIN_C4);
      }
   else
   {
               delay_us(1);
      output_high(PIN_C4);
      }
   delay_us(DDD);
   tt=ch&0x10;          file://4
   if(tt==0)
   {
      output_low(PIN_C4);
   }
   else
   {
               delay_us(1);
      output_high(PIN_C4);
   }
   delay_us(DDD);
   tt=ch&0x20;          file://3
   if(tt==0)
   {
      output_low(PIN_C4);
   }
   else
   {
               delay_us(1);
      output_high(PIN_C4);
   }
   delay_us(DDD);
   tt=ch&0x40;          file://2
   if(tt==0)
   {
      output_low(PIN_C4);
    }
   else
   {
               delay_us(1);
      output_high(PIN_C4);
   }
   delay_us(DDD);
   tt=ch&0x80;          file://1
   if(tt==0)
   {
      output_low(PIN_C4);
    }
   else
   {
      delay_us(1);
      output_high(PIN_C4);
   }
   delay_us(DDD);
   output_high(PIN_C4);
   delay_us(104);
}
作者: winnie    时间: 2009-3-28 11:18
RS232 還是 RS485 ?
1. 如果是 RS232 ,就不需要加 enable=PIN_C5

2. 如果 pin_C7 沒用到,那就用 pin_C7 傳送 RS232 就好啦,何必再寫模擬 RS232

3. 如果一定要寫 模擬 RS232 - 9600 baud,為何不直接用 CCS 的庫函數

#use rs232 ( baud=9600, xmit=PIN_C4 ) 簡單解決

4. 有宣告配置位 給 4 MHz 晶振嗎?

改寫如下


#include <16F73.h>

#fuses XT    // 加這句

#use delay(clock=4000000)
#define uchar unsigned char
//#define DDD 95    // 刪這行

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) // 改這行

unsigned int8 ch[9]={0x00,0x00,0x00,0x66,0xfe,0xb6,0X00,0X00,0X00}; //  ?示??存?
int1 yy=1;
int8 value232;
int8 jia=0;
int8 biao232=0;

//#byte RCREG = 0X1A    // 刪這行

#int_RDA         
void RDA_isr()
{
   value232 = getc();   // 改這行

   if(value232==0x23)
   {
      biao232=0;
      jia=1;
   }
   else
   {  
      if(biao232<9)
      {         
         if(value232==0x2b)   ch[biao232]=0x00;
         if(value232==0x2d)   ch[biao232]=0x02;
         if(value232==0x30)   ch[biao232]=0xfc;
         if(value232==0x31)   ch[biao232]=0x60;
         if(value232==0x32)   ch[biao232]=0xda;
         if(value232==0x33)   ch[biao232]=0xf2;
         if(value232==0x34)   ch[biao232]=0x66;
         if(value232==0x35)   ch[biao232]=0xb6;
         if(value232==0x37)   ch[biao232]=0xe0;
         if(value232==0x38)   ch[biao232]=0xfe;
         if(value232==0x39)   ch[biao232]=0xe6;
         biao232+=1;
      }
      else jia=0;
   }   
}


unsigned int8 dispbmp[16]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6,0x9C,0X6E,0x7A};  // ???示??存
int8  ii;
int8  iii;
int16 kk;
int8  aa;
int8  biao_xian=0;
void send_send();
void cha();
void csend();                //  485函?
void senddisp();             //  232函?
void send(int8 ch);          //  端口模??送
void delay();


//...........................................................................
void main()
{      
   int32 lno;
   int16 wad;
   int8 pp,delay=0;   
   port_b_pullups(TRUE);   
   disable_interrupts(INT_RDA);  
   set_tris_b(0xf0);        //file://?b口方向
   delay_ms(2);
   delay_ms(1000);
   output_low(pin_c1);
   output_low(pin_c2);
   output_low(pin_c3);
   output_low(pin_c0);
   output_high(pin_b0);
   while(1)                 //主循?
   {
            enable_interrupts(INT_RDA);   //?中?
            enable_interrupts(global);
            delay_ms(100);
            disable_interrupts(global);  //?中?
            send(0x23);                       //?模?串口?据
            for(ii=0;ii<9;)
           {
              send(ch[ii]);
              ii+=1;
            }
            delay_ms(200);
            enable_interrupts(global);   
   }
}

#use rs232(baud=9600,xmit=PIN_C4)   // 默認 parity=N,
void send(int8 ch)                  // 端口模??送,pic?的通?
{
   putc ( ch );   // 改 ... 一行解決
}




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2