这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » STC89C58RD 请问姚工:关于STC89C58RD+

共3条 1/1 1 跳转至

STC89C58RD 请问姚工:关于STC89C58RD+

院士
2006-09-17 18:14:16     打赏
STC89C58RD 请问姚工:关于STC89C58RD+



关键词: STC89C58RD     请问     姚工     关于     STC89    

院士
2006-12-22 22:43:00     打赏
2楼
问 我用的是stc89c58rd+,在测试串口时总是不通 ,之前是自己写的c51程序

,后来我参考姚工的程序如下:

/*----------------------------------------------------------

此程序完全参考宏晶科技 姚永平 程序文件 ”定时器1作波特率发生器“
file:用汇编程序编写STC89c58RD+的串口调试程序
date:2006 07 07
created by:cyh

---------------------------------------------------------------*/

       RELOAD_COUNT  EQU   0FDH        ;  11.0592MHZ  12T   SMOD=0  9600BPS
       ;AUXR          EQU   8EH

       ORG    0000H
       AJMP   MAIN
       ORG    0023H
       AJMP   UART_Interrupt
       NOP
       NOP
;-------------------------------------------------------------
MAIN:
      MOV  SP, #7FH
      ACALL  Initial_UART
      MOV    R0, #30H
      MOV    R2,#10
LOOP:
      MOV    A,R0
      ACALL  Send_One_Byte
      INC    R0
      DJNZ   R2,LOOP
MAIN_WAIT:
     SJMP  MAIN_WAIT
;--------------------------------------------------------------
UART_Interrupt:
     JB   RI, Is_UART_Receive
     CLR  TI
     RETI
Is_UART_Receive:
     CLR  RI
     PUSH  ACC
     MOV   A, SBUF
     ACALL Send_One_Byte
     POP  ACC
     RETI

;--------------------------------------------------------------
Initial_UART:
;SCON  Bit  7     6     5      4     3     2     1    0
;         SM0/FE  SM1  SM2     REN   TB8  RB8   TI    RI

     MOV  SCON, #50H           
     MOV  TMOD, #21H
     MOV  TH1, #RELOAD_COUNT
     MOV  TL1, #RELOAD_COUNT

;-----------------------------------------------------------
    ;ANL   AUXR, #10111111B  ;12T MODE


;------------------------------------------------------------
    SETB  TR1
    SETB  ES
    SETB  EA
    RET

;-------------------------------------------------------------
Send_One_Byte:
    CLR  ES
    CLR  TI
    MOV  SBUF, A  ;A=要发送的字节

Wait_Send_Finish:
    JNB  TI, Wait_Send_Finish
    CLR  TI
    SETB ES
    RET


;--------------------------------------------------------------

     END 1: o:开始的时候,程序中我加了这两句:

AUXR          EQU   8EH
ANL   AUXR, #10111111B  ;12T MODE

后来仔细阅读那个文档,发现STC89C58RD+是12个机器周期的8051单片机,我就又把上面两句注释掉了,调试时,串口调试助手的接收框里没有显示,软件应该没有问题吧,问题难道就在硬件了?  郁闷,这么个小串口:(
2: 这是我自己的程序,只向串口发一个字符#include <reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint  unsigned int

/* 新增特殊功能寄存器定义 */
sfr  WDT_CONTR  =   0xe1;
sfr     ISP_DATA      =   0xe2;
sfr  ISP_ADDRH    =   0xe3;  
sfr     ISP_ADDRL    =   0xe4;
sfr     ISP_CMD    =   0xe5;
sfr     ISP_TRIG    =   0xe6;   
sfr     ISP_CONTR  =   0xe7;
sfr  P4         =   0xe8;

sbit P4_0       =   0xe8;
sbit P4_1       =   0xe9;
sbit P4_2       =   0xea;
sbit P4_3       =   0xeb;

sfr  AUXR       =   0x8e;
sfr  AUXR1      =   0xa2;
sfr  XICON      =   0xc0;
sfr  IPH        =   0xb7;

void delay(unsigned char MS)
{
unsigned char us,usn;
while(MS!=0)
    {
        usn = 4;
        while(usn!=0)
            {
                us=0xf0;
                while (us!=0){us--;};
                usn--;
            }
        MS--;
    }
}
//----------initialize UART----------------初始化串口
void init_uart(void)
{ SCON = 0x50;//SCON: serial mode 1,8bit UART,ren=1
  TMOD = 0x20;//TMOD: timer1,mode2,8bit reload
  PCON = 0x00;//SMOD=0
// TH1  = 0Xfd;//baud: 9600bps
  TH1=0XFD;
  TL1=0XFD;

  AUXR =AUXR&0XBF;
  TR1  = 1;   //START T1

}

//-----------Send a 8_bit character to serial port-----------------
//向串口发送一个字节
void send_char_com(uchar ch)
{
  SBUF = ch;
  while(TI==0);//wait finish sending
  TI=0;//clear flag

}
//-----------send a char string to serial port---------------------
向串口发送3个字符
//str:字符串

void send_string_com(uchar *str)
{ uint n;
  do
  {  
    send_char_com(*(str+n));
    n++;
  }while(n < 3);

}
//-------------main.c-------------------------

void main(void)
{  
   delay(100);

    init_uart();//初始化
    EA=0;//总中断禁止
    
    send_char_com(0x08); 向串口发一个字符
    

} 3: 哇,不得了啊!刚才前面我贴出的那段汇编程序,我用仿真器运行着,没看见有数据收到,结果,我发完上面的贴子回头再看那个串口调试软件,结果串口里哗哗的出来好多00 (16进制显示),现在我没有管他,他又停了显示00了

4: 就是出00了也不对啊就是出00了也不对啊,明明程序是发送的是0123456789 5: 你用的是内部晶振吗?下载完程序后选的是内部晶振吗?我之前用STC12c4052就是搞错这一点查了好久.
呵,乱说了我,别拍我.. 6: 不是后来 ,后来我把程序写到芯片里去了,串口发了好多乱七八糟的数据啊。

更为奇怪的是,仿真时,串口调试软件里还是哗哗的出数据,我就把仿真头拿掉了,拿掉后,还是有数据,后来我把板子的电断了,还是有数据,后来我把串口关了,就没了。

呵呵,象闹鬼一样;)

专家
2022-08-11 22:19:17     打赏
3楼

学习学习


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]