关于单片机编写程序 将A中的二进制数变换成3为BCD码 并将百,十,个位数分别防御内部RAM的50H 51H 52H中

关于单片机编写程序 将A中的二进制数变换成3为BCD码 并将百,十,个位数分别防御内部RAM的50H 51H 52H中,第1张

这程序也写的太复杂了!既然51单片机有DIV指令,并且只是把A中的数字转变为BCD,那就用DIV直接运算:

MOV A,#0FDH

MOV B,#100

DIV AB

MOV 50H,A

MOV A,B

MOB B,#10

DIV AB

MOV 51H,A

MOV 52H,B

计算完成,这样50H就是百位数,51H是十位数,52H是个位数

直接看输入的bit2和bit3,如果不是00输出为0,否则输出为1。

1、module com(a,b);

input[3:0]a;

output b;

assign b=(a>=4'h4)1:0;

endmodule

module t_com;

reg[3:0]a;

wire b;

initial

begin

a=4'h1;

#5 a=4'h5;

#5 $stop;

end

com m(a,b);

endmodule

2、module compare(clk, rst_n, din, flag_out)

input clk, rst_n;

input [3:0] din;

output flag_out;

always @ (posedge clk or negedge rst_n)

if (!rst_n)

flag_out <= 0;

else if (din > 4'd4)

flag_out <= 1'b1;

else

flag_out <= 1'b0;

扩展资料:

使用Verilog描述硬件的基本设计单元是模块(module)。构建复杂的电子电路,主要是通过模块的相互连接调用来实现的。模块被包含在关键字module、endmodule之内。实际的电路元件。

Verilog中的模块类似C语言中的函数,它能够提供输入、输出端口,可以实例调用其他模块,也可以被其他模块实例调用。模块中可以包括组合逻辑部分、过程时序部分。例如,四选一的多路选择器,就可以用模块进行描述。

参考资料来源:百度百科-Verilog HDL

#include <stdioh>

// 8421BCD码长整数转换为长整数

unsigned long BCD2BIN_l(unsigned long num)

{

unsigned long out = 0;

unsigned char i = 0;

while(num && i++ < 8)

{

if(out) out =10;

if(num & 0xF0000000 == 0) continue;

out += (num >> 28) & 0xF;

num <<= 4;

}

while(i++ < 8) out = 10;

return out;

}

// 长整数转换为8421BCD码长整数

unsigned long BIN2BCD_l(unsigned long num)

{

unsigned long out = 0;

unsigned char i = 0;

while(num && i++ < 8)

{

out >>= 4;

out |= (num % 10) << 28;

num /= 10;

}

while(i++ < 8) out >>= 4;

return out;

}

// 8421BCD码短整数转换为短整数

unsigned short BCD2BIN_s(unsigned short num)

{

unsigned short out = 0;

unsigned char  i = 0;

while(num && i++ < 4)

{

if(out) out =10;

if(num & 0xF000 == 0) continue;

out += (num >> 12) & 0xF;

num <<= 4;

}

while(i++ < 4) out = 10;

return out;

}

// 短整数转换为8421BCD码短整数

unsigned short BIN2BCD_s(unsigned long num)

{

unsigned short out = 0;

unsigned char i = 0;

while(num && i++ < 4)

{

out >>= 4;

out |= (num % 10) << 12;

num /= 10;

}

while(i++ < 4) out >>= 4;

return out;

}

// 整数转换为8421BCD码整数

unsigned char BIN2BCD_c(unsigned char num)

{

return ((num / 10) << 4) | (num % 10);

}

// 整数转换为8421BCD码整数

unsigned char BCD2BIN_c(unsigned char num)

{

return ((num & 0xF0) >> 4)  10 + (num & 0xF);

}

unsigned char rMul_BCD_c(unsigned char x, unsigned char y, unsigned char p)

{

// p为小数位数

unsigned short r = BCD2BIN_s(x)  BCD2BIN_s(y);

while(p != 1) {r /= 10; p--;}

return BIN2BCD_c((unsigned char)((r + 5) / 10));

}

unsigned short rMul_BCD_s(unsigned short x, unsigned short y, unsigned char p)

{

// p为小数位数

unsigned long r = BCD2BIN_l(x)  BCD2BIN_l(y);

while(p != 1) {r /= 10; p--;}

return BIN2BCD_s((unsigned short)((r + 5) / 10));

}

unsigned char rMul_BIN_c(unsigned char x, unsigned char y, unsigned char p)

{

// p为小数位数

unsigned short r = (unsigned short)x  (unsigned short)y;

while(p != 1) {r /= 10; p--;}

return (unsigned char)((r + 5) / 10); // 四舍五入

}

unsigned short rMul_BIN_s(unsigned short x, unsigned short y, unsigned char p)

{

// p为小数位数

unsigned long r = (unsigned long)x  (unsigned long)y;

while(p != 1) {r /= 10; p--;}

return (unsigned short)((r + 5) / 10); // 四舍五入

}

// 演示函数结果

void main()

{

// 整数计算演示

unsigned long x = 0x9678;

unsigned long y = 0x4865;

printf("整数计算演示\nunsigned long\nBIN: %u  %u = %u\n", x, y, x  y);

printf("BCD: %X  %X = %X\n", x, y, BIN2BCD_l(BCD2BIN_l(x)  BCD2BIN_l(y)));

unsigned short sx = 0x97;

unsigned short sy = 0x48;

printf("unsigned short\nBIN: %u  %u = %u\n", sx, sy, sx  sy);

printf("BCD: %X  %X = %X\n", sx, sy, BIN2BCD_s(BCD2BIN_s(sx)  BCD2BIN_s(sy)));

unsigned char cx = 0x6;

unsigned char cy = 0x12;

printf("unsigned char\nBIN: %u  %u = %u\n", cx, cy, cx  cy);

printf("BCD: %X  %X = %X\n", cx, cy, BIN2BCD_c(BCD2BIN_c(cx)  BCD2BIN_c(cy)));

// 1位定点小数演示

printf("1位定点小数演示\n2 Byte\nBIN: %g  %g = %g\n", sx  01 , sy  01 , rMul_BIN_s(sx, sy, 1)  01);

printf("BCD: %g  %g = %g\n", BCD2BIN_s(sx)  01, BCD2BIN_s(sy)  01, BCD2BIN_s(rMul_BCD_s(sx, sy, 1))  01);

printf("1 Byte\nBCD: %g  %g = %g\n", cx  01 , cy  01 , rMul_BIN_c(cx, cy, 1)  01);

printf("BCD: %g  %g = %g\n", BCD2BIN_c(cx)  01, BCD2BIN_c(cy)  01, BCD2BIN_c(rMul_BCD_c(cx, cy, 1))  01);

// 2位定点小数演示

printf("2位定点小数演示\n2 Bytet\nBIN: %g  %g = %g\n", sx  001 , sy  001 , rMul_BIN_s(sx, sy, 2)  001);

printf("BCD: %g  %g = %g\n", BCD2BIN_s(sx)  001, BCD2BIN_s(sy)  001, BCD2BIN_s(rMul_BCD_s(sx, sy, 2))  001);

printf("1 Byte\nBCD: %g  %g = %g\n", cx  001 , cy  001 , rMul_BIN_c(cx, cy, 2)  001);

printf("BCD: %g  %g = %g\n", BCD2BIN_c(cx)  001, BCD2BIN_c(cy)  001, BCD2BIN_c(rMul_BCD_c(cx, cy, 2))  001);

}

void HextoBCD(u8 pBuff,u8 len) //十六进制转为BCD码

{

u8 i,temp;

for(i=0;i<len;i++)

{

temp=pBuff[i]/10;

time[i]=pBuff[i]%10+temp16;

}

}

bcd码就是用二进制数来表示常用的十进制数。就是用四个位的二进制来表示一个二进制数。一个字节一共有八个位,它就可以表示两个bcd码。比如,0FH等于二进制物15,用一个字节低四位来表示5,高四位来表示1合起来就是15H,不用转换两次的。

扩展资料

例如:

63÷10=6……3

即商是6,余数是

如果将商乘以16再加上余数,就是:6×16+3=99,其16进制数就是63H,即是十进制数63(16进制为3FH)的BCD码为63H。

如果在单片机中,程序这么写:char HEX,BCD;BCD=(HEX/1016)+(HEX%10);

其中HEX存储十六进制数,BCD中存储的就是其BCD码。

参考资料来源:百度百科-BCD码

这程序也写的太复杂了!既然51单片机有div指令,并且只是把a中的数字转变为bcd,那就用div直接运算:

mov

a,#0fdh

mov

b,#100

div

ab

mov

50h,a

mov

a,b

mob

b,#10

div

ab

mov

51h,a

mov

52h,b

计算完成,这样50h就是百位数,51h是十位数,52h是个位数

一个ASCII码最多需要四个BCD码存储,也就是两个字节。比如‘A',ASCII码值是65,用BCD表示是0000,0000,0110,0101,’1‘的ASCII码值是49,用BCD表示是0000,0000,0100,1001。现在的问题是这些BCD码是如何提供的?这里假定,用整数值表示BCD码,如'e'的ASCII码值(101)10,用整数表示的BCD是0000,0001,0000,0001,也就是257。

#include <stdioh>

const int MAXLEN = 128;

int main() {

char asciis[MAXLEN];

short bcds[] = {101,277,104,130,72,73,66};// AsDR12

int i,j,t,p,m,k = 0,n = sizeof(bcds)/sizeof(bcds[0]);

for(i = 0; i < n; ++i) {

t = bcds[i];

m = 0;

for(j = 0; j < 4; ++j) {

p = (t & 0XF000) >> 12;

m = 10  m + p;

t <<= 4;

}

asciis[k++] = m;

}

asciis[k] = '\0';

printf("%s\n",asciis);

return 0;

}

以上就是关于关于单片机编写程序 将A中的二进制数变换成3为BCD码 并将百,十,个位数分别防御内部RAM的50H 51H 52H中全部的内容,包括:关于单片机编写程序 将A中的二进制数变换成3为BCD码 并将百,十,个位数分别防御内部RAM的50H 51H 52H中、有一个比较电路,当输入的一位8421BCD码大于4时,输出为1,否则为0.试编写出Verilog HDL程序.、求助c语言小程序!求z=x*y;x,y分别为二进制数和BCD码时怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10219332.html

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

发表评论

登录后才能评论

评论列表(0条)

保存