共3条
1/1 1 跳转至页
STC89C58RD 请问姚工:关于STC89C58RD+
问
我用的是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: 不是后来 ,后来我把程序写到芯片里去了,串口发了好多乱七八糟的数据啊。
更为奇怪的是,仿真时,串口调试软件里还是哗哗的出数据,我就把仿真头拿掉了,拿掉后,还是有数据,后来我把板子的电断了,还是有数据,后来我把串口关了,就没了。
呵呵,象闹鬼一样;)
,后来我参考姚工的程序如下:
/*----------------------------------------------------------
此程序完全参考宏晶科技 姚永平 程序文件 ”定时器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: 不是后来 ,后来我把程序写到芯片里去了,串口发了好多乱七八糟的数据啊。
更为奇怪的是,仿真时,串口调试软件里还是哗哗的出数据,我就把仿真头拿掉了,拿掉后,还是有数据,后来我把板子的电断了,还是有数据,后来我把串口关了,就没了。
呵呵,象闹鬼一样;)
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |