天天看點

C語言單片機等待詢問_51單片機程式設計執行個體大全(下部)

學習單片機

C語言單片機等待詢問_51單片機程式設計執行個體大全(下部)

// 執行個體 1:用單片機控制第一個燈亮

#include //包含 51單片機寄存器定義的頭檔案void main(void)

{ P1=0xfe; //P1=1111 1110B,即 P1.0輸出低電平

}

// 執行個體 2:用單片機控制一個燈閃爍:認識單片機的工作頻率

#include //包含單片機寄存器的頭檔案/ 函數功能:延時一段時間

/ void delay(void) //兩個 void 意思分别為無需傳回值,沒有參數傳遞{

unsigned int i; // 定義無符号整數,最大取值範圍 65535 for(i=0;i<20000;i++) // 做 20000次空循環

; //什麼也不做,等待一個機器周期} / 函數功能:主函數 (C語言規定必須有也隻能有 1個主函數)

/ void main(void) {

while(1) //無限循環{

P1=0xfe; //P1=1111 1110B, P1.0輸出低電平delay(); //延時一段時間P1=0xff; //P1=1111 1111B, P1.0輸出高電平delay(); //延時一段時間

} }

// 執行個體 3:将 P1 口狀态分别送入 P0、P2、P3 口:認識 I/O 口

的引腳功能

#include //包含單片機寄存器的頭檔案

/ 函數功能:主函數 (C語言規定必須有也隻能有 1個主函數)

/

void main(void) {

while(1) //無限循環{

P1=0xff; // P1=1111 1111B,熄滅 LED P0=P1; // 将 P1口狀态送入 P0口P2=P1; // 将 P1口狀态送入 P2口

P3=P1; // 将 P1口狀态送入 P3口}

}

// 執行個體 4:使用 P3 口流水點亮 8 位 LED

#include //包含單片機寄存器的頭檔案/ 函數功能:延時一段時間

/

void delay(void) {

unsigned char i,j; for(i=0;i<250;i++)

for(j=0;j<250;j++) ;

} / 函數功能:主函數

/ void main(void) {

while(1) {

P3=0xfe; //第一個燈亮delay(); //調用延時函數P3=0xfd; //第二個燈亮delay(); //調用延時函數P3=0xfb; //第三個燈亮delay(); //調用延時函數

P3=0xf7; //第四個燈亮delay(); //調用延時函數P3=0xef; //第五個燈亮

delay(); //調用延時函數P3=0xdf; //第六個燈亮delay(); //調用延時函數P3=0xbf; //第七個燈亮

delay(); //調用延時函數P3=0x7f; //第八個燈亮

delay(); //調用延時函數}

}

//執行個體 7:通過對 P3口位址的操作流水點亮 8位 LED #include //包含單片機寄存器的頭檔案sfr x=0xb0; //P3 口在存儲器中的位址是 b0H, 通過 sfr 可定義 8051核心單片機

//的所有内部 8位特殊功能寄存器 ,對位址 x的操作也就是對 P1口的操作/ 函數功能:延時一段時間

/ void delay(void)

{ unsigned char i,j; for(i=0;i<250;i++)

for(j=0;j<250;j++) ; //利用循環等待若幹機器周期,進而延時一段時間

} / 函數功能:主函數

/ void main(void) {

while(1) {

x=0xfe; //第一個燈亮delay(); // 調用延時函數x=0xfd; //第二個燈亮

delay(); // 調用延時函數x=0xfb; //第三個燈亮

delay(); // 調用延時函數x=0xf7; //第四個燈亮

delay(); // 調用延時函數x=0xef; //第五個燈亮

delay(); //調用延時函數x=0xdf; //第六個燈亮delay(); //調用延時函數x=0xbf; //第七個燈亮

delay(); //調用延時函數x=0x7f; //第八個燈亮

delay(); //調用延時函數}

}

//執行個體 8:用不同資料類型控制燈閃爍時間#include //包含單片機寄存器的頭檔案/ 函數功能:用整形資料延時一段時間

/ void int_delay(void) //延時一段較長的時間{

unsigned int m; // 定義無符号整形變量,雙位元組資料,值域為 0~65535 for(m=0;m<36000;m++)

; //空操作} / 函數功能:用字元型資料延時一段時間

/ void char_delay(void) //延時一段較短的時間{

unsigned char i,j; //定義無符号字元型變量,單位元組資料,值域 0~255 for(i=0;i<200;i++)

for(j=0;j<180;j++) ; //空操作

} / 函數功能:主函數

/ void main(void) {

unsigned char i; while(1)

{ for(i=0;i<3;i++)

{

P1=0xfe; //P1.0 口的燈點亮int_delay(); //延時一段較長的時間P1=0xff; //熄滅int_delay(); //延時一段較長的時間

} for(i=0;i<3;i++)

{ P1=0xef; //P1.4 口的燈點亮char_delay(); //延時一段較長的時間P1=0xff; //熄滅char_delay(); //延時一段較長的時間

}

}

}

// 執行個體 9:用 P0 口、 P1 口分别顯示加法和減法運算結果

#include void main(void) {

unsigned char m,n; m=43; //即十進制數 2x16+11=43 n=60; //即十進制數 3x16+12=60 P1=m+n; //P1=103=0110 0111B,結果 P1.3、P1.4、P1.7 口的燈被點亮P0=n-m; //P0=17=0001 0001B,結果 P0.0、P0.4的燈被熄滅

}

