标题: 关于proteus仿真失败——很简单,你肯定会 [打印本页]

作者: ccyyer    时间: 2021-12-6 12:39
标题: 关于proteus仿真失败——很简单,你肯定会
学校里设计做了一个单词记忆测试器
我是现在单片机上实现的,然后再做仿真
然后神奇的事来了,同一个hex单片机上可以实现的仿真里实现不了。




更离谱的是我有一个室友用汇编写的编译了hex可以仿真,弄了几天真的很心累。


各位说说可能的原因,我自己也尝试了很多了,再看看大伙儿的想法。



作者: taotie    时间: 2021-12-6 15:17
看了两个图区别是不同的文件夹
作者: songxia8013    时间: 2021-12-6 16:48
可能都原因:你的1602驱动程序有问题
作者: lkc8210    时间: 2021-12-6 17:58
你不贴代我只能乱猜
请把Readdata和WriteData函数中的CheckBusy注释掉
作者: wc86110    时间: 2021-12-7 06:34
应该是放错程序了吧
作者: TTQ001    时间: 2021-12-7 09:08
有没有可能是芯片配置不正确? 还是单片机的机器频率设置不正确?
作者: ccyyer    时间: 2021-12-7 12:46
songxia8013 发表于 2021-12-6 16:48
可能都原因:你的1602驱动程序有问题

是的,我对着网上一个驱动改了就行,正在详细看
作者: Y_G_G    时间: 2021-12-7 13:25
逛这个论坛三年,我一直很庆幸,我到现在还不会用proteus仿真
作者: 188610329    时间: 2021-12-7 13:44
Y_G_G 发表于 2021-12-7 13:25
逛这个论坛三年,我一直很庆幸,我到现在还不会用proteus仿真

我也不会,同喜同喜。
作者: ccyyer    时间: 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;
}
我要顶不住了兄弟们

作者: mikotest    时间: 2021-12-8 15:35
你把排阻连接到lcd1602上看看
作者: ccyyer    时间: 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,果然此时仿真有显示了。然而实际单片机则显示错误。
这说明硬件与软件在数据读取速度上的不同,影响了实现。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1