
;51单片机汇编语言
;入口20h一个8位二进制数
;出口21h22h4位10进制bcd码
bcd:mov
21h,#00h
mov
22h,#00h
jnb
20h7,bcd1
mov
22h,#01h
mov
21h,#28h
bcd1:jnb
20h6,bcd2
mov
a,#64h
acall
add
bcd2:jnb
20h5,bcd3
mov
a,#32h
acall
add
bcd3:jnb
20h4,bcd4
mov
a,#16h
acall
add
bcd4:mov
a,20h
anl
a,#0fh
da
a
acall
add
ret
add:add
a,21h
da
a
mov
21h,a
clr
a
addc
a,22h
mov
22h,a
ret
temp=getdata10/255500; //数据转化
其中的 getdata,仅仅是 0~255。
先除以 255 这么大的数字,再乘500,产生误差是很大的。
简化一下,改成:
temp = getdata 196; //数据转化
即可。
原文件:
module AD0809 (D,D1,CLK, EOC, RST, ADDA, Q,Q1,Q2,LOCK_T);
input [7:0] D,D1;
input CLK, RST;
input EOC;
output ADDA, LOCK_T;
output Q,Q1,Q2;
wire[7:0] Q,Q1,Q2;
reg ALE, START, OE,ADDA;
reg [2:0] cs, next_state,cs1,next_state1;
reg [7:0] REGL,REGL1;
reg LOCK;
parameter s0=3'b000, s1=3'b001, s2=3'b010, s3=3'b011, s4=3'b100;
always @(posedge CLK or posedge RST)
begin
if (RST) cs<=s0;
else cs<=next_state;
end
always @ (cs or EOC)
begin
case (cs)
s0: begin ALE=0; START=0; OE=0; LOCK=0;
next_state<=s1;
end
s1: begin ALE=1; START=1; OE=0; LOCK=0;
next_state<=s2;
end
s2: begin ALE=0; START=0; OE=0; LOCK=0;
if (EOC==1'b1) next_state<=s3;
else next_state<=s2;
end
s3: begin ALE=0; START=0; OE=1; LOCK=0;
next_state<=s4;
end
s4: begin ALE=0; START=0; OE=1; LOCK=1;
next_state<=s0;ADDA=~ADDA;
end
default: begin ALE=0; START=0; OE=0; LOCK=0;
next_state<=s0;
end
endcase
end
always @(posedge LOCK)
if (LOCK)
REGL<=D;
initial ADDA=0;//initial #200 ADDA=~ADDA;
assign Q=REGL;
assign LOCK_T=LOCK;
parameter sta0=3'b000, sta1=3'b001, sta2=3'b010, sta3=3'b011, sta4=3'b100;
always @(posedge CLK or posedge RST)
begin
if (RST) cs1<=sta0;
else cs1<=next_state1;
end
always @ (cs1 or EOC)
begin
case (cs1)
sta0: begin ALE=0; START=0; OE=0; LOCK=0;
next_state1<=sta1;
end
sta1: begin ALE=1; START=1; OE=0; LOCK=0;
next_state1<=sta2;
end
sta2: begin ALE=0; START=0; OE=0; LOCK=0;
if (EOC==1'b1) next_state1<=sta3;
else next_state1<=sta2;
end
sta3: begin ALE=0; START=0; OE=1; LOCK=0;
next_state1<=sta4;
end
sta4: begin ALE=0; START=0; OE=1; LOCK=1;
next_state1<=sta0;
end
default: begin ALE=0; START=0; OE=0; LOCK=0;
next_state1<=sta0;
end
endcase
end
always @(posedge LOCK)
if (LOCK)
REGL1<=D1;
assign Q1=REGL1;
assign LOCK_T=LOCK;
assign Q2=Q+Q1;
endmodule
测试文件:
`timescale 1ns/1ns
module AD0809_tb;
reg CLK,RST,EOC;
reg [7:0] D,D1;
wire LOCK_T,ADDA;
wire [7:0] Q,Q1,Q2;
initial CLK=0;
always #10 CLK=~CLK;
initial
begin
EOC=0;
#2 EOC=1;
#70 EOC=0;
end
initial
begin
RST=0;
#5 RST=1;
#8 RST=0;
end
initial D=8'b00000001;
initial D1=8'b00000001;
AD0809 AD_0809_inst
(
CLK(CLK),
RST(RST),
D(D),
D1(D1),
EOC(EOC),
Q(Q),
Q1(Q1),
Q2(Q2),
LOCK_T(LOCK_T),
ADDA(ADDA) );
endmodule
亲测可用,请采纳哈哈哈
首先你要知道ADC0809的每个管脚的功能,然后用单片机按照下面的管脚功能要求去控制每个管脚。
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
START: A/D转换启动信号,输入,高电平有效。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
REF(+)、REF(-):基准电压。
Vcc:电源,单一+5V。
GND:地。
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
上面实际上是一个用自然语言表达的程序过程,之后你就用汇编语言来实现上面的自然语言过程
以上就是关于将一个8位二进制数转换为10进制的单片机程序,越简单越好全部的内容,包括:将一个8位二进制数转换为10进制的单片机程序,越简单越好、我编写了一个adc0809程序,但是数码管显示有问题、结合AD0809芯片功能用FPGA实现芯片控制程序控制双通道A/D转换并在FPGA中实现两组数据相加功能。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)