// 執行個體 10:用 P0、P1 口顯示乘法運算結果

#include //包含單片機寄存器的頭檔案void main(void) {

unsigned char m,n; unsigned int s; m=64;

n=71; s=m n; //s=64 71=4544,需要 16位二進制數表示,高 8位送 P1口,低 8

位送 P0口//由于 4544=17 256+192=H3 16 16 16+H2 16 16+H1 16+H0

//兩邊同除以 256,可得 17+192/256=H3 16+H2+(H1 16+H0)/256

//是以,高 8位 16進制數 H3 16+H2必然等于 17,即 4544除以 256的商

//低 8位 16進制數 H1 16+H0必然等于 192,即 4544除以 256的餘數

P1=s/256; //高 8位送 P1口 ,P1=17=11H=0001 0001B, P1.0和 P1.4口滅,其餘亮

P0=s%256; //低 8位送 P0口 , P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7口滅,其餘亮}

// 執行個體 11:用 P1、P0 口顯示除法運算結果

#include //包含單片機寄存器的頭檔案void main(void) {

P1=36/5; //求整數P0=((36%5) 10)/5; //求小數while(1)

; //無限循環防止程式"跑飛"}

// 執行個體 12:用自增運算控制 P0 口 8 位 LED 流水花樣

#include //包含單片機寄存器的頭檔案/ 函數功能:延時一段時間

/ void delay(void) {

unsigned int i; for(i=0;i<20000;i++)

; } / 函數功能

/ void main(void) {

unsigned char i; for(i=0;i<255;i++) //注意 i 的值不能超過 255 {

P0=i; //将 i的值送 P0口delay(); //調用延時函數

} }

// 執行個體 13:用 P0 口顯示邏輯 "與"運算結果

#include //包含單片機寄存器的頭檔案void main(void) {

P0=(4>0)&&(9>0xab);//将邏輯運算結果送 P0口while(1)

; //設定無限循環,防止程式"跑飛"}

// 執行個體 14:用 P0 口顯示條件運算結果

#include //包含單片機寄存器的頭檔案void main(void) {

P0=(8>4)?8:4;//将條件運算結果送 P0口,P0=8=0000 1000B while(1)

; //設定無限循環,防止程式"跑飛"}

// 執行個體 15:用 P0 口顯示按位 "異或 "運算結果

#include //包含單片機寄存器的頭檔案void main(void) {

P0=0xa2^0x3c;// 将條件運算結果送 P0口,P0=8=0000 1000B while(1)

; //設定無限循環,防止程式"跑飛"}

// 執行個體 16:用 P0 顯示左移運算結果

#include //包含單片機寄存器的頭檔案void main(void) {

P0=0x3b<<2;//将左移運算結果送 P0口,P0=1110 1100B=0xec while(1)

; //無限循環,防止程式"跑飛"}

// 執行個體 17:"萬能邏輯電路 "實驗

#include //包含單片機寄存器的頭檔案sbit F=P1^4; //将 F位定義為 P1.4 sbit X=P1^5; //将 X位定義為 P1.5 sbit Y=P1^6; //将 Y位定義為 P1.6 sbit Z=P1^7; //将 Z位定義為 P1.7 void main(void) {

while(1) {

F=((~X)&Y)|Z; //将邏輯運算結果賦給 F ;

} }

// 執行個體 18:用右移運算流水點亮 P1 口 8 位 LED

#include //包含單片機寄存器的頭檔案/

函數功能:延時一段時間/

void delay(void) { unsigned int n; for(n=0;n<30000;n++)

; } / 函數功能:主函數

/ void main(void) {

unsigned char i; while(1)

{ P1=0xff; delay(); for(i=0;i<8;i++)//設定循環次數為 8 {

P1=P1>>1; //每次循環 P1的各二進位右移 1位,高位補 0 delay(); //調用延時函數

} }

}

// 執行個體 19:用 if 語句控制 P0 口 8 位 LED 的流水方向

#include //包含單片機寄存器的頭檔案sbit S1=P1^4; //将 S1位定義為 P1.4 sbit S2=P1^5; //将 S2位定義為 P1.5 / 函數功能:主函數

/ void main(void) {

while(1) { if(S1==0) //如果按鍵 S1按下

P0=0x0f; //P0 口高四位 LED點亮if(S2==0) //如果按鍵 S2按下

P0=0xf0; //P0 口低四位 LED點亮}

}

// 執行個體 20:用 swtich 語句的控制 P0 口 8 位 LED 的點亮狀态

#include //包含單片機寄存器的頭檔案sbit S1=P1^4; //将 S1位定義為 P1.4 / 函數功能:延時一段時間

/ void delay(void) { unsigned int n; for(n=0;n<10000;n++)

; } / 函數功能:主函數

/ void main(void) {

unsigned char i; i=0; //将 i初始化為 0 while(1) {

if(S1==0) //如果 S1鍵按下{

delay(); //延時一段時間if(S1==0) //如果再次檢測到 S1鍵按下

i++; //i 自增 1 if(i==9) //如果 i=9,重新将其置為 1

i=1;

} switch(i) //使用多分支選擇語句

{ case 1: P0=0xfe; //第一個 LED亮

break; case 2: P0=0xfd; // 第二個 LED亮

break;

case 3:P0=0xfb; //第三個 LED亮break;

case 4:P0=0xf7; //第四個 LED亮break;

case 5:P0=0xef; //第五個 LED亮break;

case 6:P0=0xdf; //第六個 LED亮break;

case 7:P0=0xbf; //第七個 LED亮break;

case 8:P0=0x7f; //第八個 LED亮break;

default: //預設值,關閉所有 LED P0=0xff;

} }

}

