用STC12C5A60S2模拟一个串口
请问哪位高手用STC12C5A60S2单片机,我用这个单片机模拟串口双机通信,具体方法是用PCA定时器(其他定时器已被占用了)和外部中断0来模拟,可是接收不到数据,哪位高手能帮我改一改,都弄了两三个星期了,还没弄出来,请求各路高手帮忙,感激不尽!
#include<12C5A60S2.h>
#define uchar unsigned char
#define uint unsigned int
sbit BT_SND =P3^3;
sbit BT_REC =P3^2;//外部中断0接口
sbit led=P1^0;
/**********************************************
IO 口模拟232通讯程序
占用 定时器0 外部中断0
**********************************************/
#define F_TM F0
#define TIMER0_ENABLE CR=1; CL=0;CH=0; // 0x40 0x02
#define TIMER0_DISABLE CR=0;
uchar tmpbuf2[3];
uchar num;
//
//发送一个字符
//
void PSendChar(unsigned char input)
{
unsigned char j=8;
TIMER0_ENABLE; //启动
BT_SND=0; //start bit
F_TM=0;
while(!F_TM);
//发送8位数据位
while(j--)
{
BT_SND=(bit)(input&0x01);//先传低位
F_TM=0;
while(!F_TM);
input=input>>1 ;
}
BT_SND=(bit)1 ;
F_TM=0;
while(!F_TM);
TIMER0_DISABLE; //停止timer
}
//
//接收一个字符
//
unsigned char PGetChar()
{
uchar Output,i=8;
TIMER0_ENABLE;
F_TM=0;
while(!F_TM); //等过起始位
//接收的时候程序执行到这里就不执行了,停在这里了,不知道为什么?!
//接收8位数据位
while(i--)
{
Output>>=1 ;
if(BT_REC)Output|=0x80 ; //先收低位
F_TM=0;
while(!F_TM);
}
return Output;
}
void ext0_pca()
{
CMOD=0X00;
CCON=0X00;
CL=0; //定时器赋初值
CH=0; //同上
CCAP0L=0x5f; // 比较匹配数值1152 0xc0
CCAP0H=0; // 比较匹配数值1152 0x06
CCAPM0=0X49;//设置PCA位定时模式
EA=1; //开总中断
CR=0;//关闭启动计数器阵列,用到的时候在打开
EX0=1;// 使能外部中断0
IT0=1 ;// 设置外部中断0为边沿触发方
// CCF0=0;
}
void main()
{
ext0_pca();
PSendChar(0xaa);
while(1)
{
P0=tmpbuf2[1];
}
}
void EXT0()interrupt 0
{
EX0=0 ; //屏蔽外部中断0
tmpbuf2[1]=PGetChar(); //从模拟串口读取数据,存放到tmpbuf2数组中
IE0=0 ; //防止外部中断响应2次,防止外部中断函数执行2次
EX0=1 ; //打开外部中断0
}
void PCA_Routine() interrupt 7
{
if(CCF0==1)
{
F_TM=1;
CCF0=0;
CL=0;
CH=0;
}
}
两片单片机,一个作为发送,另一个接收,接收的时候总是停在 while(!F_TM); //等过起始位 ,这句,不知为什么,进入外部中断0以后我已经把外部中断0关闭掉了,怎么就近不到PCA定时器中断函数里呢?进不去while(!F_TM); 就一直等待。这是怎么回事呢?感谢高手能指点。