MSP430一段程序读不懂求助!!

MSP430一段程序读不懂求助!!,第1张

代码的意思,生命联络员已经跟你解释清楚了,我给你解释一下为什么这么算。

MSP430的ADC参考电压是3.3V,ADC的位数是12位。所以

采样的电压值 = 转换出来的值 * 330 / (2的12次方)。

这里把电压值放大了100倍,为什么呢?为了计算更快捷,无论什么处理器,整型运算肯定会快于浮点运算的,而且快的不只是一点点,你自己回忆一下浮点变量是几位的,而整型变量又是几简轮灶位的;还为了更方便的把电压值显桐闷示到LCD上面,例如显示330,只要人为的加一个小数点就可以了。而3.30,如果不做处理直接显示的话,只能显示为3V,小数点部分没有了,因为液晶只能显示字符型拦扮变量。

你试想一下,如果采样电压大于等于3.30V参考电压,转换出来的是什么值,没错,就是0FFFH,也就是2^12,这是它的最大量程。

正确的是

IAR默认常数是int型,程歼庆则序中a为无符号,200有符号氏棚,两个有符号数相乘得到是有符号数,再把这个值付给无符号a,于是得到4294941760这个不是乱码是溢出了,一看这种大端数你应该有所注意。

可以这样改

#include<msp430x16x.h>

unsigned long a

void main(void)

{

WDTCTL=WDTPW+WDTHOLD

a=200u*200u

}

就行了,我运行过,这样随便你怎么运行都不会错,编译器可以设置变量定义你自己多看看,还有你这种编程差洞时不可靠的,在IAR中无使用变量编译器会自动跳过,结尾也应该加while(1)

正确如下

#include<msp430x16x.h>

unsigned long a

void main(void)

{

WDTCTL=WDTPW+WDTHOLD

a=200u*200u

a= a

while(1)

}

还有问题到我空间留言吧 http://hi.baidu.com/irobot2010/

在MSP430F149中TBCTL表示定时器B的控制寄存器。MCx是该寄存器的第5-4位,是定时器B的工作模式控制位,表示定时器的工作方式。

在头文件中

#define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */

这是一个宏定义,MC_0的值即为:0*0x10u,它是一衫袭个无符号乘法运算,结果就是为0,即MC_0的值实际为:0x00(因为这个值比较特殊,所以现用MC_2举例)如果是#define MC_2 (2*0x10u) ,则MC_2=0x20,二进制为:0010 0000,正好第5位为1。喊早

TBCTL &MC_0 是TBCTL与MC_0按位相与的运郑塌雀算,其作用就是判断MCx(TBCTL第5位和第4位的值)是否为0。


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

原文地址: http://outofmemory.cn/yw/12313246.html

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

发表评论

登录后才能评论

评论列表(0条)

保存