// 執行個體 21:用 for 語句控制蜂鳴器鳴笛次數

#include //包含單片機寄存器的頭檔案sbit sound=P3^7; // 将 sound位定義為 P3.7 / 函數功能:延時形成 1600Hz音頻

/ void delay1600(void) { unsigned char n;

for(n=0;n<100;n++) ;

} / 函數功能:延時形成 800Hz音頻

/ void delay800(void) { unsigned char n;

for(n=0;n<200;n++) ;

}

/

函數功能:主函數/

void main(void) {

unsigned int i; while(1) {

for(i=0;i<830;i++) {

sound=0; //P3.7 輸出低電平delay1600(); sound=1; //P3.7 輸出高電平delay1600();

} for(i=0;i<200;i++) {

sound=0; //P3.7 輸出低電平delay800(); sound=1; //P3.7 輸出高電平delay800();

}

}

}

// 執行個體 22:用 while 語句控制 LED

#include //包含單片機寄存器的頭檔案/ 函數功能:延時約 60ms (3 100 200=60000μs)

/ void delay60ms(void) { unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<200;n++) ;

} / 函數功能:主函數

/ void main(void) {

unsigned char i; while(1) //無限循環{

i=0; //将 i初始化為 0 while(i<0xff) //當 i小于 0xff(255)時執行循環體{

P0=i; //将 i 送 P0口顯示delay60ms(); //延時i++; //i 自增 1

} }

}

// 執行個體 23:用 do-while 語句控制 P0 口 8 位 LED 流水點亮

#include //包含單片機寄存器的頭檔案/ 函數功能:延時約 60ms (3 100 200=60000μs)

/ void delay60ms(void) { unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<200;n++) ;

} / 函數功能:主函數

/ void main(void) {

do {

P0=0xfe; // 第一個 LED亮delay60ms(); P0=0xfd; // 第二個 LED亮delay60ms(); P0=0xfb; //第三個 LED亮delay60ms();

P0=0xf7; //第四個 LED亮delay60ms(); P0=0xef; //第五個 LED亮delay60ms(); P0=0xdf; //第六個 LED亮delay60ms(); delay60ms(); P0=0xbf; //第七個 LED亮delay60ms(); P0=0x7f; //第八個 LED亮delay60ms();

}while(1); //無限循環,使 8位 LED循環流水點亮}

// 執行個體 24:用字元型數組控制 P0 口 8 位 LED 流水點亮

#include //包含單片機寄存器的頭檔案/ 函數功能:延時約 60ms (3 100 200=60000μs)

/ void delay60ms(void) { unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<200;n++) ;

} / 函數功能:主函數

/ void main(void) {

unsigned char i; unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定義無符

号字元型數組while(1) {

for(i=0;i<8;i++) {

P0=Tab[i];//依次引用數組元素,并将其送 P0口顯示delay60ms();//調用延時函數

}

} }

// 執行個體 25: 用 P0 口顯示字元串常量

#include //包含單片機寄存器的頭檔案/ 函數功能:延時約 150ms (3 200 250=150 000μs=150ms

/ void delay150ms(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函數功能:主函數

/ void main(void) {

unsigned char str[]={"Now,Temperature is :"}; // 将字元串賦給字元型全部元素指派

unsigned char i; while(1) {

i=0; //将 i初始化為 0,從第一個元素開始顯示while(str[i]!='0') // 隻要沒有顯示到結束标志 '0' {

P0=str[i]; //将第 i個字元送到 P0口顯示delay150ms(); //調用 150ms延時函數i++; // 指向下一個待顯字元

} }

}

// 執行個體 26:用 P0 口顯示指針運算結果??

#include void main(void)

{ unsigned char p1, p2; //定義無符号字元型指針變量 p1,p2 unsigned char i,j; //定義無符号字元型資料i=25; //給 i 賦初值 25 j=15; p1=&i; //使指針變量指向 i ,對指針初始化p2=&j; //使指針變量指向 j ,對指針初始化P0= p1+ p2; // p1+ p2 相當于 i+j,是以 P0=25+15=40=0x28

//則 P0=0010 1000B,結果 P0.3、P0.5引腳 LED熄滅,其餘點亮while(1)

; //無限循環,防止程式"跑飛"

}

// 執行個體 27:用指針數組控制 P0 口 8 位 LED 流水點亮

#include / 函數功能:延時約 150ms (3 200 250=150 000μs=150ms

