#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;
}
}
}