高手请指教,这段程序我在其他型号芯片用过,ok的!用pic16f1828在proteus仿真也是没问题的,但是到了实际板子上就出错了,头码要么完全匹配上(不管怎么定义头码),要么就匹配不上。小弟是想自己玩玩高频接收发送,下面有相应的部分原理图及代码。有懂的请指教,谢谢!
接收原理图
#include<htc.h>
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0x0612);
#define _XTAL_FREQ 4000000UL
uint temp[]={0x00,0x00,0x00,0x00};
uint date_buffer[4];
uint k=0,i,id;
uint j=0,t=0,flag=0;
#define EepromAdd 0x00 //各个页的其始地址定义
void init()
{
asm("CLRWDT");
OPTION_REG=0x0F;
ANSELA=0x00;
TRISA=0x2f;
PORTA=0x28;
WPUA=0XFF;
ANSELB=0x10;
ANSELC=0x00;
TRISC=0x00;
PORTC=0b00010000;
IOCAP=0x00;
IOCAN=0x00;
CM1CON0=0x00;
CM2CON0=0x00;
}
void delay_ms(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=108;b>0;b--);
}
void main()
{
init();
while(1)
{
asm("CLRWDT");
if(RA2==1)
{
__delay_us(500); //为了接受发码中间时刻的高低信号
while(j<20) //20ms的同步头判断
{
j++;
if(RA2==0)
break;
__delay_ms(1);
}
RA2=0;
if(j!=20)
{
j=0;
}
else if(j==20)
{
//RC0=1;
while(t<20)
{
if(RA2==1)
break;
t++;
__delay_ms(1);
}
__delay_ms(1);
if(t!=20)
{
j=0;
t=0;
}
else if(t==20)
{
RC0=1;
j=0;
t=0;
asm("CLRWDT");
RC0=0;
for(k=0;k<4;k++)
{
//RC6=1;
for(i=0;i<8;i++)
{
temp[k]+=RA2<<i;
__delay_ms(2);
}
EEPROM_WRITE(EepromAdd+k,temp[k]);
}
//RC6=0;
for(id=0;id<4;id++) //读出写入EEPROM的数据,此时是为了仿真检测数据是否正确
{
date_buffer[id]=eeprom_read(EepromAdd+id);
}
if(temp[0]==0x44&&temp[1]==0x33&&temp[2]==0x77&&temp[3]==0xdd)
{
//asm("CLRWDT");
//RC0=1;
flag++;
__delay_ms(200);
RC0=0;
if(flag==1)
{
for(id=0;id<4;id++)
{
// EEPROM_WRITE(EepromAdd+k,temp[k]);
}
}
}
for(k=0;k<4;k++)
{
temp[k]=0;
}
}
j=0;
t=0;
}
}
}
}
此帖出自
小平头技术问答
其次我看了下你的代码,我建议你能不能把写eeprom和读eeprom先注解掉看结果,因为操作eeprom费时,我前两天有个东西就是因为操作eeprom导致通信出错。
一周热门 更多>