test
发布时间:2020-12-14 04:44:24 所属栏目:大数据 来源:网络整理
导读:#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=
#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,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,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); //??,1:0x31 write_data(0x30+date%10); //?? } /***********************lcd1602???????************************/ void write_string(uchar hang,uchar *p) //???? { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == ‘ ‘) break; //???????? ???? write_data(*p); p++; } } /***********************lcd1602???2?????************************/ void write_time(uchar hang,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,"Bu:0 Tim: : "); //step,total write_string(2,"Di: C: "); //calorie write_bushu(1,3,bushu); //????? write_time(1,11,min); //????? write_time(1,14,sec); //????? write_sfm5(2,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,"Time: : Min "); //???? min:sec write_string(2,"Dis : M "); //???? <60000M write_time(1,5,Time_min_set); write_time(1,8,Time_sec_set); write_sfm5(2,distance_set); } if(menu_1==4) //?? ???? { write_com(0x00);//?? write_string(1,"Set pace :"); write_string(2," 50 CM"); //????50 write_sfm3(2,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,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,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,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,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,"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,bushu); //???? write_time(1,min); //???? write_time(1,sec); //???? write_sfm5(2,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; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |