/********************************************************
函数名称:void main()
函数作用:主函数
参数说明:
********************************************************/
void main()
{
LCD_init(); //LCD1602初始化
T0_init(); //定时器0初始化
Int0_init(); //外部中断初始化
if(key_jian==0) //手动复位初始默认价格
{
delayms(100);
if(key_jian==0)
{
AT24C02_write_date(128,white_price); //写入【公里价】数据保存,地址0~255均可
AT24C02_write_date(5,start_price/100); //写入【起步价】数据保存
}
}
white_price=AT24C02_read_date(128); //读取存储的【公里价】数据
start_price=AT24C02_read_date(5)*100;//读取存储的【起步价】数据
lcd1602_write_pic(0x01,pic2); //将自定义字符“¥”写入LCD1602
while(1) //死循环
{
scan(); //按键检测处理
Read_time(); //读取时间
if(strat_f==1) //非初始界面显示下
{
if(set_f==0) //未设置时
{
if(start==1) //当处于计价模式下
{
display(); //显示开始计价界面
if(moto_f==1&&TR0==0)//判断是否满足开启电机的条件
TR1=1; //打开定时器1开始控制开启电机
else
{
moto=1; //关闭电机
TR1=0; //关闭定时器1
}
}
else //否则,在结束计价模式
display2(); //显示结算总价钱
}
else
if(set_f<3) //在设置计价参数模式
display3(); //显示计价参数设置界面
else //否则,在校准时间
{
Read_time(); //读取时间
display4(); //显示校准时间界面
}
}
else
{
if(f==1) //长时间未操作或设置完成,自动恢复初始界面,同时保存设置
{
if(set_f!=0) //在设置退出时需要保存数据
{
set_f=0; //清除设置标志
AT24C02_write_date(128,white_price); //写入【公里价】数据保存
AT24C02_write_date(5,start_price/100);//写入【起步价】数据保存
Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//将设置的分钟写入DS1302
Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);//将设置的秒钟写入DS1302
}
LCD_write_command(0X01); //清除屏幕显示
delay_n40us(100); //延时等待清除完成
f=0; //重置变量
}
lcd1602_write_character(4,1,"THE TAXI"); //显示"THE TAXI"
LCD_disp_char(4,2,ASCII[time[2]/10]); //显示当前时间
LCD_disp_char(5,2,ASCII[time[2]%10]);
LCD_disp_char(6,2,':');
LCD_disp_char(7,2,ASCII[time[1]/10]);
LCD_disp_char(8,2,ASCII[time[1]%10]);
LCD_disp_char(9,2,':');
LCD_disp_char(10,2,ASCII[time[0]/10]);
LCD_disp_char(11,2,ASCII[time[0]%10]);
}
}
}
/*************************************************************
AT24C02头文件
实现功能:AT24C02的控制
补充说明:
***************************************************************/
#ifndef _AT24C02_H_
#define _AT24C02_H_
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*********************AT24C02引脚定义*********************/
sbit sda=P3^6; //数据输出线
sbit scl=P3^5; //时钟线
/*********************AT24C02函数定义*********************/
void AT24C02_delay(uint n); //延时40*n微秒
void AT24C02_start(); //开始信号
void AT24C02_stop(); //停止信号
void AT24C02_respons(); //应答信号
void AT24C02_write(uchar date); //写数据
uchar AT24C02_read(); //读数据
void AT24C02_write_date(uchar address,uchar date);//向address地址写输date数据
uchar AT24C02_read_date(uchar address); //向address读出数据并返回
/********************************************************
函数名称:void AT24C02_delay(uint n)
函数作用:AT24C02延时函数
参数说明:延时40*n微秒
********************************************************/
void AT24C02_delay(uint n)
{
uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<2;j++);
}
/*********************************************************
函数名称:void AT24C02_start()
函数作用:AT24C02开始信号
参数说明:
*********************************************************/
void AT24C02_start()
{
sda=1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
}
/*********************************************************
函数名称:void AT24C02_stop()
函数作用:AT24C02停止信号
参数说明:
*********************************************************/
void AT24C02_stop()
{
sda=0;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
}
/*********************************************************
函数名称:void AT24C02_respons()
函数作用:AT24C02应答信号
参数说明:
*********************************************************/
void AT24C02_respons()
{
uchar i;
scl=1;
_nop_();
_nop_();
while((sda=1)&&(i<250)) //8个停止命令
i++;
scl=0;
_nop_();
_nop_();
}
/*********************************************************
函数名称:void AT24C02_write(uchar date)
函数作用:AT24C02写一个字节数据
参数说明:
*********************************************************/
void AT24C02_write(uchar date)
{
uchar i;
scl=0;
for(i=0;i<8;i++)
{
sda = (bit)(date&0x80); //读取最高位
_nop_();
scl=1; //拉高时钟线,制造上升沿,将sda引脚数据送入EEPROM
_nop_();
_nop_();
scl=0; //制造下降沿读取数据
date<<=1; //左移一位
}
}
/*********************************************************
函数名称:uchar AT24C02_read()
函数作用:AT24C02读一个字节数据
参数说明:
*********************************************************/
uchar AT24C02_read()
{
uchar i,k;
for(i=0;i<8;i++)
{
scl=1; //锁定sda引脚使其数据稳定不变化
k=(k<<1)|sda; //读取sda引脚数据
scl=0; //刷新sda数据
}
return k;
}
/*********************************************************
函数名称:void AT24C02_write_date(uchar address,uchar date)
函数作用:AT24C02写数据
参数说明:将数据date写入到address地址里
器件地址:主器件在发送启动命令后开始传送,主器件发送相应的
从器件的地址,8位从器件地址的高4位固定为1010。接
下来的3位用来定义存储器的地址,由于器件A2,A1,A0引
脚都接地,所以均为0。最后一位为读写控制位。“1”表
示对从器件进行读操作,“0”表示对从器件进行写操作。
因此向器件写入数据时地址为0xa0,读数据时地址为0xa1
*********************************************************/
void AT24C02_write_date(uchar address,uchar date)
{
AT24C02_start(); //开始信号
AT24C02_write(0xa0); //写时候器件地址为0xa0
AT24C02_respons(); //应答信号
AT24C02_write(address); //写入将要存放数据的地址
AT24C02_respons(); //应答信号
AT24C02_write(date); //写入数据
AT24C02_respons(); //应答信号
AT24C02_stop(); //停止信号
AT24C02_delay(150);
}
/*********************************************************
函数名称:uchar AT24C02_read_date(uchar address)
函数作用:AT24C02读数据
参数说明:向address地址里读出一个数据,并返回
*********************************************************/
uchar AT24C02_read_date(uchar address)
{
uchar date;
AT24C02_start(); //开始信号
AT24C02_write(0xa0); //写时候器件地址为0xa0
AT24C02_respons(); //应答信号
AT24C02_write(address);//写入将要读取数据的地址
AT24C02_respons(); //应答信号
AT24C02_start(); //开始信号
AT24C02_write(0xa1); //读时候器件地址为0xa1
AT24C02_respons(); //应答信号
date=AT24C02_read(); //读取数据
AT24C02_stop();
AT24C02_delay(150);
return date; //返回数据
}
#endif
|