求用51单片机控制ADXL345测量角度的程序,通过ADXL345传感器,用51单片机控制,测量倾角的程序!

求用51单片机控制ADXL345测量角度的程序,通过ADXL345传感器,用51单片机控制,测量倾角的程序!,第1张

//

// GY-29 ADXL345 IIC测试程序

// 使用单片机STC89C51

// 晶振:110592M

// 显示:LCD1602

// 编译环境 Keil uVision2

// 参考宏晶网站24c04通信程序

// 时间:2011年3月1日

// QQ:531389319

//

#include <REG51H>

#include <mathh> //Keil library

#include <stdioh> //Keil library

#include <INTRINSH>

#define uchar unsigned char

#define uint unsigned int

#define DataPort P0 //LCD1602数据端口

sbit SCL=P1^0; //IIC时钟引脚定义

sbit SDA=P1^1; //IIC数据引脚定义

sbit LCM_RS=P2^0; //LCD1602命令端口

sbit LCM_RW=P2^1; //LCD1602命令端口

sbit LCM_EN=P2^2; //LCD1602命令端口

#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改

//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区

uchar ge,shi,bai,qian,wan; //显示变量

int dis_data; //变量

int data_xyz[3];

void delay(unsigned int k);

void InitLcd(); //初始化lcd1602

void Init_ADXL345(void); //初始化ADXL345

void WriteDataLCM(uchar dataW);

void WriteCommandLCM(uchar CMD,uchar Attribc);

void DisplayOneChar(uchar X,uchar Y,uchar DData);

void conversion(uint temp_data);

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据

uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据

void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据

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

void Delay5us();

void Delay5ms();

void ADXL345_Start();

void ADXL345_Stop();

void ADXL345_SendACK(bit ack);

bit ADXL345_RecvACK();

void ADXL345_SendByte(BYTE dat);

BYTE ADXL345_RecvByte();

void ADXL345_ReadPage();

void ADXL345_WritePage();

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

//

void conversion(uint temp_data)

{

wan=temp_data/10000+0x30 ;

temp_data=temp_data%10000; //取余运算

qian=temp_data/1000+0x30 ;

temp_data=temp_data%1000; //取余运算

bai=temp_data/100+0x30 ;

temp_data=temp_data%100; //取余运算

shi=temp_data/10+0x30 ;

temp_data=temp_data%10; //取余运算

ge=temp_data+0x30;

}

//

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i<k;i++)

{

for(j=0;j<121;j++)

{;}}

}

//

void WaitForEnable(void)

{

DataPort=0xff;

LCM_RS=0;LCM_RW=1;_nop_();

LCM_EN=1;_nop_();_nop_();

while(DataPort&0x80);

LCM_EN=0;

}

//

void WriteCommandLCM(uchar CMD,uchar Attribc)

