我用S51 单片机做的程序片段如下:用的是22。1184M晶振
void init_serialcom( void ) //串口通信初始设定
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD |= 0x20 ; //定时器1为模式2,8位自动重装
PCON |= 0x80 ; //SMOD=1;
// TH1 = 0xFA ; //Baud:19200 fosc="11".0592MHz
TH1=0XF4 ; //9600 22.1184m
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0);
TI= 0 ;
}
void DelayMs(unsigned int number) {
unsigned char temp;
for(;number!=0;number--)
{
for(temp=112;temp!=0;temp--);
}
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if(RI)
{
RI = 0 ;
if(n<78)
{
RcvBuf[n]=SBUF;
n++;
}
if(RcvBuf[0]==0xAA&&RcvBuf[7]==0-RcvBuf[1]-RcvBuf[2]-RcvBuf[3]-RcvBuf[4]-RcvBuf[5]-RcvBuf[6])
{ choice_d=1;
TR0=1;}
ch= SBUF;
DelayMs(5);
read_flag= 1 ; //就置位取数标志
}
}
main ()
{init_wbzd();
init_serialcom();
while (1){
if(choice_d==1)
{FWJFYJ();}
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag= 0 ; //取数标志清0
n=0;
send_char_com(ch);
}
}
出现的问题如下:
1.在串口发送一长串数据比如77个,第77个数据为0xab
按程序我想实现调用FWJFYJ();串口调试助手应该收到的数据是0xab
但是现在在使用过程中不定时出现收到的数据是0x?? 0xab (??代表收到的数不一定),出现0x??的情况0XAB要延时约一秒出现,而且FWJFYJ();这个程序调用不正常。
2.我如果把中断中的延时加长比如DelayMs(10);,FWJFYJ();的调用也不正常。
请高手指点下。。。。。。。。。。
!!! |