出租车计价器程序Word文件下载.docx
《出租车计价器程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《出租车计价器程序Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
![出租车计价器程序Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/28/f9c9a8b7-b7fc-433e-b057-d882d442b7ff/f9c9a8b7-b7fc-433e-b057-d882d442b7ff1.gif)
sbitSCL=P1^3;
unsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedchartable1[8]={0x3F,0x3F,0xbf,0x3F,0x3F,0xbf,0x3F,0x3F};
//00-00-00
unsignedcharcc[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
inttop=0;
unsignedcharsecond;
unsignedchartcount;
unsignedcharminute;
unsignedcharhour;
unsignedintgl=0;
//公里数(百米)
unsignedchardj=16;
//单价(角)
unsignedintze=0;
//总额(角)
voidsendbyte(ucharbyte)
{
ucharnum,c;
num=tab[byte];
for(c=0;
c<
8;
c++)
{
CLK=0;
DAT=num&
0x80;
//(0x80即十进制的128,二进制的10000000按位发送)
CLK=1;
num<
<
=1;
}
voiddelay_50ms(unsignedintt)//50Ms延时程序
unsignedintj;
for(;
t>
0;
t--)
for(j=6245;
j>
j--)
{;
voiddisplay()
//显示//
unsignedcharh;
while
(1){
for(h=0;
h<
10;
h++){
delay_50ms
(1);
sendbyte(h);
delay_50ms(10);
h=0;
}
/*********************************************************************/
/*ds1302实时时钟C程序*/
sbitT_CLK=P1^2;
/*实时时钟时钟线引脚*/
sbitT_IO=P1^1;
/*实时时钟数据线引脚*/
sbitT_RST=P1^0;
/*实时时钟复位线引脚*/
//sbitOE="
P3"
^6;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
uchartime[8]="
:
"
;
ucharmin,hou,day,mon,yea;
voidInit1302(void);
voidv_W1302(ucharucAddr,ucharucDa);
ucharuc_R1302(ucharucAddr);
voidv_BurstW1302T(uchar*pSecDa);
voidv_BurstR1302T(uchar*pSecDa);
voidv_BurstW1302R(uchar*pReDa);
voidv_BurstR1302R(uchar*pReDa);
voidv_Set1302(uchar*pSecDa);
voidv_Get1302(ucharucCurtime[]);
voiddonetime(void);
voidbcd_int(uchari);
voidbcdtoInt(void);
voidSetTime(void);
/********************************************************************
*
*名称:
v_RTInputByte
*说明:
*功能:
往DS1302写入1Byte数据
*调用:
*输入:
ucDa写入的数据
*返回值:
无
***********************************************************************/
voidv_WTInputByte(ucharucDa)
{
uchari;
//OE=0;
ACC=ucDa;
for(i=8;
i>
i--)
T_IO=ACC0;
//*相当于汇编中的RRC
T_CLK=1;
T_CLK=0;
ACC=ACC>
>
1;
//OE="
1"
ucharuc_RTOutputByte
从DS1302读取1Byte数据
ACC
ucharuc_RTOutputByte(void)
ACC=ACC>
1;
//*相当于汇编中的RRC
ACC7=T_IO;
}
//OE=1;
return(ACC);
v_W1302
先写地址,后写命令/数据
往DS1302写入数据
v_RTInputByte()
ucAddr:
DS1302地址,ucDa:
要写的数据
voidv_W1302(ucharucAddr,ucharucDa)
T_RST=0;
T_RST=1;
v_WTInputByte(ucAddr);
/*地址,命令*/
v_WTInputByte(ucDa);
/*写1Byte数据*/
T_RST=0;
uc_R1302
先写地址,后读命令/数据
读取DS1302某地址的数据
v_RTInputByte(),uc_RTOutputByte()
DS1302地址
ucDa:
读取的数据
ucharuc_R1302(ucharucAddr)
ucharucDa;
ucDa=uc_RTOutputByte();
/*读1Byte数据*/
return(ucDa);
v_BurstW1302T
先写地址,后写数据(时钟多字节方式)
往DS1302写入时钟数据(多字节方式)
pSecDa:
时钟数据地址格式为:
秒分时日月星期年控制
*8Byte(BCD码)1B1B1B1B1B1B1B1B
/*voidv_BurstW1302T(uchar*pSecDa)
v_W1302(0x8e,0x00);
//*控制命令,WP=0,写操作?
v_WTInputByte(0xbe);
//*0xbe:
时钟多字节写命令
for(i=8;
i>
i--)//*8Byte=7Byte时钟数据+1Byte控制
v_WTInputByte(*pSecDa);
//*写1Byte数据
pSecDa++;
}*/
v_BurstR1302T
先写地址,后读命令/数据(时钟多字节方式)
读取DS1302时钟数据
v_RTInputByte(),uc_RTOutputByte()
秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
/*voidv_BurstR1302T(uchar*pSecDa)
v_WTInputByte(0xbf);
//*0xbf:
时钟多字节读命令
i--)
*pSecDa=uc_RTOutputByte();
//*读1Byte数据
v_BurstW1302R
先写地址,后写数据(寄存器多字节方式)
往DS1302寄存器数写入数据(多字节方式)
pReDa:
寄存器数据地址
/*voidv_BurstW1302R(uchar*pReDa)
v_WTInputByte(0xfe);
for(i=31;
i--)//*31Byte寄存器数据
v_WTInputByte(*pReDa);
//*写1Byte数据
pReDa++;
uc_BurstR1302R
先写地址,后读命令/数据(寄存器多字节方式)
读取DS1302寄存器数据
/*voidv_BurstR1302R(uchar*pReDa)
v_WTInputByte(0xff);
i--)//*31Byte寄存器数据
*pReDa=uc_RTOutputByte();
v_Set1302
设置初始时间
v_W1302()
初始时间地址。
初始时间格式为:
/*voidv_Set1302(uchar*pSecDa)
ucharucAddr=0x80;
//控制命令,WP=0,写操作?
for(i=7;
i--)
v_W1302(ucAddr,*pSecDa);
//秒分时日月星期年
ucAddr+=2;
v_W1302(0x8e,0x80);
//控制命令,WP=1,写保护?
}*/
v_Get1302
读取DS1302当前时间
uc_R1302()
ucCurtime:
保存当前时间地址。
当前时间格式为:
/*voidv_Get1302(ucharucCurtime[])
ucharucAddr=0x81;
for(i=0;
i<
7;
i++)
ucCurtime=uc_R1302(ucAddr);
//*格式为:
ucAddr+=2;
/***********************************************************************
Init1302
初始化DS1302
*****************************************************************************/
voidInit1302(void)
//控制写入WP=0
v_W1302(0x90,0xa5);
v_W1302(0x80,0x00);
//秒
v_W1302(0x82,0x59);
//分
v_W1302(0x84,0x10);
//时
/**************************************************************************
donetime
时间处理
voiddonetime(void)
uchard;
d=uc_R1302(0x81);
time[6]=d/16+48;
time[7]=d%16+48;
d=uc_R1302(0x83);
time[3]=d/16+48;
time[4]=d%16+48;
d=uc_R1302(0x85);
time[0]=d/16+48;
time[1]=d%16+48;
//bcd_int(d);
//
/*voidbcd_int(uchari)
ucharj;
time[0]=(i&
0x0f)+48;
j=i>
4;
time[1]=(j&
/*voidbcdtoInt(void)
for(i=0;
bcd_int(ucCurtm);
voidSetTime(void)
v_W1302(0x80,0x80);
v_W1302(0x82,min);
v_W1302(0x84,hou);
uint
AT24C02_com()
ucharbuffer1[3]={60,70,1};
//要写入的数据
ucharbuffer2[3];
//读出的数据存放地址
AT24C02_write(0x010,buffer1,3);
//将buffer1中的元素写入0x010开始的地址
AT24C02_read(0x010,buffer2,3);
//从0x010开始的地址读出3个字节
voidI2C_start(void)
//产生启动信号
SDA=1;
SCL=1;
//SCL为高电平时SDA由高变低
SDA=0;
SCL=0;
voidI2C_stop(void)
//产生停止信号
//SCL为高电平时SDA由低变高
voidI2C_send_ack(void)
//发送ACK(确认)信号
}
bitTestAck()
//测试AT24C02的ACK信号
bitErrorBit;
ErrorBit=SDA;
//读取SDA线上电平,等待确认
return(ErrorBit);
//若SDA=1,说明尚未处理完
voidI2C_write_byte(ucharinput)//向AT24C02写入一个字节
uchartemp;
for(temp=8;
temp!
=0;
temp--)
//发送8位数据
SDA=(bit)(input&
0x80);
//SDA为将要发送的位
//发送一位数据
input=input<
//左移一位
ucharI2C_read_byte(void)
//从AT24C02读出一个字节
uchartemp,rbyte=0;
//rbyte存放读出的数据
//读取8位数据
rbyte=rbyte<
rbyte=rbyte|((uchar)(SDA));
//SDA为将要发送的位
//读取一位数据
return(rbyte);
voidAT24C02_write(ucharadr,uchar*buf,ucharN)