{

if(Attribc)WaitForEnable();

LCM_RS=0;LCM_RW=0;_nop_();

DataPort=CMD;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

//

void WriteDataLCM(uchar dataW)

{

WaitForEnable();

LCM_RS=1;LCM_RW=0;_nop_();

DataPort=dataW;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

//

void InitLcd()

{

WriteCommandLCM(0x38,1);

WriteCommandLCM(0x08,1);

WriteCommandLCM(0x01,1);

WriteCommandLCM(0x06,1);

WriteCommandLCM(0x0c,1);

}

//

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

Y&=1;

X&=15;

if(Y)X|=0x40;

X|=0x80;

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

/

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

/

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

/

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

/

void Delay5ms()

{

WORD n = 560;

while (n--);

}

/

起始信号

/

void ADXL345_Start()

{

SDA = 1; //拉高数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿

Delay5us(); //延时

SCL = 0; //拉低时钟线

}

/

停止信号

/

void ADXL345_Stop()

{

SDA = 0; //拉低数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿

Delay5us(); //延时

}

/

发送应答信号

入口参数:ack (0:ACK 1:NAK)

/

void ADXL345_SendACK(bit ack)

{

SDA = ack; //写应答信号

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

/

接收应答信号

/

bit ADXL345_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

/

向IIC总线发送一个字节数据

/

void ADXL345_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i<8; i++) //8位计数器

{

dat <<= 1; //移出数据的最高位

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

ADXL345_RecvACK();

}

/

从IIC总线接收一个字节数据

/

BYTE ADXL345_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据,

for (i=0; i<8; i++) //8位计数器

{

dat <<= 1;

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

//单字节写入

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)

{

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页

ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页

ADXL345_Stop(); //发送停止信号

}

//单字节读取

uchar Single_Read_ADXL345(uchar REG_Address)

{ uchar REG_data;

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号

REG_data=ADXL345_RecvByte(); //读出寄存器数据

ADXL345_SendACK(1);

ADXL345_Stop(); //停止信号

return REG_data;

}

//

//

//连续读出ADXL345内部加速度数据,地址范围0x32~0x37

//

//

void Multiple_read_ADXL345(void)

{ uchar i;

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF

{

BUF[i] = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据

if (i == 5)

{

ADXL345_SendACK(1); //最后一个数据需要回NOACK

}

else

{

ADXL345_SendACK(0); //回应ACK

}

}

ADXL345_Stop(); //停止信号

Delay5ms();

}

//

//初始化ADXL345,根据需要请参考pdf进行修改

void Init_ADXL345()

{

Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式

Single_Write_ADXL345(0x2C,0x08); //速率设定为125 参考pdf13页

Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页

Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断

Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页

Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页

Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页

}

//

//显示x轴

void display_x()

{ float temp;

dis_data=(BUF[1]<<8)+BUF[0]; //合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(2,0,'-'); //显示正负符号位

}

else DisplayOneChar(2,0,' '); //显示空格

temp=(float)dis_data39; //计算数据和显示,查考ADXL345快速入门第4页

conversion(temp); //转换出显示需要的数据

DisplayOneChar(0,0,'X'); //第0行,第0列 显示X

DisplayOneChar(1,0,':');

DisplayOneChar(3,0,qian);

DisplayOneChar(4,0,'');

DisplayOneChar(5,0,bai);

DisplayOneChar(6,0,shi);

DisplayOneChar(7,0,'g');

}

//

//显示y轴

void display_y()

{ float temp;

dis_data=(BUF[3]<<8)+BUF[2]; //合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(2,1,'-'); //显示正负符号位

}

else DisplayOneChar(2,1,' '); //显示空格

temp=(float)dis_data39; //计算数据和显示,查考ADXL345快速入门第4页

conversion(temp); //转换出显示需要的数据

DisplayOneChar(0,1,'Y'); //第1行,第0列 显示y

DisplayOneChar(1,1,':');

DisplayOneChar(3,1,qian);

DisplayOneChar(4,1,'');

DisplayOneChar(5,1,bai);

DisplayOneChar(6,1,shi);

DisplayOneChar(7,1,'g');

}

//

//显示z轴

void display_z()

{ float temp;

dis_data=(BUF[5]<<8)+BUF[4]; //合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(10,1,'-'); //显示负符号位

}

else DisplayOneChar(10,1,' '); //显示空格

temp=(float)dis_data39; //计算数据和显示,查考ADXL345快速入门第4页

conversion(temp); //转换出显示需要的数据

/

DisplayOneChar(10,0,'Z'); //第0行,第10列 显示Z

DisplayOneChar(11,0,':');

DisplayOneChar(11,1,qian);

DisplayOneChar(12,1,'');

DisplayOneChar(13,1,bai);

DisplayOneChar(14,1,shi);

DisplayOneChar(15,1,'g');

/

}

//

//主程序

//

void main()

