test

#include  <REG51.H>	
#include  <INTRINS.H>

#define   uchar unsigned char				  //  0-255 	  
#define   uint  unsigned int				 //0-65536  							   
#define   DataPort P0    //LCD1602????

sbit	  SCL=P1^4;      //IIC??????
sbit 	  SDA=P1^5;      //IIC??????


sbit rs=P1^0;	 //??????? H:?????  	L:?????
sbit rw=P1^1;	 //??????? H:?????  	L:?????
sbit e =P1^2;	 //????   ?????

#define	SlaveAddress   0xA6	  //?????IIC???????,??ALT  ADDRESS????????
                              //ALT  ADDRESS????????0xA6,???????0x3A

sbit Bell=P2^2;		//?????

//????**********************
uint bushu;  //??
uint cal;
uint dis;
//******************************

typedef unsigned char  BYTE;
typedef unsigned short WORD;	//?????????

//????**********************   ???? ????5??,????1km,??50cm
uchar Time_min_set=5,Time_sec_set;
uint distance_set=10;	  // 1KM
uchar pace_set=50;		  //50cm
//******************************

//?????**********************
uchar min,sec;
uchar count_jishi;
//******************************

//ADXL345
uchar BUF[8];                         //???????   ??8?????(??),??????(??)?uchar?,????????????   	
int  dis_data;                       //??
void  Multiple_Read_ADXL345();                                  //????????????
//******************************

/***************************************************************
* ?? : delay_1ms()
* ?? : ??1ms??
* ?? : q
* ?? : ?
****************************************************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<120;j++);
}
/********************************************************************
* ?? : delay_uint()
* ?? : ????
* ?? : ?
* ?? : ?
***********************************************************************/
void delay_uint(uint q)
{
	while(q--);
}

/********************************************************************
* ?? : write_com(uchar com)
* ?? : 1602????
* ?? : ??????
* ?? : ?
***********************************************************************/
void write_com(uchar com)
{								//e?????,rs0??,rw0???
	e=0;
	rs=0;
	rw=0;
	P0=com;
	delay_uint(25);
	e=1;
	delay_uint(100);
	e=0;
}

/********************************************************************
* ?? : write_data(uchar dat)
* ?? : 1602?????
* ?? : ????1602???
* ?? : ?
***********************************************************************/
void write_data(uchar dat)
{
	e=0;
	rs=1;
	rw=0;
	P0=dat;
	delay_uint(25);
	e=1;
	delay_uint(100);
	e=0;	
}


/***********************lcd1602???5?????************************/
void write_sfm5(uchar hang,uchar add,uint date)
{
	if(hang==1)   
		write_com(0x80+add);		  //?????????0x80;
	else
		write_com(0x80+0x40+add);	   //??????0x80+0x40;
	write_data(0x30+date/10000%10);	   //1602????ASCII??,0~0X30;  1~0X31;	 ?????????0x30
	write_data(0x30+date/1000%10);
	write_data(0x30+date/100%10);
	write_data(0x30+date/10%10);		  //??????
	write_data(0x30+date%10);				 
}
/***********************lcd1602???3?????************************/
void write_sfm3(uchar hang,uchar add,uint date)
{
	if(hang==1)   
		write_com(0x80+add);
	else
		write_com(0x80+0x40+add);
	write_data(0x30+date/100%10);
	write_data(0x30+date/10%10);		  //??,ASCII??,1:0x31
	write_data(0x30+date%10);				 //??
}
/***********************lcd1602???4?????************************/
void write_bushu(uchar hang,uchar add,uint date)
{
	if(hang==1)   
		write_com(0x80+add);
	else
		write_com(0x80+0x40+add);
	write_data(0x30+date/1000%10);
	write_data(0x30+date/100%10);
	write_data(0x30+date/10%10);		  //??,ASCII??,1:0x31
	write_data(0x30+date%10);				 //??
}

