英锐恩单片机论坛,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