51單片機(jī)實(shí)驗(yàn)程序_第1頁
51單片機(jī)實(shí)驗(yàn)程序_第2頁
51單片機(jī)實(shí)驗(yàn)程序_第3頁
51單片機(jī)實(shí)驗(yàn)程序_第4頁
51單片機(jī)實(shí)驗(yàn)程序_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、用查表方式編寫yx13x23x33。(x為09的整數(shù))#include<reg51.h>void main()int code a10=0,1,8,27,64,125,216,343,512,729;/將09對應(yīng)的每位數(shù)字的三次方的值存入code中,code為程序存儲器,當(dāng)所存的值在0255或-128+127之間的話就用char,而現(xiàn)在的值明顯超過這個范圍,用int較合適。int的范圍是065535或-3276832767。int y,x1,x2,x3;/此處定義根據(jù)習(xí)慣,也可寫成char x1,x2,x3但是變量y一定要用int 來定義。x1=2;x2=4;x3=9;/x1,x2

2、,x3三個的值是自定的,只要是09當(dāng)中的數(shù)值皆可,也可重復(fù)。y=ax1+ax2+ax3;while(1);/單片機(jī)的程序不能停,這步就相當(dāng)于無限循環(huán)的指令,循環(huán)的內(nèi)容為空白。/結(jié)果的查詢在Keilvision軟件內(nèi)部,在仿真界面點(diǎn)擊右下角(一般初始位置是右下角)的watch的框架內(nèi)雙擊“double-click or F2 to add”文字輸入y后按回車,右側(cè)會顯示其16進(jìn)制數(shù)值如0x34,鼠標(biāo)右鍵該十六進(jìn)制,選擇第一行的decimal,可查看對應(yīng)的10進(jìn)制數(shù)。1、 有10個8位二進(jìn)制數(shù)據(jù),要求對這些數(shù)據(jù)進(jìn)行奇偶校驗(yàn),凡是滿足偶校驗(yàn)的數(shù)據(jù)(1的個數(shù)為偶數(shù))都要存到內(nèi)RAM50H開始的數(shù)據(jù)區(qū)中

3、。試編寫有關(guān)程序。#include<reg51.h>void main()int a10=0,1,5,20,24,54,64,88,101,105;/將所要處理的值存入RAM中,這些可以根據(jù)個人隨意設(shè)定,但建議不要超過0255的范圍。char i; /定義一個變量char *q=0x50; /定義一個指針*q指向內(nèi)部0x50這個地址。for(i=9;i>=0;i-)/90循環(huán),共十次,也可以用for(i=0;i<10;i+)ACC=ai;/將ai的值賦給累加器ACCif (P=0)/PSW0位上的奇偶校驗(yàn)位,如果累加器ACC內(nèi)數(shù)值1的個數(shù)為偶數(shù)那么P為0,若為奇數(shù),P為

4、1。這里的P是大寫的。*q=ai;q+;/每賦一個值,指針挪一個位置指向下一個。while(1);/同實(shí)驗(yàn)一,程序不能停。3.有10個8位帶符號二進(jìn)制數(shù),請將10個數(shù)按從小到大的順序排列,并存到內(nèi)RAM50H開始的單元中。#include<reg51.h>void main()char data a10=-50,-36,0,-128,1,99,127,89,-89,40;/將所有值存入RAM中,因?yàn)橛胸?fù)數(shù),所以不能用unsigned char。因?yàn)槭莄har所以假設(shè)的數(shù)值不要超過-128+127之外unsigned char *q=0x50; /定義指針*q指向0x50unsign

5、ed char i,j;char t; /定義三個變量,用于循環(huán)及換位。在換位時有賦值,所以t要用char不能用unsigned char。for(i=0;i<10;i+)for(j=0;j<10-i;j+)/冒泡法,具體可以參考C語言程序設(shè)計(jì)的書。if(aj>aj+1)t=aj;aj=aj+1;aj+1=t; for(i=0;i<10;i+) /將已經(jīng)排好序的數(shù)組存入*q指向的地址。*q=ai;q+;while(1);1、基本部分:(1)P1口做輸出口,接八只發(fā)光二極管,編寫程序,使發(fā)光二極管循環(huán)點(diǎn)亮。#include<reg51.h>void delay

