⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 host.c

📁 U盘实时记录温度
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 2004.06.05
****************************************
**  Copyright  (C)  W.ch  1999-2004   **
**  Web:  http://www.winchiphead.com  **
****************************************
**  USB Host File Interface for CH375 **
**  TC2.0@PC, KC7.0@MCS51             **
****************************************
*/
/* CH375 主机文件系统接口 */
/* 支持: FAT12/FAT16/FAT32 */

/* MCS-51单片机C语言的U盘文件读写示例程序, 适用于89C52或者更大程序空间的单片机,也适用于ATMEL/PHILIPS/SST等具有1KB内部RAM的单片机 */
/* 该程序将U盘中的/C51/CH375HFT.C文件中的前200个字符显示出来,
   如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名,
   如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名,
   最后将程序ROM中的一个字符串写入写入新建的文件"NEWFILE.TXT"中
*/
/* CH375的INT#引脚采用查询方式处理, 数据复制方式为"单DPTR复制",兼容性最好但是速度最慢,
   本例只使用512字节的外部RAM, 同时作为磁盘数据缓冲区和文件数据缓冲区, 演示没有外部RAM但是单片机的内置RAM大于768字节的应用 */

/* 本例以字节为单位读写U盘文件,读写速度较扇区模式慢,但是由于字节模式读写文件不需要文件数据缓冲区FILE_DATA_BUF,
   所以总共只需要600字节的RAM,适用于单片机硬件资源有限、数据量小并且读写速度要求不高的系统 */

/*#define 	NO_DEFAULT_CH375_INT		1*/	/* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
/*#define		CH375HF_NO_CODE		1*/
#include "CH375.H"
#include "math.h"
#include "string.h"
#include "18b20.h"

sbit SDA=P1^7;
sbit SCL=P1^6;

/** first part of RIFF Header, insert 444 zeroes after this */

//rtc
unsigned char xdata g8563_Store[7]; /*时间交换区,全局变量声明*/
unsigned char xdata Store[2];
unsigned char code c8563_Store[7]=
{ 
 0x55,
 0x21,
 0x00, /*写入时间初值:01:13:00*/
 0x10, /* 23日 */
 0x03, /* 星期5 */
 0x09, /* 12月 */
 0x08 /* 2005年 */
}; 
//rtc

void delay(unsigned int time)
{
 while(time--);
}


/********************************************
内部函数,I2C开始
********************************************/
void Start()
{ 
 //EA=0;
 SDA=1;
 SCL=1;
 delay(2);
 SDA=0;
 delay(2);
 SCL=0;
}

/********************************************
内部函数,I2C结束
********************************************/
void Stop()
{
 SDA=0;
 SCL=0;
 delay(2);
 SCL=1;
 delay(2);
 SDA=1;
 delay(2);
//EA=1;
}

/********************************************
内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
void WriteACK(unsigned char  ack)
{
 SDA=ack;
 delay(2);
 SCL=1;
 delay(2);
 SCL=0;
}

/********************************************
内部函数,等待ACK
********************************************/
void WaitACK()
{ 
 unsigned char errtime=20;
 SDA=1;
 delay(2); /*读ACK*/
 SCL=1;
 delay(2);
 while(SDA)
 { 
  errtime--;
  if(!errtime) Stop();
 }
 SCL=0;
 delay(2);
}

/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void writebyte(unsigned char wdata)
{
 unsigned char i;
 for(i=0;i<8;i++)
 {
  if(wdata&0x80) SDA=1;
  else SDA=0;
  wdata<<=1;
  SCL=1;
  delay(2);
  SCL=0;
 }
 WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯
}

/********************************************
内部函数.输入数据
出口:B
********************************************/
unsigned char Readbyte()
{
 unsigned char i,bytedata;
 SDA=1;
 for(i=0;i<8;i++)
 {
  SCL=1; 
  bytedata<<=1;
  bytedata|=SDA;
  SCL=0;
  delay(2);
 }
 return(bytedata);
}

/********************************************
输出数据->pcf8563
********************************************/
void writeData(unsigned char address,unsigned char mdata)
{
 Start();
 writebyte(0xa2); /*写命令*/
 writebyte(address); /*写地址*/
 writebyte(mdata); /*写数据*/
 Stop();
}

/********************************************
输入数据<-pcf8563
********************************************/
unsigned char ReadData(unsigned char address) /*单字节*/
{ 
 unsigned char  rdata;
 Start();
 writebyte(0xa2); /*写命令*/
 writebyte(address); /*写地址*/
 Start();
 writebyte(0xa3); /*读命令*/
 rdata=Readbyte();
 WriteACK(1);
 Stop();
 return(rdata);
}

void ReadData1(unsigned char address,unsigned char count,unsigned char * buff) /*多字节*/
{ 
 unsigned char i;
 Start();
 writebyte(0xa2); /*写命令*/
 writebyte(address); /*写地址*/
 Start();
 writebyte(0xa3); /*读命令*/
 for(i=0;i<count;i++)
 {
  buff[i]=Readbyte();
  if(i<count-1) WriteACK(0);
 }
 WriteACK(1);
 Stop();
}

/********************************************
内部函数,读入时间到内部缓冲区
********************************************/
void P8563_Read()
{ 
 unsigned char time[7];
 ReadData1(0x02,0x08,time);
 g8563_Store[0]=time[0]&0x7f; /*秒*/
 g8563_Store[1]=time[1]&0x7f; /*分*/
 g8563_Store[2]=time[2]&0x3f; /*小时*/
 g8563_Store[3]=time[3]&0x3f; /*日*/
 g8563_Store[4]=time[4]&0x07; /*星期*/
 g8563_Store[5]=time[5]&0x1f; /*月/世纪*/
 g8563_Store[6]=time[6];      /*年*/
}

/********************************************
读入时间到内部缓冲区----外部调用 
********************************************/
void P8563_gettime()
{
 P8563_Read();
 if(g8563_Store[0]==0)
 P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
}

/********************************************
写时间修改值
********************************************/
void P8563_settime()
{
 unsigned char i;
 for(i=2;i<=8;i++) { writeData(i,g8563_Store[i-2]); } //写含小时之后时间
 //writeData(6,g8563_Store[3]); //写星期
}

/********************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -