兼职项目 智能自行车
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

208 lines
3.5 KiB

#include "IRIN.h"
#include "i2c.h"
uint journey;
uint journey1;
extern uchar pwm_left;
unsigned int b;
unsigned int c;
extern uint time1;
extern uchar pwm_val_left;
unsigned int b2;
unsigned int c2;
uint money=7;
uint sudu=0;
uint count=0; //栅格是一圈20个
uchar ms=0;
uint speed=0;
uint r_s=0;
bit state=0;
bit s0=0;
bit flas=0;
uchar sec=0;
uchar sec1=0;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay11(int i)
{
while(i--);
}
void IRIN_Init(void)
{
TMOD=0x01;//定时器1工作方式1
TH0=0x3C;
TL0=0xb0;
ET0=1;
TH1=0XFc;
TL1=0X18;
ET1=1;
TR1=1;
TR0=1;
EA=1;
EX1=1;
IT1=1;
}
void display()
{
if(state==0)
{
sudu=At24c02Read(10);
if(money>7)
{
money=At24c02Read(5);
}
LcdSetCursor(0,0);
LcdShowStr(0,0,"Speed:");
Lcd1602_Write_Data(0x30+sudu/100%10);
Lcd1602_Write_Data(0x30+sudu/10%10);
Lcd1602_Write_Data(0x30+sudu%10);
LcdShowStr(10,0,"KM/h");
LcdShowStr(0,1,"L:");
Lcd1602_Write_Data(journey/10000%10+0x30);
Lcd1602_Write_Data(journey/1000%10+0x30);
Lcd1602_Write_Data(journey/100%10+0x30);
Lcd1602_Write_Data(journey/10%10+0x30);
Lcd1602_Write_Data(journey%10+0x30);
LcdShowStr(7,1,"M");
if(journey>1000)
{
money=(journey-1000)*0.002+7;
At24c02Write(5,money);
}
money=money*10;
LcdShowStr(9,1,"Q:");
Lcd1602_Write_Data(money/1000%10+0x30);
Lcd1602_Write_Data(money/100%10+0x30);
Lcd1602_Write_Data(money/10%10+0x30);
LcdShowStr(14,1,".");
Lcd1602_Write_Data(money%10+0x30);
money=money/10;
}
}
void keypros()
{
if(k2==0)
{
delay11(1000); //消抖处理
if(k2==0)
{
sudu=At24c02Read(10); //读取EEPROM地址1内的数据
b2=At24c02Read(1);
c2=At24c02Read(8);
journey=(b2<<8) | c2;
money=At24c02Read(5);
}
while(!k2);
}
if(k1==0)
{
delay11(1000); //消抖处理
if(k1==0)
{
flas=1;
}
while(!k1);
}
if(k4==0)
{
delay11(1000); //消抖处理
if(k4==0)
{
if(pwm_left>=20)
{
pwm_left=1;
}
else
{
pwm_left++;
}
}
while(!k4);
}
}
void time0() interrupt 1 //定时器 0
{
TH0=0x3C;
TL0=0xb0; //50ms定时
ms++; //变量50ms加一
if(ms%5==0) s0=~s0;
if(ms%10==0) //500ms定时
{
if(sec!=0) sec--;
if(sec1!=0) sec1--;
ms=0; //清零变量
EX1=0; //关闭外部中断,保证变量在计算的时候不会增加
r_s=count; //因为是500ms检测一次转动数据,所以要想一秒转动的圈数是 speed=count*2 ,但是光栅是一圈20格,所以还要除以20;
//综合一下,一秒转动的圈数就是 speed=count*2/20 ==》 speed=counr/10;
count=0; //清零变量
EX1=1; //打开外部中断
speed=speed*0.5+(r_s*6)*0.5; // 这里r_s是一秒走的圈数,然后乘以60得到60秒走的圈数,单位变成了 r/min; 总方式 speed=count/10*60; ==>> speed=count*6;
if(flas==0)
{
sudu=(0.15*speed);
At24c02Write(10,sudu);
journey=journey+(r_s*2.5/20);
journey1=journey;
c = journey & 0x00FF;
At24c02Write(8,c);
delay11(1000);
b=journey1>>8;
At24c02Write(1,b);
}
else
{
journey=0;
money=7;
At24c02Write(1,journey);
At24c02Write(8,journey);
At24c02Write(5,money);
flas=0;
}
}
}
void int1() interrupt 2 //外部中断 1
{
count++; //中断每触发一次,变量加一
}