6、(unsigned char x) /定義延遲函數(shù),用于后面LED燈亮的持續(xù)時間。unsigned char i,j,k; dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x); main()P1=0xfe;/11111110第一個燈亮while(1)delay(1);/延時500msP1=P1<<1|1;/P1左移一個位即11111101 具體crol跟<<的區(qū)別與具體細(xì)節(jié)可聯(lián)系我與你講解if(P1=0XFF)P1=0XFE;(2)P1.0、P1.1作輸入口接兩個撥動開關(guān),P1.

7、2、P1.3作輸出口,接兩個發(fā)光二極管,編寫程序讀取開關(guān)狀態(tài),將此狀態(tài),在發(fā)光二極管上顯示出來。編程時應(yīng)注意P1.0、P1.1作為輸入口時應(yīng)先置1,才能正確讀入值。#include<reg51.h> sbit p1_0=P10; sbit p1_1=P11; sbit p1_2=P12; sbit p1_3=P13;/程序不能對單個引腳進(jìn)行編程,需要用sbit定義才可用。main() p1_0=1;p1_1=1;p1_2=1;p1_3=1;/前兩個引腳置一是為了讓其能獲取輸入信號,后兩個引腳是賦初值,方便后面取反工作。 while(1) if(!p1_0)/判斷P1.0的引腳是否有

8、變化。 p1_2=!p1_2; /如果P1.0引腳變化,P1.2引腳也跟隨變化。 if(!p1_1)/判斷P1.1的引腳是否有變化。 p1_3=!p1_3;/如果P1.1引腳變化,P1.3引腳也跟隨變化。 2、擴(kuò)展部分:(1) 利用P1口控制發(fā)光二極管LED燈按照下面方式工作:a) LED燈從左到右依次點(diǎn)亮;b) LED燈從右到左依次點(diǎn)亮;c) 按照以上步驟重復(fù)運(yùn)行,其中要求燈亮的時間為500ms。#include <reg51.h> void delay(unsigned char x)unsigned char i,j,k;dofor(i=10;i>0;i-)for(j=

9、100;j>0;j-)for(k=249;k>0;k-);while(-x);main()while(1) /無限循環(huán)里面的內(nèi)容 P1=0XFE;/右移完畢后賦初值,為左移做準(zhǔn)備delay(1);while(1)P1=P1<<1;/如果左移右移是單個燈移動的話,那么這句改為LED=LED<<1|1;就可以了。 delay(1);if(P1=0x00) /判斷左移是否完畢,完畢break跳出此次的whilebreak; P1=0x7f; /左移完畢后給P1賦初值,準(zhǔn)備右移delay(1);while(1)P1=P1>>1;/如果左移右移是單個燈移動

10、的話,那么這句改為LED=LED>>1|0x80;就可以了。delay(1);if(P1=0x00)/判斷右移是否完畢,完畢后break跳出break;(2) 利用P1口控制發(fā)光二極管LED燈按照下面方式工作:a)從左到右奇數(shù)LED燈依次點(diǎn)亮;b)從右到左偶數(shù)LED燈依次點(diǎn)亮;c)按照以上步驟重復(fù)運(yùn)行,其中要求燈亮的時間為500ms。#include<reg51.h> /此程序也可以用<<和>>來實(shí)現(xiàn),具體細(xì)節(jié)可以來問我#include<intrins.h>/當(dāng)程序中有涉及到_crol_或者_(dá)nop_等庫函數(shù)時,必須添加此頭文件。vo

11、id delay(unsigned char x)unsigned char i,j,k;dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);main()while(1) /無限循環(huán)括號里的內(nèi)容P1=0xfe;/第一個燈亮,while(1)delay(1);P1=_crol_(P1,2); /P1左移兩個位置if(P1=0xfe)/判斷左移結(jié)束break; P1=0X7f;while(1)delay(1);P1=_cror_(P1,2);/P1右移兩個位置if(P1=0x7f)/判斷右移結(jié)束break;

12、#include<reg51.h>void delay(unsigned char x)/延時函數(shù)500msunsigned char i,j,k;dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);main()while(1) /無限循環(huán)括號里的內(nèi)容 P1=0xfe;/賦值,為左移做準(zhǔn)備 delay(1); while(1) P1=(P1<<1)|0x01;/P1左移一個位置,補(bǔ)位補(bǔ)的是1。此處不明白可以找我。 P1=P1<<1; /P1左移一個位置,補(bǔ)位補(bǔ)的是0。