/ void delay150ms(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函數功能:主函數

/ void main(void) {

unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],

&Tab[6],&Tab[7]};

unsigned char i; //定義無符号字元型資料while(1)

{ for(i=0;i<8;i++)

{ P0= p[i];

delay150ms(); }

} }

// 執行個體 28:用數組的指針控制 P0 口 8 位 LED 流水點亮

#include / 函數功能:延時約 150ms (3 200 250=150 000μs=150ms

/ void delay150ms(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函數功能:主函數

/ void main(void) {

unsigned char i; unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00, 0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81, 0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB}; //流水燈控制碼

unsigned char p; //定義無符号字元型指針p=Tab; // 将數組首位址存入指針 p while(1)

{ for(i=0;i<32;i++) //共 32個流水燈控制碼

{ P0= (p+i); // (p+i)的值等于 a[i] delay150ms(); //調用 150ms延時函數

} }

}

// 執行個體 29:用 P0 、P1 口顯示整型函數傳回值

#include / 函數功能:計算兩個無符号整數的和

/ unsigned int sum(int a,int b) {

unsigned int s; s=a+b; return (s);

} / 函數功能:主函數

/ void main(void) {

unsigned z; z=sum(2008,2009); P1=z/256; //取得 z的高 8位P0=z%256; //取得 z的低 8位while(1)

; }

// 執行個體 30:用有參函數控制 P0 口 8 位 LED 流水速度

#include / 函數功能:延時一段時間

/ void delay(unsigned char x) {

unsigned char m,n; for(m=0;m

for(n=0;n<200;n++) ;

} /

函數功能:主函數/

void main(void) {

unsigned char i; unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

//流水燈控制碼while(1)

{ //快速流水點亮 LED for(i=0;i<8;i++) //共 8個流水燈控制碼

{ P0=Tab[i]; delay(100); //延時約 60ms, (3 100 200=60 000μs)

} //慢速流水點亮 LED for(i=0;i<8;i++) //共 8個流水燈控制碼{

P0=Tab[i]; delay(250); //延時約 150ms, (3 250 200=150 000μs)

} }

}

// 執行個體 31:用數組作函數參數控制流水花樣

#include / 函數功能:延時約 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函數功能:流水點亮 P0口 8位 LED

/ void led_flow(unsigned char a[8]) {

unsigned char i; for(i=0;i<8;i++)

{ P0=a[i]; delay();

} }

/ 函數功能:主函數

/ void main(void) {

unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水燈控制碼

led_flow(Tab);

}

// 執行個體 32:用指針作函數參數控制 P0 口 8 位 LED 流水點亮

#include / 函數功能:延時約 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函數功能:流水點亮 P0口 8位 LED

/ void led_flow(unsigned char p) //形參為無符号字元型指針{

unsigned char i; while(1) {

i=0; //将 i置為 0,指向數組第一個元素while( (p+i)!='0') // 隻要沒有指向數組的結束标志{

P0= (p+i);// 取的指針所指變量(數組元素)的值,送 P0口delay(); //調用延時函數i++; // 指向下一個數組元素

} }

}

/ 函數功能:主函數

/ void main(void) {

unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,

0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,

0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C, 0x18,0x0,0x81,0xC3,0xE7,0xFF,

0xFF,0x7E}; //流水燈控制碼

unsigned char pointer; pointer=Tab; led_flow(pointer);

}

// 執行個體 33:用函數型指針控制 P1 口燈花樣

#include //包含 51單片機寄存器定義的頭檔案unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水燈控制碼,該數組被定義為全局變量/ 函數功能:延時約 150ms

/ void delay(void)

{

unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++)

; }

/ 函數功能:流水燈左移

/ void led_flow(void) {

unsigned char i; for(i=0;i<8;i++) //8 位控制碼

{ P0=Tab[i]; delay();

}

} / 函數功能:主函數

/ void main(void) {

void ( p)(void); //定義函數型指針,所指函數無參數,無傳回值p=led_flow; //将函數的入口位址賦給函數型指針 p while(1) ( p)(); //通過函數的指針 p調用函數 led_flow()

}

// 執行個體 34:用指針數組作為函數的參數顯示多個字元串

#include //包含 51單片機寄存器定義的頭檔案unsigned char code str1[ ]="Temperature is tested by DS18B20";//C語言中,字元串是作為字元數組來處理的unsigned char code str2[ ]="Now temperature is:"; //是以,字元串的名字就是字元串的首位址

unsigned char code str3[ ]="The Systerm is designed by Zhang San"; unsigned char code str4[ ]="The date is 2008-9-30"; unsigned char p[ ]={str1,str2,str3,str4}; // 定義 p[4]為指向 4個字元串的字元型指針數組/

函數功能:延時約 150ms /

void delay(void) {

unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++)

; }

/ 函數功能:流水點亮 P0口 8位 LED

/ void led_display(unsigned char x[ ]) //形參必須為指針數組{

unsigned char i,j; for(i=0;i<4;i++) //有 4個字元串要顯示{

j=0; //指向待顯字元串的第 0号元素while( (x[i]+j)!='0') // 隻要第 i個字元串的第 j 号元素不是結束标志

