求组单片机送数据到Ch375B为什么我的没有送过去?

我用的是STC89C58RD+,主程序是在LCD显示温度并送采集到的数据到U盘,我编了个程序,编译可以通过,温度也可以显示就是没有送到U盘:求行家帮帮忙,谢谢!下面是主程序: #include #include #include "string.h" #include "myfun.h" //常用程序模块 #include "uart.h" //串口信息程序模块

#define uchar unsigned char #define uint unsigned int

sbit RS=P2^4; sbit RW=P2^5; sbit EN=P2^6; sbit DQ=P3^4; uchar code str1[]={0x28,0x30,0xC5,0x48,0x00,0x00,0x00,0xFF}; //ROM1 uchar code str2[]={0x28,0x30,0xC5,0xB8,0x00,0x00,0x00,0x8E}; //ROM2 uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; //温度符号℃ uchar data disdata[5]; uint tvalue; //采集温度值 unsigned char temp,len; uchar tflag; //温度正负标志

//--------------------------------------------------------------------- #define CH375_CMD_PORT_ADDR 0x8100 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x8000 /* CH375数据端口的I/O地址 */ #include "CH375HF6.H" unsigned char i,j,k,err,len,counter=0; unsigned char towrite[60]; //数据缓冲区中等待写入到U盘中的数据 void Show_File_Inf() { UART_Send_Str("查询当前文件/目录的信息\n"); UART_Put_Inf("当前文件/目录的开始簇为:",CH375vStartCluster); UART_Put_Inf("当前文件的偏移量为:",CH375vCurrentOffset); UART_Put_Inf("当前文件/目录的文件目录项所在扇区为:",CH375vFdtLba); UART_Put_Inf("当前文件/目录的文件目录项在所在扇区中的位置为:",CH375vFdtOffset);

CH375FileQuery();

UART_Put_Inf("当前文件/目录的长度为:",mCmdParam.Modify.mFileSize); UART_Send_Str("当前文件/目录的修改日期为:"); UART_Put_Num((unsigned int)(mCmdParam.Modify.mFileDate>>9)+1980); UART_Send_Str("年"); UART_Put_Num((mCmdParam.Modify.mFileDate&0x01ff)>>5); UART_Send_Str("月"); UART_Put_Num((mCmdParam.Modify.mFileDate&0x001f)); UART_Send_Str("日\n"); UART_Send_Str("当前文件/目录的修改时间为:"); UART_Put_Num(mCmdParam.Modify.mFileTime>>11); UART_Send_Str("时"); UART_Put_Num((mCmdParam.Modify.mFileTime&0x07ff)>>5); UART_Send_Str("分"); UART_Put_Num((mCmdParam.Modify.mFileTime&0x001f)*2); UART_Send_Str("秒\n");