13、 delay(1); if(P1=0xaa) /左移結(jié)束,跳出循環(huán)break; P1=0X7f; /P1賦值,為右移做準(zhǔn)備 delay(1); while(1) P1=(P1>>1)|0x80; /P1右移一個位,補(bǔ)位補(bǔ)的是1,同樣的,不明白來找我 P1=P1>>1; /P1右移一個位 delay(1); if(P1=0x55) /判斷右移是否完畢,退出此次循環(huán)。break;本實(shí)驗(yàn)?zāi)M交通信號燈控制,一般情況下正常顯示,有急救車到達(dá)時,兩個方向交通信號燈全紅,以便讓急救車通過。設(shè)急救車通過路口時間為5秒,急救車通過后,交通恢復(fù)正常,本實(shí)驗(yàn)用單次脈沖申請外部中斷,表示有急

14、救車通過。#include<reg51.h>unsigned char x,y,i,j,k; /設(shè)置unsigned char d0,d1,d2,d3; /定義四個變量用于記錄中斷時的現(xiàn)場,以便恢復(fù)現(xiàn)場。void delay(x)/延時函數(shù)dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);zd() interrupt 0 /定義中斷函數(shù),無需聲明。interrupt 0表示外部中斷0的中斷函數(shù)y=P1; d0=x; d1=i;d2=j;d3=k; /記錄中斷時P1的值,延時函數(shù)的x,i,j

15、,k也要記錄。P1=0xf6; /P1應(yīng)為東西紅南北紅,所以設(shè)為F6。delay(5);x=d0;i=d1;j=d2;k=d3;P1=y; /現(xiàn)場恢復(fù),包括延時函數(shù)中的x,i,j,k。main()P1=0xf6; /P1設(shè)定初始狀態(tài),兩路皆為紅燈,此步驟可以忽略。delay(1);EA=1; /開總中斷EX0=1; /開外部中斷0中斷。IT0=1; /設(shè)置外部中斷0為下降沿觸發(fā)有效方式。IT0=0為低電平有效while(1) /下列四種燈亮的狀態(tài)循環(huán)。P1=0xf3;/東西綠,南北紅delay(10); P1=0xf5; /東西黃,南北紅delay(3);P1=0xde;/東西紅,南北綠del

16、ay(10);P1=0xee; /東西紅,南北黃delay(3);1、基本部分:用CPU內(nèi)部定時器中斷方式計(jì)時,實(shí)現(xiàn)每一秒鐘輸出狀態(tài)發(fā)生一次反轉(zhuǎn).#include<reg51.h>sbit p1_0=P10; /要使用單個引腳應(yīng)先定義unsigned char i;void main()TMOD=0X01;/t0工作在定時器,工作方式1TL0=0XB0;TH0=0X3C;/設(shè)定定時器初值,初值的計(jì)算可查看書本P143,此處定時器定時時間為100msIE=0X82; /開EA總中斷,開t0中斷TR0=1; /定時器工作開關(guān)開啟i=10; /設(shè)定i作為后面定時一秒的使用while(1)

17、;t_0() interrupt 1/T0定時/計(jì)數(shù)器的中斷i-; /進(jìn)入一次中斷,i的值減一if(i=0) /當(dāng)進(jìn)入10次中斷,即i=0的時候,定時時間為1S。 i=10; /重新讓i=10,使得后面繼續(xù)定時1S。p1_0=p1_0; /P1.0取反。TL0=0XB0;TH0=0X3C;/賦定時初值,定時器或計(jì)數(shù)器必要步驟,除工作方式2外。2、擴(kuò)展部分:利用P1口控制發(fā)光二極管LED燈按照下面方式工作:1)從左到右奇數(shù)LED燈依次點(diǎn)亮;2)從右到左偶數(shù)LED燈依次點(diǎn)亮;3)按照以上步驟重復(fù)運(yùn)行,其中要求燈亮的時間為500ms,由定時器T1實(shí)現(xiàn)。#include<reg51.h>#

18、include<intrins.h>unsigned char i,j,k;void main()TMOD=0X10; /設(shè)定T1工作在定時器T1,方式1。同時也會設(shè)定T0工作在定時器T0,方式0,但是我們后面沒有interrupt 1的子函數(shù),所以T0沒發(fā)揮作用。IE=0X88; /開總中斷,開T1中斷TL1=0XB0;TH1=0X3C;/定時器初值,時間為100msTR1=1; /開定時器T1的開關(guān) i=5; j=0; k=0; /用三個變量來判斷時長,循環(huán)階段。 P1=0xfe; /賦P1初值,第一個燈亮 while(1); /等待定時工作完成t_1() interrupt

