本文主要是介绍proteus 8.9 8.6 串口 无法仿真 仿真不出来 51单片机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
分享一个问题,STC89C52。
今天使用仿真软件去仿真51单片机的串口,却发现无论怎么设置51单片机计算器串口都无法工作,经过多方面的调试最终发现是keil的原因。可能的原因是:可能程序工程是很早以前创建的,和现在电脑版本的有所区别,编译出来的窗口是不能使用的。
解决方法:当前电脑用什么版本的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 ){}
}
这篇关于proteus 8.9 8.6 串口 无法仿真 仿真不出来 51单片机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!