//
// 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单片机控制,测量倾角的程序!、试述烤烟分级 *** 作程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)