單片機學習入門手冊.doc_第1頁
單片機學習入門手冊.doc_第2頁
單片機學習入門手冊.doc_第3頁
單片機學習入門手冊.doc_第4頁
單片機學習入門手冊.doc_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

匯誠科技個人的單片機開發(fā)板c語言程序及模塊設計總結目錄Keil 軟件的使用2*LED 顯示輸出*8一. 閃爍燈9二.廣告燈的左移右移10三. 按鍵識別14四.數(shù)碼管動態(tài)顯示15五.44 矩陣式鍵盤識別17六按鍵中斷識別19七.定時器 T0 的應用-9.9 秒計時設計21八.利用定時器產(chǎn)生樂曲23九數(shù)摸轉換 ADC0804 的應用26十摸數(shù)轉換 DAC0832的應用32十一24CO8 的讀寫操作35十二PC 機與單片機通信(RS232 協(xié)議)39十三.DS18B20 測量溫度系統(tǒng)41十四.128X64 液晶顯示器的基本應用45十五.標準鍵盤 PS2與單片機通信47十六,128X64無字庫液晶4X4鍵盤輸入使用(密碼鎖)51十七、串口下載線57Keil 軟件的使用軟件是目最流行開發(fā) 80C51 系列單片機的軟件,Keil 提供了包括 C 編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發(fā)方案。1. 使用Keil 前必須先安裝。安裝過程簡單,這里不在敘述。2. 安裝好了Keil 軟件以后,我們打開它。打開以后界面如下:3. 我們先新建一個工程文件,點擊“p工程”菜單,如下圖:4. 選擇工程文件要存放的路徑 ,輸入工程文件名 LED, 最后單擊保存:5 在彈出的對話框中選擇 CPU 廠商及型號:6. 選擇好 Atmel 公司的 AT89S52或AT89C52 后 , 單擊確定:7新建一個 C51 文件 , 單擊左上角的 New File (新建文件)如下圖所示:8.保存新建文件使文件名為*.C的擴展名:9.保存好后把此文件加入到工程中方法如下 : 用鼠標在 Source Group1 上單擊右鍵 , 然后再單擊 添加文件到組Source Group 1如下圖:10. 選擇要加入的文件 , 找到led.C 后 , 單擊 Add, 然后單擊關閉:11.程序編輯后選擇左窗口“目標Target 1屬性”點擊右鍵選擇 “輸出”將E生成HEX文件打鉤。然后,點擊確定,如下圖所示。12按一下,快捷鍵F7,編譯程序。*LED 顯示輸出*很明顯,要點亮使發(fā)光二極管,必須使單片機的I/O口P1.0輸出低電平。于是我們的任務就是編程序使P1.0輸出地電平。#include /*LED 顯示輸出 具體口輸出*/sbit P1_0=P10; /*定義p1.0為p1_0 */sbit P1_1=P21; /*定義p2.1為p1_1 */sbit P1_2=P32;/*定義p3.2為p1_2 */sbit P1_3=P03;/*定義p0.3為p1_3 */main()P1_0=0;/*輸出高電平 即:燈亮 */P1_1=0;P1_2=0;P1_3=0;#include /* LED 顯示輸出 整體輸出*/main()P1=0;/*輸出高電平 */P2=0;P3=0;P0=0;AT89S52單片機從簡單到復雜程序演示。一. 閃爍燈實驗任務在 P1.0 端口上接一個發(fā)光二極管 L1,使 L1 在不停地一亮一滅,一亮一滅的時間間隔為0.2秒。硬件電路與上面點亮小燈的連接完全相同。#include /*閃爍燈*/del() /*延時0.2秒*/unsigned char i,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-);sbit P1_0=P10;main()while(1)/*永遠為真,一直執(zhí)行下去*/P1_0=0;del();P1_0=1;del();#include reg52.h /#define uchar unsigned char /#define uint unsigned int sbit P10=P10; void mDelay(unsigned int Delay) unsigned int i; for(;Delay0;Delay-) for(i=0;i124;i+) ; void main() for(;) P10=!P10; /取反 P1.0 mDelay(1000); /延時1秒。如果是2000那么是2秒 二.廣告燈的左移右移實驗任務做廣告燈的左移右移,八個發(fā)光二極管分別接在單片機的P3.0P3.7接口上,輸出“0”時,發(fā)光二極管亮,開始時P3.0P3.1P3.2P3.3P3.7P3.6P3.0亮,重復循環(huán)。(當然,四個輸出口可以同時實現(xiàn)廣告燈)硬件電路#include /*廣告燈的左移右移*/unsigned char i;unsigned char temp;unsigned char a,b;delay()/延時程序unsigned char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);main()while(1)temp=0xfe;P3=P2=P0=P1=temp;/直接對1/0口p3賦值,使批p3.0輸出低電平。delay();/延時for(i=1;i8;i+)/實現(xiàn)廣告燈的從右到左移動a=temp(8-i);P3=P2=P0=P1=a|b;delay();for(i=1;ii;b=temp0;Delay-) for(i=0;i124;i+) ; void main() unsigned char OutData=0xfe; for(;) P1=OutData; OutData=_crol_(OutData,1); / 循環(huán)左移 mDelay(1000); / 1000延時1s #include /*廣告燈的縮短*/unsigned char i;unsigned char temp;unsigned char a,b;delay()/延時程序unsigned char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);main()while(1)temp=0xfe;P1=temp;/直接對1/0口p3賦值,使批p3.0輸出低電平。delay();/延時for(i=1;i8;i+)/實現(xiàn)廣告燈的從右到左移動a=temp(8-i);P1=b;/P1=a|b;delay();for(i=1;ii;b=temp(8-i);P1=b;/P1=a|b;delay();三. 按鍵識別實驗任務通過按下一次按鍵,使廣告燈向左移動一位,直到最后一位,在向右移動。硬件電路(大家注意到這一個電路圖與上一個實驗的電路圖只多了一個按鍵和一個5.1K的電阻。)實驗原理從圖中可以看出P2.1在按鍵沒有按下時接的是高電平,按鍵按下時接的就是低電平了。所以我們只要判斷P2.1的電平就可以知道按鍵是否被按下了。而在按鍵按下的過程中,由于抖動,將產(chǎn)生干擾,在按下的過程中,一旦有干擾過來,可能造成誤觸發(fā)過程,這并不是我們所想要的。因此在按鍵按下的時候,要把我們手上的干擾信號以及按鍵的機械接觸等干擾信號給濾除掉,一般情況下,我們可以采用軟件濾波的方法去除這些干擾信號,一般情況下,一個按鍵按下的時候,總是在按下的時刻存在著一定的干擾信號,按下之后就基本上進入了穩(wěn)定的狀態(tài)。我們在程序設計時,從按鍵被識別按下之后,延時5ms以上,從而避開了干擾信號區(qū)域,我們再來檢測一次,看按鍵是否真得已經(jīng)按下,若真得已經(jīng)按下,這時肯定輸出為低電平,若這時檢測到的是高電平,證明剛才是由于干擾信號引起的誤觸發(fā),CPU就認為是誤觸發(fā)信號而舍棄這次的按鍵識別過程。C語言源程序#include sbit BY1=P21; /定義按鍵的輸入端unsigned char count; /按鍵計數(shù),每按一下,count 加1unsigned char temp;unsigned char a,b;void delay10ms(void) /延時程序unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);key() /按鍵判斷程序if(BY1=0) /判斷是否按下鍵盤delay10ms(); /延時,軟件去干擾if(BY1=0) /確認按鍵按下count+; /按鍵計數(shù)加1if(count=8) /計8次重新計數(shù) count=0; /將count 清零while(BY1=0);/按鍵鎖定,每按一次count 只加1.四.數(shù)碼管動態(tài)顯示實驗任務P0端口接動態(tài)數(shù)碼管的字形碼筆段,P2端口接動態(tài)數(shù)碼管的數(shù)位選擇端,動態(tài)顯示“1234”字樣;硬件電路注意:a接P0.0;b接P0.1;c接P0.3注意:4H接P2.4;3H接P2.5;2H接P2.6;1H接P2.7實驗原理 七段LED顯示器內部由七個條形發(fā)光二極管和一個小圓點發(fā)光二極管組成,根據(jù)各管的極管的接線形式,可分成共陰極型和共陽極型。LED 數(shù)碼管的 a-dp 七個發(fā)光二極管因以不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼。下面給出共陰極的字形碼:TKVZ,0 1 2 3 4 5 6 7 8 9 a b c d e f 0 0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e 1 2 3 4 5 6 7 8 9 a b c d e f C語言源程序#include code unsigned char seg7code10= 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /顯示段碼 數(shù)碼管字跟:/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x40,/ 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 /0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e/ 1 2 3 4 5 6 7 8 9 a b c d e fDelay(unsigned int tc) /延時程序while( tc != 0 ) /如果tc 為0 則終止延時unsigned int i; /局部正整數(shù)變量 ifor(i=0; i100; i+); /執(zhí)行400 次將耗時1毫秒tc-; /tc計數(shù)減一void Led(int date) /顯示函數(shù)P2=P2&0x7f; /P2.7 輸出低電平,選通千位數(shù)P0=seg7codedate/1000; /取出千位數(shù),查表,輸出。Delay(8); /延時P2=P2|0xf0; /銷隱P2=P2&0xbf; /P2.6 輸出低電平,選通百位數(shù)P0=seg7codedate%1000/100; /取出百位數(shù),查表,輸出。Delay(8); /延時P2=P2|0xf0; /銷隱P2=P2&0xdf; /P2.5 輸出低電平,選通十位數(shù)P0=seg7codedate%100/10; /取出十位數(shù),查表,輸出。Delay(8); /延時P2=P2|0xf0; /銷隱P2=P2&0xef;P0=seg7codedate%10; /取出個位數(shù),查表,輸出。Delay(8);P2=P2|0xf0;main()int display_date=1234; /定義并賦值要顯示的數(shù)據(jù)while(1)Led(display_date);/調用顯示函數(shù)顯示數(shù)據(jù)display_date五.44 矩陣式鍵盤識別實驗任務用AT89S51的并行口P3接44矩陣鍵盤,以P3.0P3.3作輸入線,以P3.4P3.7作輸出線;在每一個數(shù)碼管上顯示每個按鍵的“0F”序號。硬件電路 實驗原理每個按鍵有它的行值和列值 ,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地,另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。C語言源程序#include Unsigned char code seg7code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e ;unsigned char k;void delay10ms(void) /延時程序unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);void Getch ( ) unsigned char X,Y,Z;P3=0xff;P3=0x0f; /先對P3 置數(shù) 行掃描if(P3!=0x0f) /判斷是否有鍵按下delay10ms(); /延時,軟件去干擾if(P3!=0x0f) /確認按鍵按下X = P3;X=P3; /保存行掃描時有鍵按下時狀態(tài)P3=0xf0; /列掃描Y=P3; /保存列掃描時有鍵按下時狀態(tài)Z=X|Y; /取出鍵值switch ( Z ) /判斷鍵值(那一個鍵按下)case 0xee: k=0; break; /對鍵值賦值case 0xde: k=1; break;case 0xbe: k=2; break;case 0x7e: k=3; break;case 0xed: k=4; break;case 0xdd: k=5; break;case 0xbd: k=6; break;case 0x7d: k=7; break;case 0xeb: k=8; break;case 0xdb: k=9; break;case 0xbb: k=10;break;case 0x7b: k=11;break;case 0xe7: k=12;break;case 0xd7: k=13;break;case 0xb7: k=14;break;case 0x77: k=15;break; /請注意寫程序時的格式規(guī)范,此處是為了節(jié)省紙張void main(void)while(1) P3=0xff;Getch();P0=seg7codek; /查表LED輸出P2=0x0f; /輸出相同的四位數(shù)據(jù)。六按鍵中斷識別實驗任務采用中斷技術,每按一下按鍵,計數(shù)器加1,并用LED顯示出來。硬件電路注意:我們只用4位數(shù)碼管中的兩位。注意:a接P0.0;b接P0.1;c接P0.3注意: 2H接P2.0; 1H接P2.1; 中斷按鍵已經(jīng)接好。C語言源程序#includeunsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char dispcount=0; /計數(shù)sbit gewei=P20; /個位選通定義sbit shiwei=P21; /十位選通定義void Delay(unsigned int tc) /延時程序 while( tc != 0 )unsigned int i;for(i=0; i=10) /顯示兩位數(shù)shiwei=0;P0=tabledispcount/10;Delay(8);shiwei=1;gewei=0;P0=tabledispcount%10;Delay(5);gewei=1;else /顯示一位數(shù)shiwei=1; gewei=0;P0=tabledispcount;Delay(8);void main() TCON=0x01; /中斷設置IE=0x81;while(1) /循環(huán)執(zhí)行LED(); /只須調用顯示函數(shù)七.定時器 T0 的應用-9.9 秒計時設計實驗任務開始時,顯示“00”,第 1 次按下 BY1 后就開始計時。第 2 次按 BY1 后,計時停止。 第3次按BY1后,計時歸零。硬件電路C語言源程序#include /必須用這個子函數(shù)庫unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char sec; /定義計數(shù)值,每過1/10 秒,sec 加一unsigned char keycnt=0;unsigned int tcnt; /鍵值判斷sbit gewei=P20; /個位選通定義sbit shiwei=P21; /十位選通定義void Delay(unsigned int tc) /延時程序while( tc != 0 ) unsigned int i;for(i=0; i0;i-) /延時去干擾for(j=248;j0;j-);if(P3_0=0)keycnt+;switch(keycnt) /按下次數(shù)判斷case 1: /第一次按下TH0=0x06; /對TH0 TL0 賦值TL0=0x06;TR0=1; /開始定時break;case 2: /第二次按下TR0=0; /定時結束break;case 3: /第三次按下keycnt=0; /重新開始判斷鍵值sec=0; /計數(shù)重新從零開始break;while(P3_0=0); /請注意寫程序時的格式規(guī)范,此處是為了節(jié)省紙張void t0(void) interrupt 1 using 0 /定時中斷服務函數(shù)tcnt+; /每過250ust tcnt 加一if(tcnt=400) /計滿400 次(1/10 秒)時tcnt=0; /重新再計sec+;if(sec=100) /定時10 秒,在從零開始計時sec=0;void main(void)TMOD=0x02; /定時器工作在方式2ET0=1;EA=1;sec=0;while(1)KEY();LED();八.利用定時器產(chǎn)生樂曲實驗任務利用單片機的I/O口演奏樂曲。硬件電路圖實驗原理 樂曲是按照一定的高低,長短和強弱關系組成的關系,在一首樂曲中,每一個音符與頻率有關。所以我們只要把有關頻率的占空比數(shù)據(jù)做成表格,在通過查表,在I/O口輸出相關樂曲的方波,便產(chǎn)生了樂曲。C語言源程序#include reg52.h/這樣用雙引號也可以。unsigned char Count;sbit _Speak =P00 ; /訊響器控制腳unsigned char code SONG = /祝你平安0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,/路邊的野華不要采0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,;void Time0_Init() TMOD = 0x01;IE = 0x82;TH0 = 0xD8;TL0 = 0xEF; /12MZ晶振,10msvoid Time0_Int() interrupt 1 TH0 = 0xD8;TL0 = 0xEF; Count+; /長度加1void Delay_xMs(unsigned int x) /1MS 延時子程序 unsigned int i,j;for( i =0;i x;i+ )for( j =0;j3;j+ );void Play_Song(unsigned char i) /:歌曲播放子程序i 為播放哪一段曲目 unsigned char Temp1,Temp2;unsigned int Addr;Count = 0; /中斷計數(shù)器清0Addr = i * 217;while(1) Temp1 = SONGAddr+;if ( Temp1 = 0xFF ) /休止符TR0 = 0; Delay_xMs(100); else if ( Temp1 = 0x00 ) /歌曲結束符return;else Temp2 = SONGAddr+;TR0 = 1;while(1) _Speak = _Speak;Delay_xMs(Temp1);if ( Temp2 = Count )Count = 0;break; /請注意寫程序時的格式規(guī)范,此處是為了節(jié)省空間void main() /主程序Time0_Init(); /定時器0 中斷初始化while(1)Play_Song(0); /播放九數(shù)摸轉換 ADC0804 的應用實驗任務從 ADC0804 的通道 IN+輸入 05V 之間的模擬量,通過 ADC0804 轉換成數(shù)字量在數(shù)碼管上以十進制形成顯示出來。硬件電路圖注意:上圖未顯示全的是四個共陰極數(shù)碼管。實驗原理ADC0804 是 8 位全 MOS 中速 A/D 轉換器、它是逐次逼近式 A/D 轉換器,片內有三態(tài)數(shù)據(jù)輸出鎖存器,可以和單片機直接接口。單通道輸入,轉換時間大約為100us。ADC0804轉換時序是:當CS0許可進行A/D轉換。WR由低到高時,A/D開始轉換,一次轉換一共需要6673個時鐘周期。CS與WR同時有效時啟動A/D轉換,轉換結束產(chǎn)生 INTR 信號(低電平有效),可供查詢或者中斷信號。在 CS和RD的控制下可以讀取數(shù)據(jù)結果。C語言源程序#include code unsigned char seg7code10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /顯示段碼sbit int1=P33; /定義管腳功能sbit cs=P32;sbit wr=P36;sbit rd=P37;void Delay(unsigned int tc) /顯示延時程序while( tc != 0 )unsigned int i;for(i=0; i100; i+);tc-;unsigned char adc0804( void ) /讀AD0804 子程序 unsigned char addata,i;rd=1;wr=1;int1=1; /讀ADC0804 前準備P1=0xff; /P1全部置一準備cs=0;wr=0;wr=1; /啟動ADC0804 開始測電壓while(int1=1); /查詢等待A/D轉換完畢產(chǎn)生的INT(低電平有效)信號rd=0; /開始讀轉換后數(shù)據(jù)i=i; i=i; /無意義語句,用于延時等待ADC0804 讀數(shù)完畢addata=P1;/讀出的數(shù)據(jù)賦與addaterd=1;cs=1;/讀數(shù)完畢return(addata);/ 返回最后讀出的數(shù)據(jù)unsigned int datpro(void)/ADC0804 讀出的數(shù)據(jù)處理 unsigned char x;unsigned int dianyah,dianyal; /用于存儲讀出數(shù)據(jù)的高字節(jié)和低字節(jié)unsigned int dianya=0; /存儲最后處理完的結果 注意數(shù)據(jù)類型for(x=0;x4; /右移四位 取出高四位dianyal=dianya&0x0f; /屏蔽高四位 取出低四位dianya=dianyal*20+dianyah*320; /最后的結果是一個四位數(shù),便于顯示return(dianya);/返回最后處理結果void Led() unsigned int date;date=datpro(); /調用數(shù)據(jù)處理最后結果P2=P2&0xef;P0=seg7codedate/1000|0x80; /輸出個位數(shù)和小數(shù)點Delay(8); P2=P2|0xf0; P2=P2&0xdf;P0=seg7codedate%1000/100; /輸出小數(shù)點后第一位Delay(8); P2=P2|0xf0; P2=P2&0xbf;P0=seg7codedate%100/10; /輸出小數(shù)點后第二位Delay(8); P2=P2|0xf0; P2=P2&0x7f;P0=seg7codedate%10; /輸出小數(shù)點后第三位Delay(8); P2=P2|0xf0;main()while(1)Led( ); /只需調用顯示函數(shù)ADC0809是帶有8位A/D轉換器、8路多路開關以及微處理機兼容的控制邏輯的CMOS組件。它是逐次逼近式A/D轉換器,可以和單片機直接接口。 (1)ADC0809的內部邏輯結構 由上圖可知,ADC0809由一個8路模擬開關、一個地址鎖存與譯碼器、一個A/D轉換器和一個三態(tài)輸出鎖存器組成。多路開關可選通8個模擬通道,允許8路模擬量分時輸入,共用A/D轉換器進行轉換。三態(tài)輸出鎖器用于鎖存A/D轉換完的數(shù)字量,當OE端為高電平時,才可以從三態(tài)輸出鎖存器取走轉換完的數(shù)據(jù)。 (2) 引腳結構 IN0IN7:8條模擬量輸入通道 ADC0809對輸入模擬量要求:信號單極性,電壓范圍是05V,若信號太小,必須進行放大;輸入的模擬量在轉換過程中應該保持不變,如若模擬量變化太快,則需在輸入前增加采樣保持電路。 地址輸入和控制線:4條 ALE為地址鎖存允許輸入線,高電平有效。當ALE線為高電平時,地址鎖存與譯碼器將A,B,C三條地址線的地址信號進行鎖存,經(jīng)譯碼后被選中的通道的模擬量進轉換器進行轉換。A,B和C為地址輸入線,用于選通IN0IN7上的一路模擬量輸入。通道選擇表如下表所示。CBA選擇的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7數(shù)字量輸出及控制線:11條 ST為轉換啟動信號。當ST上跳沿時,所有內部寄存器清零;下跳沿時,開始進行A/D轉換;在轉換期間,ST應保持低電平。EOC為轉換結束信號。當EOC為高電平時,表明轉換結束;否則,表明正在進行A/D轉換。OE為輸出允許信號,用于控制三條輸出鎖存器向單片機輸出轉換得到的數(shù)據(jù)。OE1,輸出轉換得到的數(shù)據(jù);OE0,輸出數(shù)據(jù)線呈高阻狀態(tài)。D7D0為數(shù)字量輸出線。 CLK為時鐘輸入信號線。因ADC0809的內部沒有時鐘電路,所需時鐘信號必須由外界提供,通常使用頻率為500KHZ, VREF(),VREF()為參考電壓輸入。 2 ADC0809應用說明 (1) ADC0809內部帶有輸出鎖存器,可以與AT89S51單片機直接相連。 (2) 初始化時,使ST和OE信號全為低電平。 (3) 送要轉換的哪一通道的地址到A,B,C端口上。 (4) 在ST端給出一個至少有100ns寬的正脈沖信號。 (5) 是否轉換完畢,我們根據(jù)EOC信號來判斷。 (6) 當EOC變?yōu)楦唠娖綍r,這時給OE為高電平,轉換的數(shù)據(jù)就輸出給單片機了。電路原理圖:adc0809內部結構圖:十摸數(shù)轉換 DAC0832的應用實驗任務用兩個按鍵通過單片機控制 DAC0832 的輸出,使 OUT 端可以輸出 05V 的幅值,頻率為1KHZ的鋸齒波和三角波兩種波形。通上電源后;按下INT1則輸出三角波,在按下INT0輸出鋸齒波。硬件電路圖注意:D0對應P0.0;D1對應P0.1;D2對應P0.2按鍵可以直接使用INT0和INT1按鍵(程序中以掃描方式識別按鍵)。硬件電路圖中的畫框的部分,運放 LM324 的連接部分需要用戶自己搭建,注意LM324使用的是正負12V的雙電源供電。我們只使用LM324四個運放中的兩個實驗原理ADC0804是8位全MOS 中速D/A轉換器,采用R2RT形電阻解碼網(wǎng)絡,轉換結果為一對差動電流輸出,轉換時間大約為 1us。使用單電源+5V+15V 供電。參考電壓為-10V+10V。在此我們直接選擇+5V 作為參考電壓。DAC0832 有三種工作方式:直通方式,單緩沖方式,雙緩沖方式;在此我們選擇直通的工作方式將XFER WR 1WR2 CS管腳全部接數(shù)字地。管腳8接參考電壓,在此我們接的參考電壓是+5V。那么經(jīng)過第一級運放后,輸出電壓將是-5V0V,在經(jīng)過第二級運放反相放大1倍以后將可以輸出0V5V了。我們在控制P1口輸出數(shù)據(jù)有規(guī)律的變化將可以產(chǎn)生三角波,鋸齒波,梯型波等波形了。C語言源程序#include unsigned char keycnt=0;unsigned char tcnt=0; /鍵值判斷bit sjz=0; /產(chǎn)生三角波時用到的標志void delayl() /延時子程序 unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-); void KEY() /按鍵掃描程序if(P3_2=0)delayl(); /延時跳過按下時的抖動if(P3_2=0) keycnt=0; /定時器產(chǎn)生鋸齒波標志TR0=0; /暫時停止波形輸出TH0=0x256-40; /對TH0 TL0 賦值TL0=0x256-40;TR0=1; /開始定時,產(chǎn)生鋸齒波while(P3_2=0); /如果一直按著鍵,則等待松鍵開delayl(); /延時跳過松開后的抖動 if(P3_3=0)delayl(); /延時跳過按下時的抖動if(P3_3=0)keycnt=1; /定時器產(chǎn)生三角波標志TR0=0; /暫時停止波形輸出TH0=0x256-40; /對TH0 TL0 賦值TL0=0x256-40;TR0=1; /開始定時 產(chǎn)生三角波while(P3_2=0); /如果一直按著鍵,則等待松鍵開delayl(); /延時跳過松開后的抖動 /請注意寫程序時的格式規(guī)范,此處是為了節(jié)省紙張void t0(void) interrupt 1 using 0 /定時中斷服務函數(shù)if(keycnt=0) /產(chǎn)生鋸齒波P0=tcnt;tcnt=+0x0a; /步進0.2V/一次中斷if(tcnt=0xfb)tcnt=0;if(keycnt=1) /產(chǎn)生三角波 if(sjz=0)P0=tcnt;tcnt=+0x0a;/步進0.2V/一次中斷if(tcnt=0xfa)sjz=1;if(sjz=1)P0=tcnt;tcnt=-0x0a;if(tcnt=0) sjz=0;void main(void)TMOD=0x02; /定時器工作在方式2ET0=1;EA=1;while(1) KEY(); 十一24CO8 的讀寫操作實驗任務利用 24C08 斷電以后存儲的數(shù)據(jù)不消失的特點,可以做一個斷電保護裝置。首先利用單片機做一個 099 秒的自

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論