打印

AD转换出现无法输出问题

[复制链接]
2789|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 nilingmcc2010 于 2010-4-20 11:15 编辑

本人新手,单片机学得不好,但是毕设选到的是单片机,遇到了问题,来请求大家的帮助。
最近毕设在做一个简单的数字电压表,可是程序写完发现,AD 转换完没有输出,求高人给解答
下面是我写的程序
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
/*#define  IN0 XBYTE[0x7ff8]   //adc0809 0通道地址  P2.7=0*/
#define uchar unsigned char
#define uint  unsigned int
unsigned char code table[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  //有小数点
unsigned char code table1[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管段码
unsigned char getdata,i;
void delay(uint x);    //延时
void init();     //初始化
void disp(uchar num1,uchar num2,uchar num3,uchar num4);//显示
uint get_ad();     //AD转换

sbit START=P3^6;  //启动转换 接口
sbit OE=P3^7;   //允许输出
sbit EOC=P3^3;   //转换结束判断 EOC=1转换结束
sbit CLK=P3^2;
sbit ALE=P3^6;
sbit OUT=P0;
void main()  
{
uint lednum;
uchar a1,a2,a3,a4;
init();

while(1)
{      
  
  lednum=get_ad();
  a1=lednum/1000;
  a2=lednum%1000/100;
  a3=lednum%100/10;
  a4=lednum%10;
  disp(a1,a2,a3,a4);
     
}

}
void delay(uint x)     //延时函数  x=1 1ms
{
uint a,b;
for(a=x;a>0;a--);
  for(b=110;b>0;b--);
}

void init()
{
  //P2=0xff;
  //EOC=0;
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EA=1;
  ET0=1;
  TR0=1;
}
uint get_ad()
{
OE=0;
START=0;  
    delay(3);
START=1;
delay(3);
START=0;  //启动转换
    delay(10);

EOC=0;      
delay(50);  
EOC=1;     //转换结束 中断
  
delay(5);
OE=1;
getdata=P0;  
    getdata=getdata/255*5;
delay(10);
OE=0;
    return(getdata);     
}
void int1 (void) interrupt 1 using 0
{
    TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
CLK=~CLK;

   
//getdata=getdata*1000;
         
}
void disp(uchar num1,uchar num2,uchar num3,uchar num4)//显示
{
   P2=0x7e; //数码管位4
   P1=table1[num1]; //数码管段
   delay(2);
   P2=0x7f;
   delay(2);
   P2=0x7d; //数码管位3
   P1=table1[num2];
   delay(2);
   P2=0x7f;
   delay(2);
   P2=0x7b;  //数码管位
   P1=table1[num3];
   delay(2);
   P2=0x7f;
   delay(2);
   P2=0x77;
   P1=table[num4];     
   delay(2);
   P2=0x7f;
   delay(2);
}
有好多问题,希望大大们帮我解决一下,谢谢
下面的是我画的原理图,

1.jpg (220.87 KB )

原理图

原理图

相关帖子

沙发
ayb_ice| | 2010-4-20 11:21 | 只看该作者
应该边写边凋,这样能尽早发现问题

使用特权

评论回复
板凳
qzhui121| | 2010-4-20 13:24 | 只看该作者
看不出来

使用特权

评论回复
地板
nilingmcc2010|  楼主 | 2010-4-20 14:21 | 只看该作者
有人能帮我写下程序吗,我调试了好久,还是找不到原因 啊,希望有大大帮我写下程序,我转换一下思路,谢谢

使用特权

评论回复
5
465483861| | 2010-4-20 20:26 | 只看该作者
是不是ADC坏掉了,ADC很容易坏的,要不就要看看时序有没有高错,这是我用汇编写的,成功了ORG 0000H
LJMP MAIN

ORG 0030H
MAIN:MOV 70H,#00H          ;显示百位清零
      MOV 71H,#00H         ;十位清零
      MOV 72H,#00H         ;个位清零
      MOV 73H,#00H         ;采集数据缓存清零

SATAT1:
       MOV P1,#0FFH         ;数据口初始化,数据输入口
START:MOV P3,#13H      ;控制口初始化,并选择0通道

      SETB P3.2      ;发出地址锁存脉冲和启动转换脉冲
      NOP
      CLR P3.2

   
L0  :JNB P3.4,L0         ;判断转换结束了没有
      

   SETB P3.3   ;打开0809输出缓冲器
   MOV A,P1    ;接收转换的数据
   CLR P3.3   ;关闭0809输出缓冲器
  
   LCALL  DSP           ;对接收的数据进行处理
  LCALL DSP1
     MOV R2,#110
L00: LCALL DISPLAY    ;显示转换的数据
    DJNZ R2,L00
LJMP SATAT1


DSP:  MOV B,#196
      MUL AB
      MOV R7,B
      MOV R6,A
      MOV R3,#00H
      MOV R2,#00H
      MOV R5,#27H
      MOV R4,#10H
      LCALL DIV2BY
      MOV 73H,R6             ;千位电压值

      MOV A,R3
      MOV R7,A
      MOV A,R2
      MOV R6,A
      MOV R5,#03H
      MOV R4,#0E8H
      MOV R3,#00H
      MOV R2,#00H
      LCALL DIV2BY
      MOV 72H,R6             ;百位电压值
      
      MOV A,R3
      MOV R7,A
      MOV A,R2
      MOV R6,A
      MOV R5,#00H
      MOV R4,#64H
      MOV R3,#00H
      MOV R2,#00H
      LCALL DIV2BY
      MOV 71H,R6            ;十位电压值

      MOV A,R3
      MOV R7,A
      MOV A,R2
      MOV R6,A
      MOV R5,#00H
      MOV R4,#0AH
      MOV R3,#00H
      MOV R2,#00H
      LCALL DIV2BY
      MOV 70H,R6             ;个位电压值

RET

DIV2BY: MOV 20H,#16         ;双字节除法
DIV2B:CLR C                   ;商存在R7R6,余数存R3R2
      MOV A,R6
      RLC A
      MOV R6,A
      MOV A,R7
      RLC A
      MOV R7,A
      MOV A,R2
      RLC A
      MOV R2,A
      MOV A,R3
      RLC A
      MOV R3,A

      CLR C
      MOV A,R2
      SUBB A,R4
      MOV R0,A
      MOV A,R3
      SUBB A,R5
      JC NEXT
      CLR C
      MOV R3,A
      MOV A,R0
      MOV R2,A
      MOV A,R6
      ADD A,#01H
      MOV R6,A
      MOV A,R7
      ADDC A,#00H
      MOV R7,A
  NEXT:DJNZ 20H,DIV2B
     RET

DSP1: MOV R0,#70H
      MOV A,@R0
      CLR C
      SUBB A,#05H
      JC EXIT1   ;为1则小于5,退出
   INC R0            ;指向十位
   MOV A,@R0
   INC A                 ;十位加1
   MOV @R0,A
   CJNE A,#10,EXIT1         ;十位加1等于10?等于10,是则十位清零
   CLR A
   MOV @R0,A
            INC R0           ;指向百位
            MOV A,@R0
            INC A              ;百位加1
            MOV @R0,A
            CJNE A,#10,EXIT1          ;百位加1等于10?等于10,是则百位清零
            CLR A
            MOV @R0,A
     INC R0                ;指向千位
     MOV A,@R0
     INC A             ;千位加1
     MOV @R0,A
     CJNE A,#06,EXIT1      ;千位等于6,是则清零
     CLR A
     MOV @R0,A
   EXIT1:RET




DISPLAY:
        MOV R1,#73H        ;指向数据显示缓冲区     
        MOV R5,#0FEH           ;显示位选择         
PLAY:   MOV A,#0FFH
        MOV P2,A
        MOV A,R5               
        MOV P2,A        
        MOV A,@R1
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        CJNE R1,#73H,POW
        ORL A,#80H
    POW:MOV P0,A
        LCALL DL1MS
        DEC R1
        MOV A,R5
      JNB ACC.2,ENDOUT
       RL A
       MOV R5,A
       AJMP PLAY

ENDOUT:RET
                    
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

DL1MS:MOV R6,#20
DL1:MOV R7,#50
DL2:DJNZ R7,DL2
    DJNZ R6,DL1
RET

END

使用特权

评论回复
6
nilingmcc2010|  楼主 | 2010-4-21 20:20 | 只看该作者
谢谢貌似用汇编写了之后,就可以显示了,可是C语言写的还是没有结果,不知道哪里出问题了

使用特权

评论回复
7
人老心更老| | 2010-4-22 20:56 | 只看该作者
EOC是AD输出供你读的吧?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

1

粉丝