本帖最后由 连家二少 于 2012-11-23 20:35 编辑
接收时就只有几个字节能接收到~~~如FF,FB,77等,而且不管发送什么十六进制的数,接收到的都是这类FF,FB,FD,固定的几个·····
帮助啊~~~
源程序
/**************************
*** 模拟串口 **
***************************/
#include
#define uchar unsigned char
//#define timer0_en TL1=TH1;TR1=1; //启动T1
#define timer0_dis TR1=0; //关闭T1
volatile unsigned char F_TM; //标志位
***it SND=P1^0; //模拟发送端
***it REC=P1^1; //模拟接受端
/*ACC累加器作为发送的移位寄存器 */
***it ACC0=ACC^0;
***it ACC1=ACC^1;
***it ACC2=ACC^2;
***it ACC3=ACC^3;
***it ACC4=ACC^4;
***it ACC5=ACC^5;
***it ACC6=ACC^6;
***it ACC7=ACC^7;
//定时器T1中断
void Timer1() interrupt 3
{
F_TM=1;
}
/*发送一个字符,数据格式为一个起始位(0),8个数据位,一个停止位(1)*/
void SENDCHAR(uchar GETCH)
{
ACC=GETCH;
F_TM=0; //中断标志清零
SND=0;
//timer0_en; //计数器T0启动
TR1=1;
while(!F_TM);
SND=ACC0; //送出低位
F_TM=0; //软件对中断标志清零
while(!F_TM);
SND=ACC1;
F_TM=0;
while(!F_TM);
SND=ACC2;
F_TM=0;
while(!F_TM);
SND=ACC3;
F_TM=0;
while(!F_TM);
SND=ACC4;
F_TM=0;
while(!F_TM);
SND=ACC5;
F_TM=0;
while(!F_TM);
SND=ACC6;
F_TM=0;
while(!F_TM);
SND=ACC7;
F_TM=0; //依次由低至高送出8位数据
while(!F_TM);
SND=1; //停止位
F_TM=0;
while(!F_TM);
timer0_dis; //关闭计时器
}
//接收一个字符
uchar GETCHAR()
{
//timer0_en;
TR1=1 ;
F_TM=0;
while(!F_TM); //等待过起始位
ACC0=REC;
TL0=TH0;
F_TM=0;
while(!F_TM);
ACC1=REC;
F_TM=0;
while(!F_TM);
ACC2=REC;
F_TM=0;
while(!F_TM);
ACC3=REC;
F_TM=0;
while(!F_TM);
ACC4=REC;
F_TM=0;
while(!F_TM);
ACC5=REC;
F_TM=0;
while(!F_TM);
ACC6=REC;
F_TM=0;
while(!F_TM);
ACC7=REC;
F_TM=0;
while(!F_TM)
{
if(REC) //判断停止位,并跳出
{
break;
}
}
timer0_dis; //停止计时器
return ACC;
}
void init() // 初始化uart
{
TMOD=0x20; // 定时器1定时器方式 工作模式2,可自动重载的8位计数器常把定时计数器0以模式2作为串行口波特率发生器
SCON=0x50; // 选择工作模式1使能接收,允许发送,允许接收
EA=1; // 开总中断
ET1=1; // 打开定时器中断
TF1=0;
PCON=0x80; // 8位自动重载,波特率加倍
TH1=0xf3; // 用4800波特率
//TH1=0xfa; //9600
TL1=TH1;
TR1=0; // 在发送或接收时打开
}
bit startbit() //检查起始位
{
return(REC==0);
}
void main()
{
uchar gchar;
init();
while(1)
{
if(startbit())
{
gchar=GETCHAR();
SENDCHAR(gchar);
}
}
}
补充一点:
在串口调试助手发送分别:01, 02, 03, 04, 05,06,07,08,09,0a,0b,0c,0d,0e,0f
接收到的是: 7B, DB, DB, 7B, 7B,B7,B7,7B,7B,DB,DB,7B,7B,6F,6F
然后如果发送,7B,B7,DB,6F,
则可以接收回来:7B,B7, DB,6F,
这是为什么呢?????
求大神赐教
|