{

uchar devid;

float Roll,Pitch,Q,T,K;

delay(500); //上电延时

InitLcd(); //液晶初始化ADXL345

Init_ADXL345(); //初始化ADXL345

devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确

while(1) //循环

{

Init_ADXL345(); //初始化ADXL345

Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中

data_xyz[0]=(BUF[1]<<8)+BUF[0]; //合成数据

data_xyz[1]=(BUF[3]<<8)+BUF[2]; //合成数据

data_xyz[2]=(BUF[5]<<8)+BUF[4]; //合成数据

//分别是加速度X,Y,Z的原始数据,10位的

Q=(float)data_xyz[0]39;

T=(float)data_xyz[1]39;

K=(float)data_xyz[2]39;

Q=-Q;

Roll=(float)(((atan2(K,Q)180)/314159265)+180); //X轴角度值

Pitch=(float)(((atan2(K,T)180)/314159265)+180); //Y轴角度值

conversion(Roll); //转换出显示需要的数据X轴,或者Y轴

DisplayOneChar(9,1,'A');

DisplayOneChar(10,1,':');

DisplayOneChar(11,1,bai);

DisplayOneChar(12,1,shi);

DisplayOneChar(13,1,ge);

delay(200); //延时

}

}

1.成熟度(Maturity):指调制后烟叶的成熟程度(包括田间和调制后成熟度),成熟度划分为下列档次。

(1)完熟(Mellow):指上部烟叶在田间达到高度的成熟,且调制后熟充分。

(2)成熟(Ripe):烟叶在田间及调制后熟均达到充分成熟。

(3)尚熟(Mature):烟叶在田间刚达到成熟,生化变化尚不充分或调制失当后熟不够。

(4)欠熟(Unripe):烟叶在田间未达到成熟。

(5)假熟(Premature):泛指脚叶,外观似成熟,但未达到真正成熟。

2.叶片结构(Leaf structure):指烟叶细胞的疏密程度,分为下列档次:

(1)疏松(Open)

(2)尚疏松(Firm)

(3)稍密(Close)

(4)紧密(Tight)

3.身份(Body):指烟叶厚度、密度或单位面积的重量。以厚度表示,分下列档次:

(1)薄(Thin)

(2)稍薄(Less Thin)

(3)中等(Medium)

(4)稍厚(Fleshy)

(5)厚(Heavy)

4.油分(Oil):烟叶含有的一种柔软半液体物质,根据其含量的多少,分下列档次:

(1)多(Rich):含油分丰富,表观油润。

(2)有(Oily):含油分尚多,表观有油润感。

(3)稍有(Less Oily):油分较少,表观尚有油润感。

(4)少(Lean):油分贫乏,表观无油润感。

5.色度:(Color intensity):指烟叶表面颜色的饱和程,度,分下列档次:

(1)浓(Deep):叶表面颜色均匀,色泽饱和。

(2)强(Strong):颜色均匀,饱和度略逊。

(3)中(Moderate):颜色尚匀,饱和度一般。

(4)弱(Weak):颜色不匀,饱和度低。

(5)淡(Pale):颜色不匀,色泽淡薄。

6.长度(Length):从叶片主脉柄端至尖端间的距离,以厘米表示。

7.残伤(Waste):烟叶组织受破坏,失去成丝的强度和坚实性,使用价值极度低下,以百分数表示。

8.破损(Injury):叶片受到损伤,失去的完整度,以百分数表示。

9.颜色(Color):同一型烟叶经调制后烟叶的相关色彩、色泽饱和度和色值的状态。分下列颜色:

(1)柠檬**(Lemon):烟叶表观全部呈现**或微现不明显的红色,在习惯称呼的淡黄、正**色域内。

(2)橘**(Orange):烟叶表观呈现橘红色,在习惯称呼的金**、深**色域内。

(3)红棕色(Red):烟叶表观呈现红色或浅棕**,在习惯称呼的红黄、棕**色域内。

10.微带青(Greenish):指**烟叶上叶脉带青或叶片含微浮青面积在10%以内者。

