我用的是STC89C58RD+,主程序是在LCD顯示溫度并送采集到的數(shù)據(jù)到U盤,我編了個程序,編譯可以通過,溫度也可以顯示就是沒有送到U盤:求行家?guī)蛶兔Γx謝!下面是主程序: #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; //溫度正負標(biāo)志
//--------------------------------------------------------------------- #define CH375_CMD_PORT_ADDR 0x8100 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x8000 /* CH375數(shù)據(jù)端口的I/O地址 */ #include "CH375HF6.H" unsigned char i,j,k,err,len,counter=0; unsigned char towrite[60]; //數(shù)據(jù)緩沖區(qū)中等待寫入到U盤中的數(shù)據(jù) void Show_File_Inf() { UART_Send_Str("查詢當(dāng)前文件/目錄的信息\n"); UART_Put_Inf("當(dāng)前文件/目錄的開始簇為:",CH375vStartCluster); UART_Put_Inf("當(dāng)前文件的偏移量為:",CH375vCurrentOffset); UART_Put_Inf("當(dāng)前文件/目錄的文件目錄項所在扇區(qū)為:",CH375vFdtLba); UART_Put_Inf("當(dāng)前文件/目錄的文件目錄項在所在扇區(qū)中的位置為:",CH375vFdtOffset);
CH375FileQuery();
UART_Put_Inf("當(dāng)前文件/目錄的長度為:",mCmdParam.Modify.mFileSize); UART_Send_Str("當(dāng)前文件/目錄的修改日期為:"); 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("當(dāng)前文件/目錄的修改時間為:"); 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("系統(tǒng) "); break; case ATTR_VOLUME_ID: UART_Send_Str("卷標(biāo) "); 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寫數(shù)據(jù) { 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() //初始化設(shè)置 { 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復(fù)位*/ { DQ = 1; //DQ復(fù)位 delay_18B20(4); //延時4us DQ = 0; //DQ拉低 delay_18B20(100); //精確延時大于480us小于960us DQ = 1; //電位拉高 delay_18B20(40); } uchar ds1820rd()/*讀數(shù)據(jù)*/ { 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)/*寫數(shù)據(jù)*/ { 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個字節(jié),分八次讀寫 ds1820wr(str1[j]); //發(fā)送18B20的序列號,先發(fā)送低字節(jié)的8位 } if(a==2) { for(j=0;j<8;j++) ds1820wr(str2[j]); //發(fā)送18B20的序列號,先發(fā)送低字節(jié)的8位 } return 1; } read_temp(uchar z)/*讀取溫度值并轉(zhuǎn)換*/ { uchar a,b; float tt; ds1820rst(); //DS18B20復(fù)位 ds1820wr(0xcc); //跳過DS18B20的序列號 ds1820rst(); //DS18B20復(fù)位 if(z==1) { b20_Matchrom(1); //匹配ROM1 } if(z==2) { b20_Matchrom(2); //匹配ROM2 } ds1820wr(0x44); //啟動溫度轉(zhuǎn)換 delay1ms(5); ds1820rst(); //DS18B20復(fù)位 ds1820wr(0xcc); //跳過DS18B20的讀序列號 ds1820rst(); //DS18B20復(fù)位 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位(十六位數(shù)據(jù)格式) tvalue=tvalue|a; //把溫度的高8位,低8位和成一個數(shù)據(jù) if(tvalue<0x0fff) //判斷溫度的正負,十二位精度 tflag=0; //溫度標(biāo)志位 else { tvalue=~tvalue+1; tflag=1; } tt=tvalue*0.0625; tvalue=tt*10; return(tvalue); } /**********溫度顯示函數(shù)*********/ void ds1820disp(uchar z) //溫度值各個位的顯示程序 { uchar flagdat; disdata[0]=tvalue/1000+0x30; //百位數(shù) disdata[1]=tvalue%1000/100+0x30;//十位數(shù) disdata[2]=tvalue%100/10+0x30; //個位數(shù) disdata[3]=tvalue%10+0x30; //小數(shù)位 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); //顯示小數(shù)點 wr_com(0x87); wr_dat(disdata[3]); //顯示小數(shù)位 } 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); //顯示小數(shù)點 wr_com(0xc7); wr_dat(disdata[3]); //顯示小數(shù)位 } } /********主程序*********/ 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盤已經(jīng)插入\n"); UART_Send_Str("開始檢測U盤是否就緒...\n"); while(CH375DiskReady()!=ERR_SUCCESS) { delay(1000); } UART_Send_Str("U盤已經(jīng)就緒,可以操作\n"); UART_Send_Str("獲取磁盤物理總?cè)萘?..\n"); CH375DiskSize(); UART_Put_Inf("硬盤物理總?cè)萘繛?扇區(qū)):",mCmdParam.DiskSize.mDiskSizeSec); UART_Send_Str("獲取磁盤信息...\n"); CH375DiskQuery(); UART_Put_Inf("磁盤總?cè)萘?兆):",mCmdParam.Query.mTotalSector/2048); UART_Put_Inf("剩余容量(兆):",mCmdParam.Query.mFreeSector/2048); UART_Send_Str("磁盤上的文件系統(tǒng)為:"); switch(mCmdParam.Query.mDiskFat) { case 0: UART_Send_Str("未知文件系統(tǒng)\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("創(chuàng)建新文件\n"); strcpy(mCmdParam.Create.mPathName,"\\104.TXT"); err=CH375FileCreate(); if(err==ERR_SUCCESS) { UART_Send_Str("文件創(chuàng)建成功\n"); Show_File_Inf(); } else { UART_Send_Str("文件創(chuàng)建失敗\n"); } } else { UART_Send_Str("初始化CH375程序庫及CH375芯片失?。n"); } UART_Send_Str("以字節(jié)模式寫入:\n"); while(1) //死循環(huán) { read_temp(1); //讀取溫度 ds1820disp(1); //顯示溫度 i=u32tostr(tvalue,towrite); //將溫度值 轉(zhuǎn)為字符串,好寫入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("當(dāng)前文件的偏移量為:",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("當(dāng)前文件的偏移量為:",CH375vCurrentOffset); } }