19、3 /T1的中斷子函數(shù)i-; /進(jìn)入一次,i就減1TL1=0xB0;TH1=0x3C; /每次進(jìn)入中斷定時器的初值就為0,所以需要重裝if(i=0) /500ms后i=5; /讓i=5,繼續(xù)定時500ms。j+; /j一開始為0,j加一if(j=4)/如果j等于4,代表P1口左移了四次j=0; k=!k; /k取反,用于后面左移右移的執(zhí)行if(k=0) /P1口左移 if(P1=0xfd) /左移到頭了,要右移需要把燈亮的位置變化下P1=0xbf; P1=_crol_(P1,2);if(k!=0)/P1口右移if(P1=0xbf)/右移到頭了,要右移需要把燈亮的位置變化下P1=0xfd;P1=

20、_cror_(P1,2); #include<reg51.h>unsigned char i,j;void main()i=5;j=0;P1=0xfe;/只亮第一個燈TMOD=0X10; /設(shè)置T1的工作方式為1,定時器工作IE=0X88; /中斷EA開,ET1開TL1=0XB0; TH1=0X3C; /初值設(shè)定為100msTR1=1; /開啟工作開關(guān)while(1); /等待定時工作完成t_1() interrupt 3 /T1中斷子函數(shù)i-; TL1=0XB0;TH1=0X3C; /賦初值if(i=0)/時間為500ms i=5; j+; /利用j來判斷左移或右移是否結(jié)束if(

21、j<4)P1=P1<<1|0x01; P1=P1<<1|0x01; /P1口左移兩位,且補(bǔ)位是補(bǔ)1。也可以用P1=P1<<2|0X03代替if(j=4) /左移結(jié)束,賦P1值準(zhǔn)備右移P1=0x7f;if(j>4) /右移階段P1=P1>>1|0X80;P1=P1>>1|0X80;/P1口右移兩位,且補(bǔ)位是補(bǔ)1。也可以用P1=P1>>2|0XC0代替if(j=8) /右移結(jié)束,賦P1值準(zhǔn)備左移P1=0xfe; j=0; /最后還要將J恢復(fù)為0以便下次循環(huán)。1、基本部分:8031內(nèi)部定時計(jì)數(shù)器T0,按計(jì)數(shù)器模式和方

22、式1工作,對P3.4(T0)引腳進(jìn)行計(jì)數(shù)。將其數(shù)值按二進(jìn)制數(shù)在P1口驅(qū)動LED燈上顯示出來。#include<reg51.h>void main()TMOD=0X05; /T0工作方式1,計(jì)數(shù)器工作TL0=0X00;TH0=0Xff;/初值設(shè)置方法可以參考P143頁IE=0X82; /中斷EA=1,ET0中斷開啟TR0=1; /開啟中斷開關(guān)while(1)P1=TL0; /計(jì)數(shù)器的值存在TL0里面。每加一個值,所得的值就是以八位二進(jìn)制形式存在TL0里面的。 t_0() interrupt 1 /T0的計(jì)數(shù)器中斷 TL0=0X00;TH0=0Xff;2、擴(kuò)展部分:利用T0作為定時器,

23、T1作為計(jì)數(shù)器,將試驗(yàn)箱上的脈沖信號源接到T1引腳,測量出脈沖信號源的頻率。#include<reg51.h>unsigned char i,a;void main()a=0;i=10;TMOD=0X51; /設(shè)置T0為工作方式1,定時器工作。T1為工作方式1,計(jì)數(shù)器工作EA=1;ET0=1;ET1=0;/這里也可以設(shè)置為IE=0x82。關(guān)閉了T1的中斷TL0=0XB0;TH0=0X3C;/時間設(shè)定為100msTL1=0X00;TH1=0X00; /計(jì)數(shù)器開啟最大范圍計(jì)數(shù)TR0=1;TR1=1; /皆開啟開關(guān)while(1)/等待計(jì)數(shù)定時工作完成if(TF1=1)/查詢溢出標(biāo)志位。