/***********************lcd1602???????************************/
void write_string(uchar hang,uchar add,uchar *p)		  //????
{
	if(hang==1)   
		write_com(0x80+add);
	else
		write_com(0x80+0x40+add);
		while(1)														 
		{
			if(*p == '\0')  break;		 //????????\0 	????
			write_data(*p);
			p++;
		}	
}
/***********************lcd1602???2?????************************/
void write_time(uchar hang,uchar add,uchar date)
{
	if(hang==1)   
		write_com(0x80+add);
	else
		write_com(0x80+0x40+add);

	write_data(0x30+date/10%10);
	write_data(0x30+date%10);	
}
//***********************************************************************
//?????
void show_cal()
{
	write_com(0x80+0x40+10);			//0xc0+10 1602??11???????
	write_data(0x30+cal/10000%10);
	write_data(0x30+cal/1000%10);
	write_data(0x30+cal/100%10);	
	write_data(0x30+cal/10%10);
	write_data('.');
	write_data(0x30+cal%10);
}		
/***********************lcd1602?????************************/
void Init_1602()	//lcd1602初始化
{
	write_com(0x38); //??16*2????	
	write_com(0x0c);  //???????,????
	write_com(0x06);   //?????1
	write_com(0x00);//??
	delay_uint(1000);
	write_string(1,0,"Bu:0   Tim:  :  ");	  //step,total
	write_string(2,0,"Di:     C:      ");	//calorie

	write_bushu(1,3,bushu);		//?????
	write_time(1,11,min);		//?????
	write_time(1,14,sec);		//?????
	write_sfm5(2,3,dis);		//?????
	show_cal();//燃烧我的卡路里 
}
				
/**************************************

**************************************/
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();	  //intrins.h	  ??????
}

/**************************************

**************************************/
void Delay5ms()
{
    WORD n = 560;

    while (n--);
}

/**************************************
iic????	  scl???,sda????
**************************************/
void ADXL345_Start()
{
    SDA = 1;                    //?????
    SCL = 1;                    //?????
    Delay5us();                 //??
    SDA = 0;                    //?????
    Delay5us();                 //??
    SCL = 0;                    //?????
}

/**************************************
iic????	 scl???,sda????
**************************************/
void ADXL345_Stop()
{
    SDA = 0;                    //?????
    SCL = 1;                    //?????
    Delay5us();                 //??
    SDA = 1;                    //?????
    Delay5us();                 //??
}

/**************************************
????/?????
????:ack (0:ACK ?? 1:NAK ???)	 scl???,sda??????,???????
**************************************/
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;					//psw????,???????	,?????	 ???????????,?????????
}							   //????????,???????IIC??,????????????,????CY???

/**************************************
?IIC??????????
**************************************/
void ADXL345_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8????
    {
        dat <<= 1;              //????????	  ??CY
        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);   //??????(7??0?:????)	???????,???????
    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	 ,?6????????????
//
//*********************************************************
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);                //??????,????????
       }
   }
    ADXL345_Stop();                          //????
    Delay5ms();
}


//*****************************************************************

//???ADXL345,???????pdf????************************
void Init_ADXL345()
{
   Single_Write_ADXL345(0x31,0x0B);   //????,??16g,13???
   Single_Write_ADXL345(0x2C,0x08);   //????     ??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?
}

//***********************************************************************
//??Y?
void display_y()			   //????,????
{     
	static uchar flag_en,flag_fu;
	float temp;
    dis_data=(BUF[3]<<8)+BUF[2];  //????   x 0 1, z 4 5
	if(dis_data<0)				  //??????????
	{
		dis_data=-dis_data;
		flag_fu = 1;
	}
	else 
	{
		flag_en = 1;
		flag_fu = 0;
	}
 	temp=(float)dis_data*3.9; 	 //3.9?13???????
 	if(temp >300)   //???1	 ???
	{
		if((flag_en == 1) && (flag_fu == 1))		//???data<0,?????
		{
			flag_en = 0;
			bushu ++;	
		}
	}
	if(temp < 300)  
	{
		flag_en = 1;	
	}
}

