搜索
bottom↓
回复: 4

ADC0832折腾好几天了 C和汇编都试过 数据基本都输出00H 0FFH

[复制链接]

出0入0汤圆

发表于 2012-7-10 05:19:45 | 显示全部楼层 |阅读模式
而且两块板测试 都是输出00H与0FFH

C也试了无数个例程 很少出现其他数据
接线没有问题 就几根线 而且DI DO独立
也试过 开始怀疑淘宝的芯片问题了
/***显示数据错误************************************/
/***2012 7 8  12 12*********************************/
               ADCS       BIT     P1.6     ;数据输入
               ADDI       BIT     P0.0     ;片选
               ADDO       BIT     P0.0     ;片选
               ADCLK      BIT     P0.1     ;时钟
               RS         BIT     P3.5
               RW         BIT     P3.6
               E          BIT     P3.7
               DAT        EQU     5AH
               COM        EQU     5BH
               START      EQU     44H      ;44H>49H
               DATAH      EQU     40H      ;读取数据高位
               DATAL      EQU     41H      ;读取数据低位
               T_S        EQU     50H
               T_M        EQU     51H
               T_H        EQU     52H
               T_G        EQU     53H
;---------数据字节定义-------------
               ORG        0000H
               LJMP       MAIN
               ORG        0030H
MAIN:          CLR        P1.5
               LCALL      CLRYJ
               LCALL      DEL
               SETB       P1.5  
               CLR        P1.6
               LCALL      XSA
               SETB       P3.5
               LCALL      DEL
               SETB       P1.6
               CLR        P1.5
LOOP:          ACALL      ADCONV
               LCALL      ZH
               LCALL      CB
               LCALL      XSSJ
               LCALL      DEL
               SETB       P1.5
               CLR        P1.6
               LCALL      DEL
               CLR        P1.5
               SETB       P1.6
               LJMP       LOOP
;==== ADC0832读数据子程序====
ADCONV:        MOV        B,#03H   ;通道1修改
               SETB       ADDI ;初始化通道选择
               NOP
               NOP
               NOP
               NOP
               CLR        ADCS ;拉低/CS端
               NOP
               NOP
               NOP
               NOP
               SETB       ADCLK ;拉高CLK端
               NOP
               NOP
               CLR        ADCLK ;第一个下降沿
               MOV        A,B
              ; MOV        C,ACC.1 ;确定取值通道选择
               SETB       C    ;通道1选择修改
               MOV        ADDI,C        ;第一位数据
               NOP
               NOP
               NOP
               NOP
               SETB       ADCLK ;拉高CLK端
               NOP
               NOP
               NOP
               NOP
               CLR        ADCLK ;第二个下降沿
               MOV        A,B
               SETB       C     ;通道1选择修改
              ; MOV        C,ACC.0 ;确定取值通道选择
               MOV        ADDI,C
               NOP
               NOP
               NOP
               NOP
               SETB       ADCLK ;拉高CLK端
               NOP
               NOP
               NOP
               NOP
               CLR        ADCLK ;;第三个下降沿
               SETB       ADDI
               NOP
               NOP
               NOP
               NOP
               CLR        ADDI  ;MUX SETTING 增加
               MOV        R7,#8 ;准备送下后8个时钟脉冲
AD_1:          MOV        C,ADDO ;接收数据
               MOV        ACC.0,C
               RL         A ;                  左移一次
               SETB       ADCLK
               NOP
               NOP
               NOP
               NOP
               CLR        ADCLK ;形成一次时钟脉冲
               NOP
               NOP
               NOP
               NOP
               DJNZ       R7,AD_1 ;循环8次
               MOV        C,ADDO ;接收数据
               MOV        ACC.0,C
               MOV        B,A        ;读出数据交寄存器B
               MOV        R7,#8
AD_13:         MOV        C,ADDO     ;接收数据
               MOV        ACC.0,C
               RR         A          ;右移一次
               SETB       ADCLK
               NOP
               NOP
               NOP
               NOP
               CLR        ADCLK ;形成一次时钟脉冲
               NOP
               NOP
               NOP
               NOP
               DJNZ       R7,AD_13 ;循环8次
               CJNE       A,B,ADCONV ;数据校验
               SETB       ADCS ;拉高/CS端
               CLR        ADCLK ;拉低CLK端
               SETB       ADDO ;拉高数据端,回到初始状态
               MOV        R7,A      ;低位TDATAL
               MOV        R6,#00H      ;高位
               MOV        R5,#00H         ;
               RET
;----------------二十进制转换程序-------
ZH:            CLR        A               ;清累加器
               MOV        T_G,A
               MOV        T_H,A           ;清除出口单元,准备转换
               MOV        T_M,A
               MOV        T_S,A
               MOV        R2,#24          ;共计转换24位
