資料介紹
/* ch08-8-1.c - Mode 0串列輸入實驗 */
#include? //?包含reg51.h檔?
#define? LED?? P1?//?定義LED位置
sbit?load=P3^2;?//?聲明P3^2位置?
main()????//?主程序開始?
{?SCON=0x11;??//?設定為mode 0、REN=1、RI=1
//====b7===b6===b5===b4===b3===b2===b1===b0=== (P8-5 ̄P8-6)
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====1====0====0====0====1===
?while(1)??//?while循環開始?
?{?load=0;??//?輸出負脈波,讓74165載入資料?
??load=1;??//?恢復高態?
??RI=0;??//?清除RI?
??while (RI==0);?//?等待RI串列輸入中斷?
??LED=SBUF;?? //?RI=1時(接收完成),輸出至LED
?}????//?while循環結束?
}?????//?主程序結束?
#include? ?//?包含reg51.h檔?
#define? DIPSW? P2?// 定義指撥開關位置
main()???//?主程序開始?
{?SCON=0;??//?設定為mode 0
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====0====0====0====0====0===
?while(1)??//?while循環開始?
?{?DIPSW=0xff;?//?規劃為輸入埠?
??SBUF=DIPSW;?//?將指撥開關狀態,放入SBUF
??while (TI==0);?//?等待TI串列輸出中斷?
??TI=0;??//?TI=1時(傳送完成),清除TI?
?}????//?while循環結束?
}?? ????//?主程序結束?
?
#include? ?// 包含reg51.h檔?
#define? LED???? P1??// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2??// 定義指撥開關位置?
main()?????// 主程式開始?
{?TMOD |= 0x20;??// 將Timer 1設定mode 2以產生鮑率
?PCON &= 0x7f;??//?將SMOD設定為0
?TH1=TL1=0xfd;??//?鮑率設定約為9600bps(12MHz)
?TR1=1;????//?啟動Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
?SCON=0x50;??//?設定為mode 1? (P8-5 ̄P8-6)
?while(1)??//?while循環開始
?{?DIP_SW=0xff;// 規劃指撥開關為輸入埠?
??SBUF=DIP_SW;//?將指撥開關狀態,放入SBUF
??while (RI==0);? //?檢查是否完成接收?
??RI=0;??//?RI=1時(接收完成),清除RI旗標?
??LED=SBUF;?//?將所接收的資料輸出到LED
??TI=0;??//?清除TI旗標?
?}????//?while循環結束?
}?????//?主程式結束?
?
#include??// 包含reg51.h檔?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2??// 定義指撥開關位置?
sbit? ?BUZZER = P3^7;?// 定義蜂鳴器位置?
void??delay(int);?// 聲明延遲函數?
char?i;????// 聲明變數?
main()?????// 主程序開始?
{?TMOD |= 0x20;??// 將Timer 1設定mode 2以產生鮑率???
?PCON &= 0x7f;??// 將SMOD設定為0
?TH1=TL1=0xfd;??// 鮑率設定約為9600bps(12MHz)
?TR1=1;????// 啟動Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
?SCON=0x50;???// 設定為mode 1? (P8-5 ̄P8-6)
?EA=ES=1;???// 設定串列埠中斷
?DIP_SW=0xff;??// 規劃指撥開關為輸入埠?
?SBUF= DIP_SW;??// 將指撥開關狀態,放入SBUF
//============主程序(產生1kHz聲音)==========
?while(1)???//?while回圈開始?
?{?for(i=0;i<30;i++)???// 30 x 0.5ms
??{?BUZZER=1; delay(1);??// 輸出高態?
???BUZZER=0; delay(1); }?// 輸出低態?
??delay(200);??// 延遲0.1s (200 x 0.5ms)
?}?????// while回圈結束?
}??????// 主程序結束?
//============延遲函數(產生0.5ms延遲)==========
void delay(int? x)
{?char? i,j;???// 聲明變數?
?for (i=0;i
??for (j=0;j<60;j++);?// 計時0.5ms
}
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (RI==1)???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??LED=SBUF;??// 將所接收的資料輸出到LED
??SBUF= DIP_SW;?// 將指撥開關狀態,放入SBUF
?}
?else? TI=0;???// 清除TI旗標?
}??????// 結束中斷子程序?
?
?
#include? // 包含reg52.h檔?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
sbit? ?BUZZER = P3^7;?// 定義蜂鳴器位置?
void?delay(int?);?// 聲明延遲函數?
char?i;????// 聲明變數?
main()?????// 主程序開始?
{?T2CON &= 0xf0;??// EXEN2=TR2=C/T2=CP/RL2=0?
?T2CON |= 0x30;??// RCLK=TCLK=1?
?TH2 = 0xff;???// Timer 2初值(9600bps, 12MHz)?
?TL2 = 0xd9;???// Timer 2初值(9600bps, 12MHz)
?RCAP2H = 0xff;??// 鮑率設定為9600bps(12MHz)?
?RCAP2L = 0xd9;??// 鮑率設定為9600bps(12MHz)
?TR2=1;????// 啟動Timer 2
?SCON=0x50;???// 設定為mode 1? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
//============主程序(產生1kHz聲音)==========
?EA=ES=1;???// 設定串列埠中斷
?DIP_SW=0xff;??// 規劃指撥開關為輸入埠?
?SBUF= DIP_SW;??// 將指撥開關狀態,放入SBUF
?while(1)???// while循環開始
?{?for(i=0;i<30;i++)???// 30 x 0.5ms
??{?BUZZER=1; delay(1);??// 輸出高態?
???BUZZER=0; delay(1); }?// 輸出低態?
??delay(200);?????// 延遲0.1s (200 x 0.5ms)
?}????????// while循環結束?
}?????????// 主程序結束?
//============延遲函數(產生0.5ms延遲)==========
void delay(int? x)
{?char? i,j;??????// 聲明變數?
?for (i=0;i
??for (j=0;j<60;j++);???// 計時0.5ms
}
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (RI==1)???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??LED=SBUF;??// 將所接收的資料輸出到LED
??SBUF= DIP_SW;?// 將指撥開關狀態,放入SBUF
?}
?else?TI=0;??// 清除TI旗標?
}??????// 結束中斷子程序?
?
?
#include? // 包含reg51.h檔?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
main()????// 主程序開始?
{?PCON |= 0x80;?// 將SMOD設定為1
?SCON=0x90;??// 設定為mode 2? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
?while(1)???// while循環開始
?{?DIP_SW=0xff;?// 規劃指撥開關為輸入埠?
??SBUF=DIP_SW;?// 將指撥開關狀態,放入SBUF
??while (RI==0);? // 檢查是否完成接收?
??RI=0;???// RI=1時(接收完成),清除RI旗標?
??LED=SBUF;??// 將所接收的資料輸出到LED
??TI=0;???// 清除TI旗標?
?}?????// while循環結束?
}??????// 主程序結束
?
?
#include? // 包含reg51.h檔?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
main()????// 主程序開始?
{?TMOD |= 0x20;?// 將Timer 1設定mode 2以產生鮑率?
?PCON &= 0x7f;?// 將SMOD設定為0
?TH1=TL1=0xfd;?// 鮑率設定約為9600bps(12MHz)
?TR1=1;???// 啟動Timer 1
?SCON=0xd0;??// 設定為mode 3? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====1====0====1====0====0====0====0===
?DIP_SW=0xff;?// 規劃指撥開關為輸入埠?
?SBUF=DIP_SW;?// 將指撥開關狀態,放入SBUF
?while(1)??// while循環開始?
?{?if (TI==1)?// 檢查是否完成傳出?
??{?TI=0;?// TI=1時(傳出完成),清除TI旗標?
???SBUF=DIP_SW; }?// 將指撥開關狀態,放入SBUF
??if (RI==1)?// 檢查是否完成接收?
??{?RI=0;?// RI=1時(接收完成),清除RI旗標?
???LED=SBUF; }?// 將所接收的資料輸出到LED
?}????// while循環結束?
}?????// 主程序結束
?
?
#include? // 包含reg51.h檔?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
main()????// 主程序開始?
{?PCON |= 0x80;?// 將SMOD設定為1?
?SCON=0x90;??// 設定為mode 2? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
?while(1)??// while循環開始?
?{?DIP_SW=0xff;// 規劃指撥開關為輸入埠?
??SBUF=DIP_SW;// 將指撥開關狀態,放入SBUF
??while (RI==0); ?// 檢查是否完成接收?
??RI=0;??// RI=1時(接收完成),清除RI旗標?
??LED=SBUF;?// 將所接收的資料輸出到LED
??TI=0;??// 清除TI旗標?
?}????// while循環結束?
}?????// 主程序結束?
?
?
#include? ?// 包含reg51.h檔?
#define? LED? P1??// 定義LED位置?
//============ 函數 ==========
void INIT_serial(void);?// 聲明串列埠初始化函數?
void send_char(char);?// 傳送字元函數?
void delay1ms(int);??// 聲明延遲函數?
//============ 函數 ==========
unsigned char myAddress = 0x01;?// 我的地址?
unsigned char addr[3]={0x02, 0x03, 0x04};?// SLAVE之地址?
unsigned char sdata[3]={0x01, 0x03, 0x07};?// 傳出之初值?
//=======? 主程式? ========
main()?????// 主程式開始?
{?unsigned char? i,j;?// 聲明變量??
?INIT_serial();??// 串列埠初始化設定?
?LED=0xff;???// 關閉LED
?while(1)
?{?LED=~LED;??// 切換LED
??for(i=0;i<3;i++)// 對三個slave通訊?
??{?TB8 = 1;?// 傳送地址模式?
???send_char(addr[i]);?// 傳送地址?
???TB8 = 0;??// 傳送資料模式?
???j=sdata[i];??// 取出資料?
???send_char(j);?// 傳送資料?
???delay1ms(100);?// 延遲0.1秒?
???TB8 = 0;??// 傳送資料模式?
???send_char(~j);?// 傳送反相資料?
???delay1ms(100);?// 延遲0.1秒?
??}?????// for回圈結束??????????
?}??????// while回圈結束?????
}???????// 主程式結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//============ 傳送字元函數 ==========
void send_char(char s_char)
{?TI=0;????// 清除TI旗標??
?SBUF = s_char;??? ?// 傳出字元?
?while(!TI);???// 等待完成傳出?
}?
//============ 延遲函數(產生x1ms延遲) ==========
void delay1ms(int x)
{?char? i, j;???// 聲明變量?
?for (i=0;i
??for (j=0;j<120;j++);// 延遲1ms
}
====================================
/* ch08-8-71.c - mode 3多處理器通訊實驗_Slave A */?
#include? ?// 包含reg51.h檔?
#define? LED? P1??// 定義LED位置?
void INIT_serial(void);?// 聲明串列埠初始化函數?
unsigned char myAddress = 0x02;?// 我的地址?
//=======? 主程序? ========
main()?????// 主程序開始?
{?INIT_serial();??// 串列埠初始化設定?
?while(1);???// 無窮回路?
}??????// 主程序結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?EA=ES=1;???// 設定串列埠中斷
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (TI==1)???// 判斷是否發生傳出中斷
??TI=0;???// 清除TI旗標,準備下次的傳送?
?if (RI==1) ???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??if (RB8)?
???if (SBUF==myAddress) SM2=0;?// 進入接收資料模式?
???else SM2=1;?// 非我的地址?
??else? LED=SBUF;?// 讀取接收到的資料,并輸出到LED
?}?????// 結束接收程序?
}??????// 結束中斷子程序?
=======================================
/* ch08-8-71.c - mode 3多處理器通訊實驗_Slave B */?
#include? ?// 包含reg51.h檔?
#define? LED? P1??// 定義LED位置?
void INIT_serial(void);?// 聲明串列埠初始化函數?
unsigned char myAddress = 0x03;?// 我的地址?
//=======? 主程序? ========
main()?????// 主程序開始?
{?INIT_serial();??// 串列埠初始化設定?
?while(1);???// 無窮回路?
}??????// 主程序結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?EA=ES=1;???// 設定串列埠中斷
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (TI==1)???// 判斷是否發生傳出中斷
??TI=0;???// 清除TI旗標,準備下次的傳送?
?if (RI==1) ???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??if (RB8)?
???if (SBUF==myAddress) SM2=0;?// 進入接收資料模式?
???else SM2=1;?// 非我的地址?
??else? LED=SBUF;?// 讀取接收到的資料,并輸出到LED
?}?????// 結束接收程序?
}??????// 結束中斷子程序?
?
==============================
/* ch08-8-71.c - mode 3多處理器通訊實驗_Slave C */?
#include? ?// 包含reg51.h檔?
#define? LED? P1??// 定義LED位置?
void INIT_serial(void);?// 聲明串列埠初始化函數?
unsigned char myAddress = 0x04;?// 我的地址?
//=======? 主程序? ========
main()?????// 主程序開始?
{?INIT_serial();??// 串列埠初始化設定?
?while(1);???// 無窮回路?
}??????// 主程序結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?EA=ES=1;???// 設定串列埠中斷
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (TI==1)???// 判斷是否發生傳出中斷
??TI=0;???// 清除TI旗標,準備下次的傳送?
?if (RI==1) ???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??if (RB8)?
???if (SBUF==myAddress) SM2=0;?// 進入接收資料模式?
???else SM2=1;?// 非我的地址?
??else? LED=SBUF;?// 讀取接收到的資料,并輸出到LED
?}?????// 結束接收程序?
}??????// 結束中斷子程序?
#include?
#define? LED?? P1?//?定義LED位置
sbit?load=P3^2;?//?聲明P3^2位置?
main()????//?主程序開始?
{?SCON=0x11;??//?設定為mode 0、REN=1、RI=1
//====b7===b6===b5===b4===b3===b2===b1===b0=== (P8-5 ̄P8-6)
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====1====0====0====0====1===
?while(1)??//?while循環開始?
?{?load=0;??//?輸出負脈波,讓74165載入資料?
??load=1;??//?恢復高態?
??RI=0;??//?清除RI?
??while (RI==0);?//?等待RI串列輸入中斷?
??LED=SBUF;?? //?RI=1時(接收完成),輸出至LED
?}????//?while循環結束?
}?????//?主程序結束?
2、Mode 0串列輸出實驗
/* ch08-8-2.c - Mode 0串列輸出實驗 */?#include?
#define? DIPSW? P2?// 定義指撥開關位置
main()???//?主程序開始?
{?SCON=0;??//?設定為mode 0
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====0====0====0====0====0===
?while(1)??//?while循環開始?
?{?DIPSW=0xff;?//?規劃為輸入埠?
??SBUF=DIPSW;?//?將指撥開關狀態,放入SBUF
??while (TI==0);?//?等待TI串列輸出中斷?
??TI=0;??//?TI=1時(傳送完成),清除TI?
?}????//?while循環結束?
}?? ????//?主程序結束?
?
3、mode 1實驗(垂詢方式) _采用Timer 1產生鮑率
/* ch08-8-3.c - mode 1實驗(垂詢方式) _采用Timer 1產生鮑率 */#include?
#define? LED???? P1??// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2??// 定義指撥開關位置?
main()?????// 主程式開始?
{?TMOD |= 0x20;??// 將Timer 1設定mode 2以產生鮑率
?PCON &= 0x7f;??//?將SMOD設定為0
?TH1=TL1=0xfd;??//?鮑率設定約為9600bps(12MHz)
?TR1=1;????//?啟動Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
?SCON=0x50;??//?設定為mode 1? (P8-5 ̄P8-6)
?while(1)??//?while循環開始
?{?DIP_SW=0xff;// 規劃指撥開關為輸入埠?
??SBUF=DIP_SW;//?將指撥開關狀態,放入SBUF
??while (RI==0);? //?檢查是否完成接收?
??RI=0;??//?RI=1時(接收完成),清除RI旗標?
??LED=SBUF;?//?將所接收的資料輸出到LED
??TI=0;??//?清除TI旗標?
?}????//?while循環結束?
}?????//?主程式結束?
?
4、mode 1實驗(中斷方式) _采用Timer 1產生鮑率
/* ch08-8-3a.c - mode 1實驗(中斷方式) _采用Timer 1產生鮑率 */#include?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2??// 定義指撥開關位置?
sbit? ?BUZZER = P3^7;?// 定義蜂鳴器位置?
void??delay(int);?// 聲明延遲函數?
char?i;????// 聲明變數?
main()?????// 主程序開始?
{?TMOD |= 0x20;??// 將Timer 1設定mode 2以產生鮑率???
?PCON &= 0x7f;??// 將SMOD設定為0
?TH1=TL1=0xfd;??// 鮑率設定約為9600bps(12MHz)
?TR1=1;????// 啟動Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
?SCON=0x50;???// 設定為mode 1? (P8-5 ̄P8-6)
?EA=ES=1;???// 設定串列埠中斷
?DIP_SW=0xff;??// 規劃指撥開關為輸入埠?
?SBUF= DIP_SW;??// 將指撥開關狀態,放入SBUF
//============主程序(產生1kHz聲音)==========
?while(1)???//?while回圈開始?
?{?for(i=0;i<30;i++)???// 30 x 0.5ms
??{?BUZZER=1; delay(1);??// 輸出高態?
???BUZZER=0; delay(1); }?// 輸出低態?
??delay(200);??// 延遲0.1s (200 x 0.5ms)
?}?????// while回圈結束?
}??????// 主程序結束?
//============延遲函數(產生0.5ms延遲)==========
void delay(int? x)
{?char? i,j;???// 聲明變數?
?for (i=0;i
}
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (RI==1)???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??LED=SBUF;??// 將所接收的資料輸出到LED
??SBUF= DIP_SW;?// 將指撥開關狀態,放入SBUF
?}
?else? TI=0;???// 清除TI旗標?
}??????// 結束中斷子程序?
?
?
5、mode 1實驗(中斷方式)_采用Timer 2產生鮑率
/* ch08-8-3b.c - mode 1實驗(中斷方式)_采用Timer 2產生鮑率 */#include?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
sbit? ?BUZZER = P3^7;?// 定義蜂鳴器位置?
void?delay(int?);?// 聲明延遲函數?
char?i;????// 聲明變數?
main()?????// 主程序開始?
{?T2CON &= 0xf0;??// EXEN2=TR2=C/T2=CP/RL2=0?
?T2CON |= 0x30;??// RCLK=TCLK=1?
?TH2 = 0xff;???// Timer 2初值(9600bps, 12MHz)?
?TL2 = 0xd9;???// Timer 2初值(9600bps, 12MHz)
?RCAP2H = 0xff;??// 鮑率設定為9600bps(12MHz)?
?RCAP2L = 0xd9;??// 鮑率設定為9600bps(12MHz)
?TR2=1;????// 啟動Timer 2
?SCON=0x50;???// 設定為mode 1? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
//============主程序(產生1kHz聲音)==========
?EA=ES=1;???// 設定串列埠中斷
?DIP_SW=0xff;??// 規劃指撥開關為輸入埠?
?SBUF= DIP_SW;??// 將指撥開關狀態,放入SBUF
?while(1)???// while循環開始
?{?for(i=0;i<30;i++)???// 30 x 0.5ms
??{?BUZZER=1; delay(1);??// 輸出高態?
???BUZZER=0; delay(1); }?// 輸出低態?
??delay(200);?????// 延遲0.1s (200 x 0.5ms)
?}????????// while循環結束?
}?????????// 主程序結束?
//============延遲函數(產生0.5ms延遲)==========
void delay(int? x)
{?char? i,j;??????// 聲明變數?
?for (i=0;i
}
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (RI==1)???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??LED=SBUF;??// 將所接收的資料輸出到LED
??SBUF= DIP_SW;?// 將指撥開關狀態,放入SBUF
?}
?else?TI=0;??// 清除TI旗標?
}??????// 結束中斷子程序?
?
?
6、mode 2實驗
/* ch08-8-4.c - mode 2實驗 */?#include?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
main()????// 主程序開始?
{?PCON |= 0x80;?// 將SMOD設定為1
?SCON=0x90;??// 設定為mode 2? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
?while(1)???// while循環開始
?{?DIP_SW=0xff;?// 規劃指撥開關為輸入埠?
??SBUF=DIP_SW;?// 將指撥開關狀態,放入SBUF
??while (RI==0);? // 檢查是否完成接收?
??RI=0;???// RI=1時(接收完成),清除RI旗標?
??LED=SBUF;??// 將所接收的資料輸出到LED
??TI=0;???// 清除TI旗標?
?}?????// while循環結束?
}??????// 主程序結束
?
?
7、mode 3實驗(垂詢方式) _采用Timer 1產生鮑率
/* ch08-8-5.c - mode 3實驗(垂詢方式) _采用Timer 1產生鮑率*/#include?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
main()????// 主程序開始?
{?TMOD |= 0x20;?// 將Timer 1設定mode 2以產生鮑率?
?PCON &= 0x7f;?// 將SMOD設定為0
?TH1=TL1=0xfd;?// 鮑率設定約為9600bps(12MHz)
?TR1=1;???// 啟動Timer 1
?SCON=0xd0;??// 設定為mode 3? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====1====0====1====0====0====0====0===
?DIP_SW=0xff;?// 規劃指撥開關為輸入埠?
?SBUF=DIP_SW;?// 將指撥開關狀態,放入SBUF
?while(1)??// while循環開始?
?{?if (TI==1)?// 檢查是否完成傳出?
??{?TI=0;?// TI=1時(傳出完成),清除TI旗標?
???SBUF=DIP_SW; }?// 將指撥開關狀態,放入SBUF
??if (RI==1)?// 檢查是否完成接收?
??{?RI=0;?// RI=1時(接收完成),清除RI旗標?
???LED=SBUF; }?// 將所接收的資料輸出到LED
?}????// while循環結束?
}?????// 主程序結束
?
?
】
?
8、mode 2互傳實驗
/* ch08-8-6.c - mode 2互傳實驗 */?#include?
#define? LED???? P1?// 定義LED位置?
// 第一版89S51線上刻錄實驗板(印表機埠介面)之指撥開關在P2。?
// 第二版89S51線上刻錄實驗板(USB介面) 之指撥開關在P0。?
#define? DIP_SW? P2?// 定義指撥開關位置?
main()????// 主程序開始?
{?PCON |= 0x80;?// 將SMOD設定為1?
?SCON=0x90;??// 設定為mode 2? (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
?while(1)??// while循環開始?
?{?DIP_SW=0xff;// 規劃指撥開關為輸入埠?
??SBUF=DIP_SW;// 將指撥開關狀態,放入SBUF
??while (RI==0); ?// 檢查是否完成接收?
??RI=0;??// RI=1時(接收完成),清除RI旗標?
??LED=SBUF;?// 將所接收的資料輸出到LED
??TI=0;??// 清除TI旗標?
?}????// while循環結束?
}?????// 主程序結束?
?
?
9、mode 3多處理器通信實驗
/* ch08-8-70.c - mode 3多處理器通信實驗_Master */?#include?
#define? LED? P1??// 定義LED位置?
//============ 函數 ==========
void INIT_serial(void);?// 聲明串列埠初始化函數?
void send_char(char);?// 傳送字元函數?
void delay1ms(int);??// 聲明延遲函數?
//============ 函數 ==========
unsigned char myAddress = 0x01;?// 我的地址?
unsigned char addr[3]={0x02, 0x03, 0x04};?// SLAVE之地址?
unsigned char sdata[3]={0x01, 0x03, 0x07};?// 傳出之初值?
//=======? 主程式? ========
main()?????// 主程式開始?
{?unsigned char? i,j;?// 聲明變量??
?INIT_serial();??// 串列埠初始化設定?
?LED=0xff;???// 關閉LED
?while(1)
?{?LED=~LED;??// 切換LED
??for(i=0;i<3;i++)// 對三個slave通訊?
??{?TB8 = 1;?// 傳送地址模式?
???send_char(addr[i]);?// 傳送地址?
???TB8 = 0;??// 傳送資料模式?
???j=sdata[i];??// 取出資料?
???send_char(j);?// 傳送資料?
???delay1ms(100);?// 延遲0.1秒?
???TB8 = 0;??// 傳送資料模式?
???send_char(~j);?// 傳送反相資料?
???delay1ms(100);?// 延遲0.1秒?
??}?????// for回圈結束??????????
?}??????// while回圈結束?????
}???????// 主程式結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//============ 傳送字元函數 ==========
void send_char(char s_char)
{?TI=0;????// 清除TI旗標??
?SBUF = s_char;??? ?// 傳出字元?
?while(!TI);???// 等待完成傳出?
}?
//============ 延遲函數(產生x1ms延遲) ==========
void delay1ms(int x)
{?char? i, j;???// 聲明變量?
?for (i=0;i
}
====================================
/* ch08-8-71.c - mode 3多處理器通訊實驗_Slave A */?
#include?
#define? LED? P1??// 定義LED位置?
void INIT_serial(void);?// 聲明串列埠初始化函數?
unsigned char myAddress = 0x02;?// 我的地址?
//=======? 主程序? ========
main()?????// 主程序開始?
{?INIT_serial();??// 串列埠初始化設定?
?while(1);???// 無窮回路?
}??????// 主程序結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?EA=ES=1;???// 設定串列埠中斷
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (TI==1)???// 判斷是否發生傳出中斷
??TI=0;???// 清除TI旗標,準備下次的傳送?
?if (RI==1) ???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??if (RB8)?
???if (SBUF==myAddress) SM2=0;?// 進入接收資料模式?
???else SM2=1;?// 非我的地址?
??else? LED=SBUF;?// 讀取接收到的資料,并輸出到LED
?}?????// 結束接收程序?
}??????// 結束中斷子程序?
=======================================
/* ch08-8-71.c - mode 3多處理器通訊實驗_Slave B */?
#include?
#define? LED? P1??// 定義LED位置?
void INIT_serial(void);?// 聲明串列埠初始化函數?
unsigned char myAddress = 0x03;?// 我的地址?
//=======? 主程序? ========
main()?????// 主程序開始?
{?INIT_serial();??// 串列埠初始化設定?
?while(1);???// 無窮回路?
}??????// 主程序結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?EA=ES=1;???// 設定串列埠中斷
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (TI==1)???// 判斷是否發生傳出中斷
??TI=0;???// 清除TI旗標,準備下次的傳送?
?if (RI==1) ???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??if (RB8)?
???if (SBUF==myAddress) SM2=0;?// 進入接收資料模式?
???else SM2=1;?// 非我的地址?
??else? LED=SBUF;?// 讀取接收到的資料,并輸出到LED
?}?????// 結束接收程序?
}??????// 結束中斷子程序?
?
==============================
/* ch08-8-71.c - mode 3多處理器通訊實驗_Slave C */?
#include?
#define? LED? P1??// 定義LED位置?
void INIT_serial(void);?// 聲明串列埠初始化函數?
unsigned char myAddress = 0x04;?// 我的地址?
//=======? 主程序? ========
main()?????// 主程序開始?
{?INIT_serial();??// 串列埠初始化設定?
?while(1);???// 無窮回路?
}??????// 主程序結束?
//=== 串列埠初始化函數 ===
void INIT_serial(void)
{?PCON |= 0x80;??// 將SMOD設定為1
?SCON=0xf0;???// 設定為mode 3,多處理器通訊?
?TMOD |= 0x20;??// 設定采mode 2
?TH1=TL1=0xf3;??// 4800bps (12MHz)
?EA=ES=1;???// 設定串列埠中斷
?TR1=1;????// 啟動Timer 1
}??????// 結束初始化函數?
//===串列埠中斷子程序(中斷向量為0x23、中斷編號為 4)===
void serial_INT(void)? interrupt? 4
{?if (TI==1)???// 判斷是否發生傳出中斷
??TI=0;???// 清除TI旗標,準備下次的傳送?
?if (RI==1) ???// 判斷是否發生接收中斷
?{?RI=0;???// 清除RI旗標,準備下次的接收?
??if (RB8)?
???if (SBUF==myAddress) SM2=0;?// 進入接收資料模式?
???else SM2=1;?// 非我的地址?
??else? LED=SBUF;?// 讀取接收到的資料,并輸出到LED
?}?????// 結束接收程序?
}??????// 結束中斷子程序?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- STM32 外部中斷實驗參考程序 41次下載
- 實驗11:外部中斷0
- 信捷觸摸屏實驗程序 2次下載
- HPEC應用子程序線程推測并行性實驗分析 8次下載
- 通過四個撥動開關SW0SW3輸入的鍵值在數碼管上顯示相應的鍵值的實驗 8次下載
- 點陣式LED顯示0到9的數字顯示程序和仿真免費下載 62次下載
- 單片機實驗INT0及INT1中斷計數的程序和仿真資料免費下載。 4次下載
- 單片機實驗INT0中斷控制LED的程序和仿真資料免費下載 2次下載
- 單片機INT0中斷3位計數的C語言程序和電路圖免費下載 3次下載
- INT0中斷計數的實驗程序及電路圖資料合集免費下載 1次下載
- JAVA程序設計教程之JSP程序設計實驗 6次下載
- 單片機與嵌入式系統實驗教程之P1、P3 口的應用實驗說明
- 實驗2-3循環結構程序設計 0次下載
- 實驗3_NIOS程序EPCS固化 0次下載
- 可編程序控制技術及應用實驗 116次下載
- RK3568國產處理器實驗平臺:語音識別控制實驗 169次閱讀
- 國產Cortex-A55實驗箱操作案例分享:LED程序開發 192次閱讀
- 【從0開始創建AWTK應用程序】創建應用程序并在模擬器運行 540次閱讀
- H3C實驗配置:H3CNE綜合實驗 1659次閱讀
- MSPM0L1306開發板教程-SPI 2607次閱讀
- KUKA運用系統變量$MODE_OP編程 2089次閱讀
- Python版實驗室設備管理系統源代碼 2502次閱讀
- 關于在Bootloader模式下的應用程序下載 4283次閱讀
- 0歐電阻的多種用途 4080次閱讀
- PIC9054 PCI總線主控I/O加速器的性能及接口設計解決方案 2430次閱讀
- 海天雄電子:Android移動互聯網實驗室開發架構 3247次閱讀
- 51單片機IO口模擬串口通訊的設計 2861次閱讀
- SAMSUNG S3C9454 示例程序 2847次閱讀
- 51單片機實驗板該如何制作? 2131次閱讀
- AVR內部EEPROM讀寫實驗 2571次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1490次下載 | 免費
- 2單片機典型實例介紹
- 18.19 MB | 92次下載 | 1 積分
- 3S7-200PLC編程實例詳細資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關電源原理及各功能電路詳解
- 0.38 MB | 10次下載 | 免費
- 6基于AT89C2051/4051單片機編程器的實驗
- 0.11 MB | 4次下載 | 免費
- 7藍牙設備在嵌入式領域的廣泛應用
- 0.63 MB | 3次下載 | 免費
- 89天練會電子電路識圖
- 5.91 MB | 3次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應用800例(新編版)
- 0.00 MB | 33562次下載 | 免費
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關電源設計實例指南
- 未知 | 21539次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537791次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183277次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論