‘壹’ pic单片机串行通信收发字符串的问题!高分求助!
我把你的程序做了些修改,并在PROTEUS中仿真,是正确的,图中的上面是仿真的发送,我输入了“HowAreYou?"并按回车键,单片机收到回车后,先输出"OK!!!"及回车,再把收到的数回送出去。
这里加了宏定义。有些内容请见北航的《PIC16系列单片机C程序设计与PROTEUS仿真》一书。
#include<pic.h>
__CONFIG(0x3F31);
#defineucharunsignedchar
#defineuintunsignedint
//宏定义,发送一个数,并等等发送完毕
#defineSEND_ONE(A)
TXREG=A;
while(!TRMT)
bitFLAG=0; //标志位,如收到回车字符,此位为1
ucharN=0; //接收数据累计
ucharDD[20]; //接收数据存放在此
constucharDD1[7]="OK!!!"; //虽然只有6个字符,但要用7个单元,最后一个为结束字符,const表示存放在程序存储器中的常数
voidinit(void);
voidinterruptISR(void);
voidmain()
{ uchari;
init();
while(1)
{ if(FLAG)
{ for(i=0;i<6;i++) //先发送“OK!!!”
{ SEND_ONE(DD1[i]);
}
SEND_ONE(0x0D); //发送一个回车
for(i=0;i<N;i++)
{ SEND_ONE(DD[i]);
}
FLAG=N=0; //重新清0,为下次接收做准备
}
};
}
voidinit()
{
TRISC=0xff; //这里要把高二位设置这输入,但在以下的串口使能后,系统自动将RC6变成通信输出
TXSTA=0x24;
RCSTA=0x90;
SPBRG=25; //9600波特率
GIE=1;
PEIE=1;
RCIE=1; //打开中断
}
voidinterruptISR(void)
{
if(RCIE&&RCIF) //不必清RCIF,因为接收数据后RCIF自动清0
{ DD[N]=RCREG;
if(DD[N]==0x0D)
FLAG=1; //如果收到回车,标志位置1
N++;
if(N>=20)
N=0; //如果接收数据数超出,从0存放
}
}
‘贰’ pic单片机串行异步通信的C程序,发送邮箱[email protected],谢谢了!
我这里把北航的<PIC16系列单片机C程序设计与PROTEUS仿真>一书的例4.15发在这里,这个例子是二个单片机之间的异步通信,主机每按一下按键,就把数发出,人机接收到就把数在LED上显示出来.因此这个例子有发送和接收二种.个人认为这本书值得你看的.给的图和程序都是所附光盘中的.
主机的程序:
//异步串行通信发送,按一下按键RB0,发送一个字节,从20H开始发送
#include<pic.h>
//__CONFIG(0x3F71); //运行用
__CONFIG(0x3F39); //调试用
#defineLED RB1
voidDELAY(unsignedint); //延时(i)ms
voidCSH(void); //初始化程序
//宏定义,发送一个数,并等待其发送结束
#defineSEND_ONE(a)
TXREG=a;
while(TRMT==0)
charaaa;
main(void)
{
CSH();
aaa=0x20; //发送的第一个数
LED=0;
while(1);
}
//======延时(n)ms
voidDELAY(unsignedintn)
{ unsignedintj;
chark;
for(j=0;j<n;j++)
for(k=246;k>0;k--)NOP();
}
//======初始化程序
voidCSH(void)
{ TRISB=0B00000001; //RB0为按键输入
TRISC=0B11100000;
TRISD=0; //D口全为输出,接LED
PORTD=0;
INTCON=0B10010000; //RB0中断使能
SPBRG=25; //波特率9600,高速,8位数据
RCSTA=(0b10010000);
TXSTA=(0b00100100);
}
//======//中断服务程序
voidinterruptINT_ISR(void)
{ charx;
if(INTF) //按键RB0中断,LED3闪一下,蜂鸣器响
{ LED=1;
SEND_ONE(aaa);
PORTD=aaa;
aaa++; //发送的数加1,为下次发送做准备
DELAY(100);
LED=0;
INTF=0;
}
}
从机的程序:
//异步串行通信的接收
#include<pic.h>
__CONFIG(0x3F39); //调试用
#defineLED RB1
voidDELAY_I(unsignedint); //延时(i)ms,中断用
voidCSH(void); //初始化程序
voidinterruptINT_ISR(void); //中断服务程序
main(void)
{ CSH();
LED=0;
while(1);
}
//======初始化程序
voidCSH(void)
{ TRISB=0B11110000;
TRISC=0B11100011; //RC2为蜂鸣器输出
TRISD=0;
PORTD=0;
INTCON=0B11000000; //
RCIE=1; //接收中断
SPBRG=25; //波特率9600,高速,8位数据
RCSTA=(0b10010000);
TXSTA=(0b00100100);
PORTB=0b00000000;
}
//======//中断服务程序
voidinterruptINT_ISR(void)
{ charx;
if(RCIE&RCIF) //接收中断,LED闪一下
{ LED=1;
x=RCREG; //读接收数据,实际上会自动将RCIF清0
PORTD=x;
DELAY_I(100); //延时为了能看清LED闪亮
LED=0;
}
}
//======延时(n)ms
voidDELAY_I(unsignedintn)
{ unsignedintj;
chark;
for(j=0;j<n;j++)
for(k=246;k>0;k--)NOP();
}
‘叁’ 求用PIC单片机语言编写一段crc8校验码的程序 (求大神指点,要是有注释就更好了)
可以参考北航的《PIC16系列单片机C程序设计与PROTEUS仿真》一书,里面有8位的和16位的CRC程序,是用PICC编的,8位的好象在第6章的一线式温度传感器那一节。
‘肆’ pic系列单片机用c语言编程时,让他执行A/D转换的指令是什么
AD转换不是一条指令就可以完成的,它要先经过端口设置,AD设置等过程后才能准备进入AD转换,下例是从北航的<PIC16单片机C程序设计与PROTEUS仿真>一书中得到的启发编制的程序,希望对你能有帮助.建议你看一下这本书,对初学和想进一步提高在PIC单片机应用编程等会有用的.
附图是对应程序的,在仿真时调整电位器可以看到AD结果的变化,并通过计算器可以验证程序的正确性.
//ADl转换示例,可以改变输入电压、AD通道、结果对齐方式等,看其变化
#include<pic.h>
__CONFIG(0x3F39);//配置位设置
voidmain(void)
{ chari,X,Y;
TRISA=0xFF; //将所有的A口设置为输入
TRISE=0x03; //将所有的E口设置为输入
TRISD=0; //C口与D口全为输出
TRISC=0;
ADCON1=0b10000000; //设置AD结果对齐方式、AD时钟选择(与ADCON0的位7,6一起),AD端口设置等
ADCON0=0b01011001; //AD时钟选择(与ADCON1的位6一起),通道选择,AD模块使能
while(1)
{ NOP();
for(i=0;i<3;i++) //延时时间大约20us
NOP();
ADGO=1; //开始AD
while(ADGO==1); //等待AD转换完成
ADIF=0;
X=ADRESH; //读取AD结果高字节至C口
PORTC=X;
Y=ADRESL; //读取AD结果低字节至D口
PORTD=Y;
};
}