HB3:           MOV        A,R7            ;获得低位数据
               RLC        A               ;带位左移,高位数据在CY中
               MOV        R7,A            ;保存数据
               MOV        A,R6            ;取得高位数
               RLC        A               ;带进位左移
               MOV        R6,A            ;保存数据
               MOV        A,R5            ;取得高位数
               RLC        A               ;带进位左移
               MOV        R5,A
               MOV        A,T_S           ;得到低位数据
               ADDC       A,T_S           ;累加
               DA         A               ;十进制调整
               MOV        T_S,A           ;保存数据
               MOV        A,T_M           ;得到第二位数据
               ADDC       A,T_M           ;累加
               DA         A               ;十进制调整
               MOV        T_M,A           ;保存结果
               MOV        A,T_H           ;得到第三位
               ADDC       A,T_H           ;累加
               DA         A
               MOV        T_H,A           ;保存
               MOV        A,T_G           ;得到第四位
               ADDC       A,T_G           ;累加
               MOV        T_G,A            
               DJNZ       R2,HB3          ;没有转换完毕,重复转换
               NOP                       ;转换完毕,恢复PSW;返回
;---------------------------------------
;码型变换,将带转换的数据分成,不同的数位,并转换成单位BCD

;---------------------------------------
BCD:           MOV        R0,#START       ;获得首地址
               MOV        A,T_S           ;获得待转化的低位
               MOV        B,#16           ;转化进制,如果要进行十进制转换
               DIV        AB             ;计算 A/B   aA
               MOV        @R0,B           ;第一位转换完毕,保存低位转化后
               INC        R0              ;自增
               MOV        @R0,A           ;保存高位
               INC        R0              ;取第二个数据地址
               MOV        A,T_M           ;获得第二个需要转换的数据
               MOV        B,#16           ;十六进制
               DIV        AB ;计算
               MOV        @R0,B           ;存低位
               INC        R0
               MOV        @R0,A           ;存高位
               INC        R0              ;第三位
               MOV        A,T_H           ;获得第三个需要转换的数据
               MOV        B,#16           ;十六进制
               DIV        AB             ;计算
               MOV        @R0,B           ;存低位
               INC        R0
               MOV        @R0,A           ;存高位
               LCALL      ASJ             ;ADD <6675>
               RET                       ;完毕,返回
;=======================================
CB:            MOV        A,58H
               MOV        DPTR,#TAB
               MOVC       A,@A+DPTR
               MOV        68H,A
;---------------------------------------
               MOV        A,57H
               MOV        DPTR,#TAB
               MOVC       A,@A+DPTR
               MOV        67H,A
;---------------------------------------
               MOV        A,56H
               MOV        DPTR,#TAB
               MOVC       A,@A+DPTR
               MOV        66H,A
;---------------------------------------
               MOV        A,55H
               MOV        DPTR,#TAB
               MOVC       A,@A+DPTR
               MOV        65H,A
               RET
;-------------清除显示子程序 -----------
CLRYJ:         MOV        COM,#30H
               LCALL      WRI
               ACALL      D1
               MOV        COM,#0DH
               LCALL      WRI
               ACALL      D1
               MOV        COM,#01H ;清除显示子程序
               LCALL      WRI
               LCALL      D1
               MOV        COM,#06H   
               LCALL      WRI
               LCALL      D1
               RET
;-------------写命令子程序 -----------
WRI:           PUSH       ACC
               CLR        RS
               SETB       RW
WRI1:          MOV        P2,#0FFH                  
               SETB       E
               MOV        A,P2
               CLR        E   
               JB         ACC.7,WRI1
               LCALL      D1
               CLR        RW              
               MOV        P2,COM
               LCALL      D1
               SETB       E
               LCALL      D1        
               CLR        E   
               POP        ACC              
               RET
;-------------写数据子程序 -----------
WRD:           PUSH       ACC
               CLR        RS   
               LCALL      D1
               SETB       RW                  
WRD1:          MOV        P2,#0FFH
               LCALL      D1
               SETB       E               
               MOV        A,P2
               LCALL      D1
               CLR        E               
               JB         ACC.7,WRD1
               LCALL      D1
               SETB       RS
               LCALL      D1
               CLR        RW
               LCALL      D1
               MOV        P2,DAT
               SETB       E
               LCALL      D1
               CLR        E
               POP        ACC
               RET                  
