51出租车计价器-LCD112864-DS1302-霍尔-ADXL345-bell
本设计由STC89C52单片机电路+液晶12864显示电路+时钟DS1302显示电路+霍尔测速电路+ADXL3445加速度传感器模块+电机控制电路+蜂鸣器报警电路+电源电路组成。
1、通过液晶12864实时显示时间、路程。
2、12864也就实时显示起步价8元,5元/公里,实际车费。
3、可以通过电位器调节车速(模拟油门),从而控制车速进而控制里程,实时计费。
4、液晶显示速度值,如果速度值超过一定值,蜂鸣器报警,否则蜂鸣器不报警。(具体速度值可自行调节)
5、通过ADXL345检测倾角,如果水平倾角达到一定角度,蜂鸣器将会一直报警,除非按下复位按键或断开电源后,蜂鸣器停止鸣叫。
串口更新时间命令:2017061218235501 (位数必须正好)
表示:2017年06月12日18时23分55秒 周01。
unsigned char ReadAdxl345; //定时读取adxl345数据
bit touFlag = 0;//拖车标志
void main(void)
{
EX0=1; //外部中断0开
IT0=1; //边沿触发
EA=1; //全局中断开
Init_Timer0(); //定时器0初始化
UART_Init();
DelayMs(200); //延时有助于稳定
Init_ST7920(); //初始化
ClrScreen();
Init_ADXL345(); //初始化
if(Single_Read_ADXL345(0X00)==0xe5) //读出的数据为0XE5,表示正确
{
DelayMs(5);
// SendStr("ready ok!",9);//显示第二行
}
else
{
DelayMs(3);
}
Ds1302_Init();
relay =1; //初始化控制
buzzer =1;
Ds1302_Read_Time();//读取时间参数
// sprintf(dis0,"20%02d-%02d-%02d ",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周
// LCD_PutString(0,1,dis0,16);//显示第时间
//
// sprintf(dis0,"%02d:%02d:%02d ",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//时分秒
// LCD_PutString(0,2,dis0,16);//显示第时间
LCD_PutString(0,3,"起:8元 5元/km ",16); //固定显示价格
LCD_PutString(0,4,"实际价格",8);
uartSendStr("ready ok !",10);
// Ds1302_Write_Time();
while(1)
{
if(ReadAdxl345==1) //定时读取adxl345数据
{
ReadAdxl345=0;
ReadData_x(); //三轴检测函数
count++;
}
if(SetFlag==1) //如果接收到串口信息则更新时钟
{
for(i=0;i<8;i++)
{
time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数 1和5整合成15
}
Ds1302_Write_Time();//接收更新的时间然后写入ds1302
SetFlag=0; //时钟信息更新后标志位清零
}
if(ReadTimeFlag==1) //定时读取ds1302 定时时间到 则标志位置1,处理过时间参数标志位清零
{
ReadTimeFlag=0; //标志位清零
Ds1302_Read_Time();//读取时间参数
sprintf(dis0,"20%02d-%02d-%02d %4.1f",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],Sudu);//年月日周
LCD_PutString(0,1,dis0,16);//显示第时间
if(touFlag == 0) //非拖车状态下
{
if(Sudu > 3.0) //速度过高
{
buzzer = !buzzer; //蜂鸣器报警
}
else
{
buzzer =1;
}
}
}
}
}
void ISR_Key(void) interrupt 0 using 1
{
PluNum++; //速度脉冲量计数
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
if(time_20ms%5==0)
{
ReadAdxl345 = 1;
ReadTimeFlag=1;
}
}
void UART_Init(void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TL1 = TH1;
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void uartSendByte(unsigned char dat)
{
unsigned char time_out;
time_out=0x00;
SBUF = dat; //将数据放入SBUF中
while((!TI)&&(time_out<100)) //检测是否发送出去
{time_out++;DelayUs2x(10);} //未发送出去 进行短暂延时
TI = 0; //清除ti标志
}
void uartSendStr(unsigned char *s,unsigned char length)
{
unsigned char NUM;
NUM=0x00;
while(NUM<length) //发送长度对比
{
uartSendByte(*s); //放松单字节数据
s++; //指针++
NUM++; //下一个++
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
unsigned char uart_buf;
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
uart_buf=SBUF; //读入缓冲区的值
time_buf2[uart_i]=uart_buf&0x0F;
uart_i++;
if(uart_i>=16) //连续接收16个字符信息
{
uart_i=0;
SetFlag=1; //接收完成标志位置1
}
SBUF = uart_buf; //把接收到的值再发回电脑端
}
if(TI) //如果是发送标志位,清零
TI=0;
}
资料下载地址