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={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=0x00;
}
if(value232==0x2d)
{
ch=0x02;
}
if(value232==0x30)
{
ch=0xfc;
}
if(value232==0x31)
{
ch=0x60;
}
if(value232==0x32)
{
ch=0xda;
}
if(value232==0x33)
{
ch=0xf2;
}
if(value232==0x34)
{
ch=0x66;
}
if(value232==0x35)
{
ch=0xb6;
}
if(value232==0x37)
{
ch=0xe0;
}
if(value232==0x38)
{
ch=0xfe;
}
if(value232==0x39)
{
ch=0xe6;
}
biao232+=1;
}
else
{
jia=0;
}
}
}
unsigned int8 dispbmp={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6,0x9C,0X6E,0x7A};// 实际显示数码存
int8ii;
int8iii;
int16 kk;
int8aa;
int8biao_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+=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);
} 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={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=0x00;
if(value232==0x2d) ch=0x02;
if(value232==0x30) ch=0xfc;
if(value232==0x31) ch=0x60;
if(value232==0x32) ch=0xda;
if(value232==0x33) ch=0xf2;
if(value232==0x34) ch=0x66;
if(value232==0x35) ch=0xb6;
if(value232==0x37) ch=0xe0;
if(value232==0x38) ch=0xfe;
if(value232==0x39) ch=0xe6;
biao232+=1;
}
else jia=0;
}
}
unsigned int8 dispbmp={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6,0x9C,0X6E,0x7A};// ???示??存
int8ii;
int8iii;
int16 kk;
int8aa;
int8biao_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+=1;
}
delay_ms(200);
enable_interrupts(global);
}
}
#use rs232(baud=9600,xmit=PIN_C4) // 默認 parity=N,
void send(int8 ch) // 端口模??送,pic?的通?
{
putc ( ch ); // 改 ... 一行解決
}
页:
[1]