;---------------------------------------
XSA:           MOV        R1,#0CEH
               MOV        COM,#80H
               LCALL      WRI
               MOV        DAT,#0B2H
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD      ;cai参
;---------------------------------------
               MOV        R1,#0FDH
               MOV        COM,#81H
               LCALL      WRI
               MOV        DAT,#0CAH
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD   ;shu数
;---------------------------------------
               MOV        R1,#0E8H   
               MOV        COM,#82H   
               LCALL      WRI
               MOV        DAT,#0C9H
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD   ;She设
;---------------------------------------
               MOV        R1,#0A8H
               MOV        COM,#83H
               LCALL      WRI
               MOV        DAT,#0B6H
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD   ;din定
               RET
;---------------------------------------
XSSJ:          MOV        R2,#0A3H
               MOV        R1,68H
               MOV        COM,#90H
               LCALL      WRI
               MOV        DAT,R2
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD     
;---------------千位--------------------
               MOV        R2,#0A3H
               MOV        R1,67H
               MOV        COM,#91H
               LCALL      WRI
               MOV        DAT,R2
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD     
;----------------百位-------------------
               MOV        R2,#0A3H
               MOV        R1,66H
               MOV        COM,#92H
               LCALL      WRI
               MOV        DAT,R2
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD     
;----------------十位-------------------
               MOV        R2,#0A3H
               MOV        R1,65H
               MOV        COM,#93H
               LCALL      WRI
               MOV        DAT,R2
               LCALL      WRD
               MOV        DAT,R1
               LCALL      WRD      
               RET
;----------------个位-------------------
ASJ:           MOV        55H,44H         ;个位
               MOV        56H,45H                    ;十位
               MOV        57H,46H                    ;百位
               MOV        58H,47H                    ;千位
               MOV        59H,48H
               MOV        5AH,49H
               RET
DEL:           MOV        R2,#0FFH
DE2:           MOV        R3,#0AFH
DE3:           MOV        R4,#01FH
               DJNZ       R4,$
               DJNZ       R3,DE3
               DJNZ       R2,DE2
               RET
;--------------------------------------
D1:            MOV        R7,#0FFH
DEM:           MOV        R6,#06H         ;0001.0100
DEN:           DJNZ       R6,DEN
               DJNZ       R7,DEM
               RET                       ;延时6毫秒子程序
;--------------------------------------
DYS:           MOV        R0,#0FFH
DY4:           DJNZ       R0,DY4
               RET
               ORG        0500H
TAB:           DB         0B0H,0B1H,0B2H,0B3H,0B4H
               DB         0B5H,0B6H,0B7H,0B8H,0B9H
               END

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-7-10 06:17:20 | 显示全部楼层
               ADCS       BIT     P1.6     ;数据输入


it is unlikely anyone will take the time necessary going through the assembly code to help you.

look to C instead.

出0入0汤圆

 楼主| 发表于 2012-7-10 07:07:18 | 显示全部楼层
  意外发现 在DIO并一个LED 电位器调节CH1通道 读数据时DIO通道LED会随着电位器变化亮度
把CH1引脚切断 LED不随电位器变化亮度  终于知道为什么是00H和0FFH了吧
奇迹啊 奇迹
  钱扔掉了 重新淘宝买几个试试

出0入0汤圆

 楼主| 发表于 2012-7-11 19:30:40 | 显示全部楼层
                   好了 很好 还是要靠自己啊

                   #include<REG51.H>      
                   #include<intrins.H>   
                   sbit     RS=P3^5;
                   sbit     RW=P3^6;
                   sbit     E=P3^7;
                   sbit     ADCLK=P0^1;
                   sbit     ADCS=P1^6;
                   sbit     ADDI=P0^0;
                   sbit     ADDO=P0^0;
                   sbit     OUT1=P1^5;
                   sbit     OUT2=P1^6;            
                   #define  uchar unsigned char
                   #define  uint unsigned int
                   #define  Lcd_Bus P2
                   uchar    cStat,endat,dat;
                   uchar    Value;
                   uchar    code disdt[11]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xa3};
/*------------------检查忙位--------------------------*/
                   void chk_busy()
                     {
                      RS=0;
                      RW=1;
                      E=1;
                      Lcd_Bus=0xff;
                      while((Lcd_Bus&0x80)==0x80);
                      E=0;
                     }
/*------------------延时子程序------------------------*/
                   void delay(unsigned int t)
                     {
                      uint i,j;
                      for(i=0;i<t;i++)
                      for(j=0;j<121;j++);
                     }
/*------------------写命令到LCD-----------------------*/
                   void write_com(unsigned char cmdcode)
                     {
                      chk_busy();
                      RS=0;
                      RW=0;
                      E=1;
                      Lcd_Bus=cmdcode;
                      delay(5);                  /*在数据写入的时候加入适当的延时*/
                      E=0;
                      delay(5);
                     }
