搜索

重新开始仿真才会出现第二次结果

[复制链接]
52|23
 楼主 | 2021-3-2 21:10 | 显示全部楼层 |阅读模式
在AD转换时没出现问题,后来要求加个串口,于是我加上了串口程序,一仿真,发现AD转换部分只转换一次便不动了,需要重新开始仿真才会出现第二次结果

使用特权

评论回复
| 2021-3-2 21:13 | 显示全部楼层

串口部分有问题

使用特权

评论回复
| 2021-3-2 21:15 | 显示全部楼层

把串口部分程序屏蔽掉试试

使用特权

评论回复
 楼主 | 2021-3-2 21:17 | 显示全部楼层
试了,再仿真结果就是循环转换了,不知道怎么回事

使用特权

评论回复
| 2021-3-2 21:19 | 显示全部楼层
以前呢?把你代码贴上来看看

使用特权

评论回复
| 2021-3-2 21:22 | 显示全部楼层
以前做的时候也是这样,只不过那时不需要循环多次

使用特权

评论回复
| 2021-3-2 21:23 | 显示全部楼层
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;

uchar disbuf[]={'0','0','0',0x00};
sbit rs=P2^0;
sbit en=P2^1;
sbit rw=P2^2;
sbit OE=P2^3;
sbit EOC=P2^4;
sbit ST=P2^5;
sbit CLK=P2^6;

void delay(uint z)
{
      uint x,y;
          for(x=z;x>0;x--)
                  for(y=110;y>0;y--);
}

void command(uchar com)
{
          rs=0;
          delay(5);
          P1=com;
          en=1;
          delay(5);
          en=0;
}

void figure(uchar figure)
{
          rs=1;
          delay(5);
          P1=figure;
          en=1;
          delay(5);
          en=0;
}

void write_first(uchar *s)
{
          command(0x80);
          while(*s)
          {
                  figure(*s);
                  s++;
                  delay(20);
          }
}

void write_second(uchar x)
{
           command(0xc0);
           disbuf[0]=x/100+0x30;
           disbuf[1]=x%100/10+0x30;
           disbuf[2]=x%10+0x30;
           for(i=0;i<3;i++)
           {
                   figure(disbuf);
                   delay(5);
           }
}

void init()
{        
          rw=0;
          TMOD=0x22;
          SCON=0X50;
          PCON=0;
          TH1=TL1=0XFD;        
            TH0=(256-4)/256;
          TL0=(256-4)%256;                                                   
          command(0x38);
          command(0x0c);
          command(0x06);
          command(0x80);
}

void main()
{
           uchar temp,i;
           uchar *p;         
         init();
           p="ADconvert result";;
           write_first(p);
           EA=1;
           ET0=1;
           TR0=1;
           TR1=1;
           while(1)
           {         
                 ST=0;ST=1;ST=0;
                   delay(5);
                   while(EOC==0);  
                   OE=1;
                   temp=P0;  
                   write_second(temp);  
                   OE=0;
                   i=0;
                   while(disbuf!=0x00)
                   {
                          SBUF=disbuf;
                          while(TI==0);
                          TI=0;
                          i++;
                          delay(5);
                   }
                   while(RI==0);
                   RI=0;
                   while(TI==0);
                   TI=0;
         }
}

void timer0() interrupt 1
{
        CLK=~CLK;
}

使用特权

评论回复
| 2021-3-2 21:25 | 显示全部楼层
0809啊

使用特权

评论回复
| 2021-3-2 21:31 | 显示全部楼层
AD转换部分大致不会有错,只有看串口部分了

使用特权

评论回复
 楼主 | 2021-3-2 21:32 | 显示全部楼层
可能有些长,不知道可能是哪里的问题

使用特权

评论回复
| 2021-3-2 21:34 | 显示全部楼层

可以分部分来调试吗

使用特权

评论回复
| 2021-3-2 21:37 | 显示全部楼层

你下载些现成的程序参考下啊

使用特权

评论回复
| 2021-3-2 21:39 | 显示全部楼层
.
.
.
while(RI==0);
RI=0;
while(TI==0);
TI=0;
---------
最大的问题在这里。

使用特权

评论回复
| 2021-3-2 21:41 | 显示全部楼层
同意楼上的, 应该删除掉这部分, 否则程序会听在那里

使用特权

评论回复
| 2021-3-2 21:43 | 显示全部楼层

while(RI==0);
                   RI=0;
                   while(TI==0);
                   TI=0;
以后要少些这样的语句,编译器不会明白你的意思

使用特权

评论回复
| 2021-3-2 21:45 | 显示全部楼层
它会一直在那里循环,做无用功!

使用特权

评论回复
| 2021-3-2 21:47 | 显示全部楼层
while循环真的是,我也碰到过,后来我都不敢用了!

使用特权

评论回复
| 2021-3-2 21:51 | 显示全部楼层
楼主仿真的时候应该能看到程序卡在循环里了。

使用特权

评论回复
| 2021-3-2 21:54 | 显示全部楼层

while(!RI);
RI=0;
while(!TI);
TI=0;

使用特权

评论回复
| 2021-3-2 21:56 | 显示全部楼层
发送接收用中断吧。中断能解决你的问题

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表