找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3382|回复: 17
收起左侧

新手求大神 输入电压3V数码管无法显示

[复制链接]
ID:156852 发表于 2016-12-22 14:26 | 显示全部楼层 |阅读模式
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
uint temp;
uchar i;
uint a;
uchar v;
uchar qian,bai,shi,ge;
void display();
void delay(uint z);
void time0_init();
void time1_init();
void AD_0809();
uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
sbit ST=P2^6;
sbit OE=P2^5;
sbit EOC=P2^4;
sbit CLK=P2^3;
sbit ALE=P2^6;
sbit OUT=P3^6;
uint gatedate;
uchar flag;
float t;
void main()
{
flag=0;
time1_init();
time0_init();       
while(1)       
{
  AD_0809();                  
  if((v==4)||(v>4))
   {
   OUT=1;        //继电器输出                 
   }
     else if(v>2&&v<4)
      {
          display();
          t=(1.25*3)*(1.25*3*10)/(v*v);
          printf("%.2f",t);          //保留小数点后2位小数
          t=t*100;                                   //a累计计数100次为1s
           display();//数码管显示程序
        while(a==t)                   //a累计计数100次为1s
             {
                 flag=1;                                 //标记位改为1
                 OUT=1;
         }
       }
      else
      {

      while(a==1500)
       {
              flag=0;
       }
      }

   
  }
}
void time0_init()       
{
TMOD=0x12;                       
TH0=(65536-2)/256;
TL0=(65536-2)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0()interrupt 2
{
CLK=~CLK;       
}         
void display()
{
P3=0xbe;
P0=table1[qian];       
delay(2);
P3=0xbd;
P0=table2[bai];
delay(2);
P3=0xbb;
P0=table1[shi];
delay(2);
P3=0xb7;
P0=table1[ge];
delay(2);
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer1()interrupt 1
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
a++;
i++;

if(i==10)
       {
           i=0;
                temp++;
                if(temp==9999)
                        temp=0;
                        if(flag==0)
            {
                        qian=temp/1000;
                        bai=temp%1000/100;
                        shi=temp%100/10;
                        ge=temp%10;
}
}       
}
void time1_init()
{
TMOD=0x12;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET1=1;
TR1=1;
}
void AD_0809()
{
ST=0;
_nop_();
OE=0;
_nop_();
ST=1;
_nop_();
ST=0;
while(EOC==0);
  OE=1;
  gatedate=P1;
  _nop_();
  OE=0;
  v=gatedate*5/255;

}       
                                               
回复

使用道具 举报

ID:74784 发表于 2016-12-22 14:42 | 显示全部楼层
硬件图 呢?
回复

使用道具 举报

ID:156852 发表于 2016-12-22 14:49 | 显示全部楼层
硬件图是这个
QQ图片20161222144743.png
回复

使用道具 举报

ID:156852 发表于 2016-12-22 14:58 | 显示全部楼层

下面是硬件图,大神能帮我看看吗
回复

使用道具 举报

ID:7485 发表于 2016-12-22 15:46 | 显示全部楼层
at89c51在3V下不能工作。

数码管接的也不对。
回复

使用道具 举报

ID:156852 发表于 2016-12-22 16:16 | 显示全部楼层
ahshmj 发表于 2016-12-22 15:46
at89c51在3V下不能工作。

数码管接的也不对。

后面我直接把数码管的4个三极管给去掉了,直接连接AT89C51的P3.0 P3.1 P3.2P3.3口,给的的3V电压是从ADC0809左端IN0口进入的
回复

使用道具 举报

ID:150126 发表于 2016-12-22 19:50 | 显示全部楼层
你得先搞清楚用的数码管是共阴极还是共阳极
回复

使用道具 举报

ID:156852 发表于 2016-12-22 20:24 | 显示全部楼层
51黑点子论坛 发表于 2016-12-22 19:50
你得先搞清楚用的数码管是共阴极还是共阳极

数码管是共阴的
回复

使用道具 举报

ID:7485 发表于 2016-12-22 20:52 | 显示全部楼层
qiran1818 发表于 2016-12-22 16:16
后面我直接把数码管的4个三极管给去掉了,直接连接AT89C51的P3.0 P3.1 P3.2P3.3口,给的的3V电压是从ADC0 ...

去掉也不行,P3口没有这么大的负载能力。
回复

使用道具 举报

ID:137239 发表于 2016-12-22 21:19 | 显示全部楼层
ahshmj 发表于 2016-12-22 20:52
去掉也不行,P3口没有这么大的负载能力。

可以换成P0口驱动数码管
回复

使用道具 举报

ID:156852 发表于 2016-12-22 21:20 | 显示全部楼层
ahshmj 发表于 2016-12-22 20:52
去掉也不行,P3口没有这么大的负载能力。

现在我用protues仿真,在去掉AD转化部分程序和t=(1.25*3)*(1.25*3*10)/(v*v);printf("%.2f",t);  t=t*100;
这几句程序,在没有三极管的情况下数码管竟然能够计数并且到点停止。真的搞不明白
        
回复

使用道具 举报

ID:157007 发表于 2016-12-22 22:17 | 显示全部楼层
仿真只管电平高低,不考虑具体负载的,另外。加了三极管,位选信号就应该是相反的了。还有查看一下三极管的管脚。不要把极性弄反了。
回复

使用道具 举报

ID:7485 发表于 2016-12-23 21:03 | 显示全部楼层
qiran1818 发表于 2016-12-22 21:20
现在我用protues仿真,在去掉AD转化部分程序和t=(1.25*3)*(1.25*3*10)/(v*v);printf("%.2f",t);  t=t*10 ...

仿真的功能是有局限的。
回复

使用道具 举报

ID:7485 发表于 2016-12-23 21:04 | 显示全部楼层
qiran1818 发表于 2016-12-22 21:20
现在我用protues仿真,在去掉AD转化部分程序和t=(1.25*3)*(1.25*3*10)/(v*v);printf("%.2f",t);  t=t*10 ...

仿真是有局限的。
回复

使用道具 举报

ID:156852 发表于 2016-12-23 22:15 | 显示全部楼层
ahshmj 发表于 2016-12-23 21:04
仿真是有局限的。

AD转化部分程序感觉有问题,就是找不到原因
回复

使用道具 举报

ID:7485 发表于 2016-12-24 19:21 | 显示全部楼层
qiran1818 发表于 2016-12-23 22:15
AD转化部分程序感觉有问题,就是找不到原因

问题不是一个方面的。起码显示部分有问题。即使AD转换部分没问题,现实也不会正常。
回复

使用道具 举报

ID:157349 发表于 2016-12-24 20:19 | 显示全部楼层
数码管哪里找的?我现在就缺这个了!
回复

使用道具 举报

ID:156852 发表于 2016-12-25 10:51 | 显示全部楼层
徐凤年 发表于 2016-12-24 20:19
数码管哪里找的?我现在就缺这个了!

自己画的,貌似元件库找不到
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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