{ P0= (x[i]+j); //取得該元素值送到 P0口顯示delay(); //調用延時函數

j++; //指向下一個元素}

} } / 函數功能:主函數

/ void main(void) {

unsigned char i; while(1)

{ for(i=0;i<4;i++)

led_display(p); //将指針數組名作實際參數傳遞}

}

// 執行個體 35:字元函數 ctype.h 應用舉例

#include //包含 51單片機寄存器定義的頭檔案

#include void main(void) {

while(1) {

P3=isalpha('_')?0xf0:0x0f;//條件運算,若 '_'是英文字母, P3=0xf0 }

}

// 執行個體 36:内部函數 intrins.h 應用舉例

#include //包含 51單片機寄存器定義的頭檔案#include // 包含函數 isalpha()聲明的頭檔案/ 函數功能:延時約 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函數功能:主函數

/ void main(void) {

P3=0xfe; //P3=1111 1110B while(1)

{ P3=_crol_(P3,1);// 将 P3的二進制位循環左移 1位後再賦給 P3 delay(); //調用延時函數

} }

// 執行個體 37:标準函數 stdlib.h 應用舉例

#include //包含 51單片機寄存器定義的頭檔案#include //包含函數 isalpha()聲明的頭檔案/ 函數功能:延時約 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函數功能:主函數

/ void main(void) { unsigned char i; while(1) {

for(i=0;i<10;i++) //産生 10個随機數{

P3=rand()/160; //将産生的随機數縮小 160倍後送 P3顯示delay();

} }

}

// 執行個體 38:字元串函數 string.h 應用舉例

#include //包含 51單片機寄存器定義的頭檔案#include //包含函數 isalpha()聲明的頭檔案void main(void) { unsigned char str1[ ]="Now, The temperature is :"; unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i; i=strcmp(str1,str2); //比較兩個字元串,并将結果存入 i if(i==0) //str1=str2

P3=0x00; else

if(i<0) //str1

else //str1>str2 P3=0x0f;

while(1) ; //防止程式"跑飛"

}

// 執行個體 39:宏定義應用舉例 2

#include //包含 51單片機寄存器定義的頭檔案# define F(a,b) (a)+(a) (b)/256+(b) //帶參數的宏定義, a和 b為形參void main(void) {

unsigned char i,j,k; i=40; j=30; k=20; P3=F(i,j+k); //i 和 j+k分别為實參,宏展開時,實參将替代宏定義中的形

參while(1)

; }

// 執行個體 40:宏定義應用舉例 2

#include #include void main(void) {

P3_0=0; //将 P3.0引腳置低電平, LED點亮P3_1=0; //将 P3.0引腳置低電平, LED點亮P3_2=0; //将 P3.0引腳置低電平, LED點亮P3_3=0; //将 P3.0引腳置低電平, LED點亮P3_4=1; //将 P3.4引腳置高電平, LED熄滅P3_5=1; //将 P3.5引腳置高電平, LED熄滅P3_6=1; //将 P3.7引腳置高電平, LED熄滅

P3_7=1; //将 P3.7引腳置高電平, LED熄滅while(1)

; }

// 執行個體 41:宏定義應用舉例 3

#include //包含 51單片機寄存器定義的頭檔案#define MAX 100 //将 MAX宏定義為字元串 100 void main(void) {

#if MAX>80 //如果字元串 100大于 80 P3=0xf0; //P3 口低四位 LED點亮

#else P3=0x0f; //否則,P3口高四位 LED點亮

#endif //結束本次編譯

}

/

中斷、定時器 中斷、定時器

中斷、定時器 中斷、定時器

/

// 執行個體 42:用定時器 T0 查詢方式 P2 口 8 位控制 LED 閃爍

#include // 包含 51單片機寄存器定義的頭檔案/ 函數功能:主函數

/ void main(void)

{ // EA=1; // 開總中斷

// ET0=1; // 定時器 T0中斷允許TMOD=0x01; //使用定時器 T0的模式 1 TH0=(65536-46083)/256; //定時器 T0的高 8位賦初值TL0=(65536-46083)%256; //定時器 T0的高 8位賦初值TR0=1; // 啟動定時器 T0 TF0=0; P2=0xff; while(1)// 無限循環等待查詢{

while(TF0==0) ;

TF0=0; P2=~P2;

TH0=(65536-46083)/256; //定時器 T0的高 8位賦初值TL0=(65536-46083)%256; //定時器 T0的高 8位賦初值

} }

// 執行個體 43:用定時器 T1 查詢方式控制單片機發出 1KHz 音頻

#include // 包含 51單片機寄存器定義的頭檔案sbit sound=P3^7; //将 sound位定義為 P3.7引腳/ 函數功能:主函數

/ void main(void) {

// EA=1; // 開總中斷// ET0=1; //定時器 T0中斷允許

TMOD=0x10; //使用定時器 T1的模式 1 TH1=(65536-921)/256; //定時器 T1的高 8位賦初值TL1=(65536-921)%256; //定時器 T1的高 8位賦初值TR1=1; // 啟動定時器 T1 TF1=0; while(1)// 無限循環等待查詢{

while(TF1==0) ;

TF1=0;

sound=~sound; //将 P3.7引腳輸出電平取反TH1=(65536-921)/256; //定時器 T0的高 8位賦初值TL1=(65536-921)%256; //定時器 T0的高 8位賦初值

} }

