⑴ 急啊...51單片機對sd卡內txt文本文檔進行寫數據問題
「換行」實際上是一個ASCII符號,比如是字元0x0A,只每次檢測到這個字元,就認為是一次換行。
⑵ 用51單片機和18b20做一個溫度計,求一個完整程序,要求用12864顯示。
這個是用數碼顯示的 你自己改改顯示就ok了 12864 有帶字型檔的那種,只要輸入ASCII碼就行了 程序有點亂,你注意換行就行
1.DS18B20基本知識
DS18B20數字溫度計是DALLAS公司生產的1-Wire,即單匯流排器件,具有線路簡單,體積小的特點。因此用它來組成一個測溫系統,具有線路簡單,在一根通信線,可以掛很多這樣的數字溫度計,十分方便。
1、DS18B20產品的特點
(1)、只要求一個埠即可實現通信。
(2)、在DS18B20中的每個器件上都有獨一無二的序列號。
(3)、實際應用中不需要外部任何元器件即可實現測溫。
(4)、測量溫度范圍在-55。C到+125。C之間。
(5)、數字溫度計的解析度用戶可以從9位到12位選擇。
(6)、內部有溫度上、下限告警設置。
2、DS18B20的引腳介紹
TO-92封裝的DS18B20的引腳排列見圖1,其引腳功能描述見表1。
(底視圖)圖1
表1 DS18B20詳細引腳功能描述
序號 名稱 引腳功能描述
1 GND 地信號
2 DQ 數據輸入/輸出引腳。開漏單匯流排介面引腳。當被用著在寄生電源下,也可以向器件提供電源。
3 VDD 可選擇的VDD引腳。當工作於寄生電源時,此引腳必須接地。
3. DS18B20的使用方法
由於DS18B20採用的是1-Wire匯流排協議方式,即在一根數據線實現數據的雙向傳輸,而對AT89S51單片機來說,硬體上並不支持單匯流排協議,因此,我們必須採用軟體的方法來模擬單匯流排的協議時序來完成對DS18B20晶元的訪問。
由於DS18B20是在一根I/O線上讀寫數據,因此,對讀寫的數據位有著嚴格的時序要求。DS18B20有嚴格的通信協議來保證各位數據傳輸的正確性和完整性。該協議定義了幾種信號的時序:初始化時序、讀時序、寫時序。所有時序都是將主機作為主設備,單匯流排器件作為從設備。而每一次命令和數據的傳輸都是從主機主動啟動寫時序開始,如果要求單匯流排器件回送數據,在進行寫命令後,主機需啟動讀時序完成數據接收。數據和命令的傳輸都是低位在先。
DS18B20的復位時序
DS18B20的讀時序
對於DS18B20的讀時序分為讀0時序和讀1時序兩個過程。
對於DS18B20的讀時隙是從主機把單匯流排拉低之後,在15秒之內就得釋放單匯流排,以讓DS18B20把數據傳輸到單匯流排上。DS18B20在完成一個讀時序過程,至少需要60us才能完成。
DS18B20的寫時序
對於DS18B20的寫時序仍然分為寫0時序和寫1時序兩個過程。
對於DS18B20寫0時序和寫1時序的要求不同,當要寫0時序時,單匯流排要被拉低至少60us,保證DS18B20能夠在15us到45us之間能夠正確地采樣IO匯流排上的「0」電平,當要寫1時序時,單匯流排被拉低之後,在15us之內就得釋放單匯流排。
4. 實驗任務
用一片DS18B20構成測溫系統,測量的溫度精度達到0.1度,測量的溫度的范圍在-20度到+100度之間,用8位數碼管顯示出來。
5. 電路原理圖
6. 系統板上硬體連線
(1). 把「單片機系統」區域中的P0.0-P0.7用8芯排線連接到「動態數碼顯示」區域中的ABCDEFGH端子上。
(2). 把「單片機系統」區域中的P2.0-P2.7用8芯排線連接到「動態數碼顯示」區域中的S1S2S3S4S5S6S7S8端子上。
(3). 把DS18B20晶元插入「四路單匯流排」區域中的任一個插座中,注意電源與地信號不要接反。
(4). 把「四路單匯流排」區域中的對應的DQ端子連接到「單片機系統」區域中的P3.7/RD端子上。
C語言源程序#include <AT89X52.H>#include <INTRINS.h> unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,72,75,78,81,84,88,91,94,97};unsigned char displaycount;unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};unsigned char timecount;unsigned char readdata[8]; sbit DQ=P3^7;bit sflag; bit resetpulse(void){unsigned char i; DQ=0;for(i=255;i>0;i--);DQ=1;for(i=60;i>0;i--);return(DQ);for(i=200;i>0;i--);} void writecommandtods18b20(unsigned char command){unsigned char i;unsigned char j; for(i=0;i<8;i++){if((command & 0x01)==0){DQ=0;for(j=35;j>0;j--);DQ=1;}else{DQ=0;for(j=2;j>0;j--);DQ=1;for(j=33;j>0;j--);}command=_cror_(command,1);}} unsigned char readdatafromds18b20(void){unsigned char i;unsigned char j;unsigned char temp; temp=0;for(i=0;i<8;i++){temp=_cror_(temp,1);DQ=0;_nop_();_nop_();DQ=1;for(j=10;j>0;j--);if(DQ==1){temp=temp | 0x80;}else{temp=temp | 0x00;}for(j=200;j>0;j--);}return(temp);} void main(void){TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;ET0=1;EA=1; while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0x44);TR0=1;while(1){;}} void t0(void) interrupt 1 using 0{unsigned char x;unsigned int result; TH0=(65536-4000)/256;TL0=(65536-4000)%256;if(displaycount==2){P0=displaycode[displaybuf[displaycount]] | 0x80;}else{P0=displaycode[displaybuf[displaycount]];}P2=displaybit[displaycount];displaycount++;if(displaycount==8){displaycount=0;} timecount++;if(timecount==150){timecount=0;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0xbe);readdata[0]=readdatafromds18b20();readdata[1]=readdatafromds18b20();for(x=0;x<8;x++){displaybuf[x]=16;}sflag=0;if((readdata[1] & 0xf8)!=0x00){sflag=1;readdata[1]=~readdata[1];readdata[0]=~readdata[0];result=readdata[0]+1;readdata[0]=result;if(result>255){readdata[1]++;}}readdata[1]=readdata[1]<<4;readdata[1]=readdata[1] & 0x70;x=readdata[0];x=x>>4;x=x & 0x0f;readdata[1]=readdata[1] | x;x=2;result=readdata[1];while(result/10){displaybuf[x]=result%10;result=result/10;x++;}displaybuf[x]=result;if(sflag==1){displaybuf[x+1]=17;}x=readdata[0] & 0x0f;x=x<<1;displaybuf[0]=(dotcode[x])%10;displaybuf[1]=(dotcode[x])/10;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0x44);}}
⑶ 51單片機偽指令DB使用方法
可以的
DB的作用是把項或項表中的數存入由該指令地址起始單元中,「項或項表」中的數可以是一個八位二進制數或用逗號隔開的一串8位二進制數(二進制、十進制、十六進制或ASCII碼)
格式:【標號】 DB 項或項表
例如:TAB: DB 45H,73,00110011B,』A『
⑷ 51單片機 數組
你給的信息太有限, 我需要知道你的單片機的具體型號,還有你創建工程的屬性。
我先猜一下:
你用的是STC增強型52單片機,除了自帶的256位元組內存還有256位元組的擴展內存,並且你在工程屬性裡面選擇的是大內存模式(Large: variables in xdata )這樣在你定義內存的時候如果不加data,idata,pdata關鍵字的話,默認就是xdata。這用的是外部RAM,是通過P0和P2口用匯流排模式擴展晶元得到的,可訪問64K的內存空間。但是STC增強型52內置了256位元組(某些版本會更大,我猜你用的是256的),默認訪問方式一樣,但是被STC集成到了片內。你定義了一個a[160]一個b[160],加起來遠遠超過256.按你的說法,有用的是160+48(這里你又有一個表達錯誤,a[0]~a[47]應該是48個。)=208個,算上你其他地方定義的變數,應該滿256個,那麼a[48]~a[159]是怎麼出現的呢,理論上是從P0口讀回來的。但是這里你還有一個不嚴謹的地方,不知道你有沒有證明到底是a[48]~a[159]全部成為了0xFF還是b[48]~b[159]早早的就成為了0xFF。
處理辦法一:內存模式先改成small:variables in data . 這時你應該都無法通過編譯。
然後改變這句話:void 2(char a[160]) 變成 void 2(char pdata a[160])
方法二:直接改 char b[160]= 變成 char code b[160]=
試試看。
如果猜錯了,請別笑話我。
⑸ 為什麼電腦給4G通訊模塊發送AT指令可以得到回復,51單片機給通訊模塊發送AT指令卻失敗了
注意AT命令後加的回車換行符!!!
電腦發送一般是自動加回車換行符的,單片機需要手動加上去
⑹ 關於單片機的LCD顯示問題
1.LCD1602是並行數據介面,就要D0~D7同時輸入8位數,不可以只送一位數。所以,接單片機的四個並行口P0,P1,P2,P3的任一個都行,只是習慣上都接在P0口上,但不是固定這樣的。
2.必須同時給8位數,如果只給一位,LCD1602也會按8位數接收的,其餘7位就是未知的,也就沒有意了。
3.D0~D7送出的數據分命令字和顯示字元,顯示的字元是ASCll碼形式。要顯示浮點數,需要把每一位數轉換成字元。例,數字1,內部計算是0X01,但要變成字元'1',即0X31。
4.在哪行顯示,先要寫一個命令字確定位置,不會自動換行。
最後,你還是先看看有關1602的一些介紹,有個初步了解,很多基礎的東西看了就明白,否則,提問的都是很低級的東西。
⑺ 單片機程序中的printf是什麼意思
有時候在C51中直接使用printf比自己編個串口發送字元串的函數方便,但有幾個問題要注意的。
在51單片機中往串口發送數據如下代碼,也可以用sprintf()函數:
TI=1;
printf("love\n"); //這樣可以換行
//while(!TI);
TI=0;
⑻ 51單片機1602液晶顯示漢字
請問你是想問「51單片機1602液晶顯示漢字的方法」嗎?顯示漢字的方法為:
在51單片機上使用LCD1602顯示漢字,需要先將漢字轉換成對應的點陣數據,然後再通過LCD1602的指令將點陣數據寫入到LCD1602的CGRAM中,最後在指定位置顯示即可。
根據在LCD上開始顯示的行列號及每行的列數可找出顯示RAM對應的地址,設立游標,送上要顯示的漢字的第一位元組,游標位置加1,送第二個位元組,換行按列對齊,送第三個位元組……直到32B顯示完就可以LCD上得到一個完整漢字。