Proteus 8.9 8.6シリアルポートはシミュレーションできず、シミュレーションを実行できない51 MCU

質問を共有してください、STC89C52。

今日、シミュレーションソフトを使って51シングルチップマイコンのシリアルポートをシミュレートしましたが、51シングルチップコンピュータのシリアルポートは設定方法に関係なく動かないことがわかりました。考えられる理由は、プログラムプロジェクトがかなり前に作成されたため、現在のコンピューターのバージョンと異なるため、コンパイルされたウィンドウを使用できないことです。

解決策:コンピューターで現在使用されているkeilソフトウェアのバージョンを確認し、ソフトウェアを使用して新しいプロジェクトを自分で作成します。
以下に、正常に動作するシミュレーション図とシミュレーションコードを掲載します。

別の分析:タイマー0が使用されている場合は、シリアルポートを初期化した後、タイマー0を初期化するためのコードを記述します。

以下は私のシミュレーション図です:
ここに画像の説明を挿入

以下は私のテストコードです:

#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


/*********************************************************************************
 * 【函 数 名】: void send_cmd(unsigned char dat)
 * 【功    能】: 串口发送数据命令
 **********************************************************************************/
void send( unsigned char dat )
{
    
    
	SBUF = dat;     /* 发送指令到SBUF */
	while ( !TI )
		;       /* 等待发送结束 */
	TI = 0;         /* 清除结束标志,以便再发送数据 */
}
/*********************************************************************************
 * 【函 数 名】: Print_Str(unsigned char *s)
 * 【功    能】: 串口发送 一个字符串
 **********************************************************************************/
void Print_Str( unsigned char *s )
{
    
    
	while ( *s != '\0' )
	{
    
    
		send( *s++ );
	}
}
#define FSOC	11059200L                       /* 晶振 */
#define BAUD	9600                            /* 波特率 */
/*********************************************************************************
 * 【函 数 名】: void SerInit(void)
 * 【功    能】: 串口初始化程序 设置波特率为9600
 **********************************************************************************/
void SerInit( void )
{
    
    
	SCON	= 0x50;                         /* 010 1 0000B,工作方式1, 8位UART,波特率可变,允许接收 */
	TMOD	= 0x20;                         /* T1工作于方式2 */
	TCON	= 0x40;                         /* 定时器1开始计数 */
	TH1	= -(FSOC / BAUD / 12 / 16);     /* T1计数初值 */
	TL1	= -(FSOC / BAUD / 12 / 16);
	PCON	= 0x80;                         /* SMOD置1,双倍速率 */
	RI	= 0;
	TI	= 0;

	ES = 1;                                 /* 关闭串口中断 */
}

unsigned char Txd_data;
void Uart_isr() interrupt 4             /* 中断接收程序 */
{
    
    
	if ( RI )                       /* 判断是否接收完,接收完成后,由硬件置RI位 */
	{
    
    
		Txd_data	= SBUF; /* 读入缓冲区 */
		RI		= 0;    /* 清标志 */
		send( Txd_data );
	}
}






void delay_ms( unsigned int t )                 /* 延时xms */
{
    
    
	unsigned char ttt;
	while ( t-- )
	{
    
    
		for ( ttt = 0; ttt < 125; ttt++ )
			;
	}
}
/*********************************************************************************
 *
 *       主函数
 **********************************************************************************/
void main( void )
{
    
    
	SerInit();


	EA = 1;

	delay_ms( 200 );

	Print_Str( "zheng dian bao shi " );
	Print_Str( "\r\n" ); /* 发送换行符号 便于看 */

	while ( 1 )
	{
    
    
	}
}



おすすめ

転載: blog.csdn.net/x1131230123/article/details/108548310