// 執行個體 44:将計數器 T0 計數的結果送 P1 口 8 位 LED 顯示

#include // 包含 51單片機寄存器定義的頭檔案sbit S=P3^4; //将 S位定義為 P3.4引腳/ 函數功能:主函數

/ void main(void) {

// EA=1; // 開總中斷// ET0=1; // 定時器 T0中斷允許

TMOD=0x02; //使用定時器 T0的模式 2 TH0=256-156; //定時器 T0的高 8位賦初值TL0=256-156; //定時器 T0的高 8位賦初值TR0=1; // 啟動定時器 T0 while(1)// 無限循環等待查詢{

while(TF0==0) //如果未計滿就等待{

if(S==0) //按鍵 S按下接地,電平為 0 P1=TL0; //計數器 TL0加 1後送 P1口顯示

} TF0=0; //計數器溢出後,将 TF0清 0

} }

// 執行個體 45:用定時器 T0 的中斷控制 1 位 LED 閃爍

#include // 包含 51單片機寄存器定義的頭檔案sbit D1=P2^0; //将 D1位定義為 P2.0引腳/

函數功能:主函數/

void main(void) {

EA=1; // 開總中斷ET0=1; // 定時器 T0中斷允許TMOD=0x01; //使用定時器 T0的模式 2 TH0=(65536-46083)/256; //定時器 T0的高 8位賦初值TL0=(65536-46083)%256; //定時器 T0的高 8位賦初值TR0=1; // 啟動定時器 T0 while(1)// 無限循環等待中斷

; }

/ 函數功能:定時器 T0的中斷服務程式

/ void Time0(void) interrupt 1 using 0 //"interrupt"聲明函數為中斷服務函數

//其後的 1為定時器 T0的中斷編号; 0表示使用第 0組工作寄存器

{ D1=~D1; //按位取反操作,将 P2.0引腳輸出電平取反TH0=(65536-46083)/256; //定時器 T0的高 8位重新賦初值TL0=(65536-46083)%256; //定時器 T0的高 8位重新賦初值

}

// 執行個體 46:用定時器 T0 的中斷實作長時間定時

#include // 包含 51單片機寄存器定義的頭檔案sbit D1=P2^0; //将 D1位定義為 P2.0引腳unsigned char Countor; //設定全局變量,儲存定時器 T0中斷次數/ 函數功能:主函數

/ void main(void) {

EA=1; // 開總中斷ET0=1; // 定時器 T0中斷允許TMOD=0x01; //使用定時器 T0的模式 2 TH0=(65536-46083)/256; //定時器 T0的高 8位賦初值TL0=(65536-46083)%256; //定時器 T0的高 8位賦初值TR0=1; // 啟動定時器 T0

Countor=0; // 從 0開始累計中斷次數while(1)// 無限循環等待中斷

; }

/ 函數功能:定時器 T0的中斷服務程式

/ void Time0(void) interrupt 1 using 0 //"interrupt"聲明函數為中斷服務函數

//其後的 1為定時器 T0的中斷編号; 0表示使用第 0組工作寄存器{

Countor++; //中斷次數自加 1 if(Countor==20) //若累計滿 20次,即計時滿 1s {

D1=~D1; //按位取反操作,将 P2.0引腳輸出電平取反Countor=0; //将 Countor清 0,重新從 0開始計數

} TH0=(65536-46083)/256; //定時器 T0的高 8位重新賦初值TL0=(65536-46083)%256; //定時器 T0的高 8位重新賦初值

}

// 執行個體 47:用定時器 T1 中斷控制兩個 LED 以不同周期閃爍

#include // 包含 51單片機寄存器定義的頭檔案sbit D1=P2^0; //将 D1位定義為 P2.0引腳sbit D2=P2^1; //将 D2位定義為 P2.1引腳unsigned char Countor1; //設定全局變量,儲存定時器 T1中斷次數unsigned char Countor2; //設定全局變量,儲存定時器 T1中斷次數/ 函數功能:主函數

/ void main(void) {

EA=1; // 開總中斷ET1=1; // 定時器 T1中斷允許TMOD=0x10; //使用定時器 T1的模式 1 TH1=(65536-46083)/256; //定時器 T1的高 8位賦初值TL1=(65536-46083)%256; //定時器 T1的高 8位賦初值TR1=1; // 啟動定時器 T1 Countor1=0; //從 0開始累計中斷次數Countor2=0; //從 0開始累計中斷次數

while(1)// 無限循環等待中斷;

} / 函數功能:定時器 T1的中斷服務程式

/ void Time1(void) interrupt 3 using 0 //"interrupt"聲明函數為中斷服務函數

//其後的 3為定時器 T1的中斷編号; 0表示使用第 0組工作寄存器{

Countor1++; //Countor1 自加 1 Countor2++; //Countor2 自加 1 if(Countor1==2) //若累計滿 2次,即計時滿 100ms

{ D1=~D1; //按位取反操作,将 P2.0引腳輸出電平取反Countor1=0; //将 Countor1清 0,重新從 0開始計數

} if(Countor2==8) //若累計滿 8次,即計時滿 400ms

