/*实现功能:利用maichong()函数来模拟人的脚步,通过定时器中断
来对人的step进行计数,通过LCD1602进行step的显示。
    滑动变阻器负责调节LCD1602的背光
    Key0按键负责开机,当按下开机按键后会出现开机"welcome"界面,然后再显示运动界面。
    Key1按键负责Step复位到0;
        LED负责对步数超限进行指示    
注:1、由于计算机仿真对按键的电平检测不稳定,在按按键时不应点击过快。
    2、最高显示步数为99999(完全满足一个正常人的运动量)
*/

 

计步器android 计步器计步_初始化

                                                                                               图一、原理图

 

/*File  main.c*/
/*实现功能:利用maichong()函数来模拟人的脚步,通过定时器中断
来对人的step进行计数,通过LCD1602进行step的显示。
    滑动变阻器负责调节LCD1602的背光
    Key0按键负责开机,当按下开机按键后会出现开机"welcome"界面,然后再显示运动界面。
    Key1按键负责Step复位到0;
		LED负责对步数超限进行指示	
注:1、由于计算机仿真对按键的电平检测不稳定,在按按键时不应点击过快。
    2、最高显示步数为99999(完全满足一个正常人的运动量)
*/

#include <reg51.h>
#include "lcd1602.h"

void Timer0Init(void);  //中断初始化函数
uint num=0;    //step计数的变量;

sbit  STEP=P3^4;  //脉冲中断输入键
sbit  Key0=P0^0;  //开始键
sbit  Key1=P0^1;  //步数复位键

uchar xiaomi[16]="Welcome Iwatch";
uchar need[16]="Life Need Sports";
uchar d[16] = "  I Love Sports";
uchar total[6] = "Total:";
uchar T[10]="0123456789";
uchar step[5] = " Step";

sbit baojing=P3^0;//中断脉冲输入端

void delay(uint i)
{
	while(i--);
}

void maichong()
{
	STEP=0;
	delay(200);
	STEP=1;
	delay(200);
}

void wrc(uint c)
{
	LcdWriteCom(c);
}
void wrd(uint d)
{
	LcdWriteData(d);
}
void lcd_init()
{
	LcdInit();
}

void kaiji_dispaly()
{
	uint l,m;
	wrc(0x80+0x00);
	for(l=0;l<16;l++)
	{
		wrd(xiaomi[l]);
		delay(12000);
	}
	wrc(0x80+0x40);
	for(m=0;m<16;m++)
	{
		wrd(need[m]);
		delay(12000);
	}
	
}


void display()
{
	uint i,j,k;
	wrc(0x80+0x00);
	for(i=0;i<16;i++)
	{
		wrd(d[i]);
	}
	wrc(0x80+0x40);
	for(j=0;j<6;j++)
	{
		wrd(total[j]);
	}
//	wrd('T');
//	wrd('o');
//	wrd('t');
//	wrd('a');
//	wrd('l');
//	wrd(':');
	wrd(T[num/10000]);
  wrd(T[num/1000%10]);
	wrd(T[num/100%10]);
	wrd(T[num/10%10]);
	wrd(T[num%10]);
	  //wrd(0xdf);  //摄氏度中的半角0
	for(k=0;k<6;k++)
	{
		wrd(step[k]);
	}
//	wrd(' ');
//	wrd('S');
//	wrd('t');
//	wrd('e');
//	wrd('p');
}

void Timer0Init(void)        
{
    TMOD=0x06;         //设置定时器模式(方式2,计数模式)
    TL0 = 0xff;        //设置定时初值
    TH0 = 0xff;        //设置定时初值
    TF0 = 0;           //清除TF0标志
    TR0 = 1;           //计数器0开始计时
    EA=1;
    ET0=1;
}


void Time0() interrupt 1  //计数器T0中断
{
  num++;
    if(num==9999)
    {
       num=0;
        baojing=0;        //驱动led发光报警
    }
    
}

void main(void)
{
	  lcd_init();        //LCD1602初始化
    Timer0Init();      //为了提高代码的可读性,此处运用定时器中断函数
	  P2=0x00;
	  while(1)
	{
		if(Key0==0)        //判断按键开始
		{  
		 kaiji_dispaly();
     while(1)
     {  
			  maichong();      //脉冲模拟脚步
        display();       //Lcd1602显示
        if(Key1==0)      //判断按键复位
		   { 
			  num=0;
			 }
		 }
    }
	 }	
}
/*File lcd1602.h*/

#ifndef __LCD1602_H_
#define __LCD1602_H_

#include <reg51.h>
#include <intrins.h>

#ifndef  uchar
#define  uchar unsigned char
#endif

#ifndef  uint
#define  uint unsigned int
#endif


#define LCD1602_DATAPINS  P2
sbit  LCD1602_RS = P1^2;
sbit  LCD1602_RW = P1^3;
sbit  LCD1602_E  = P1^4;

void Lcd1602_Delay1ms(uint c) ;  //误差 0us
void LcdWriteCom(uchar com)	 ; //写入命令
void LcdWriteData(uchar dat)	;	//写入数据
void LcdInit();			//初始化

#endif
/*File  lcd1602.c*/

#include <reg51.h>
#include "lcd1602.h"


/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能		   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
   uint a,b;
	for(; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/

void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //选择发送命令
	LCD1602_RW = 0;	   //选择写入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待数据稳定

	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(5);	  //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/		   
  
void LcdWriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;	//使能清零
	LCD1602_RS = 1;	//选择输入数据
	LCD1602_RW = 0;	//选择写入

	LCD1602_DATAPINS = dat; //写入数据
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   //写入时序
	Lcd1602_Delay1ms(5);   //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能		 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/		   

void LcdInit()			//LCD初始化子程序
{
 	LcdWriteCom(0x38);  //开显示
	LcdWriteCom(0x0c);  //开显示不显示光标
	LcdWriteCom(0x06);  //写一个指针加1
	LcdWriteCom(0x01);  //清屏
	LcdWriteCom(0x80);  //设置数据指针起点
}