sbitMMA7260sleep=P1^0 //MMA7260休眠与否,0-休眠;1-正常工作
//---------------------------------------
//日期:20081111
//-----------------------------------------
void delay1ms()
{
word k
for(k=0k<12000k++)
}
void delayms(word ms)
{
word k,j
for(j=0j<msj++)
for(k=0k<12000k++)
}
//---------------------------------------
//名称: 串口数据发送函数
//日期:20081111
//-----------------------------------------
void uart_putchar(byte ch)
{
TI=0
if (ch == '\n')
{
SBUF= 0x0d //output'CR'
while(!TI)
return
}
SBUF=ch
while(!TI)
}
//---------------------------------------
//名称: 串口数据接收函数
//日期:20081111
//-----------------------------------------
byte uart_getchar(void)
{
if(RI)
{
RI=0
return SBUF //有数据接收到,返回1
}
else
{
return 0 //无数据接收到,返回0
}
}
void putstr(char ch[])
{
byte ptr=0
while(ch[ptr])
{
uart_putchar((byte)ch[ptr++])
}
}
//---------------------------------------
//名称: 模数转换函数(8位)
//日期:20081111
//-----------------------------------------
byte ReadAD(byte ch)
{
ADC_DATA = 0//清A/D转换结果寄存器
ADC_CONTR = 0xF8|ch //0000,1000ADCS = 1,启动转换
delay1ms()
do{}
while((ADC_CONTR&0x10)==0) //0001,0000等待A/D转换结束
ADC_CONTR = ADC_CONTR&0xE7 //1110,0111清ADC_FLAG位,停止A/D转换
return ADC_DATA
}
/***************************************************
把0--255的数值转化为3位字符串格式
****************************************************/
void Byte2Str3(char zifu[],byte val,byte StartPtr)
{
char characters[11]="0123456789"
byte tv=0
tv=val/100
zifu[StartPtr++] = characters[tv]
tv=(val%100)/10
zifu[StartPtr++] = characters[tv]
tv=val%10
zifu[StartPtr] = characters[tv]
//zifu[3] = '\0'
return
}
//---------------------------------------
//名称: 初始化函数函数
//日期:20081111
//-----------------------------------------
void init_ad(void)
{
P1M0=0x07 //设置P1.012为高阻输入,以准备AD
P1M1=0x00
ADC_CONTR = 0xf8//1000,0000打开A/D转换电源
delay1ms()
ADC_CONTR = ADC_CONTR&0xe0//1110,0000 清ADC_FLAG,ADC_START位和低3位
}
void init_uart(void) //P3.0,3.1
{
TMOD=0x20 //TH1=256-INT(22118400/32/12/baud+0.5)
TH1=0xfa //0xfa,9600
TL1=0xfd //0xff,57600
PCON=0x00
TR1=1
SCON=0xd0
}
void init_dev(void)
{
init_ad()
init_uart()
}
//---------------------------------------
//名称: 主函数
//日期:20081111
//-----------------------------------------
void main()
{
char txtbuf[17]="\n ADC Val: "
byte adbuf
init_dev()
putstr("\n MMA7260 starts working!\n")
MMA7260sleep=1//MMA7260开始工作
while(1)
{
//ADC
adbuf=ReadAD(0)//X AXIS
Byte2Str3(txtbuf,adbuf,11)
putstr(txtbuf)
adbuf=ReadAD(1)//Y AXIS
Byte2Str3(txtbuf,adbuf,11)
putstr(txtbuf)
adbuf=ReadAD(2)//Z AXIS
Byte2Str3(txtbuf,adbuf,11)
putstr(txtbuf)
delayms(300)
}
}
精度要求也不算太高(器件本身精度也有限)重力对流体的作用引起膜电位变化的原理 一般地说。所以选择ADC的余度较大。器件实际输出的是比例于加速度量值的模拟(电压)量。原因是倾角测试在本质上就是加速度测量,如果选用的MCU带ADC,并不直接输出倾角,需要根据应用条件(包括器件本身的位置方向等结构)经过适当的运算才可以得到你的倾角结果,作为转换--ADC也就成了必须的环节了。 测量要求本身和器件的工作速度要求都比较低,况且还可能需要一些校正等,这就必然会需要微控制器等的支持,是需要ADC的可能是流氓软件删除不完全后留下的残留,系统启动时会自动加载流氓软件(流氓软件都这样设计的),但现在流氓软件被删了,之留下一些残留,不能启动,故会出现异常未知的软件异常。建议用360安全卫士查一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)