{ D2=~D2; //按位取反操作,将 P2.1引腳輸出電平取反Countor2=0; //将 Countor1清 0,重新從 0開始計數

} TH1=(65536-46083)/256; //定時器 T1的高 8位重新賦初值TL1=(65536-46083)%256; //定時器 T1的高 8位重新賦初值

}

// 執行個體 48:用計數器 T1 的中斷控制蜂鳴器發出 1KHz 音頻

#include // 包含 51單片機寄存器定義的頭檔案sbit sound=P3^7; // 将 sound位定義為 P3.7引腳/ 函數功能:主函數

/ void main(void) {

EA=1; // 開總中斷ET1=1; // 定時器 T1中斷允許TMOD=0x10; //TMOD=0001 000B,使用定時器 T1的模式 1 TH1=(65536-921)/256; //定時器 T1的高 8位賦初值TL1=(65536-921)%256; // 定時器 T1的高 8位賦初值TR1=1; // 啟動定時器 T1

while(1)// 無限循環等待中斷;

} / 函數功能:定時器 T1的中斷服務程式

/ void Time1(void) interrupt 3 using 0 //"interrupt"聲明函數為中斷服務函數{

sound=~sound; TH1=(65536-921)/256; //定時器 T1的高 8位重新賦初值TL1=(65536-921)%256; // 定時器 T1的高 8位重新賦初值

}

// 執行個體 49:用定時器 T0 的中斷實作 "渴望 "主題曲的播放

#include //包含 51單片機寄存器定義的頭檔案sbit sound=P3^7; //将 sound位定義為 P3.7 unsigned int C; //儲存定時器的定時常數//以下是 C調低音的音頻宏定義#define l_dao 262 //将" l_dao"宏定義為低音" 1"的頻率 262Hz #define l_re 286 //将" l_re"宏定義為低音" 2"的頻率 286Hz #define l_mi 311 //将" l_mi"宏定義為低音" 3"的頻率 311Hz #define l_fa 349 //将" l_fa"宏定義為低音" 4"的頻率 349Hz #define l_sao 392 //将" l_sao"宏定義為低音" 5"的頻率 392Hz #define l_la 440 //将" l_a"宏定義為低音" 6"的頻率 440Hz #define l_xi 494 // 将" l_xi"宏定義為低音" 7"的頻率 494Hz //以下是 C調中音的音頻宏定義#define dao 523 //将"dao"宏定義為中音" 1"的頻率 523Hz #define re 587 //将" re"宏定義為中音" 2"的頻率 587Hz #define mi 659 //将"mi"宏定義為中音" 3"的頻率 659Hz #define fa 698 // 将" fa"宏定義為中音" 4"的頻率 698Hz #define sao 784 //将" sao"宏定義為中音" 5"的頻率 784Hz #define la 880 //将" la"宏定義為中音" 6"的頻率 880Hz #define xi 987 //将"xi"宏定義為中音" 7"的頻率 523H //以下是 C調高音的音頻宏定義#define h_dao 1046 // 将"h_dao"宏定義為高音" 1"的頻率 1046Hz #define h_re 1174 //将"h_re"宏定義為高音" 2"的頻率 1174Hz #define h_mi 1318 // 将"h_mi"宏定義為高音" 3"的頻率 1318Hz #define h_fa 1396 //将"h_fa"宏定義為高音" 4"的頻率 1396Hz #define h_sao 1567 //将"h_sao"宏定義為高音" 5"的頻率 1567Hz #define h_la 1760 //将"h_la"宏定義為高音" 6"的頻率 1760Hz

#define h_xi 1975 //将"h_xi"宏定義為高音" 7"的頻率 1975Hz / 函數功能: 1個延時機關,延時 200ms

/ void delay()

{ unsigned char i,j; for(i=0;i<250;i++)

for(j=0;j<250;j++) ;

} / 函數功能:主函數

/ void main(void)

{ unsigned char i,j;

//以下是《渴望》片頭曲的一段簡譜unsigned int code f[]={re,mi,re,dao,l_la,dao,l_la, // 每行對應一小節音符

l_sao,l_mi,l_sao,l_la,dao, l_la,dao,sao,la,mi,sao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao,

l_la,l_la,dao,l_la,l_sao,l_re,l_mi, l_sao, re,re,sao,la,sao, fa,mi,sao,mi, la,sao,mi,re,mi,l_la,dao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,dao,re,l_la,dao,re,mi, re, l_la,dao,re,l_la,dao,re,mi, re, 0xff}; // 以 0xff 作為音符的結束标志

//以下是簡譜中每個音符的節拍//"4" 對應 4個延時機關, "2"對應 2個延時機關, "1"對應 1個延時機關unsigned char code JP[ ]={4,1,1,4,1,1,2,

2,2,2,2,8, 4,2,3,1,2,2, 10,

4,2,2,4,4, 2,2,2,2,4,

2,2,2,2,2,2,2, 10, 4,4,4,2,2, 4,2,4,4, 4,2,2,2,2,2,2, 10, 4,2,2,4,4, 2,2,2,2,6, 4,2,2,4,1,1,4, 10, 4,2,2,4,1,1,4, 10 };

