求用51单片机控制 MMA7361 倾角传感器 的C 语言代码。最好有注释,详尽者 追加30分。

求用51单片机控制 MMA7361 倾角传感器 的C 语言代码。最好有注释,详尽者 追加30分。,第1张

#include "STC12C5410AD.H"

sbitMMA7260sleep=P1^0 //MMA7260休眠与否,0-休眠;1-正常工作

//---------------------------------------

//名称: 延时约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安全卫士查一下。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存