#include "usatr.h"
void Hardwareini(void)
{
nRBPU=1; //关闭上拉
ANSEL=0x00;
ANSELH=0x00; //关闭模拟端口(暂时用不到)
INTE=1;//开外部中断
INTF=0;//开外部中断标志位初始为零
INTEDG=0;//下降沿触发
GIE=1;//开全局中断
PEIE=1;//开外设中断
RB0=1;//RB0初始值为1
TRISB0=1;//设置RB0为输入
RB1=1;//RB0初始值为1
TRISB1=0;//设置RB0为输出
RA0=0;
TRISA0=0;
RA1=1;
TRISA1=1;
PORTC=0x00;
TRISC=0x00;
TMR2ON=0;//关模拟波特率
a=0;//收完一帧后置零
}
void Timeini(void)
{
//*****T0定时器初始化
T0CS=0; //选择内部晶振频率/4为定时器0的时钟源
PSA=0; //预分频器分配给定时器0
PS0=1;
PS1=0;
PS2=1; //以上三项是分频比设为1:64
TMR0=0x70;//定时器0赋初值(系统基准时钟定为10mS)
T0IF=0; //定时器0中断标志位清初始为零
T0IE=1; //开定时器0中断
//*****T2定时器初始化
//T2CON=0x02;//T2预分频为1:16,后分频为1:1
T2CON=0x00;//
TMR2=0;
PR2=TRXT;
TMR2ON=0;
TMR2IF=0;
TMR2IE=1;
a=0;
num=0;
}
void Time_on(uchar count)
{
Flag.timE=1;
Mscount=count;
}
void Time_off(void)
{
//x++;
Flag.timE=0;
Mscount=0;
}
void interrupt server()
{
if(T0IF && T0IE)
{
T0IF=0;
TMR0=0x70;
if(Flag.timE)
{
Mscount--;
if(Mscount==0)
{
Flag.timE=0;
if(Flag.RX)
{
Flag.RX=0;//关接收标志位
Flag.RXok=1;//接收完成标志位
TMR2ON=0;//关模拟波特率
a=0;//收完一帧后置零
}
}
}
}
if(TMR2IF && TMR2IE)
{
TMR2IF=0;
if(Flag.RX)
{
//x++;
if(PR2==RXT1)//更换成1倍时间来接收
{
PR2=TRXT;
}
if(RXD==1)
{
RXdata=(RXdata>>1) | 0x80;
}
else
{
RXdata>>=1;
}
num++;
if(num==8)//收完一个字节
{
TMR2ON=0;
num=0;
INTF=0;
INTE=1;
RXBUF[a]=RXdata;
RXdata=0;
a++;
Time_on(2);
}
}
}
if(INTE && INTF)
{
Time_off();
INTF=0;
INTE=0;
PR2=RXT1;//接收首位1.5倍时间
TMR2ON=1;
Flag.RX=1;
}
}
void main(void)
{
Hardwareini();
Timeini();
while(1)
{
if(Flag.RXok)//接收完后的处理
{
Flag.RXok=0;
PORTC=RXBUF[1];
if(RXBUF[0]==0x55)
{
d1=1;
}
}
if(RA1==0)
{
d1=0;
}
CLRWDT();
}
}
模拟串口接收的程序,在第一次启动收一字节时似乎会收到结束位,以后就都正常。麻烦高手帮我看看 |