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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)