为什么在proteus8仿真中用自己的电脑数码管只能亮8,而用别人电脑时数码管能根据自己写的代码亮

为什么在proteus8仿真中用自己的电脑数码管只能亮8,而用别人电脑时数码管能根据自己写的代码亮,而自己电脑不行。换了好几台电脑试过了,代码和仿真图都没问题。

img

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7643705
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于Proteus仿真闪退及Proteus上电瞬间电容初始电压设定问题解决办法总结
  • 除此之外, 这篇博客: 8051单片机Proteus仿真与开发实例-串口通信仿真中的 8、中断方式接收数据 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 8051 UART 有一个串行中断。 每当发送或接收数据时,串行中断标志 TI 和 RI 分别被激活。

    8051 串行中断有一个向量地址(0023H),如果启用全局和串行中断,它可以跳转到服务 ISR(中断服务程序)。

    让我们看看串行中断程序将如何用于串行通信编程。

    • 1)将计时器 1 设置为自动重新加载模式。
    • 2)根据所需的波特率加载 TH1 值,例如 对于 9600 波特率负载 0xFD。
    • 3)使用串行模式和控制位加载 SCON。 例如 用于模式 1 并启用接收负载 0x50。
    • 4)通过将 TR1 位设置为 1 来启动 timer1。
    • 5)使能全局和串行中断位,即 EA = 1 和 ES = 1。
    • 6)无论何时接收或发送数据,中断标志都会设置,控制器将跳转到串行 ISR。
      请注意,TI/RI 标志必须在 ISR 中由软件清零。

    注意:对于发送和接收中断,分配了相同的中断向量地址,所以当控制器跳转到 ISR 时,我们必须通过 TI 和 RI 位状态来检查是 Tx 中断还是 Rx 中断。

    实现代码如下:

    #include <reg52.h>		/* Include x51 header file */
    
    char rcv_data;
    
    void uart_interrupt_init()				
    {
    	EA  = 1;		/* 开启全局中断 */
    	ES = 1;  		/* 开户串行中断 */			
    }
    
    void uart_init()
    {
    	TMOD = 0x20;		/* Timer 1, 8位,自动重载模式 */
    	TH1 = 0xFD;		/* 波特率为9600 */
    	SCON = 0x50;		/* 模式1,启动接收 */
    	TR1 = 1;		/* 启动 timer 1 */
    }
    
    /*中断处置函数*/
    void Serial_ISR() interrupt 4    
    {
    	rcv_data = SBUF;		/* 接收数据 */
    	RI = 0;			/* 清空 RI 标志 */
    	//IE=0x00;    /* 关闭中断以防止递归 */
    	
    	SBUF = rcv_data; // 将数据原路返回
    	while(TI==0);
    	TI=0;
    	
    	//IE=0x90; 
    } 
    
    void main()
    {
    	P1 = 0x00;		/* Make P1 output */
    	uart_interrupt_init();  	/* Call Ext. interrupt initialize */
    	uart_init();
    	while(1);
    }
    

    Proteus仿真结果:

    在这里插入图片描述

1,你怎么确认代码和仿真图和代码没问题的?是直接拷过来的吗?(抄的不算,抄错可能性太大)
2,确认操作正确,确保单片机正确加载了程序文件。