EA=1; //開總中斷ET0=1; //定時器 T0中斷允許TMOD=0x00; // 使用定時器 T0的模式 1(13位計數器)while(1) // 無限循環

{ i=0; //從第 1個音符 f[0]開始播放

while(f[i]!=0xff) //隻要沒有讀到結束标志就繼續播放{ C=460830/f[i]; TH0=(8192-C)/32; //可證明這是 13位計數器 TH0高 8位的賦

初值方法

TL0=(8192-C)%32; //可證明這是 13位計數器 TL0低 5位的賦初值方法

TR0=1; //啟動定時器 T0 for(j=0;j

delay(); // 延時 1個節拍機關TR0=0; //關閉定時器 T0

i++; //播放下一個音符}

} } / 函數功能:定時器 T0的中斷服務子程式,使 P3.7引腳輸出音頻的方波

/ void Time0(void ) interrupt 1 using 1 {

sound=!sound; //将 P3.7引腳輸出電平取反,形成方波TH0=(8192-C)/32; //可證明這是 13位計數器 TH0高 8位的賦初值方法TL0=(8192-C)%32; //可證明這是 13位計數器 TL0低 5位的賦初值方法

}

// 執行個體 50-1:輸出 50 個矩形脈沖

#include //包含 51單片機寄存器定義的頭檔案sbit u=P1^4; //将 u位定義為 P1.4 / 函數功能:延時約 30ms (3 100 100=30 000μs =30m

/ void delay30ms(void) {

unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<100;n++) ;

} / 函數功能:主函數

/ void main(void)

{ unsigned char i; u=1; //初始化輸出高電平for(i=0;i<50;i++) //輸出 50個矩形脈沖

{ u=1; delay30ms(); u=0; delay30ms();

} while(1)

; //無限循環,防止程式"跑飛"}

// 執行個體 50-2 :計數器 T0 統計外部脈沖數

#include //包含 51單片機寄存器定義的頭檔案

/ 函數功能:主函數

/ void main(void)

{ TMOD=0x06; // TMOD=0000 0110B,使用計數器 T0的模式 2 EA=1; //開總中斷ET0=0; //不使用定時器 T0的中斷TR0=1; //啟動 T0 TH0=0; //計數器 T0高 8位賦初值TL0=0; // 計數器 T0低 8位賦初值while(1) //無限循環,不停地将 TL0計數結果送 P1口P1=TL0;

}

// 執行個體 51-2 :定時器 T0 的模式 2 測量正脈沖寬度

#include //包含 51單片機寄存器定義的頭檔案sbit ui=P3^2; // 将 ui位定義為 P3.0( INT0)引腳,表示輸入電壓/ 函數功能:主函數

/ void main(void)

{ TMOD=0x0a; // TMOD=0000 1010B,使用定時器 T0的模式 2,GATE置 1 EA=1; //開總中斷ET0=0; //不使用定時器 T0的中斷TR0=1; //啟動 T0 TH0=0; //計數器 T0高 8位賦初值TL0=0; // 計數器 T0低 8位賦初值while(1) // 無限循環,不停地将 TL0計數結果送 P1口{

while(ui==0) //INT0 為低電平, T0不能啟動;

TL0=0; //INT0 為高電平,啟動 T0計時,是以将 TL0清 0 while(ui==1) //在 INT0高電平期間,等待,計時

; P1=TL0; //将計時結果送 P1口顯示

} }

// 執行個體 52:用定時器 T0 控制輸出高低寬度不同的矩形波

#include //包含 51單片機寄存器定義的頭檔案sbit u=P3^0; //将 u 位定義為 P3.0,從該引腳輸出矩形脈沖unsigned char Countor; //設定全局變量,儲存負跳變累計數/ 函數功能:延時約 30ms (3 100 100=30 000μs =30ms)

/ void delay30ms(void) {

unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<100;n++) ;

}

/ 函數功能:主函數

/ void main(void)

{ unsigned char i; EA=1; //開放總中斷EX0=1; //允許使用外中斷IT0=1; //選擇負跳變來觸發外中斷Countor=0; for(i=0;i<100;i++) //輸出 100個負跳變{

u=1; delay30ms(); u=0; delay30ms();

} while(1)

; //無限循環, 防止程式跑飛}

/ 函數功能:外中斷 T0的中斷服務程式

/ void int0(void) interrupt 0 using 0 // 外中斷 0的中斷編号為 0 {

Countor++; P1=Countor;

}

// 執行個體 53:用外中斷 0 的中斷方式進行資料采集

#include //包含 51單片機寄存器定義的頭檔案sbit S=P3^2; //将 S位定義為 P3.2,/ 函數功能:主函數

/ void main(void)

{ EA=1; //開放總中斷EX0=1; //允許使用外中斷IT0=1; //選擇負跳變來觸發外中斷P1=0xff; while(1) ; //無限循環, 防止程式跑飛

} / 函數功能:外中斷 T0的中斷服務程式

/ void int0(void) interrupt 0 using 0 // 外中斷 0的中斷編号為 0 {

P1=~P1; //每産生一次中斷請求, P1取反一次。

}