24、a+; /溢出一次a的值加1TF1=0; /將溢出標(biāo)志位清零TH1=0x00;TL1=0X00;/重新裝上計(jì)數(shù)器初值t_0() interrupt 1 /定時器T0的中斷子程序TL0=0XB0;TH0=0X3C; /賦初值 i-;if(i=0)i=10;P1=TL1;/將低位記錄的次數(shù)賦給P1顯示出來。P2=TH1;/將高位記錄的次數(shù)賦給P2顯示出來,即一秒內(nèi)的計(jì)數(shù)次數(shù),即為頻率。TR0=0;TR1=0;/頻率讀出后關(guān)閉T0和T1/一般情況下,所測頻率不能超過500kHz,否則此程序結(jié)果有錯。程序頻率計(jì)算為:P1和P2的讀數(shù)轉(zhuǎn)為十進(jìn)制數(shù)字,加上(a*65536)得出頻率總和。1、基本部分:利用

25、74ls165讀入撥盤開關(guān)的狀態(tài),利用單片機(jī)串行口將狀態(tài)讀入并通過P1口輸出到LED,從而實(shí)現(xiàn)撥盤開關(guān)對LED燈的控制。#include<reg51.h>sbit P1_6=P16; /實(shí)驗(yàn)箱內(nèi)部已經(jīng)將P1.6引腳與165的S/L引腳相連,也把P3.6與165的CLK引腳相連void main()SM0=0; SM1=0; REN=1; /串行口工作方式0,也可用SCON=0x10 EA=1;ES=1; /開總中斷和串行口中斷 while(1);I_0() interrupt 4 /串行口中斷子程序P1_6=0; /讓74LS165將按鍵的狀態(tài)讀入 P1_6=1; /讓74LS16

26、5將讀入的8位按鍵碼用串行方式輸出,從低位到高位; P2=SBUF; /將SBUF緩沖器里的數(shù)據(jù)讀給P2RI=0;/RI要由軟件置02、擴(kuò)展部分:利用74ls165讀入撥盤開關(guān)的狀態(tài),利用單片機(jī)P3口將狀態(tài)讀入并通過P1口輸出到LED,從而實(shí)現(xiàn)撥盤開關(guān)對LED燈的控制。#include<reg51.h>sbit p1_6=P16;/與165的內(nèi)部S/L相連sbit p3_6=P36; /與165的內(nèi)部CLK相連sbit p1_7=P17; /P1.7短路帽扣上時,P1.7與165的QH相連unsigned char i,x;main()while(1) p1_6=0;/數(shù)據(jù)移入16

27、5芯片 p1_6=1; /數(shù)據(jù)從165芯片輸出x=p1_7; /防止第一位丟失for(i=0;i<7;i+) p3_6=0; p3_6=1; /內(nèi)部制造一個上升沿,從而達(dá)到數(shù)據(jù)傳輸,一個上升沿一個數(shù)據(jù)。 x=x<<1|p1_7;/每次左移一個位,空出來的位補(bǔ)P1_7的值P2=x; /將移位完的X賦給P2,那么P2上顯示的就是按鍵的二進(jìn)制狀態(tài) 1、基本部分:利用單片機(jī)串行口,實(shí)現(xiàn)兩個實(shí)驗(yàn)臺之間的串行通訊。其中一個實(shí)驗(yàn)臺作為發(fā)送方,另一側(cè)為接收方。利用發(fā)送方的撥盤控制接收方的LED。甲方:#include<reg51.h>void main()SM0=0;SM1=1;

28、SM2=0;/設(shè)定串行口工作方式1,單對單通信,可用SCON=0X40代替EA=0;ES=0;ET1=0; /關(guān)串行口中斷,關(guān)總中斷,關(guān)定時/計(jì)數(shù)器T1中斷PCON=0; /設(shè)置SMOD=0,波特率不加倍TMOD=0X20; /設(shè)置定時/計(jì)數(shù)器T1為工作方式2,定時器工作TH1=0XFE;TL1=0XFE; /賦初值,此處賦值與定時或計(jì)數(shù)賦初值不同,此處初值用于波特率,可參考P168TR1=1; /開定時器T1while(1)SBUF=P2; /把P2口接收到的值賦給發(fā)送SBUF,準(zhǔn)備發(fā)送while(TI=0); /等待發(fā)送完畢TI=0; /將發(fā)送標(biāo)志位TI置0,此步一定要軟件操作乙方:#include<reg51.h>void main()SM0=0;SM1=1;SM2=0;REN=1; /串行口工作方式1,單對單通信,可用SCON=0x50代替EA=0;ET1=0;ES=0; /關(guān)所有中斷TMOD=0X20; /T1工

溫馨提示

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