UART_Send_Str("文件/目录属性:\n"); for(i=0;i<6;i++) { if(mCmdParam.Modify.mFileAttr&(1< { switch(mCmdParam.Modify.mFileAttr&(1< { case ATTR_READ_ONLY: UART_Send_Str("只读 "); break; case ATTR_HIDDEN: UART_Send_Str("隐藏 "); break; case ATTR_SYSTEM: UART_Send_Str("系统 "); break; case ATTR_VOLUME_ID: UART_Send_Str("卷标 "); break; case ATTR_DIRECTORY: UART_Send_Str("目录 "); break; case ATTR_ARCHIVE: UART_Send_Str("归档 "); break; } } } UART_Send_Str("\n"); } // -----------1602的读写及初始化---------------// void delay1ms(uint ms)//延时(?)ms程序 { uint i,j; for(i=0;i for(j=0;j<120;j++); } void wr_com(uchar com) //DS18B20写指令 { delay1ms(1); RS=0; RW=0; EN=0; P1=com; delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_dat(uchar dat) //DS18B20写数据 { delay1ms(1);; RS=1; RW=0; EN=0; P1=dat; delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_new() { uchar i; wr_com(0x40); for(i=0;i<8;i++) { wr_dat(table[i]); } } void lcd_init() //初始化设置 { delay1ms(15); wr_com(0x38); delay1ms(5); wr_com(0x08); delay1ms(5); wr_com(0x01); delay1ms(5); wr_com(0x06); delay1ms(5); wr_com(0x0c); delay1ms(5); wr_new(); wr_com(0x80); wr_dat('A'); wr_com(0x81); wr_dat(':'); wr_com(0x89); wr_dat(0x00); wr_com(0x8a); wr_dat('C'); wr_com(0xc9); wr_dat(0x00); wr_com(0xca); wr_dat('C'); wr_com(0xc0); wr_dat('B'); wr_com(0xc1); wr_dat(':'); } /******ds1820程序*********/ void delay_18B20(uint i)//延时(?)us { while(i--); } void ds1820rst()/*ds1820复位*/ { DQ = 1; //DQ复位 delay_18B20(4); //延时4us DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us小于960us DQ = 1; //电位拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/ { uchar i=0; uchar dat = 0; for (i=0;i<8;i++) { DQ = 0; //单总线拉低 dat>>=1; DQ = 1; //单总线拉高 if(DQ) dat|=0x80; delay_18B20(10);//延时20us } return(dat); //返回读出的温度值 } void ds1820wr(uchar dat)/*写数据*/ { uchar i=0; for (i=0; i<8; i++) { DQ = 0; DQ = dat&0x01; delay_18B20(10); DQ = 1; dat>>=1; } } b20_Matchrom(uchar a) //匹配ROM { char j; ds1820wr(0x55); //写入匹配ROM的命令 if(a==1) { for(j=0;j<8;j++) //一共有8个字节,分八次读写 ds1820wr(str1[j]); //发送18B20的序列号,先发送低字节的8位 } if(a==2) { for(j=0;j<8;j++) ds1820wr(str2[j]); //发送18B20的序列号,先发送低字节的8位 } return 1; } read_temp(uchar z)/*读取温度值并转换*/ { uchar a,b; float tt; ds1820rst(); //DS18B20复位 ds1820wr(0xcc); //跳过DS18B20的序列号 ds1820rst(); //DS18B20复位 if(z==1) { b20_Matchrom(1); //匹配ROM1 } if(z==2) { b20_Matchrom(2); //匹配ROM2 } ds1820wr(0x44); //启动温度转换 delay1ms(5); ds1820rst(); //DS18B20复位 ds1820wr(0xcc); //跳过DS18B20的读序列号 ds1820rst(); //DS18B20复位 if(z==1) { b20_Matchrom(1); //匹配ROM1 } if(z==2) { b20_Matchrom(2); //匹配ROM2 } ds1820wr(0xbe); //读取DS18B20采集的温度 a=ds1820rd(); //读取DS18B20采集的温度低8位 b=ds1820rd(); //读取DS18B20采集的温度高8位 tvalue=b; tvalue<<=8; //左移8位(十六位数据格式) tvalue=tvalue|a; //把温度的高8位,低8位和成一个数据 if(tvalue<0x0fff) //判断温度的正负,十二位精度 tflag=0; //温度标志位 else { tvalue=~tvalue+1; tflag=1; } tt=tvalue*0.0625; tvalue=tt*10; return(tvalue); } /**********温度显示函数*********/ void ds1820disp(uchar z) //温度值各个位的显示程序 { uchar flagdat; disdata[0]=tvalue/1000+0x30; //百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30; //个位数 disdata[3]=tvalue%10+0x30; //小数位 if(tflag==0) flagdat=0x20; //正温度不显示符号 else flagdat=0x2d; //负温度显示"-" if(disdata[0]==0x30) { disdata[0]=0x20; //如果百位为0则不显示 if(disdata[1]==0x30) { disdata[1]=0x20; //如果十位也为0也不显示 } } if(z==1) { wr_com(0x82); wr_dat(flagdat); //显示符号位 wr_com(0x83); wr_dat(disdata[0]); //显示百位 wr_com(0x84); wr_dat(disdata[1]); //显示十位 wr_com(0x85); wr_dat(disdata[2]); //显示个位 wr_com(0x86); wr_dat(0x2e); //显示小数点 wr_com(0x87); wr_dat(disdata[3]); //显示小数位 } if(z==2) { wr_com(0xc2); wr_dat(flagdat); //显示符号位 wr_com(0xc3); wr_dat(disdata[0]); //显示百位 wr_com(0xc4); wr_dat(disdata[1]); //显示十位 wr_com(0xc5); wr_dat(disdata[2]); //显示个位 wr_com(0xc6); wr_dat(0x2e); //显示小数点 wr_com(0xc7); wr_dat(disdata[3]); //显示小数位 } } /********主程序*********/ void main() { lcd_init(); //1602初始化显示 UART_Init(); //串口初始化 UART_Send_Str("串口通信测试...\n"); //能看到则是好的 if(!CH375LibInit()) { UART_Send_Str("初始化CH375程序库及CH375芯片成功!\n"); UART_Send_Str("插入U盘\n"); UART_Send_Str("开始检测U盘是否插入...\n"); while(CH375DiskConnect()!=ERR_SUCCESS) { delay(3000); } UART_Send_Str("U盘已经插入\n"); UART_Send_Str("开始检测U盘是否就绪...\n"); while(CH375DiskReady()!=ERR_SUCCESS) { delay(1000); } UART_Send_Str("U盘已经就绪,可以操作\n"); UART_Send_Str("获取磁盘物理总容量...\n"); CH375DiskSize(); UART_Put_Inf("硬盘物理总容量为(扇区):",mCmdParam.DiskSize.mDiskSizeSec); UART_Send_Str("获取磁盘信息...\n"); CH375DiskQuery(); UART_Put_Inf("磁盘总容量(兆):",mCmdParam.Query.mTotalSector/2048); UART_Put_Inf("剩余容量(兆):",mCmdParam.Query.mFreeSector/2048); UART_Send_Str("磁盘上的文件系统为:"); switch(mCmdParam.Query.mDiskFat) { case 0: UART_Send_Str("未知文件系统\n"); break; case 1: UART_Send_Str("FAT12\n"); break; case 2: UART_Send_Str("FAT16\n"); break; case 3: UART_Send_Str("FAT32\n"); break; } UART_Send_Str("创建新文件\n"); strcpy(mCmdParam.Create.mPathName,"\\104.TXT"); err=CH375FileCreate(); if(err==ERR_SUCCESS) { UART_Send_Str("文件创建成功\n"); Show_File_Inf(); } else { UART_Send_Str("文件创建失败\n"); } } else { UART_Send_Str("初始化CH375程序库及CH375芯片失败!\n"); } UART_Send_Str("以字节模式写入:\n"); while(1) //死循环 { read_temp(1); //读取温度 ds1820disp(1); //显示温度 i=u32tostr(tvalue,towrite); //将温度值 转为字符串,好写入U盘 temp=towrite[i-1]; towrite[i-1]='.'; towrite[i]=temp; towrite[i+1]=0x0d; towrite[i+2]=0x0a; towrite[i+3]=0; UART_Send_Str(towrite); len=strlen(towrite); mCmdParam.ByteWrite.mByteCount=len%MAX_BYTE_IO; for(k=0;k { mCmdParam.ByteWrite.mByteBuffer[k]=towrite[k]; } CH375ByteWrite(); mCmdParam.ByteWrite.mByteCount=0; CH375ByteWrite(); UART_Put_Inf("当前文件的偏移量为:",CH375vCurrentOffset); read_temp(2); //读取温度 ds1820disp(2); //显示温度 i=u32tostr(tvalue,towrite); temp=towrite[i-1]; towrite[i-1]='.'; towrite[i]=temp; towrite[i+1]=0x0d; towrite[i+2]=0x0a; towrite[i+3]=0; UART_Send_Str(towrite); len=strlen(towrite); mCmdParam.ByteWrite.mByteCount=len%MAX_BYTE_IO; for(k=0;k { mCmdParam.ByteWrite.mByteBuffer[k]=towrite[k]; } CH375ByteWrite(); mCmdParam.ByteWrite.mByteCount=0; CH375ByteWrite(); UART_Put_Inf("当前文件的偏移量为:",CH375vCurrentOffset); } }

编译通过只是第一步,不能写到U盘的话你前面的初始化,检测磁盘连接、就绪、新建文件等通过了没有?如果都通过了就检查写那一部分,文件长度有没有强制更新。


那个要怎么看有没有成功初始化。。。完全不懂,你帮我看下我的初始化以及送数据部分的程序有没有错,还有那个U盘模块INT,TXD,RXD引脚要不要接啊?谢谢!毕设好难啊。。。你帮我看看和读写U盘有关的那部分程序看看能不能实现送数据的目的。。。


你不是有串口输出嘛?监控一下到哪一步了?单片机与CH375连线根据你的接口方式来配置,软件需要跟硬件连接来修改。


只有登录才能回复,可以选择微信账号登录