而且两块板测试 都是输出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
it is unlikely anyone will take the time necessary going through the assembly code to help you.
look to C instead.
把CH1引脚切断 LED不随电位器变化亮度 终于知道为什么是00H和0FFH了吧
奇迹啊 奇迹
钱扔掉了 重新淘宝买几个试试
#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);
}
}
一周热门 更多>