11.青**(Green):指**烟叶上含有任何可见的青色,且不超过三成者。

12.光滑(Slick):指烟叶组织平滑或僵硬。任何叶片含平滑或僵硬面积超过20%者,均列为光滑叶。

13.杂色(Variegated):指烟叶表面存在的非基本色颜色斑块(青黄烟除外),包括轻度洇筋、蒸片及局部挂灰、全叶受污染、青痕较多、严重烤红、潮红、受蚜虫损害叶等。凡杂色面积达到或超过20%者,均视为杂色叶片。

14.颜色代号:分级中的颜色用下列代号表示:L—柠檬**、F—橘**、R—红棕色、K—杂色、V—微带青、GY—青**。

15.分组代号:分组以下列代号表示:CX—中下部(Cutters or Lugs),B-上部(Leaf),H—完熟(Smoking Leaf),C—中部(Cutters),X—下部(Lugs),S—光滑叶组(Slick)。

三、验收规则

第一,定级原则。烤烟的成熟度、叶片结构、身份、油分、色度、长度都达到某些要求时,才定为某级,破损、残伤为控制指标,长度不得低于规定,破损、残伤不得超过规定的百分数。

第二,最终级的确定。当重新检验时与已确定之级不符,则原定级无效。

第三,一批烟叶介于两种颜色的界限上,则视其他品质适当定色定级。

第四,一批烟叶在两个等级界限上,则定较低等级。

第五,设一批烟叶品级因素为B级,其中一个因素低于B级规定则定C级;一个或多个因素高于B级,仍为B级。

第六,青片、霜冻烟叶、火伤、火熏、异味、霉变、掺杂、水分超限等均为不列级。

第七,中部叶短于35厘米者在下部叶组定级。

第八,杂色面积超过20%的烟叶,在杂色组定级。

第九,杂色面积小于20%的烟叶,允许在正组定级,但杂色与残伤相加之和不得超过相应等级的残伤百分数,超过者定为下一级;杂色与残伤之和超过该组最低等级残伤允许度者,可在杂色组内适当定级。

第十,褪色烟在光滑叶组定级。

第十一,基本色影响不明显的轻度烤红烟,在相应部位、颜色组别二级以下定级。

第十二,破损的计算以一把烟内破损总面积占烟实有总面积的百分数;每张叶片的完整度必须达到50%以上,低于50%者列为级外烟。

第十三,凡列不进标准级但尚有使用价值的烟叶,可视作级外烟。收购部门可根据用户需要决定是否收购。

四、验收规格

(一)烟叶水分:一般初烤烟水分要求16~18%(其中4~9月份掌握在16~17%),复烤烟11~13%。

(二)砂土率:自然砂土率各等级初烤烟均不超过11%,复烤烟不超过1%。

(三)破损率和纯度误差:中部橘黄(C1F、C2F、C3F)、柠檬黄1、2级(C1L、C2L),上部橘黄1、2级(B1F、B2F)、柠檬黄1级(B1L)、红棕1级(B1R),完熟叶1级(H1F)破损率和纯度误差均控制在10%。中部柠檬黄3级(C3L),下部橘黄1、2、3级(X1F、X2F、X3F)、柠檬黄1、2级(X1L、X2L),上部橘黄3、4级(B3F、B4F)、柠檬黄2、3级(B2L、B3L)、红棕2、3级(B2R、B3R),完熟叶2级(H2F),下二棚微青色(X2V),中部微青色(C3V),上二棚微青色(B2V、B3V),光滑叶1级(S1)破损率和纯度误差分别控制在15%和20%。上部柠檬黄4级(B4L),下部柠檬黄3、4级(X3L、X4L)、橘黄4级(X4F),光滑叶2级(S2),中下部杂色1、2级(CX1K、CX2K),上部杂色1、2、3级(B1K、B2K、B3K),青**(GY1、GY2)破损率和纯度误差分别控制在30%和20%。

