标题: 求教各路大咖:本人使用Proteus 8仿真AT89C51_ADC0804出现乱码 [打印本页]

作者: pull1121    时间: 2020-2-13 11:30
标题: 求教各路大咖:本人使用Proteus 8仿真AT89C51_ADC0804出现乱码
//代码如下
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={                 //数码管编码 0到F
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;                        //定义数码管的段选
sbit wela=P2^7;                        //定义数码管的位选
sbit adwr=P3^6;
sbit adrd=P3^7;
void delay_ms(uint);        //申明延时函数;因为在主函数之前,也可以不申明

void display (uchar bai,uchar shi,uchar ge)  //数码管显示子函数
{
        P0=0x00;
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7e;
        wela=0;
        delay_ms(5);

        P0=0x00;
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7d;
        wela=0;
        delay_ms(5);

        P0=0x00;
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7b;
        wela=0;
        delay_ms(5);
               

}
void delay_ms(uint cc)          //延时子函数
{
        uint aa,bb;
        for (aa=cc;aa>0;aa--)
                for (bb=110;bb>0;bb--);       
}
void main()                          //主函数
{
         uchar adval,A1,A2,A3,a;
         wela=1;
         P0=0x78;
         wela=0;
         while(1);
                 {
                        adwr=1;
                         _nop_();
                        adwr=0;
                        _nop_();
                         adwr=1;                          
                         for(a=10;a>0;a--)
                         {
                                display(A1,A2,A3);
                        }
                        P1=0xff;
                         adrd=1;
                         _nop_();
                         adrd=0;
                         _nop_();
                         adval=P1;
                         adrd=1;
                         A1=adval/100;
                         A2=adval%100/10;
                         A3=adval%10;                       
                }         
                                                        
}

显示情况.png (22.9 KB, 下载次数: 101)

显示情况.png

作者: hantu    时间: 2020-2-13 12:55
先不要ADC,先验证你能在数码管上正确显示要显示的数字吧
作者: csmyldl    时间: 2020-2-13 13:07
在每一条P0=table[]前加上P0=0;就可以了
作者: pull1121    时间: 2020-2-13 14:37
hantu 发表于 2020-2-13 12:55
先不要ADC,先验证你能在数码管上正确显示要显示的数字吧

好的,我先试试哈,感谢你的建议。
作者: pull1121    时间: 2020-2-13 14:38
嗯嗯 我去试一下 谢谢
作者: pull1121    时间: 2020-2-13 14:39
csmyldl 发表于 2020-2-13 13:07
在每一条P0=table[]前加上P0=0;就可以了

我已经加了哈
作者: pull1121    时间: 2020-2-13 14:43
hantu 发表于 2020-2-13 12:55
先不要ADC,先验证你能在数码管上正确显示要显示的数字吧

去掉了 AD 显示异常?还是一样,不知道哪里错了

#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={                 //数码管编码 0到F
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;                        //定义数码管的段选
sbit wela=P2^7;                        //定义数码管的位选
sbit adwr=P3^6;
sbit adrd=P3^7;
void delay_ms(uint);        //申明延时函数;因为在主函数之前,也可以不申明

void display (uchar bai,uchar shi,uchar ge)  //数码管显示子函数
{
        P0=0x00;
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7e;
        wela=0;
        delay_ms(5);

        P0=0x00;
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7d;
        wela=0;
        delay_ms(5);

        P0=0x00;
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7b;
        wela=0;
        delay_ms(5);
               

}
void delay_ms(uint cc)          //延时子函数
{
        uint aa,bb;
        for (aa=cc;aa>0;aa--)
                for (bb=110;bb>0;bb--);       
}
void main()                          //主函数
{
         uchar adval,A1,A2,A3,a;
         wela=1;
         P0=0x78;
         wela=0;
         while(1);
                 {
                //        adwr=1;
                 //        _nop_();
                //        adwr=0;
                //        _nop_();
                //         adwr=1;                          
                        // for(a=10;a>0;a--)
                 //        {
                                display(A1,A2,A3);
                //        }
                //        P1=0xff;
                //         adrd=1;
                //         _nop_();
                //         adrd=0;
                //         _nop_();
                         adval=0x00;
                        // adrd=1;
                         A1=adval/100;
                         A2=adval%100/10;
                         A3=adval%10;                       
                }         
                                                        
}
作者: cccc888    时间: 2020-2-13 19:12
段码,换一个,
比如这样
unsigned char code numtab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
p2=numtab[3];//显示3

作者: pull1121    时间: 2020-2-14 12:14
cccc888 发表于 2020-2-13 19:12
段码,换一个,
比如这样
unsigned char code numtab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x8 ...

我用的是共阴数码管,之前做实验一直都正常的,我在研究下吧
作者: pull1121    时间: 2020-2-14 17:50
cccc888 发表于 2020-2-13 19:12
段码,换一个,
比如这样
unsigned char code numtab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x8 ...

  while(1); 后面多列个; 去掉就正常了谢谢你
作者: pull1121    时间: 2020-2-14 18:07
hantu 发表于 2020-2-13 12:55
先不要ADC,先验证你能在数码管上正确显示要显示的数字吧

  while(1); 后面多列个; 去掉就正常了谢谢你




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