/********************************************************
函數名稱: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
|