//   ??????
uchar key_can,menu_1;
void keyscan()	     //??????	   ????????
{
	static uchar key_new;
	key_can = 20;               //?????
	P3 |= 0xf0;
	if((P3 & 0xf0) != 0xf0)		//????
	{
		delay_1ms(1);	     	//?????
		if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
		{						//???????
			key_new = 0;
			switch(P3 & 0xf0)
			{ 
				case 0xd0: key_can = 1; break;	   //??k1??		 ??1???????
				case 0xb0: key_can = 2; break;	   //??K2??		 ??2??????
				case 0x70: key_can = 3; break;	   //??k3??		 ??3??????
			}
		}			
	}
	else 						  //????????????????switch
	{
		if(key_new == 0)
		{
			key_new = 1;
		}
	}		
}
void handle_key()		   //????????????
{
	if(key_can == 1)	   //?????
	{
		menu_1 ++;
		if(menu_1 >4)
		{
			menu_1 = 0;
			Init_1602();
		}
		if(menu_1==1)
		{
			write_com(0x00);//??
			write_string(1,0,"Time:  :    Min ");	 //????	 min:sec
			write_string(2,0,"Dis :         M ");	 //????	 <60000M
			write_time(1,5,Time_min_set);
			write_time(1,8,Time_sec_set);
			write_sfm5(2,5,distance_set);
		}		
		if(menu_1==4)				  //?? ????  
		{
		    write_com(0x00);//??
			write_string(1,0,"Set    pace    :");
			write_string(2,0,"     50       CM");	   //????50
			write_sfm3(2,5,pace_set);
		}
	}
	if(menu_1==0)					 //????,??????????,??
	{
		if(key_can == 2)
		{
			bushu=0;
		}
		if(key_can == 3)
		{
			 min=0;
			 sec=0;
		}	
	}
	if(menu_1==1)			  //????  min
	{
		if(key_can == 2)
		{
			Time_min_set++;
			if(Time_min_set>=99)
				Time_min_set=99;
		}
		if(key_can == 3)
		{
			Time_min_set--;
			if(Time_min_set<=0)
				Time_min_set=0;
		}		
		write_time(1,5,Time_min_set);
		write_com(0x0f);//???
		write_com(0x80+4);         
	}
	if(menu_1==2)			  //????  sec
	{
    	if(key_can == 2)
		{
			Time_sec_set++;
			if(Time_sec_set>=60)
				Time_sec_set=60;
		}
		if(key_can == 3)
		{
			Time_sec_set--;
			if(Time_sec_set<=0)
				Time_sec_set=0;	
		}		
		write_time(1,8,Time_sec_set);
		write_com(0x0f);//???
		write_com(0x80+7);           
	}
	if(menu_1==3)			  //????	   100-60000M
	{
		if(key_can == 2)
		{
			distance_set++;
			if(distance_set>=60000)
				distance_set=60000;
		}
		if(key_can == 3)
		{
			distance_set--;
			if(distance_set<=1)
				distance_set=1;
		}		
		write_sfm5(2,5,distance_set);
		write_com(0x0f);//???
		write_com(0xc0+4);            
	}
	if(menu_1==4)			  //???? 10CM-200CM
	{
		if(key_can == 2)
		{
			pace_set++;
			if(pace_set>=200)
				pace_set=200;
		}
		if(key_can == 3)
		{
			pace_set--;
			if(pace_set<=10)
				pace_set=10;
		}		
		write_sfm3(2,5,pace_set);
		write_com(0x0f);//???
		write_com(0xc0+4);            
	}	
}
void speaker()
{
	if(((min>=Time_min_set)&&(sec>Time_sec_set))||(min>Time_min_set)||(dis>distance_set))
	{
		Bell=0;
	}
	else 
	{
		Bell=1;
	}
}
//???0/???????
void Uart_Init()//串口初始化					  			   
{
	TMOD = 0x01;  //T0?????1(16?)??
	TH0=(65536-50000)/256; //高8位,
	TL0=(65536-50000)%256;//低8位 
	ET0=1;//?????0??
	TR0=1; //??T0
	EA = 1;     //????????
}
//*********************************************************
//******???********
//*********************************************************
void main()
{ 
	static uint flag_value;
	uchar devid; 
	Uart_Init();// 
	Init_1602();	//lcd1602显示
	Init_ADXL345();                 	//???ADXL345
	delay_1ms(20);	
	while(1)                         	//???
	{ 		
		keyscan();	  //扫描键值 
		if(key_can<10)						  //??????,??HANDLE_KEY();
			 handle_key();
		if(menu_1==0)
		{
			flag_value ++;
			if(flag_value >= 3)	   //100ms	  ???????????
			{
				flag_value = 0;
				Init_ADXL345();                 	//???ADXL345
				devid=Single_Read_ADXL345(0X00);	//??????0XE5,????	,??
				if(devid!=0XE5)
				{			
					write_string(2,11,"error");			
				}
				else
				{			
					Multiple_Read_ADXL345();       	//??????,???BUF?
	
					display_y();                   	//---------??Y?
				}     
			} 
			dis=(bushu*pace_set)/100.0+0.5;  //??*??(CM)(???M??????100.0,????? )	   (+0.5?????)
			cal=(dis/100.0)*70+0.5;			 //?????70?  
			write_bushu(1,3,bushu);		//????
			write_time(1,11,min);		//????
			write_time(1,14,sec);		//????
			write_sfm5(2,3,dis);		//????
			show_cal();
			speaker();
		}  
	}
} 
void timer0() interrupt 1			 //????	   50ms????	?20?	  T0?????1
{
	TH0 =(65536-50000)/256;
	TL0 = (65536-50000)%256;     //50ms
	count_jishi++;
 	if(count_jishi>=20)
	{
		count_jishi=0;
		sec++;			   //20????????
		if(sec>=60)
		{
			sec=0;
			min++;		 //60?????
			if(min>=99)
				TR0=0;
		}
	}
}

  

转载于:https://www.cnblogs.com/lyxyhhxbk/p/11019982.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值