學習單片機

// 執行個體 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取反一次。
}