将一个8位二进制数转换为10进制的单片机程序,越简单越好

将一个8位二进制数转换为10进制的单片机程序,越简单越好,第1张

;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路模拟输入中的一路

ALE:地址锁存允许信号,输入,高电平有效。

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中实现两组数据相加功能。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10076860.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存