请教C51单片机编程问题,这是什么原因呢

这些
s=cc/mt;
ct=(uchar)(cd/s); //出错

ct=(uchar)((cd*mt)/cc); //OK
是从函数里抽出来的,
s=cc/mt;
ct=(uchar)(cd/s); 运算结果不对,
而换成ct=(uchar)((cd*mt)/cc); 运算结果就对了,
这是怎么回事呢

难道你程序真的这么写的?下面的三行也不是写在一个主函数里或者一个子函数里吗?最后一行竟然会OK?在说笑话吧。
这样,就能编译通过的。
unsigned int mt;
unsigned char cc,cd,ct;
float s;
void cdt()
{
s=cc/mt;
ct=(unsigned char)(cd/s);
ct=(unsigned char)((cd*mt)/cc);
}
main()
{
cdt();
while(1);
}追问

不好意思,是我没说清楚,前面有定义
#define uint unsigned int
#define uchar unsigned char

追答

你也没看明白,我没说uint和uchar,我知道前面有定义。
我问的是后面三行,那计算赋值语句,就像你那么写的,肯定是不行,要写要主程序中或者写在子函数中的。
都给写出来,那么写,编译是通过的,这都看不明白呀。

追问

明白你的意思,那几句是从函数里抽出来的,编译是能通过,但二者算出来的结果不一样,不知道这是什么原因,还望不吝赐教,谢谢!

追答

问题出在这行:s=cc/mt;
因cc,mt都不是浮点数,计算的结果s是0。
对于keilc,这种浮点数计算,参加运算的数都是浮点数才行。

温馨提示:内容为网友见解,仅供参考
无其他回答

c51单片机程序编译时错误:error c236:‘——display’:different length...
“子函数里的形参声明的方式不对,需要每个参数都定义一下类型 。”===不需要,这一点,你的没错。count是uchar,还是uint?我猜想,你的count是uint。很可能问题在这里。

51单片机的编程问题?
是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:C51语句: P0 = 1...

C51单片机,这段代码哪里错了,显示error C193: 'parameter': bad o...
Delay_ms()函数的参数是一个uint型,你把_nop_()函数的返回值传递给它,然而_nop_()函数是没有返回值的……行号,第48行,你自己好好看。

51单片机C51语言的几个问题。
问题1:sbit a = PSW^2;这不是一条简单的赋值语句,a也不是什么变量,而是把他和PSW的第二位关联起来,相当于a是它的别名一样,如果a变化的话PSW的第二位会变,PSW的第二位变化时a当然也会变(假设你叫李宇春,现在这条语句就是说把春哥也变成你的名字),其实是一个东西,这么做的原因是,...

c51单片机程序运行顺序的问题?
任何单片机在强电磁干扰下都可能会出问题,所以从设计上要把隔离和抗辐射做足。A、当程序进入外部中断1时断开加热,这个时候只有等待到启动加热信号才跳出外部中断,那么其他程序都不执行了吗?比如这个时候收到启动语句6(异步电机正转信号)。是的,主循环在中断执行期间是不会得到执行的。问题:B、怎么...

89c52系列的c51单片机开发版刚买来的,烧入代码后没有写蜂
首先,硬件知识的缺失是入门单片机开发的一大障碍。对于蜂鸣器的接线位置、所连接的P口引脚等基本硬件配置,若不清楚,将直接影响到后续代码的正确性。因此,熟悉硬件原理图并理解各硬件组件的电气特性,是单片机开发的基础。其次,汇编语言编程需要具备深厚的逻辑思维和编码技巧。若未熟练掌握汇编语言,仅使用...

谁能帮我检查下,这个C51单片机的汇编语言有什么错误!
分别与开始的第1、2、3个键值相同),就将00H这位置为有效,然后蜂鸣器响一响,没有什么实质性的工作。另外,你的原理图中P3.2是控制线,程序中没有看到P3.2,却有P3.5。希望你具体说明你的需求,以及你自己的编程思路,才能让别人帮到你,只会贴贴程序是没有意义的。

51单片机使用KEIL C51 数据碰到编译异常
问这样的问题之前,你应当先了解一下Keil Cx51的默认数据类型。Cx51在不修改项目配置时,计算时默认的数据类型是int型的(有符号整型),所以在没有类型指定的前提下,9600×4会计算得到溢出的结果变成-27136(0x9600),接下来执行赋值操作时promote类型为四字节,即0xFFFF9600。要想得到正确的结果,应当...

C51单片机编译后显示error:failed to execute'c: \\keil\\c51\\b
估计是复制工程造成的,重新建一个工程,然后复制里面的头文件和源文件,并添加,重新编译试试

51单片机上电后不运转,不执行程序。什么原因?
很可能是晶振的问题。起振的话,晶振两脚上有一只脚可以看到振荡波形的。你还可以查一下单片机的EA脚,这个是配置启动顺序的,外部还是内部,EA为高电平可能是有问题的,你该尝试下接地。单片机程序不执行,我遇到过上述两种情况,EA没接,还有就是晶振的电容和晶振碰到一块去了。

相似回答