(四)扎把:规格要求为自然把,每把25~30片叶,把头周长100~120毫米,绕宽50毫米。

五、检验方法

第一,按照15级制进行检验。

第二,出口供货可按供需双方协议规定的方法进行。

第三,实物样品是检验和验级的凭证之一,一经双方确认,即为验货的依据。

六、包装、标志、运输、保管

(一)包 装

第一,每包(件)烤烟必须是同一产区、同一等级。供需交接时,每包(件)自然碎片不得超过3%。

第二,包装用的材料必须牢固、干燥、清洁、无异味、无残毒。

第三,包(件)内烟把应排列整齐,循序相压,不得有任何杂物。

第四,包装类型。分麻布包装和纸箱包装两种:①麻布包装。每包净重分50、60千克两种,成包体积50千克为40厘米×60厘米×80厘米,60千克为40厘米×65厘米×85厘米;②纸箱包装。每箱净重200千克,内径规格1 097毫米×672毫米×705毫米,外径规格1 115毫米×690毫米×725毫米。

(二)标 志

第一,必须字迹清晰,包内要放标志卡片。

第二,标志内容:①产地;②级别(大写及代号);③重量;④产品年、月;⑤供货单位名称。

第三,包件的四周应注明级别及其代号

(三)运输

第一,运输包件时,上面必须有遮盖物,包严、盖牢、防日晒和受潮。

第二,不得与有异味和有毒物品混运,有异味和污染的运输工具不得装运。

第三,装卸必须小心轻放,不得摔包、钩包。

(四)保 管

1.垛高:麻袋包装初烤烟1~2级(不含副组2级)不超过5个包高,3~4级不超过6个包高,复烤烟不超过7个包高,硬纸箱包装不受此限。

2.场所:必须干燥通风,地势高,不靠火源和油库。

3.包位:须置于距地面300毫米以上的垫木上,距房墙至少300毫米。

4.不得与有毒物品或有异味物品混运。

5.露天堆放:四周必须有防雨、防晒遮盖物,封严。垛底需距地面300毫米以上,垫木(石)与包齐,以防雨水侵入。

6.安全:存贮期须防潮、防霉、防虫,定期检查,确保商品安全。

七、40级制国家烤烟标准的优点

第一,更加合理地分清了烟叶质量,按部位、颜色分组后,又以性质、用途进行分组,纯化了同一组内的烟叶质量,比较接近先进国家标准,适应了对外出口的需要。

第二,促进了三化生产水平的提高,解决了成熟度好,颜色偏深,光泽稍暗,有较多成熟斑,甚至有不同程度赤星病斑烟叶的问题。这部分烟叶的质量较高,放宽了对病斑和光泽的要求。

第三,便于分级 *** 作,易于被烟农接受。烟农反映,听起来难,做起来易。组数,级数增多,级差缩小,便于掌握。

第四,级差小且合理,避免争级争价,确保收购秩序。

第五,在规范化种植水平提高的基础上,烟农收入明显提高。

八、推行40级制国家烤烟标准应注意的问题

第一,三化生产水平低的地方不宜推行。据粗略估计,我国达到三化生产要求的烟田面积仅有30~40%。若急于推广实行则事与愿违。

第二,三化生产水平高的地区,推行40级制时,应停止15级制的收购,防止两个标准交错。

第三,卷烟配方结构未改变以前,不要急于全面推行。

第四,加强组织领导,做好技术培训,才能比较好地推行。

以上就是关于求用51单片机控制ADXL345测量角度的程序,通过ADXL345传感器,用51单片机控制,测量倾角的程序!全部的内容,包括:求用51单片机控制ADXL345测量角度的程序,通过ADXL345传感器,用51单片机控制,测量倾角的程序!、试述烤烟分级 *** 作程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9710882.html

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

发表评论

登录后才能评论

评论列表(0条)

保存