找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5310|回复: 11
收起左侧

关于proteus仿真失败——很简单,你肯定会

[复制链接]
ID:988502 发表于 2021-12-6 12:39 | 显示全部楼层 |阅读模式
学校里设计做了一个单词记忆测试器
我是现在单片机上实现的,然后再做仿真
然后神奇的事来了,同一个hex单片机上可以实现的仿真里实现不了。
W@OZ1X`YW)O8U6QO7LCK3SI.png
@1DI$G@395$KR~P@KFAME]Q.png


更离谱的是我有一个室友用汇编写的编译了hex可以仿真,弄了几天真的很心累。
H)(RFV2XM]ZTTS%Z~BIS}}9.png
]2KWFPDCLSZF(Q1)1XV%YBG.png
各位说说可能的原因,我自己也尝试了很多了,再看看大伙儿的想法。


回复

使用道具 举报

ID:342822 发表于 2021-12-6 15:17 | 显示全部楼层
看了两个图区别是不同的文件夹
回复

使用道具 举报

ID:102963 发表于 2021-12-6 16:48 | 显示全部楼层
可能都原因:你的1602驱动程序有问题
回复

使用道具 举报

ID:161164 发表于 2021-12-6 17:58 | 显示全部楼层
你不贴代我只能乱猜
请把Readdata和WriteData函数中的CheckBusy注释掉
回复

使用道具 举报

ID:96682 发表于 2021-12-7 06:34 来自触屏版 | 显示全部楼层
应该是放错程序了吧
回复

使用道具 举报

ID:420836 发表于 2021-12-7 09:08 | 显示全部楼层
有没有可能是芯片配置不正确? 还是单片机的机器频率设置不正确?
回复

使用道具 举报

ID:988502 发表于 2021-12-7 12:46 | 显示全部楼层
songxia8013 发表于 2021-12-6 16:48
可能都原因:你的1602驱动程序有问题

是的,我对着网上一个驱动改了就行,正在详细看
回复

使用道具 举报

ID:401564 发表于 2021-12-7 13:25 | 显示全部楼层
逛这个论坛三年,我一直很庆幸,我到现在还不会用proteus仿真
回复

使用道具 举报

ID:624769 发表于 2021-12-7 13:44 | 显示全部楼层
Y_G_G 发表于 2021-12-7 13:25
逛这个论坛三年,我一直很庆幸,我到现在还不会用proteus仿真

我也不会,同喜同喜。
回复

使用道具 举报

ID:988502 发表于 2021-12-7 17:07 | 显示全部楼层
有一下几种驱动;
忙检测的:

第一种:r  单片机可以仿真不行;
#include <reg52.h>
...
void Busy()
{
                P0= 0xFF;//必要的否则会干扰读写信号
                RW=1;
                RS=0;
                EN=1;
                while(P0 & 0x80);
                EN=0;       
}
第二种:源代码中的:单片机可以仿真不行。
#include <AT89X52.h>
...
void LCD1602_busy(void)
{
     P0_7=1;              //将P0.7置1,为读状态做准备
     RS=0;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
     RW=1;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
     E=1;                 //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
     while(P0_7==1);      //由P0.7读入1,表示1602液晶忙,需要等待
     E=0;                 //读完以后,恢复E的电平
}


第三种:也是唯一成功的,读入忙信号后不将while循环放在忙检测函数中,这似乎也是影响到仿真的因素,while循环是否在忙检测函数内部。
//BUSY   CHECK
bit test()
{
        bit busy;
        RS=0;
        RW=1;
        EN=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        busy=BF;
        EN=0;
        return busy;
}
我要顶不住了兄弟们
回复

使用道具 举报

ID:989630 发表于 2021-12-8 15:35 | 显示全部楼层
你把排阻连接到lcd1602上看看
回复

使用道具 举报

ID:988502 发表于 2021-12-10 12:14 | 显示全部楼层
ccyyer 发表于 2021-12-7 17:07
有一下几种驱动;
忙检测的:

第一种:r  单片机可以,仿真不行;
#include <reg52.h>
...
void Busy()
{
···
}

第二种:源代码中的:单片机可以仿真不行。
#include <AT89X52.h>
...
void LCD1602_busy(void)
{
···
}

以上两种不能仿真是因为在驱动忙检测里在对P0口赋值后马上忙检测,此时检测的还是对P0赋值的1,所以一直为忙,只有在while忙检测之前加一段延时就行。
例如这样。
void Busy()
{
                P0= 0xFF;//必要的否则会干扰读写信号
                delay_nms(5);
                RW=1;
                RS=0;
                EN=1;
                while(P0 & 0x80);
                EN=0;       
}

为了验证这一猜想,我将P0赋值为0F,果然此时仿真有显示了。然而实际单片机则显示错误。
这说明硬件与软件在数据读取速度上的不同,影响了实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表