| 
 
| 我用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();的调用也不正常。
 请高手指点下。。。。。。。。。。
 !!!
 | 
 |