/*-------------------写数据到LCD----------------------*/
                   void write_data(unsigned char Dispdata)
                     {
                      chk_busy();
                      RS=1;
                      RW=0;
                      E=1;
                      Lcd_Bus=Dispdata;
                      delay(5);                  /*在数据写入的时候加入适当的延时 */
                      E=0;
                      delay(5);
                     }
/*------------------初始化LCD屏-----------------------*/
                   void lcdreset()
                     {
                      delay(300);
                      RW=0;
                      delay(200);
                      write_com(0x30);
                      delay(10);                 /*选择基本指令集 */
                      write_com(0x30);           /*选择8bit数据流 */
                      delay(5);
                      write_com(0x0c);           /*开显示(无游标、不反白) */
                      delay(10);
                      write_com(0x01);           /*清除显示,并且设定地址指针为00H */
                      delay(500);
                      write_com(0x06);           /*游标的移动方向及指定显示的移位*/
                      delay(0);
                     }
/*************************************/
                     void display()                        /*显示电流*/
                     {                                     /*开始*/
                       write_com(0x82);                    /*地址*/
                       write_data(0xB5);                   /*电前字节*/
                       write_data(0xE7);                   /*后字节*/
                       write_com(0x83);                    /*地址*/
                       write_data(0xC1);                   /*流前字节*/
                       write_data(0xF7);                   /*后字节*/
                     }
/*************************************/
                     void displaya()                       /*显示A函数*/
                     {                                     /*开始*/
                       write_com(0x84);                    /*地址*/
                       write_data(0xA3);                   /*半个字符*/
                       write_data(disdt[Value/100]);        /*百位*/
                       write_com(0x85);                    /*地址*/
                       write_data(0xA3);                   /*半个字符*/
                       write_data(disdt[(Value%100)/10]);   /*十位*/
                       write_com(0x86);                    /*地址*/
                       write_data(0xA3);                   /*半个字符*/
                       write_data(disdt[Value%10]);         /*个位*/
                      }                                    /*结束*/
/***********************************/
                     ADC0832(uchar channel )
                     {
                       uchar i=0;
                       uchar j;
                       uint dat=0;
                       uchar ndat=0;
                       if(channel==0)channel=2;
                       if(channel==1)channel=3;
                       ADDI=1;
                       _nop_();
                       _nop_();
                       ADCS=0;//拉低CS端
                       _nop_();
                       _nop_();
                       ADCLK=1;//拉高CLK端
                       _nop_();
                       _nop_();
                       ADCLK=0;//拉低CLK端,形成下降沿1
                       _nop_();
                       _nop_();
                       ADCLK=1;//拉高CLK端
                       ADDI=channel&0x1;
                       _nop_();
                       _nop_();
                       ADCLK=0;//拉低CLK端,形成下降沿2
                       _nop_();
                       _nop_();
                       ADCLK=1;//拉高CLK端
                       ADDI=(channel>>1)&0x1;
                       _nop_();
                       _nop_();
                       ADCLK=0;//拉低CLK端,形成下降沿3
                       ADDI=1;//控制命令结束
                       _nop_();
                       _nop_();
                       dat=0;
                       for(i=0;i<8;i++)
                       {
                        dat|=ADDO;//收数据
                        ADCLK=1;
                        _nop_();
                        _nop_();
                        ADCLK=0;//形成一次时钟脉冲
                        _nop_();
                        _nop_();
                        dat<<=1;
                        if(i==7)dat|=ADDO;
                        }
                       for(i=0;i<8;i++)
                        {
                         j=0;
                         j=j|ADDO;//收数据
                         ADCLK=1;
                         _nop_();
                         _nop_();
                         ADCLK=0;//形成一次时钟脉冲
                         _nop_();
                         _nop_();
                         j=j<<7;
                         ndat=ndat|j;
                       if(i<7)ndat>>=1;
                     }
                     ADCS=1;//拉低CS端
                     ADCLK=0;//拉低CLK端
                     ADDO=1;//拉高数据端,回到初始状态
                     dat<<=8;
                     dat|=ndat;
                     return(dat);
                    }
/***********************************/                           
                     void  main ( )
                        {  
                          lcdreset();            /*液晶复位*/
                          display();  
                 while(1)
                   {
                             //Value=Adc0832(0x03);
                             Value=ADC0832(0X03);
                             displaya();
                             OUT1=0;
                             OUT2=1;
                             delay(1500);
                             OUT1=1;
                             OUT2=0;
                             delay(1500);
                  }
                        }

出0入0汤圆

发表于 2012-7-12 09:59:33 | 显示全部楼层
换个芯片试试
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 18:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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