单片机 C语言 从AD得到一个8位二进制数 0x00~0xff 想把它换算成小数显示 0.00~1.00

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机 C语言 从AD得到一个8位二进制数 0x00~0xff 想把它换算成小数显示 0.00~1.00相关的知识,希望对你有一定的参考价值。

程序是这样的
uchar n=P1; //从P1口读到的8位二进制数
uchar k,l,m;
k=n/255; //整数部分
l=100*n/2550%10; //十分位
m=1000*n/2550%10; //百分位
但是显示的数不正确,本人菜鸟,求高手帮忙解决,这种思路有问题么?没问题的话我错在哪里?有问题的话那又该怎么解决?

参考技术A 计算时,需要乘以100,8位的变量,就不够用了。

unsigned int j;
unsigned char k, l, m, n = P1; //从P1口读到的8位二进制数

n = 168; // 168 / 255 = 0.65
j = 100 * n; //0 ~ 25500,需要用16位数的变量

k = j / 25500; //整数0~1
j = j % 25500; //余数0~25499,需要用16位数的变量

l = j / 2550; //十分位0~9
m = (j % 2550) / 255; //百分位0~9

//k=0, l=6, m=5.
参考技术B uchar n=P1; //从P1口读到的8位二进制数
uchar k,l,m,temp;
temp = (uchar)((ulong)n*1000/255);
k=temp/100%10; //整数部分
l=temp/10%10; //十分位
m=temp%10; //百分位
显示的是0.00~1.00 但其实你可以看成 0~100 只是百位后面多了点追问

这里 uchar定义的数据我感觉够了啊 为什么得用ulong

追答

n是uchar的 最大就是255 但是 n*1000以后 最大就可能是255000,你得给这个数据分配一个足够大的空间,简单的说就是n乘以1000以后自身会增大1000倍,你得在这之前强制给n非配一个足够大的空间, 因为n*1000以后这个数据的空间不够的话,会导致最终算出来的数据的错误的

本回答被提问者采纳
参考技术C uchar n=P1; //从P1口读到的8位二进制数
uchar k,l,m;
k=(uchar)(n%10); //整数部分
l=(uchar)(n/100%10); //十分位
m=(uchar)(n/100); //百分位追问

你确定?我运行出来不对啊 我需要的小数范围是0.00~1.00

追答

哦,刚才忙着别的活了,没注意是这个范围,你显示的最大数是1.00,那么
n=(uchar)(n *100 /255 ); //关于*100: 如果最大显示是2.00,就是*200,最大值是N.MP,那就是*NMP
k=(uchar)(n%10); //百分位
l=(uchar)(n/10%10); //十分位
m=(uchar)(n/100); //整数部分

c 语言中 bit与sbit的区别

不是C语言里的,而是C51里面的。

区别在于功能不同:

bit:是变量类型,相当于boot 只占一个位,最多可定128个bit变量。

sbit:是给可位寻址的变量(或特殊功能寄存器)的某一个位定个别名,不另占空间。

扩展资料:

单片机中C语言sbit使用方法——

1、bit位标量。

bit位标量是c51编译器的一种扩充数据类型,利用它可以定义一个位标量,但是不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0或1,类似boolean中的true和false。

2、sfr特殊功能寄存器。

sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255.利用它可以访问51单片机内部的所有特殊功能寄存器。如果sfr P1 = 0x90,这一句定P1为P1端口在片内的寄存器,在后面的语句中我们可以用P1=255(对P1端口的所有的引脚置高电平)之类的语句来操作特殊功能寄存器。

sfr是定义8位的特殊功能寄存器而sfr16 则是定义16位特殊功能寄存器。


参考技术A

一、意思不同

bit是变量类型,相当于boot 只占一个位,最多可定128个bit变量,sbit是给可位寻址的变量(或特殊功能寄存器)的某一个位定个别名,不另占空间。

如:

bit YesOrNo; //定义bit型变量 占用bdata区的一个位。

sbit P0_1 = P0^1; //申明一个引用名 P0_1 指向端口P0的1号接脚,不会额外分配空间。

二、用法不同

bit,sbit是KEIL c51里面扩展的数据类型,BIT表示一位二进制类型的数据,只有0,1两种取值

SBIT表示一位字符,sbit是位定义,这个定义只有51内核的单片机才有,一般用于51端口的位操作,一个P口有8位,sbit就可以定义一个通俗的名字来描述一端口8位中的其中一位如sbit LED=P0^1; sbit key=P0^2;等等,这样当你使用LED或者KEY时就相当于对P0.1和P0.2操作了。

三、用处不同

sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0×90这一句定P1为P1端口在片内的寄存器,用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。




参考技术B

bit和sbit这两者不是C语言里面的,而是C51里面的;

bit和sbit的区别在于两者功能不同,具体如下:

bit是变量类型,相当于boot 只占一个位,最多可定128个bit变量,而sbit是给可位寻址的变量的某一个位定个别名,不另占空间;

扩展资料:

bit定义:

比特是英文 binary digit的缩写,比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量,一般来说,n比特的信息量可以表现出2的n次方种选择;

sbit定义:

sbit是定义特殊功能寄存器的位变量,bit和sbit都是C51扩展的变量类型,应用如sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作,bit和int char之类的差不多,只不过char=8位, bit=1位而已,都是变量,编译器在编译过程中分配地址;

参考资料来源:百度百科-sbit

参考资料来源:百度百科-bit

参考技术C bit和sbit都是C51扩展的变量类型。

bit和int char差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非指定,否则这个地址是随机分配的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,和Windows下VC中的BOOL类似。

sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6的定义,这个sbit量就确定地址了。

bit和sbit的最大区别在于,bit是定义一个变量;sbit经常用在寄存器中的,方便对寄存器的某位进行操作。

参考资料:http://zhidao.baidu.com/question/72536362.html

本回答被提问者采纳
参考技术D   bit : 编译时分配空间 sbit 只能在外部定义全局变量。 sfr(特殊功能寄存器)的bit。SFR是系统指定的内存地址。   bit 动态分配的,有编译器来指定内存地址。   bit和sbit都是C51扩展的变量类型。   sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的bit   sbit更像是类型定义,不像是变量定义。   sbit: 指示说明性说明   bit 可以在外部或内部定义。   bit和int char之类的差不多,只不过char=8位, bit="1位而已"。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。   bit是编译器在的可寻址区分配的一个位变量,是不定的,不是绝对地址目标。   所有可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。   sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。   sbit位寄存器是可位寻址的绝对地址目标,定义后编译器是不会改变位置的。

以上是关于单片机 C语言 从AD得到一个8位二进制数 0x00~0xff 想把它换算成小数显示 0.00~1.00的主要内容,如果未能解决你的问题,请参考以下文章

单片机怎样把8位的数据写入74HC595寄存器里(c语言)

C语言:十进制BCD码互换

C语言输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位).

3. 从键盘上输入一个八进制数,利用指针将其转换为十进制数并输出 C语言 很急

c语言编写一程序,以字符串形式输入十进制数,将字符串对应的十进制数转换成二进制数,将得到的结果输出。

自带12位AD转换器的51系列单片机